openclaw - ✅(Solved) Fix MS Teams: Graph API media fetch fails in personal DMs — Bot Framework conversation ID not recognized as Graph chat ID [3 pull requests, 1 comments, 1 participants]

Official PRs (…)
ON THIS PAGE

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#62219Fetched 2026-04-08 03:07:29
View on GitHub
Comments
1
Participants
1
Timeline
1
Reactions
0
Participants
Timeline (top)
commented ×1

File attachments (PDF, documents) sent in Teams personal DM chats are silently dropped. The agent receives <media:document> placeholder tags but no actual file content. Inline images in DMs may also be affected.

Error Message

"error": { This error is caught silently, resulting in "graph media fetch empty" in the debug logs with no visible error to the user or agent.

Root Cause

buildMSTeamsGraphMessageUrls() in inbound-media.ts uses the Bot Framework conversationId (format a:1dRsHC...) directly as the Graph API chatId parameter when constructing the Graph message URL:

https://graph.microsoft.com/v1.0/chats/{conversationId}/messages/{messageId}

However, the Bot Framework conversation ID for personal chats (a:... format) is not a valid Graph API chat ID. Graph API expects a different identifier (typically 19:[email protected] or an opaque GUID format). The Graph API returns:

{
  "error": {
    "code": "NotFound",
    "message": "NotFound",
    "innerError": {
      "code": "1",
      "message": "Invalid ThreadId."
    }
  }
}

This error is caught silently, resulting in "graph media fetch empty" in the debug logs with no visible error to the user or agent.

Fix Action

Workaround

Upload files via alternative methods (OneDrive link, email, SCP to server) instead of Teams DM file attachments.

PR fix notes

PR #63063: fix(msteams): resolve Graph chat ID for personal DM media downloads (#62219)

Description (problem / solution / changelog)

Summary

  • Problem: Bot Framework personal DM conversation IDs (a:... format) are not valid Graph API chat IDs. When the direct Bot Framework attachment download fails and the code falls back to the Graph API path, buildMSTeamsGraphMessageUrls constructs URLs with the invalid a: ID, Graph returns 404 "Invalid ThreadId", and inbound media (images, documents) is silently dropped.
  • Why it matters: Users sending files or images in Teams personal DMs see <media:document> / <media:image> placeholders but the agent receives no file content.
  • What changed: Before calling resolveMSTeamsInboundMedia, resolve the real Graph chat ID via resolveGraphChatId() for personal DMs with a: conversation IDs. The resolved ID is cached in the conversation store so subsequent messages skip the API lookup.
  • What did NOT change (scope boundary): The direct Bot Framework download path (smba.trafficmanager.net), the channel message path, and the buildMSTeamsGraphMessageUrls function itself are unchanged.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • Fixes #62219
  • Related #41390 (same root cause for team/channel routing variant)
  • This PR fixes a bug or regression

Root Cause (if applicable)

  • Root cause: translateMSTeamsDmConversationIdForGraph synthesizes 19:{userId}_{appId}@unq.gbl.spaces which is not always accepted by the Graph /chats/{chatId}/messages endpoint. The resolveGraphChatId function (used in the send path for SharePoint uploads) was not used in the inbound media download path.
  • Missing detection / guardrail: No validation that the conversation ID passed to buildMSTeamsGraphMessageUrls is a valid Graph chat ID for the /chats/ endpoint.
  • Contributing context: The direct Bot Framework download (smba.trafficmanager.net) is the primary path and usually succeeds. The Graph fallback is reached when the direct download fails (e.g., auth issues, unsupported attachment types). The a: ID bug in the fallback path has been masked by the primary path working.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: extensions/msteams/src/attachments.helpers.test.ts
  • Scenario the test should lock in: buildMSTeamsGraphMessageUrls correctly uses a resolved Graph chat ID (not the a: format) for personal DMs.
  • Why this is the smallest reliable guardrail: The URL builder is a pure function — testing its output for different conversation ID formats directly validates the fix.
  • Existing test that already covers this (if any): None — existing tests only covered channel and groupChat URLs.

User-visible / Behavior Changes

  • Personal DM file/image attachments in Teams now reach the agent via the Graph API fallback path when the direct Bot Framework download fails.

Diagram (if applicable)

Before:
[Teams DM file] -> direct download (401) -> Graph fallback with a:xxx ID -> 404 Invalid ThreadId -> agent gets no file

After:
[Teams DM file] -> direct download (401) -> resolveGraphChatId(a:xxx) -> 19:real-id -> Graph fallback with real ID -> agent gets file

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No (reuses existing tokenProvider.getAccessToken and resolveGraphChatId)
  • New/changed network calls? Yes — one additional Graph API call (/me/chats?$filter=...) per personal DM conversation, cached after first resolution
  • Command/tool execution surface changed? No
  • Data access scope changed? No
  • The Graph /me/chats call uses the same token scope already used by the send path. The resolved chat ID is cached in the conversation store (same store used by send-context.ts).

Repro + Verification

Environment

  • OS: Ubuntu 24.04 (Linux 6.17.0-1008-azure, x64) — AKS pod
  • Runtime/container: OpenClaw 2026.3.13 (deployed), fix validated against upstream/main codebase
  • Model/provider: N/A (attachment handling, not model inference)
  • Integration/channel: MS Teams (Bot Framework), personal 1:1 DM
  • Relevant config: dmPolicy: "open", groupPolicy: "open"

Steps

  1. Configure MS Teams channel with bot registration
  2. Send a file or image to the bot in a personal 1:1 DM
  3. Observe: agent receives <media:image> or <media:document> placeholder but no file content

Expected

  • Agent receives the file content via the Graph API fallback path

Actual

  • Gateway log shows "graph media fetch empty" with hostedStatus: 403 / attachmentStatus: 404
  • Agent dispatched without media

Evidence

  • Failing test/log before + passing after
  • Trace/log snippets

Before fix (live AKS pod):

08:28:07.327 received message
08:28:07.328 html attachment summary
08:28:08.100 graph media fetch empty
08:28:08.115 dispatching to agent      ← no media

After patching trafficmanager.net into auth allowlist (direct download fix, already on upstream/main):

Bot receives and processes image attachment successfully

Graph fallback path validated via instrumented logs:

convId=a:10OyQ1u7... type=personal isDM=true startsA=true

Confirmed the a: conversation ID reaches buildMSTeamsGraphMessageUrls unchanged when resolveGraphChatId is not called.

Human Verification (required)

  • Verified scenarios: Personal DM image upload on live AKS pod (aksclaw-peni namespace), instrumented with debug logs to trace conversation ID flow through resolveMSTeamsInboundMedia and buildMSTeamsGraphMessageUrls
  • Edge cases checked: Channel messages (verified 19: format passes through unchanged), a: prefix detection, conversation store caching path
  • What you did not verify: Graph /me/chats resolution with delegated auth tokens (tested environment uses app-only tokens where /me returns 400; the resolveGraphChatId function is already used and tested in the send path)

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? Yes
  • Config/env changes? No
  • Migration needed? No

Risks and Mitigations

  • Risk: resolveGraphChatId calls Graph /me/chats which requires delegated auth — may return null with app-only tokens
    • Mitigation: Falls back to the synthetic translateMSTeamsDmConversationIdForGraph ID (same behavior as before this fix). The primary download path (smba.trafficmanager.net) handles most cases; this fix improves the Graph fallback path.
  • Risk: Additional Graph API call per new DM conversation
    • Mitigation: Result is cached in the conversation store; subsequent messages use the cached value with zero API cost.

Changed files

  • extensions/msteams/src/attachments.helpers.test.ts (modified, +22/-0)
  • extensions/msteams/src/conversation-store-helpers.ts (modified, +5/-1)
  • extensions/msteams/src/conversation-store.shared.test.ts (modified, +24/-0)
  • extensions/msteams/src/monitor-handler/message-handler.ts (modified, +31/-1)

PR #63951: fix(msteams): fetch DM media via Bot Framework path for a: conversation IDs (#62219)

Description (problem / solution / changelog)

Summary

Personal DM media fetches were failing because the plugin tried to use Graph /chats/{a:xxx}/messages/... which Graph rejects with "Invalid ThreadId" (only 19:xxx@thread.* / 19:[email protected] IDs are accepted on /chats). File attachments (PDFs, documents) sent in Teams personal DMs were silently dropped with only a <media:document> placeholder reaching the agent.

Fix

  • Detect Bot Framework personal chat IDs (a: and 8:orgid: prefixes) via a new isBotFrameworkPersonalChatId helper.
  • Route media fetches for those IDs through the Bot Framework v3 attachments endpoint (GET {serviceUrl}/v3/attachments/{attachmentId} + .../views/{viewId}) using the bot's Bot Framework token scope.
  • Attachment IDs are extracted from the HTML attachments in the activity via the new extractMSTeamsHtmlAttachmentIds helper (un-sliced counterpart to the existing diagnostic summary).
  • When the conversation is a BF personal chat, skip the Graph fallback entirely so we do not waste a call that is guaranteed to fail with "Invalid ThreadId".
  • Keep the existing Graph routing intact for thread-format conversation IDs (19:xxx@thread.*) and group chats.
  • Wire activity.serviceUrl through resolveMSTeamsInboundMedia so the new code path has the Bot Framework service URL it needs.

Fixes #62219

Test plan

  • Unit test: a: and 8:orgid: IDs route to Bot Framework, Graph URLs never built
  • Unit test: 19: IDs continue to route to Graph (regression)
  • Unit test: missing serviceUrl leaves both paths inert (safe degradation)
  • Unit test: missing attachment IDs on BF DM logs a diagnostic
  • Unit test: bot-framework helper fetches attachment info then view and saves media
  • Unit test: bot-framework helper handles 401, missing views, oversized views, token failure
  • Full extensions/msteams suite passes (595 tests)
  • Manual: send a PDF in a personal DM with the bot

Changed files

  • extensions/msteams/src/attachments.ts (modified, +6/-0)
  • extensions/msteams/src/attachments/bot-framework.test.ts (added, +317/-0)
  • extensions/msteams/src/attachments/bot-framework.ts (added, +306/-0)
  • extensions/msteams/src/attachments/html.ts (modified, +31/-0)
  • extensions/msteams/src/monitor-handler/inbound-media.test.ts (modified, +151/-1)
  • extensions/msteams/src/monitor-handler/inbound-media.ts (modified, +49/-1)
  • extensions/msteams/src/monitor-handler/message-handler.ts (modified, +1/-0)

PR #49126: WORKING: All Microsoft Issues and PRs

Description (problem / solution / changelog)

Microsoft Ecosystem Issues & PRs Tracker

Purpose: Living checklist for maintainers to track all open Microsoft-related issues and PRs (Teams, Windows, WSL, Azure, M365/SharePoint).

How to use:

  • Mark items resolved by editing this PR body and changing [ ] to [x]
  • Claim items by adding your GitHub handle to the Assignee column
  • Priority guide: P0 = crash/blocker, P1 = significant bug/regression, P2 = minor bug/enhancement, P3 = nice-to-have/stale
  • Items marked (stale) have been flagged by the stale bot due to inactivity

Last updated: 2026-04-11 (full audit: refreshed Microsoft metrics, reconciled closed sudie-codes PRs and linked issues, and updated open PR backlog)


Summary

CategoryIssuesPRsTotalClosedRemaining
MS Teams (channel plugin)758916412638
Windows platform1328922174147
WSL00000
Azure23550
SharePoint / M36500000
Total209181390205185

1. MS Teams Channel Plugin — Issues

Bugs / Crashes

Resolved?Priority#TitleLabelsAssignee
[x]P0#55250[Bug]: msteams plugin crash-loops due to path-to-regexp v8 incompatibility in @microsoft/teams.appsbug
[x]P0#54960[msteams] path-to-regexp v8 breaking: /api* wildcard in Bot Framework CloudAdapterbug
[x]P0#54889[msteams] Teams SDK migration breaks on path-to-regexp v8+ — /api* wildcard pattern rejectedbug
[x]P0#54852[msteams] Channel fails to start on 2026.3.24 — pathToRegexp "Missing parameter name at index 5: /api*"bug
[x]P0#54703[Bug]: Teams Broken After 2026.3.24 updatesbug
[x]P0#54755v2026.3.24: Two breaking changes — Express 5 route regression + duplicate plugin infinite loopbug
[x]P0#53953[Bug]: msteams plugin crashes on startup — module singleton mismatch / ships uncompiled TypeScriptbug
[x]P0#44857Broken bundled msteams extensionbug bug:crash
[x]P0#43648MS Teams: inline pasted images fail to download (hostedContents contentBytes always null)bug bug:crash
[x]P1#56040msteams: Teams streaming protocol causes lost messages with tool-using agentsbug@BradGroux
[x]P1#56041msteams: blockStreaming config has no effect (onBlockReply not wired)bug@BradGroux
[x]P1#58601msteams: streaming + block delivery duplicate text when response exceeds 4000 charsbug@jlian
[ ]P1#58774[Bug] Microsoft Teams: HTTP 403 on proactive messages in v2026.3.31 + RSC consent blocks bot installation in teambug
[ ]P1#58617[Bug]: msteams channel file attachments not downloaded — Graph fallback triggers on non-file HTML attachments
[x]P1#58615[Bug]: msteams channel threads share the same session key (cross-thread context bleed)
[x]P1#58249[Bug]: Teams webhook broken in 2026.3.24+: publicUrl removed breaks JWT validationbug regression
[x]P1#58030fix(msteams): channel thread replies land as top-level posts or in wrong thread
[x]P1#58001[Bug] Cron announce delivery rejects valid Microsoft Teams conversation IDs
[ ]P1#56479msteams plugin: path-to-regexp crash on gateway 2026.3.24 + Node.js 25.8.2
[x]P2#56380msteams: Double typing indicator in Teams DMs
[ ]P1#56108Microsoft Teams channel crashes on startup in OpenClaw 2026.3.24
[ ]P1#59731MSTeams: streaming reply drops during long tool chains (30s+)bug
[x]P1#56603msteams plugin: three stacked bugs prevent inbound Teams webhooks on v2026.3.24bug@BradGroux
[x]P1#55384[msteams] Adaptive Card Action.Submit invoke activities silently dropped
[ ]P1#55386[msteams] Bot-to-user file upload via message send --media fails — fileConsent callback not handled
[x]P1#55383[msteams] Inbound media from OneDrive/SharePoint shared links fails — graph media fetch empty
[x]P1#53911[Bug]: msteams agent unaware of message delivery failure — silently drops errorsbug
[x]P1#53910[Bug]: msteams typing/send errors logged as [object Object] — error not stringifiedbug
[x]P1#54520[Bug]: MSTeams DM replies leak to team channel — lastChannel routing race + reply_to_current fragilitybug
[x]P1#54670[Bug]: msteams runtime supports feedback/welcome config keys but schema rejects thembug
[x]P1#53184msteams: typing indicator hits 429 rate limit during long agent runsbug
[x]P1#52954[Bug]: MS Teams channel thread replies post as top-level messages instead of in the threadbug
[ ]P1#51749MS Teams: graph media fetch empty for channel file attachments despite valid permissions and tokenbug
[x]P1#43323MS Teams pairing drops first DM before saving conversation reference, so --notify always failsbug bug:behavior
[ ]P1#47268[msteams] FileConsentCard not updated after user accepts — consent card remains frozen
[x]P1#38629msteams implicit mention fails — replyToId unreliable, threadRootId not used as fallback
[x]P1#35822MS Teams DM file attachments fail: Graph API chatId format mismatch and messageId encoding error
[x]P1#29379MS Teams plugin drops all text blocks after the first in multi-block replies
[x]P1#29847fix(msteams): FileConsent upload succeeds but FileInfoCard fails — TurnContext proxy revoked
[x]P1#27885msteams provider exits immediately, causing infinite auto-restart loop
[x]P1#25790msteams plugin: duplicate provider start causes EADDRINUSE crash loop (bundled + standalone conflict)
[x]P1#24148Cross-channel reply context leak — Teams DM overwrites session reply targetbug
[x]P1#24088Plugin MSTeams en OpenClawbug
[x]P1#23453MS Teams: Inline images (Ctrl+V) in DMs not downloaded — Graph fallback fails
[x]P1#22169msteams provider starts twice on gateway boot, causing EADDRINUSE restart loopbug
[ ]P1#52558pnpm check fails on main with tsgo errors in irc/mattermost/msteams/nextcloud-talkmaintainer
[x]P2#51568msteams: add OpenClaw User-Agent header to Microsoft backend HTTP calls
[x]P2#50835Docs: inconsistent 'MS Teams' vs 'Microsoft Teams' naming
[x]P2#28014[msteams] Inline image downloads fail in 1:1 chats — bot adapter token instead of MSAL Graph token (stale)stale
[x]P2#26599[MSTeams] Regular messages falsely detected as <media:document> (stale)stale
[x]P2#24797MSTeams: Image attachments not downloaded in bot DM chats (3 bugs) (stale)stale
[x]P2#17783Microsoft Teams channel setup fails on OpenClaw (Raspberry Pi) (stale)bug stale
[x]P2#15622Teams extension deps wiped on every global npm update (stale)stale
[x]P2#14436Gateway JWT middleware blocks Bot Framework webhooks in msteams plugin (stale)bug stale

Feature Requests

Resolved?Priority#TitleLabelsAssignee
[x]P1#54626msteams: Fetch thread/chat history from Graph API on session restartenhancement
[ ]P2#54932feat(msteams): Auto-inject thread context when message arrives as thread replyenhancement
[x]P2#60746Microsoft Teams: add config option to disable typing indicator before replies
[x]P2#60732MS Teams plugin: migrate from deprecated HttpPlugin to httpServerAdapter
[ ]P2#52501[Feature]: Team Channelsenhancement
[x]P2#51806msteams: implement Teams AI agent UX best practicesenhancement
[x]P2#40865feat(msteams): Implement read and search message actions for Teams channel
[ ]P2#40855Support federated credentials / managed identity for MS Teams Bot Framework auth
[x]P2#13243msteams support resumable Graph upload session for files >4MBenhancement
[x]P2#11346feat(msteams): Add Graph API-based message history query (readMessages action)enhancement
[x]P2#7031Simplify Teams integration for M365-only organizations (no Azure subscription)enhancement
[x]P2#40439ClawHub skill review pending: sharepoint-by-altf1be (several days)clawhub sharepoint
[ ]P1#63396Teams: SharePoint file download fails on Node 24+ due to undici strict dispatcher incompatibilitybug
[x]P3#19908WhatsApp Channel Reliability Issues — Migration to Teams Graph (stale)stale

2. MS Teams Channel Plugin — PRs

Resolved?Priority#TitleSizeAssignee
[x]P1#56071fix(msteams): reset stream state after tool calls to prevent message lossS@BradGroux
[x]P1#56134fix(msteams): add blockStreaming config and progressive deliveryM@BradGroux
[x]P1#59297fix(msteams): prevent duplicate text when stream exceeds 4000 char limitXS@BradGroux
[x]P2#59321fix(msteams): use formatUnknownError instead of String(err) for error loggingXS@BradGroux
[x]P1#56631fix(msteams): accept strict Bot Framework and Entra service tokensS@BradGroux
[x]P1#55108fix(msteams): align feedback invoke authorizationL@jacobtomlinson
[x]P0#55440fix(msteams): prevent path-to-regexp crash with express 5 (#55161)S@lml2468
[x]P1#55198fix(msteams): preserve channel reply threading in proactive fallbackS@hyojin
[x]P2#56608fix(msteams): preserve thread context in proactive fallback for channel conversationsS@tazmon95
[x]P1#59937fix(msteams): re-land revoked-context proactive fallbackS@BradGroux
[x]P1#60430fix(msteams): inject system event on message delivery failureS@BradGroux
[x]P1#60431fix(msteams): handle Adaptive Card Action.Submit invoke activitiesM@BradGroux
[x]P1#60432fix(msteams): persist conversation reference during DM pairingS@BradGroux
[x]P2#60433feat(msteams): add OpenClaw User-Agent header to Microsoft HTTP callsM@BradGroux
[x]P2#60771msteams: add typingIndicator config and prevent duplicate DM typing indicatorS@BradGroux
[x]P2#60939fix(msteams): replace deprecated HttpPlugin with httpServerAdapterS@coolramukaka-sys
[x]P1#62674fix(msteams): accept Bot Framework audience in JWT validation (#58249)M@sudie-codes
[x]P1#63942fix(msteams): fetch OneDrive/SharePoint shared media via Graph shares endpoint (#55383)M@sudie-codes
[x]P1#63951fix(msteams): fetch DM media via Bot Framework path for a: conversation IDs (#62219)M@sudie-codes
[x]P1#63953fix(cron): accept Microsoft Teams conversation IDs in announce delivery (#58001)XS@sudie-codes
[x]P1#64089feat(msteams): handle signin/tokenExchange and signin/verifyState for SSO (#60956)M@sudie-codes
[x]P0#54880fix(msteams): patch Teams HttpPlugin /api* route pattern in distS
[ ]P0#48659MSTeams: harden channel integration and readable focus labelsXL
[x]P1#54832msteams: add search message actionM
[x]P1#54702fix(msteams): prefer freshest personal conversation for proactive DM sendsS
[x]P1#54679fix: allow msteams feedback and welcome config keysXS
[x]P1#54424chore(msteams): bump @microsoft/teams.apps from 2.0.5 to 2.0.6XS
[x]P1#53615feat(msteams): add federated credential support (certificate + managed identity)M
[x]P1#53458fix(msteams): prefer personal conversation in findByUserId to prevent DM misroutingS
[x]P1#53432msteams: add message actions — pin, unpin, read, react, reactionsL
[x]P1#53188fix(msteams): throttle typing indicator to prevent 429 rate limit spiralS
[x]P1#52212fix(msteams): download DM inline images via Graph APIM
[x]P1#51808msteams: implement Teams AI agent UX best practicesM
[x]P1#51647msteams: extract structured quote/reply contextS
[x]P1#51646msteams: add reaction support (inbound + outbound)M
[x]P1#51643msteams: fetch thread history via Graph API for channel repliesM
[x]P1#50863fix: standardize 'MS Teams' to 'Microsoft Teams' across docsS
[x]P1#50214fix(msteams): pass teamId and teamName to resolveAgentRoute() [AI-assisted]S
[ ]P1#48014feat(msteams): add DefaultAzureCredential auth type for passwordless Teams authL
[ ]P1#47934fix(msteams): address review feedback on #40884 — schema, types, env validation (draft)M
[x]P1#47860fix(msteams): add fetch timeout to Microsoft Graph API callsXS
[ ]P1#49580fix(msteams): update FileConsentCard after user accepts uploadM@sudie-codes
[x]P1#57528msteams: add member-info actionXS@sudie-codes
[x]P1#57529msteams: add channel-list and channel-info actionsXS@sudie-codes
[x]P1#57530msteams: add participant removal supportS@sudie-codes
[x]P1#47270fix(msteams): update FileConsentCard in-place after upload via updateActivityS
[x]P1#44899fix: add missing @microsoft/agents-hosting dependency for msteams extensionS
[ ]P1#44739feat(msteams): extract structured quote/reply context from HTML attachmentsM
[ ]P1#43934fix(msteams): persist conversation reference during DM pairingS
[x]P1#43761fix(msteams): add @microsoft/agents-hosting to root dependenciesXS
[ ]P1#43414fix(msteams): persist first-DM conversation reference in pairing pathS
[x]P1#43326feat(msteams): fetch thread history via Graph API for channel repliesM
[ ]P1#43190MS Teams: add channel archive persistence and deleted-channel cleanupXL
[ ]P1#41565feat(cards): add shared adaptive card rendering for all channelsXL
[ ]P1#42350feat(cards): adaptive card rendering for iOS/macOS (SwiftUI)L
[ ]P1#42307feat(cards): adaptive card rendering for web UI (Lit element)XL
[ ]P1#42304feat(cards): adaptive card rendering for Android (Jetpack Compose)L
[ ]P2#41908docs(plugins): adaptive cards concept documentationM
[ ]P2#41735docs(plugins): add adaptive cards to community plugins listingXS
[ ]P1#41108fix(msteams): detect implicit mentions in thread replies via conversation.idS
[ ]P1#40884feat(msteams): support federated credentials and certificate auth (draft)S
[ ]P1#40463fix(msteams): fix image attachment download for channel and DM messagesM
[x]P1#39352fix(msteams): pass teamId into inbound route resolutionS
[x]P2#37853feat(msteams): add Teams reaction supportM
[ ]P2#34581fix(msteams): handle invalid JSON escape sequences in Bot Framework activitiesM
[ ]P2#34532docs: add Teams academic chat Canvas MVP host-side guideXS
[x]P2#33343fix(msteams): sanitize error messages sent to users (CWE-209)XS
[ ]P2#32558MSTeams: add upload session fallback for large filesM
[x]P2#32555fix(msteams): clear pending upload timeout on removalXS
[ ]P2#30142feat(adapters): add sendPayload to batch-b (includes MS Teams)L
[x]P2#23596fix(msteams): add SSRF validation to file consent upload URLM@BradGroux
[x]P2#22325fix(security): prevent memory exhaustion in inline image decodingS
[ ]P2#21739feat(msteams): support resumable upload sessions for files > 4MBS
[ ]P2#18716msteams: fix DM image delivery + user target routingS
[x]P3#27765msteams: allow replyStyle config override for DMs (stale)XS
[x]P3#26668MSTeams: add upload session fallback for large filesL
[x]P3#26274msteams: fix image download auth, double-counting, and typing indicator (stale)M
[x]P3#25511fix(msteams): suppress reasoning-only text in outbound rendering (stale)XS
[ ]P1#63347feat(msteams): support webhook host bindingmsteams
[x]P1#63945feat(msteams): auto-inject parent message context for thread repliesmsteams
[x]P1#63949fix(msteams): include tenantId and aadObjectId on proactive sendsmsteams
[x]P1#64087fix(msteams): handle fileConsent/invoke callback for bot-to-user file uploadmsteams
[x]P1#64088fix(msteams): keep streaming alive during long tool chains via typing indicatormsteams
[x]P3#8964test(msteams): add comprehensive tests for graph-upload module (stale)

Audit Notes — 2026-04-10

  • Closed issues marked resolved today: #58001, #58249, #55383.
  • Closed/merged Microsoft PRs added today: #62674, #63942, #63951, #63953, #64089.

Audit Notes — 2026-04-11

  • Recomputed summary metrics directly from the tracker body sections instead of GitHub label counts.
  • MS Teams tracker section currently contains 68 issues and 84 PRs (115 resolved, 37 remaining).
  • Windows tracker section currently contains 197 issues and 52 PRs (101 resolved, 148 remaining).
  • WSL tracker section currently contains 0 issues and 0 PRs (0 resolved, 0 remaining).
  • Azure tracker section currently contains 0 issues and 0 PRs (0 resolved, 0 remaining).
  • SharePoint / M365 tracker section currently contains 0 issues and 0 PRs (0 resolved, 0 remaining).
  • Confirmed merged sudie-codes Microsoft PRs reflected in the tracker include: #49582, #49583, #49585, #49587, #49925, #49929, #51643, #51646, #51647, #53432, #54832, #57528, #57529, #57530, #62674, #62713, #62715, #62716, #63942, #63945, #63949, #63951, #63953, #64087, #64088, #64089, #64641, #64645, #64646, #64652.
  • Closed without merge in that queue: #49580, #63954, #63963, #63964.

3. Windows Platform — Issues

Installation / Setup / Gateway

Resolved?Priority#TitleAssignee
[x]P0#54801[Bug]: The openclaw gateway can't start in Windows
[x]P0#48832[Windows] Module initialization error: CHANNEL_IDS not iterable on startup
[x]P0#48756Gateway restart/stop commands fail on Windows, causing connection loss
[x]P0#48736CLI WebSocket handshake timeout on Windows (~80% failure rate)
[ ]P1#54751Feature: Windows-compatible Update button (stop gateway before npm update)
[ ]P1#54437[Bug]: Windows Playwright CDP integration bug
[ ]P1#54039[Bug]: read tool prepends workspace root to absolute Windows paths, producing doubled paths
[ ]P1#53668gateway status reports unknown / staleGatewayPids on localized Chinese Windows
[ ]P1#53539[Feature]: New openclaw-for-windows repository under openclaw org
[ ]P1#53474Bug: openclaw gateway status false positive on Windows due to setlocal batch parsing bug
[ ]P1#53226[Windows] exec launcher broken on Windows-native: all commands quoted as PS string literals
[ ]P1#52952Windows Telegram execs fail in allowlist/command-rebuild path
[ ]P1#52525[Windows] Native file dialog invisible to browser-automation — exec+PowerShell workaround
[ ]P1#52424cron create/list fails with 'gateway closed (1000)' handshake timeout on Windows
[ ]P1#52180[Bug]: Podman Windows WSL permission denied
[ ]P1#52093Windows: EPERM error on atomic write to devices/pending.json (file lock race condition)
[ ]P1#52049Bug: gateway stop doesn't terminate node.exe process on Windows
[ ]P1#52044Bug: gateway restart spawns duplicate processes on Windows (3 windows)
[ ]P1#52022[Bug] Windows skill path compaction mixes separators and causes wrong read paths
[ ]P1#51837Windows: exec spawns steal focus from active window
[ ]P1#51797Bug: Exec command parameter spaces lost on Windows
[ ]P1#51519Windows: channel /restart still fails even when CLI gateway restart works
[ ]P1#50519[Bug]: Windows exec tool produces garbled Chinese characters due to hardcoded UTF-8 encoding
[ ]P1#50472[Windows] Gateway exits silently without crash log
[ ]P1#50453Memory Search FTS5 unavailable on Windows due to node:sqlite missing FTS5 module
[x]P1#50403[Bug]: Regression of #25376 - Exec allowlist returns 'unsupported platform' on Windows
[ ]P1#50380[Bug]: CLI WebSocket handshake timeout when gateway is running (v2026.3.13, Windows)
[x]P1#50352[Bug]: acpx fails to spawn Claude CLI on Windows
[ ]P1#50251Windows: Feishu channel fails with 'Feishu runtime not initialized'
[ ]P1#48780[Windows] exec() and read() commands corrupted with </arg_value>> suffix
[ ]P1#48461Intermittent browser command failures on Windows (gateway closed, handshake timeout)
[ ]P1#48079LINE plugin /line/webhook returns 404 on Windows
[ ]P1#48043Chrome User Profile Attach Broken on Windows
[ ]P1#47957CI check/startup-memory/windows-tests globally broken
[ ]P1#47748Windows: openclaw update fails with spawn EINVAL
[ ]P1#47643Persistent Telegram Channel Issues on Windows
[ ]P1#47484openclaw_supervisor.ps1: unquoted paths break on Windows usernames with spaces
[ ]P1#47445gateway restart command fails when executed via exec tool on Windows
[ ]P1#46378Installation config UI freezes on Windows
[ ]P1#45940False negative from openclaw gateway probe on Windows
[ ]P1#45275pnpm ui:build fails: can't find C:\\Program on Windows
[ ]P1#44559Windows: Gateway disconnects when PowerShell window closes
[ ]P1#44199Windows: ENOENT mkdir error in Telegram handler
[ ]P1#43943[Windows] Gateway fails to start with Chinese username path
[ ]P1#43180No hooks found — Windows pnpm install
[ ]P1#42839Windows: openclaw agent --local returns 401 after clean reset
[ ]P1#42556Plugin install fails on Windows with spawn EINVAL
[ ]P1#41797install.ps1 forcefully exits PowerShell on systems without winget
[ ]P1#40684npm install fails on Windows: git permission denied for libsignal-node
[ ]P1#40613Windows 11 exec Chinese output becomes mojibake
[ ]P1#40551[Windows + pnpm] Gateway dashboard returns 404 after upgrading
[ ]P1#40540openclaw update fails with EBUSY error on Windows
[ ]P1#40340bug(acpx): Windows console windows flash on every ACP spawn
[x]P1#40108Dashboard returns 404 on Windows with pnpm global install
[ ]P1#39758OpenClaw 2026.3.7 Windows Setup Failure
[ ]P1#39057openclaw node status reports "stopped" on German Windows
[ ]P1#38054Windows install fails and immediately closes Powershell
[ ]P1#37563openclaw plugins install fails on Windows when Node.js path contains spaces
[ ]P1#37036In Windows, opening dashboard shows "Not Found"
[ ]P1#35807Exec tool corrupts PowerShell pipeline variables on Windows
[ ]P1#35796Windows node onboarding: no --token flag, config overwritten on restart
[ ]P1#35297Control UI: Tools toggles don't persist / Save disabled on Windows
[ ]P1#34189Control UI / Dashboard returns "Not Found" on Windows
[ ]P1#34092Chat "copy button" not working on Windows
[ ]P1#33862Feishu groupPolicy allowlist not working on Windows
[ ]P1#33514bug(acpx): resolveWindowsSpawnProgramCandidate is not a function
[ ]P1#31175Windows Node: exec-approvals socket not created automatically
[ ]P1#30973MEDIA: token parser rejects Windows drive-letter paths
[ ]P1#30072Windows: CLI startup regression ~14s vs ~3s
[x]P1#29949/restart command fails on Windows: missing schtasks support
[x]P1#29305Windows: acpx plugin binary verification fails under Scheduled Task
[x]P1#29134ACP runtime backend reports unavailable on Windows
[x]P1#28625Gemini CLI detection fails on Windows (npm global path mismatch)
[x]P1#28551Dashboard shows incorrect status on Windows: Version n/a, Health Offline
[x]P1#28283Exec approval gating intermittent on Windows
[ ]P1#59708exec-approvals: ask: off / security: full not respected on Windows
[x]P1#59774Windows exec approval broken (Chinese-language dupe of #59708)
[ ]P1#59702sessions_spawn RPC fails with 'pairing required' on Windows Server 2025
[x]P1#59617Windows: allowFrom + security: standard does not enable auto-approval for remote commands
[x]P1#59481Windows exec allowlist auto-execution not supported on win32
[x]P1#28270Fix version mismatch & zombie process on Windows
[ ]P2#54669[Field Report] Chrome 136+ binds CDP to [::1] (IPv6) on Windows — portproxy v4tov4 breaks silently
[ ]P2#54470[Bug]: openclaw webhooks gmail setup fails on native Windows with Error: spawn gcloud ENOENT
[ ]P2#48689google-vertex auth broken on Windows in 2026.3.13
[ ]P2#47053tts.test.ts mock missing — Windows CI fails
[ ]P2#45529Support stdin/file input for config set (PowerShell quote issues)
[x]P2#44487exec host=node broken from Mac gateway after 2026.3.11
[ ]P2#44362fix(backup): .backupignore permission check false-positives on Windows
[ ]P2#44361fix(backup): archive integrity cross-check fails on Windows
[ ]P2#44293Make pnpm check:docs work in native PowerShell
[ ]P2#43931MEMORY.md injected twice on Windows NTFS (case-insensitive)
[x]P2#41800Gemini CLI OAuth broken on Windows (nvm)
[ ]P2#38809[Windows] Image payload missing for google-generative-ai
[ ]P2#37426Reply media dedupe should normalize Windows local paths
[ ]P2#30878Flaky Windows CI test in path-safety
[x]P2#30403google-gemini-cli-auth OAuth fails on Windows
[x]P2#25399tools.exec.pathPrepend replaces PATH entirely on Windows
[x]P2#25282install on windows
[x]P2#22851Windows: exec tool creates visible console windows (conhost flash)
[x]P2#22554Telegram voice not auto-transcribed on Windows
[x]P2#19819SIGUSR1 restart crashes on Windows: EBADF bad file descriptor
[x]P2#16821exec tool mangles PowerShell $ syntax on Windows
[x]P2#5440Error when installing via CMD on Windows 11
[x]P3#25856Windows: cmd.exe window flashes every ~30s from ARP scanning (stale)
[x]P3#25376Exec allowlist returns 'unsupported platform' on Windows (stale)
[x]P3#24441P0 Windows reliability: stale lock, cron EPERM, single-instance guard (stale)
[x]P3#23612OpenClaw installation fails on Windows (stale)
[x]P3#23509SIGUSR1 restart creates orphaned process as Scheduled Task (stale)
[x]P3#23109Silent failure sending local media on Windows via Telegram (stale)
[x]P3#21990Exec Tool on Windows does not capture stdout/stderr (stale)
[x]P3#21678Windows: missing windowsHide:true on child*process.spawn *(stale)_
[x]P3#16323Security: Insecure Default Tool Policies + Windows Command Injection (stale)

Feature Requests

Resolved?Priority#TitleAssignee
[ ]P2#44038[Proposal] Windows Quick Installer GUI
[ ]P2#38799Windows automation skills — bridging the platform gap
[ ]P2#39821Add Ctrl+Enter (Windows) shortcut to send messages in Control UI
[ ]P2#18985Supports Windows 11 MSYS environment and Fishshell
[ ]P2#15027Conflicting installation guidance for Windows
[ ]P2#10070canvas:a2ui:bundle script not Windows compatible
[x]P3#26160Windows support for obsidian skill (stale)
[ ]P3#26110macOS-in-Docker for full experience on Linux/Windows x86
[ ]P3#75Linux/Windows Clawdbot Apps

4. Windows Platform — PRs

Resolved?Priority#TitleAssignee
[x]P1#54588feat(windows): add native WinUI 3 companion app [AI-assisted]
[ ]P1#54431Feat/Windows Search Index file search
[ ]P1#54205Fix: read tool treats Windows absolute paths as relative to workspace (Issue #54039)
[ ]P1#54120fix(windows): hide console window during gateway restart
[ ]P1#54066fix(tools): detect Windows drive-letter paths as absolute on POSIX hosts (#54039)
[x]P1#62286fix(channels): keep bundled dist loads off native Jiti on Windows@chen-zhang-cs-code
[x]P1#60480fix: implement Windows stale gateway process cleanup before restart@arifahmedjoy
[x]P1#60692refactor(acpx): split Windows command parsing@steipete
[x]P1#60689fix(acpx): preserve Windows Claude CLI paths@steipete
[ ]P1#53965fix: atomic file writes on Windows-mounted Docker volumes
[ ]P1#53664Improve Windows source-dev support and make scripts cross-platform
[ ]P1#53121Add Windows service support to gateway status
[ ]P1#52487fix(windows): prevent restart race from duplicate schtasks /Run
[x]P1#52485fix(windows): detect stale gateway PIDs via netstat
[ ]P1#52291fix(ui): make ui:build work on Windows
[ ]P1#52200fix(skills): normalize backslashes in compacted skill paths on Windows
[ ]P1#51559fix(process): add windowsHide to spawn in runCommandWithTimeout
[ ]P1#51547fix(exec): default to GBK encoding on Windows (#50519)
[ ]P1#51486fix(daemon): query Windows task runtime directly
[ ]P1#50885process: fix Windows runExec garbled CJK output [AI-assisted]
[ ]P1#50586fix(exec): use gbk encoding for Windows cmd.exe wrapper [AI-assisted]
[ ]P1#50136fix(windows): stabilize gateway restart and avoid false stale cleanup [AI-assisted]
[ ]P1#50116fix: handle Windows-style session paths when running on POSIX
[ ]P1#48887Fix/docs format check windows clean
[ ]P1#48613Fix/compatible with native windows
[x]P1#48557test: normalize Windows plugin path assertions
[x]P1#48544fix(tests): stabilize Windows CI cases
[ ]P1#48320fix(windows): add windowsHide to all Windows spawn resolution paths
[ ]P1#48130fix: correct Windows Chrome executable path extraction regex
[ ]P1#47751fix: wrap bunx with cmd shim on Windows
[ ]P1#47734fix: handle Windows schtasks "Last Result" key variant
[ ]P1#46992Fix: Windows terminal encoding set to UTF-8
[ ]P1#45870fix: align windows path tests with runtime behavior
[ ]P1#45860fix(build): prefer usable POSIX shells for Windows bundling
[ ]P1#45380Make env-prefixed npm scripts work on Windows
[ ]P2#53788docs(windows): companion app copy and GitHub auth notes
[ ]P2#44234docs(windows): note Git Bash requirement for A2UI builds
[ ]P2#44228fix(reply): normalize Windows media paths for dedupe
[ ]P2#44215fix(path): add Windows PATH bootstrap dirs
[ ]P2#44211fix(build): use Git Bash wrapper for A2UI bundling on Windows
[ ]P2#43624fix(gateway): fall back to PowerShell when wmic unavailable on Windows
[ ]P2#43611decode Windows console output (GBK/CP936)
[ ]P2#42174fix: false error of Windows path when binding host path to sandbox
[ ]P2#39644fix(windows): PowerShell completion install and time-format detection
[ ]P2#38932docs(gateway): add Windows no-Docker hardening fallback guide
[ ]P2#38846security(windows): enhance command argument validation
[ ]P2#37592fix(windows): handle spaces in Node.js path for plugin install
[x]P2#32602Tests: skip ios-team-id on Windows
[x]P1#59466[codex] Hide Windows exec console windows
[x]P1#59843fix: detect PID recycling in gateway lock on Windows/macOS + startup progress
[ ]P2#59705[codex] improve parallels windows smoke logging (draft)
[x]P2#59647ci: raise Windows checks timeout to 90 minutes

5. WSL (Windows Subsystem for Linux) — Issues

Resolved?Priority#TitleLabelsAssignee
[x]P0#47590Gateway binds on WSL2 but never responds to probe/health/TUI
[ ]P1#53877Gateway self-probe fails under WSL2 mirrored networking (networkingMode=mirrored)
[x]P1#44180WSL2: os.networkInterfaces() can throw and crash gateway
[ ]P1#44051[skills] Skipping skill path error on WSL Environmentbug regression
[ ]P1#43891Build failure on Windows: canvas:a2ui:bundle triggers WSL instead of Git Bashbug bug:crash
[ ]P1#42557exec host=node: path validation breaks cross-platform (WSL->Windows)
[ ]P1#31980[WSL2 Mirrored Mode] Gateway fails to start — "another gateway instance" errorbug regression
[ ]P1#59833Telegram polling stalls on startup in 2026.4.1 (WSL2)bug regression
[x]P1#59065LINE provider breaks on WSL2 with Unable to resolve runtime module ./runtime-line.contractbug
[ ]P2#41553Surface diagnostics for Control UI auth in WSL2 + Windows setupsenhancement
[ ]P2#34239windows 11 wsl ubtuenhancement
[x]P2#20386Node host approval socket not responding on Windows/WSL
[x]P2#16649WSL2: Control Windows browsers (Edge, Chrome) from OpenClaw
[x]P2#7122DX Improvements for Windows/WSL2 Onboardingenhancement
[ ]P2#7057Flaky tests on Windows/WSL: timeouts and ENOENTenhancement

WSL — PRs

Resolved?Priority#TitleAssignee

6. Azure (Provider / Infrastructure) — Issues

Resolved?Priority#TitleLabelsAssignee
[x]P0#48939tui/agent not working when Azure OpenAI endpoint is onboardedbug
[ ]P1#54645400 error after update: 'reasoning' item provided without required following item (azure-openai-responses, gpt-5.3-codex)
[ ]P1#60546[Bug]: microsoft-foundry provider selects Claude deployments but routes them through OpenAI Foundry endpoints
[ ]P1#53506[Bug]: API Protocol Error 400 with Azure Reasoning Models in v2026.3.23 (works in v2026.3.18)
[ ]P1#52444Azure OpenAI (cognitiveservices) Chat Completions returns 404 with openai-completions API
[ ]P1#51869[Bug]: onboard-custom hardcodes input: ["text"] for non-Azure custom providers, silently disabling image/vision support
[x]P1#51735Config schema missing 'azure-openai-responses' in models.providers.*.api enum
[ ]P1#48107OpenAI SDK baseUrl query params silently dropped, breaking Azure OpenAI Responses API
[ ]P1#46971Azure OpenAI missing api-version query parameter causes 404 errors
[ ]P1#46676Azure OpenAI: api-version sent as header instead of query param causing 404
[ ]P1#38784Azure OpenAI models report 0 context tokens
[ ]P1#37123Azure OpenAI provider not appearing during onboardingbug regression
[ ]P1#34241Intermittent no-tool execution after switching to azure-openai-responsesbug regression
[ ]P1#32179Azure Foundry Anthropic: SSE stream events concatenated without delimiter
[x]P1#28641Custom provider not accepting Azure Cognitive Service URLbug
[x]P2#48899Fix dedicated ACA worker: missing SystemAssigned identity
[x]P2#48116Phase 10: Fix dedicated ACA provisioning — env vars, retry logic
[ ]P2#54820False positive: 'azure-bing-grounding' flagged as suspicious on ClawHub
[ ]P2#7249Support Claude Models via Azure serviceenhancement
[x]P3#25058azure-responses sends rs__ reference when supportsStore=false _(stale)*

Azure — PRs

Resolved?Priority#TitleAssignee

7. Microsoft 365 / SharePoint — Issues

Resolved?Priority#TitleLabelsAssignee
[x]P2#30299Microsoft SharePoint and Openclawenhancement
[x]P2#30023Native Microsoft 365 integration (like gog for Google Workspace)enhancement

Appendix: P0 Blockers (Start Here)

Resolved?#Title
[x]#54852msteams pathToRegexp crash on 2026.3.24
[x]#54755v2026.3.24: Express 5 route regression + duplicate plugin loop
[x]#54703Teams Broken After 2026.3.24 updates
[x]#53953msteams plugin crash — module singleton mismatch
[x]#54801Gateway can't start in Windows
[x]#54880PR: fix Teams HttpPlugin /api* route pattern
[ ]#48659PR: MSTeams harden integration (XL)
[x]#44857Broken bundled msteams extension
[x]#43648MS Teams inline images crash
[x]#48832Windows CHANNEL_IDS not iterable
[x]#48756Windows gateway restart/stop fail
[x]#48736Windows WebSocket 80% failure
[x]#47590WSL2 gateway unresponsive
[x]#48939Azure OpenAI endpoint broken

Appendix: Stale Items (Consider Closing)

Resolved?#Title
[x]#28014msteams inline image downloads (1:1 chats)
[x]#26599msteams false media:document detection
[x]#24797msteams image attachments (3 bugs)
[x]#17783Teams setup on Raspberry Pi
[x]#15622Teams deps wiped on npm update
[x]#14436JWT blocks Bot Framework webhooks
[x]#19908WhatsApp migration to Teams Graph
[x]#25856Windows cmd.exe flash from ARP
[x]#25376Exec allowlist unsupported platform
[x]#24441Windows reliability: lock + cron + instance guard
[x]#23612Windows installation failure
[x]#23509SIGUSR1 orphaned process
[x]#23109Silent media failure on Windows
[x]#21990Exec no stdout/stderr on Windows
[x]#21678Missing windowsHide:true
[x]#16323Windows command injection security
[x]#26160Obsidian skill Windows support
[x]#25058Azure rs_* reference leak
[x]#27765PR: msteams replyStyle DM override
[x]#26274PR: msteams image auth fix
[x]#25511PR: msteams suppress reasoning text
[x]#8964PR: msteams graph-upload tests
[x]#25758PR: Azure AI provider
[x]#17970PR: Azure function refactor
[x]#12059PR: Azure AI Foundry credentials

Audit Notes

  • Refreshed MS Teams tracker entries for merged fixes #62713, #62715, and #62716.
  • Backfilled missed Windows tracker entries from recent merged PRs/issues during audit.
  • Corrected summary counts after resolving stale/missed tracker rows.

Changed files

  • MICROSOFT_TRACKER.md (added, +546/-0)

Code Example

https://graph.microsoft.com/v1.0/chats/{conversationId}/messages/{messageId}

---

{
  "error": {
    "code": "NotFound",
    "message": "NotFound",
    "innerError": {
      "code": "1",
      "message": "Invalid ThreadId."
    }
  }
}

---

a:1dRsHCobZ1AxURzY05DcePY5NAOLanRc1nZgZ6frWzO8yB0XwH_DWytw_K2yiLRd8UpiKUgveWHCHPvJHV6sAirvHbZGI1ZARQN_eUNr32zD5AwOdySFgIVGsvGHGztN1

---

GET /v1.0/chats/{above_id}/messages/{msgId}404 NotFound, "Invalid ThreadId"
RAW_BUFFERClick to expand / collapse

Summary

File attachments (PDF, documents) sent in Teams personal DM chats are silently dropped. The agent receives <media:document> placeholder tags but no actual file content. Inline images in DMs may also be affected.

Root Cause

buildMSTeamsGraphMessageUrls() in inbound-media.ts uses the Bot Framework conversationId (format a:1dRsHC...) directly as the Graph API chatId parameter when constructing the Graph message URL:

https://graph.microsoft.com/v1.0/chats/{conversationId}/messages/{messageId}

However, the Bot Framework conversation ID for personal chats (a:... format) is not a valid Graph API chat ID. Graph API expects a different identifier (typically 19:[email protected] or an opaque GUID format). The Graph API returns:

{
  "error": {
    "code": "NotFound",
    "message": "NotFound",
    "innerError": {
      "code": "1",
      "message": "Invalid ThreadId."
    }
  }
}

This error is caught silently, resulting in "graph media fetch empty" in the debug logs with no visible error to the user or agent.

Reproduction

  1. Configure MS Teams channel with a bot registration that has Chat.Read.All and ChatMessage.Read.All (Application permissions, admin consented)
  2. Send a PDF or document file to the bot in a personal (1:1) DM
  3. Observe: agent receives <media:document> tag but no file content
  4. Gateway log shows: "graph media fetch empty" (DEBUG level)

Diagnostic Evidence

Bot Framework conversation ID (from msteams-conversations.json):

a:1dRsHCobZ1AxURzY05DcePY5NAOLanRc1nZgZ6frWzO8yB0XwH_DWytw_K2yiLRd8UpiKUgveWHCHPvJHV6sAirvHbZGI1ZARQN_eUNr32zD5AwOdySFgIVGsvGHGztN1

Graph API response when using this ID:

GET /v1.0/chats/{above_id}/messages/{msgId} → 404 NotFound, "Invalid ThreadId"

Graph API token is valid — independently verified by obtaining a client_credentials token and calling other Graph endpoints successfully.

Azure Bot permissions confirmed: Chat.Read.All + ChatMessage.Read.All (Application, admin consented). Client secret valid (expires 2027-02).

Additional Context

  • The "graph media fetch empty" log message fires on every inbound Teams message (not just file uploads), because all Teams messages have text/html attachments that trigger the Graph media fallback path. For text-only messages this is harmless (no media to download), but for file uploads it means the files are lost.

  • The debug logger at this call site only serializes the first two positional arguments, so the { attempts } diagnostic object (containing hostedStatus, attachmentStatus, tokenError, etc.) is silently dropped from the log output. This was also noted in #41390.

  • Issue #41390 describes the same fundamental problem (Bot Framework IDs ≠ Graph API IDs) but for team/channel routing. This issue is the personal DM media download variant.

Expected Fix

The Graph message URL builder should translate the Bot Framework a: conversation ID to the corresponding Graph API chat ID before constructing the URL. Microsoft's Bot Framework SDK may provide a mapping, or the Graph /chats endpoint could be queried to find the correct ID.

Alternatively, for personal DM file attachments, the Bot Framework activity itself may contain direct download URLs (via activity.attachments[].contentUrl) that could be fetched using the bot token instead of requiring the Graph API path.

Environment

  • OpenClaw: 2026.4.5 (3e72c03) — also reproduced on 2026.4.2
  • Node: v24.13.1
  • Platform: Ubuntu 24.04 (Linux 6.17.0-1009-aws, x64)
  • Channel: MS Teams (Bot Framework)
  • Chat type: Personal (1:1 DM)

Workaround

Upload files via alternative methods (OneDrive link, email, SCP to server) instead of Teams DM file attachments.

extent analysis

TL;DR

The most likely fix involves translating the Bot Framework conversation ID to the corresponding Graph API chat ID when constructing the Graph message URL to correctly fetch file attachments in personal DM chats.

Guidance

  • Verify that the Bot Framework SDK provides a mapping between conversation IDs and Graph API chat IDs, and use this mapping to construct the correct Graph message URL.
  • Alternatively, query the Graph /chats endpoint to find the correct chat ID for the given conversation ID.
  • Consider using the direct download URLs provided in the Bot Framework activity (activity.attachments[].contentUrl) for personal DM file attachments, which can be fetched using the bot token.
  • Review the Azure Bot permissions and ensure that Chat.Read.All and ChatMessage.Read.All are correctly configured and admin consented.

Example

No code example is provided as the issue requires a deeper understanding of the Bot Framework and Graph API integration, and the solution may involve using specific SDK methods or querying the Graph API.

Notes

The issue is specific to personal DM chats and file attachments, and the workaround of uploading files via alternative methods may not be suitable for all use cases. The fix should be tested thoroughly to ensure that it works correctly for all types of messages and file attachments.

Recommendation

Apply a workaround by using the direct download URLs provided in the Bot Framework activity for personal DM file attachments, as this may be a simpler and more reliable solution than translating conversation IDs or querying the Graph API. This approach can be implemented while a more permanent fix is developed and tested.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING