Conversation
…lity fix(teams): accept inline image rendering companions
…-normalization fix(teams): normalize wildcard inline images
…nt-auth fix(teams): authenticate Bot Connector attachments
…adder Fix Teams inline-image timeout ownership
…names fix(tools): preserve historical MCP aliases
fix(teams): allow slow inline image body downloads
…ng-plan docs(teams): investigate repeated image timeouts and plan hardening
fix(teams): recover stalled photo downloads and bound image batches
fix(teams): complete channel and principal management
fix(teams): search Group Chats by name
…ress fix(teams): make Group Chat search advance automatically
…trol fix(teams): expose Group Chat ingress in the main TUI menu
chore: sync dev with upstream/dev
Signed-off-by: Proxicon <konradtech@gmail.com>
Proxicon
marked this pull request as draft
September 15, 2026 05:52
Proxicon
marked this pull request as ready for review
September 15, 2026 06:48
Contributor
Author
|
Related PR for the Netclaw-website: netclaw-dev/netclaw-website#122 Apologies about the unsigned commits @Aaronontheweb - Let me know how you would like to proceed. Its strange coming from the same dev env, like hit & miss. Also worthy to note, Teams channel ordering will conflict with Telegram on : #1905 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Microsoft Teams Channel Integration
Summary
This PR adds Microsoft Teams as a first-class Netclaw communication channel and upstreams the Teams implementation that has been developed and validated in the Proxicon fork.
It implements the current delivery scope defined by the Microsoft Teams roadmap:
Roadmap: #1946 — Microsoft Teams Roadmap and Architecture Strategy
This also resolves the original Teams channel request:
Closes #1401
The implementation follows the same architectural principle as Netclaw's other channels: Microsoft-specific transport concerns remain at the channel boundary, while sessions, orchestration, tools, approvals, memory, reminders, and policy remain Netclaw-owned and platform-agnostic.
Roadmap alignment
Phase 1 — Teams Channel Integration
This PR establishes Teams as a stable Netclaw transport with the core functionality required by the Phase 1 roadmap.
It includes:
The result is that a Teams conversation can participate in the existing Netclaw session pipeline rather than introducing a Teams-specific orchestration model.
Phase 1.1 — Teams Runtime Modernization
The implementation also lands the modernization baseline described by Phase 1.1 instead of introducing a legacy transport that would immediately require replacement.
The Teams integration uses the current Microsoft Teams SDK 2.x line; the fork is currently pinned to Microsoft Teams SDK 2.1.0.
The runtime design includes:
This preserves Phase 1 behavior while giving the Teams adapter a modern runtime foundation.
Graph usage in this PR is limited to Teams administration/discovery scenarios such as resolving users, channels, and Group Chats. It does not introduce the Microsoft 365 workload automation planned for Phase 2.
Channel behavior
Personal conversations
Personal Teams chats are mapped into durable Netclaw conversation/session bindings.
The implementation provides:
Teams channels and threads
Channel conversations preserve Teams threading semantics.
The adapter distinguishes the canonical channel root from replies and maps the conversation into a stable Netclaw session.
Supported behavior includes:
The channel adapter does not move thread/session semantics into the Netclaw core; it translates Teams-specific addressing into the existing channel/session model.
Group Chats
Group Chat support is included as a separately controlled ingress mode.
Operators can:
Group Chat discovery is administrative only. Display names never grant access; persisted canonical IDs remain authoritative.
Friendly discovery may use the relevant Graph application permissions, while direct canonical-ID configuration remains available independently of discovery.
Approvals
Teams supports Netclaw's existing approval model through Adaptive Cards.
Approval actions are translated back into the normal Netclaw approval pipeline rather than creating a Teams-specific authorization mechanism.
The implementation includes:
Authorization remains owned by Netclaw.
Reminders and proactive delivery
The Teams channel supports proactive output after the original inbound request has completed.
This includes:
The Teams gateway receives generic Netclaw reminder/output messages; scheduling itself remains channel-independent.
Attachments and images
Teams attachment handling is deliberately fail-closed.
The implementation distinguishes safe rendering metadata from actual file/reference attachments and validates supported image ingress before admitting it to the model/session pipeline.
The attachment path includes:
Normal text handling remains independent from rejected attachment content where policy allows it.
Access control and safety
The Teams adapter is disabled by default and uses explicit configuration before accepting traffic.
The access model includes:
Microsoft-specific policy is kept at the channel boundary wherever possible. Existing Netclaw tool, audience, approval, and trust policies remain authoritative after a Teams message enters the session pipeline.
Operator configuration
The Netclaw TUI includes Teams configuration and access-management workflows.
Operators can manage:
Group Chat search supports partial/full chat-name matching, bounded paging, automatic continuation, deduplication, cancellation, and canonical-ID persistence.
The implementation intentionally distinguishes friendly discovery from authorization: a directory or Graph search result does not itself grant access.
Teams application package
The contribution includes the Teams application packaging/operations work required to deploy the bot into a tenant.
The package aligns the Teams application identity with the configured Entra application and supports the capabilities required by the channel integration.
Operational documentation covers configuration and deployment expectations without moving tenant-specific credentials or identities into source control.
Architecture
A key design goal is to prevent Teams from leaking deeply into Netclaw's core.
At a high level:
The Teams SDK is therefore an edge dependency rather than an orchestration dependency.
This is consistent with the roadmap principle that Teams should become a first-class channel without replacing Netclaw's existing session, memory, approval, orchestration, or tool execution models.
Validation
The Teams work has been developed incrementally in the Proxicon fork with dedicated regression coverage for the transport, actors, persistence, configuration, TUI, approvals, reminders, attachments, Graph-backed discovery, and application package.
Development validation has included combinations of:
The implementation has also been repeatedly synchronized with upstream
devduring development so that the final contribution is based on current upstream architecture rather than an isolated long-lived fork.Scope boundaries
This PR implements Phase 1 and the Phase 1.1 runtime modernization baseline from #1946.
It intentionally does not implement the later roadmap phases.
Not included:
Those remain Phase 2 and Phase 3 roadmap work.
Related issues