Skip to content

fix(msteams): recover inbound channel and group-chat files safely#90738

Merged
steipete merged 4 commits into
openclaw:mainfrom
colton-octaria:fix/msteams-channel-file-attachments
Jul 10, 2026
Merged

fix(msteams): recover inbound channel and group-chat files safely#90738
steipete merged 4 commits into
openclaw:mainfrom
colton-octaria:fix/msteams-channel-file-attachments

Conversation

@colton-octaria

@colton-octaria colton-octaria commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Microsoft Teams channel and group-chat files were not reliably recoverable from inbound activities. Channel requests could use the Bot Framework team id where Microsoft Graph requires the team's AAD group id; thread replies could fall back to the root message and surface the wrong file; and Teams can omit HTML file markers even though the Graph message still carries attachments.

The same audit found two unsafe adjacent paths: app-only bot tokens were sent to delegated-only /me/chats and /me/drive endpoints. Those calls could not succeed and obscured the actual identifier and SharePoint requirements.

Fixes #89594.

Why This Change Was Made

The maintainer rewrite establishes one canonical, fail-closed path:

  • Channel roots use /teams/{aadGroupId}/channels/{channelId}/messages/{messageId}.
  • Channel replies use only /messages/{rootMessageId}/replies/{replyMessageId}; a failed reply lookup never falls back to the root.
  • Group chats use /chats/{chatId}/messages/{messageId}.
  • The canonical team AAD group id comes from activity metadata or the regional Teams SDK getTeamDetails API, then flows through media, thread context, and native channel actions.
  • Personal-chat files remain on the Bot Framework attachment API with their exact Bot Framework conversation id.
  • A shared 10-second preprocessing deadline bounds identity, media, token, quote, and thread enrichment, while guarded responses are released before nested downloads.
  • App-incompatible /me/chats discovery, persisted graphChatId state, guessed identifiers, speculative URL candidates, and the dead /me/drive upload fallback are deleted.
  • Group/channel non-image sends now use the configured SharePoint path or fail with an actionable channels.msteams.sharePointSiteId error.

Config review metric: this adds one optional surface, channels.msteams.graphMediaFallback. It defaults to false. When enabled, markerless channel/group HTML can trigger one Graph message lookup, including ordinary or mention-only activities, so operators opt into the extra traffic and Graph permissions explicitly. Explicit attachment markers continue to use Graph recovery without enabling the setting.

The resulting production diff is net-negative and keeps all Teams-specific policy inside the Microsoft Teams plugin.

User Impact

With the documented Graph consent and graphMediaFallback: true, agents can recover files from markerless top-level channel messages, the exact channel reply being handled, and group chats. Missing or invalid identity fails closed rather than returning a neighboring or root attachment. Personal-chat file handling is unchanged.

For outbound files, DMs still use FileConsentCard and images can remain inline. Group-chat/channel non-image files require sharePointSiteId; the previous app-only OneDrive path never represented a working fallback.

Evidence

Live-proof gap: the final rewrite could not be deployed into an authenticated Microsoft 365 tenant with the necessary Graph/file consent and channel, group-chat, and personal-chat fixtures. Earlier contributor proof supports the reported group-chat failure, but is not claimed as exact-rewrite proof. Clearing this gap requires unique PDF/audio canaries, root-A/reply-B selection, markerless group activity, a personal-file regression, a mention-only/no-file case, and missing/bogus identity negatives.

Reported by @cmc099. Implementation and investigation credit to @colton-octaria and @packwood; this rewrite incorporates the safe, default-off behavior from #101096.

@openclaw-barnacle openclaw-barnacle Bot added channel: msteams Channel integration: msteams size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 9, 2026, 7:18 PM ET / 23:18 UTC.

Summary
The PR changes the Microsoft Teams plugin to recover inbound channel, channel-reply, and group-chat attachments through one canonical Microsoft Graph message URL while preserving personal-chat attachment handling.

PR surface: Source -52, Tests +114. Total +62 across 6 files.

Reproducibility: yes. Current main and v2026.6.11 still show the old attachment-id gate and channel URL builder, and the linked issue/PR comments provide live Teams and Graph evidence for channel and group-chat attachment loss.

Review metrics: 2 noteworthy metrics.

  • Graph fallback gate: 1 fallback condition changed. This condition decides when Teams channel/group messages start Graph media lookup, so it is the main maintainer-visible tradeoff before merge.
  • Graph URL fallback stack: multi-candidate list replaced by 1 canonical URL. The PR removes ambiguous root/reply URL attempts and makes incomplete Teams identities fail closed instead of probing neighboring messages.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #89594
Summary: This PR is the active candidate fix for the canonical Microsoft Teams non-personal inbound attachment loss issue; related Teams DM and group-chat items are adjacent or partially overlapping rather than replacements.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🐚 platinum hermit
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

  • [P1] The PR intentionally starts Graph media lookup for Microsoft Teams channel/group HTML stubs, so existing deployments can see extra Graph token/message requests, latency, and diagnostics for mention-only traffic that previously stopped before Graph.
  • [P1] The PR body calls out that the current maintainer rewrite was not replayed in a live Microsoft 365 tenant; the earlier live proof supports the same user behavior, but exact-head tenant proof remains a maintainer acceptance gap.
  • [P2] The open group-chat fallback PR at fix(msteams): add graphMediaFallback so group-chat file attachments reach the agent #101096 overlaps this PR's group-chat behavior, so maintainers should reconcile that branch before landing both independently.

Maintainer options:

  1. Accept the canonical Graph lookup tradeoff (recommended)
    Merge once maintainers accept that Teams channel/group HTML stubs may start a Graph message lookup to recover files that Bot Framework did not expose.
  2. Gate the fallback before merge
    Require a config opt-in or stricter runtime signal if extra Graph reads for mention-only channel/group traffic are not acceptable by default.
  3. Wait for exact-head tenant proof
    Pause until exact-head live tenant proof covers channel roots, channel replies, group chats, mention-only messages, and personal chats if deterministic tests plus prior live proof are not enough.

Next step before merge

  • No automated repair is indicated; the remaining action is maintainer acceptance of the Teams Graph fallback tradeoff plus normal exact-head merge checks.

Maintainer decision needed

  • Question: Should this PR land with automatic Microsoft Teams channel/group Graph media lookup for HTML-stub messages, or should that fallback be opt-in or narrower before merge?
  • Rationale: The code path is coherent, but the default affects existing Teams deployments through extra Graph reads, permissions expectations, diagnostics, and whether attached files reach the agent-visible message context.
  • Likely owner: steipete — They are assigned to the PR and authored the latest canonical Graph attachment recovery rewrite on this branch.
  • Options:
    • Accept automatic non-personal fallback (recommended): Merge after normal exact-head checks, treating a channel/group HTML stub as enough signal to attempt one canonical Graph message lookup for media recovery.
    • Require opt-in or stricter gate: Ask for a config-gated or narrower fallback if maintainers want to preserve the old mention-only protection by default for existing installs.
    • Pause for exact-head tenant replay: Hold the PR until someone replays this exact head in a live Microsoft 365 tenant across channel roots, thread replies, group chats, mention-only messages, and personal chats.

Security
Cleared: The diff changes Teams plugin URL selection, Graph fallback logic, local structural types, and tests only; it adds no dependency, workflow, lockfile, credential, or new code-execution surface.

Review details

Best possible solution:

Land this Teams-plugin fix, or an equivalent reconciled fix, after maintainers accept the automatic non-personal Graph fallback policy and confirm the normal exact-head merge checks.

Do we have a high-confidence way to reproduce the issue?

Yes. Current main and v2026.6.11 still show the old attachment-id gate and channel URL builder, and the linked issue/PR comments provide live Teams and Graph evidence for channel and group-chat attachment loss.

Is this the best way to solve the issue?

Yes, with maintainer acceptance of the fallback policy. The fix stays in the Microsoft Teams plugin, follows Microsoft Graph's channel/reply/chat URL shapes, removes ambiguous URL fallback attempts, and adds focused regression coverage.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against fe2486247b6f.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The PR changes default fallback behavior for existing Teams channel/group messages by starting Graph lookup for HTML stubs that previously did not fetch Graph media.

Label justifications:

  • P2: This is a focused Microsoft Teams attachment recovery bug fix with real workflow impact and a bounded bundled-plugin blast radius.
  • merge-risk: 🚨 compatibility: The PR changes default fallback behavior for existing Teams channel/group messages by starting Graph lookup for HTML stubs that previously did not fetch Graph media.
  • merge-risk: 🚨 message-delivery: Changing Teams Graph media lookup can affect whether inbound attached files appear in the agent-visible message context or remain unavailable.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (logs): The PR has redacted live Teams proof for the reported behavior plus copied focused-suite output for the current rewrite; the exact-head tenant replay gap remains visible as maintainer merge-risk context.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR has redacted live Teams proof for the reported behavior plus copied focused-suite output for the current rewrite; the exact-head tenant replay gap remains visible as maintainer merge-risk context.
Evidence reviewed

PR surface:

Source -52, Tests +114. Total +62 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 4 54 106 -52
Tests 2 189 75 +114
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 243 181 +62

What I checked:

Likely related people:

  • steipete: Live PR state assigns them, the latest rewrite commit on this branch is theirs, and main history shows recent Teams inbound-media/message-handler work in the same area. (role: recent area contributor and assigned decision owner; confidence: high; commits: 2d8d2f299758, 73fc0f5c5fa3, 58912f8fd842; files: extensions/msteams/src/attachments/graph.ts, extensions/msteams/src/monitor-handler/inbound-media.ts, extensions/msteams/src/monitor-handler/message-handler.ts)
  • sudie-codes: They authored the merged change that added the current HTML attachment-id fallback gate to avoid mention-only Graph lookup noise, which is the compatibility constraint this PR changes. (role: introduced related fallback gate behavior; confidence: high; commits: 2c211d171e88, 2084441b51aa, ab9be8dba547; files: extensions/msteams/src/monitor-handler/inbound-media.ts, extensions/msteams/src/attachments/graph.ts, extensions/msteams/src/monitor-handler/inbound-media.test.ts)
  • vincentkoc: Path history shows recent Teams Graph media diagnostic work in the same attachment and inbound-media surfaces. (role: recent adjacent diagnostics contributor; confidence: medium; commits: b62251817e57; files: extensions/msteams/src/attachments/graph.ts, extensions/msteams/src/monitor-handler/inbound-media.ts)
  • cxbAsDev: Recent main history touched graph.ts to bound Graph attachment and message JSON responses, which is adjacent to this PR's Graph media fetch path. (role: recent adjacent Graph media contributor; confidence: medium; commits: 090c3a26d051; files: extensions/msteams/src/attachments/graph.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (3 earlier review cycles)
  • reviewed 2026-06-22T00:32:37.599Z sha 4b500d9 :: needs maintainer review before merge. :: none
  • reviewed 2026-06-30T20:53:56.483Z sha 4b500d9 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-09T21:20:16.682Z sha cb7b9b9 :: needs maintainer review before merge. :: none

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 11, 2026
@colton-octaria

Copy link
Copy Markdown
Contributor Author

Pushed 366a383 addressing the P2 finding (maintainer option 1 — narrow the fallback trigger).

Gate change (extensions/msteams/src/monitor-handler/inbound-media.ts): the Graph media fallback now requires the activity to carry a text/html attachment (the Teams stub) in addition to mediaList.length === 0 && !isBotFrameworkPersonalChatId(conversationId). Channel/group @mention activities always deliver that stub — with or without <attachment id> markers — so the #89594 fix is preserved, while messages with no text/html attachment at all never start Graph token/message requests. The existing no-text/html skip invariant is kept rather than replaced.

Tests (extensions/msteams/src/monitor-handler/inbound-media.test.ts): the "graph fallback trigger" block now runs in channel context (conversationType channel, a 19:…@thread.tacv2 conversation id, channelData.team.aadGroupId) instead of a personal DM, so the trigger tests exercise the surface they gate. The does NOT trigger Graph fallback when no attachments are text/html case — the one the review flagged as contradicted — now passes against the narrowed gate for the right reason (no stub → no Graph call), and the mention-only HTML-stub case still triggers the fallback. The Bot Framework DM cases keep their explicit personal-chat setup.

Acceptance criteria (copied output, run on this branch):

$ node scripts/run-vitest.mjs extensions/msteams/src/monitor-handler/inbound-media.test.ts extensions/msteams/src/attachments.helpers.test.ts
 Test Files  2 passed (2)
      Tests  28 passed (28)

$ node scripts/run-vitest.mjs extensions/msteams/src/attachments/graph.test.ts
 Test Files  1 passed (1)
      Tests  11 passed (11)

Live re-verification after the gate change: deployed this exact patch onto a v2026.6.5 install on a live Microsoft Teams tenant today. Channel @mention with a PDF attached to a top-level message → the correct file is read (agent produced an accurate summary of that document); thread-reply follow-ups → handled in-thread; mention-only channel messages with no file → answered normally with no Graph fetch diagnostics; personal-chat files → unaffected. Before/after screenshots available on request.

No CHANGELOG or PR-body changes.

@colton-octaria

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@colton-octaria

Copy link
Copy Markdown
Contributor Author

CI note: the failing checks on the latest run are unrelated to this PR. The merge-ref typecheck fails at src/agents/sessions/sdk.ts(279,19)Model<Api> is not assignable to ThinkingCatalogEntry in the plugin-sdk boundary dts — introduced on main by 4f3c2cd (#91657, merged 11:36 UTC today, ~15 minutes before this PR's checks ran). This PR touches only extensions/msteams/**; the same failure reproduces from main alone. Happy to rebase/re-run once main is green.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 11, 2026
@colton-octaria
colton-octaria force-pushed the fix/msteams-channel-file-attachments branch from 366a383 to 4b500d9 Compare June 13, 2026 04:06
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. proof: sufficient ClawSweeper judged the real behavior proof convincing. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 13, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 15, 2026
@steipete steipete self-assigned this Jul 9, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. label Jul 9, 2026
clwilliams8 and others added 4 commits July 10, 2026 02:11
Three bugs blocked reading files attached to channel messages:
- Graph /teams/{id} used channelData.team.id (the 19:[email protected] thread id)
  instead of team.aadGroupId (the AAD group GUID) -> 400.
- The Graph fetch was gated on an <attachment id> HTML marker that channel
  @mention activities don't carry -> fetch skipped.
- A thread reply was fetched at /messages/{replyId} (404) then fell back to the
  bare thread root, returning the root's file for every reply. Replies live at
  /messages/{root}/replies/{replyId}.

Fixes openclaw#89594
Build one canonical Graph message URL per Teams activity, recover marker-free channel and group-chat file shares, and retain bounded current-main attachment handling.

Co-authored-by: Colton Williams <[email protected]>
Recover channel and group-chat files through one fail-closed Graph identity path, bound inbound enrichment, and remove invalid app-only Graph fallbacks.

Co-authored-by: Colton Williams <[email protected]>
Co-authored-by: Joshua Packwood <[email protected]>
@steipete
steipete force-pushed the fix/msteams-channel-file-attachments branch from cb7b9b9 to cae9fb6 Compare July 10, 2026 01:11
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: XL and removed size: M labels Jul 10, 2026
@steipete steipete changed the title fix(msteams): read file attachments on Teams channel messages (team GUID + channel fallback + thread-reply URL) fix(msteams): recover inbound channel and group-chat files safely Jul 10, 2026
@steipete

Copy link
Copy Markdown
Contributor

Maintainer rewrite and exact-head verification complete.

Final head: cae9fb6979f8cc890184a4f7c5ad8a53963b47fc

What changed:

  • canonical AAD group identity from activity metadata or regional Teams getTeamDetails
  • exactly one Graph URL for channel roots, channel replies, and group chats
  • reply failures fail closed and never fall back to the thread root
  • personal files remain on the exact Bot Framework attachment path
  • markerless Graph recovery is opt-in via channels.msteams.graphMediaFallback (default false)
  • one 10-second deadline bounds identity, media, token, quote, and thread enrichment
  • invalid app-only /me/chats and /me/drive paths, guessed identifiers, and persisted graphChatId state removed
  • outbound group/channel non-image files now require configured SharePoint instead of a dead OneDrive fallback

Proof:

  • Blacksmith Testbox tbx_01kx4j4ffeh725ahz8thv4qwqw: focused Teams/config/docs matrix, 38 files / 586 tests passed
  • same Testbox: full Microsoft Teams suite, 73 files / 1,038 tests passed
  • same Testbox: full pnpm check:changed passed in 8m56.493s, including guards, four tsgo lanes, core/extension lint, generated metadata, database/media/sidecar/import-cycle/webhook/pairing checks
  • fresh Codex gpt-5.5 xhigh autoreview 019f497b-49d6-7e63-ae2b-1d60e7000a47: zero findings, patch correct
  • native review artifacts: READY, zero findings
  • exact-head hosted CI: run 29061818438, success with no failed or pending jobs
  • OPENCLAW_TESTBOX=1 scripts/pr prepare-run 90738: completed in hosted_exact mode on the final SHA

Live-proof gap: this host has no authenticated Microsoft 365 tenant with the required Graph/file consent and channel, group-chat, and personal-chat fixtures. Earlier contributor evidence supports the reported failure, but I am not transferring it to the final rewrite. A full live replay would use distinct PDF/audio canaries for root-A/reply-B, markerless group chat, personal chat, mention-only/no-file, and bogus/missing identity negatives.

Thanks @colton-octaria and @packwood for the implementation and investigation, and @cmc099 for the report.

@steipete
steipete merged commit dc8c0aa into openclaw:main Jul 10, 2026
118 of 120 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 10, 2026
…enclaw#90738)

* fix(msteams): read file attachments on Teams channel messages

Three bugs blocked reading files attached to channel messages:
- Graph /teams/{id} used channelData.team.id (the 19:[email protected] thread id)
  instead of team.aadGroupId (the AAD group GUID) -> 400.
- The Graph fetch was gated on an <attachment id> HTML marker that channel
  @mention activities don't carry -> fetch skipped.
- A thread reply was fetched at /messages/{replyId} (404) then fell back to the
  bare thread root, returning the root's file for every reply. Replies live at
  /messages/{root}/replies/{replyId}.

Fixes openclaw#89594

* fix(msteams): gate Graph media fallback on text/html stub; run trigger tests in channel context

* fix(msteams): canonicalize Graph attachment recovery

Build one canonical Graph message URL per Teams activity, recover marker-free channel and group-chat file shares, and retain bounded current-main attachment handling.

Co-authored-by: Colton Williams <[email protected]>

* fix(msteams): canonicalize Graph media recovery

Recover channel and group-chat files through one fail-closed Graph identity path, bound inbound enrichment, and remove invalid app-only Graph fallbacks.

Co-authored-by: Colton Williams <[email protected]>
Co-authored-by: Joshua Packwood <[email protected]>

---------

Co-authored-by: Colton Williams <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
Co-authored-by: Joshua Packwood <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: msteams Channel integration: msteams docs Improvements or additions to documentation merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: In msteams channel messages, OpenClaw can't access inbound attachments

3 participants