Skip to content

fix(msteams): block untrusted Teams service URLs#87334

Merged
eleqtrizit merged 1 commit into
openclaw:mainfrom
eleqtrizit:699
May 27, 2026
Merged

fix(msteams): block untrusted Teams service URLs#87334
eleqtrizit merged 1 commit into
openclaw:mainfrom
eleqtrizit:699

Conversation

@eleqtrizit

Copy link
Copy Markdown
Contributor

Summary

Block Microsoft Teams Bot Framework outbound activity requests from using connector credentials with untrusted serviceUrl hosts.

Changes

  • Add a Teams Bot Framework serviceUrl allowlist and matching SSRF policy for documented Microsoft Teams connector hosts.
  • Validate serviceUrl before constructing the Teams API client or sending update/delete REST calls with Bot Framework tokens.
  • Stop persisting blocked inbound serviceUrl values and remove blocked stored proactive references before reuse.
  • Add regression coverage for send, update, delete, stored-reference cleanup, and valid-host guard policy behavior.

Validation

Behavior addressed: Teams outbound send/update/delete paths no longer attach Bot Framework credentials to non-allowlisted serviceUrl hosts.

Real environment tested: Local Linux source checkout; Crabbox/Testbox remote proof was unavailable because no working crabbox binary is installed in this container.

Exact steps or command run after this patch:

  • node scripts/run-vitest.mjs extensions/msteams/src/sdk.test.ts extensions/msteams/src/send-context.test.ts extensions/msteams/src/monitor-handler/message-handler.authz.test.ts
  • corepack pnpm check:changed
  • node scripts/run-vitest.mjs extensions/msteams

Evidence after fix: Targeted Teams tests passed with 3 files / 62 tests; local changed check passed; full extensions/msteams Vitest lane passed with 66 files / 924 tests.

Observed result after fix: Blocked serviceUrl hosts reject before token lookup or fetch; valid Microsoft Teams service URLs still send through the guarded connector path.

What was not tested: Live Microsoft Teams tenant traffic and remote Crabbox/Testbox proof.

Notes

  • AI-assisted with Codex.
  • No CHANGELOG.md update.
  • No exploit walkthrough or advisory details are included in this public PR body.

@openclaw-barnacle openclaw-barnacle Bot added channel: msteams Channel integration: msteams size: M maintainer Maintainer-authored PR labels May 27, 2026
@eleqtrizit eleqtrizit self-assigned this May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed May 27, 2026, 12:14 PM ET / 16:14 UTC.

Summary
The PR adds a Microsoft Teams Bot Framework serviceUrl allowlist, applies it to send/update/delete and stored proactive references, and adds regression tests.

PR surface: Source +111, Tests +259. Total +370 across 8 files.

Reproducibility: yes. Source inspection shows a default-allowed trafficmanager.net serviceUrl can reach the Bot Framework attachment downloader, which acquires a Bot Framework token and sends Authorization on the initial fetch; the contributor proof covers send/update/delete but not this sibling path.

Review metrics: 1 noteworthy metric.

  • Token-bearing serviceUrl coverage: 4 guarded, 1 unresolved. The PR guards SDK send, update, delete, and stored proactive reuse, but Bot Framework attachment downloads remain a credential-bearing serviceUrl path to settle before merge.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🐚 platinum hermit
Patch quality: 🧂 unranked krab
Result: blocked by patch quality or review findings.

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

Rank-up moves:

  • Apply the same serviceUrl guard to Bot Framework attachment downloads or merge an equivalent attachment-auth fix first.
  • Add regression coverage for a blocked trafficmanager.net attachment serviceUrl before token acquisition or first-hop Authorization.
  • Resolve the overlap with fix(msteams): bind bot framework service urls #87160 so maintainers have one complete Teams serviceUrl hardening path.

Risk before merge

  • The PR fail-closes stored or inbound Teams serviceUrls that are outside the new allowlist, so a legitimate missing sovereign or edge endpoint could break send/update/delete or proactive delivery until the bot receives a fresh allowed reference.
  • The PR leaves the Bot Framework attachment serviceUrl path outside the new guard; current defaults allow trafficmanager.net media hosts and the attachment downloader can attach a Bot Framework token on the initial fetch.
  • There is an overlapping open Teams serviceUrl/media-auth PR, so maintainers need to choose whether to merge, combine, or sequence the two security changes.

Maintainer options:

  1. Cover every Bot Framework serviceUrl token path (recommended)
    Extend this branch, or combine it with the related media-auth branch, so send/update/delete/proactive and Bot Framework attachment downloads all reject or strip credentials consistently before merge.
  2. Accept a scoped partial hardening
    Maintainers can intentionally land only the activity-send hardening if they also keep a tracked follow-up for attachment serviceUrl credential handling and own the temporary boundary gap.
  3. Pause behind the related security PR
    If the serviceUrl contract should be solved in the media-auth PR first, pause this PR until the two branches have a single non-overlapping owner.

Next step before merge
Maintainer/security review should choose the canonical path between this PR and the related media-auth PR, then require the full Bot Framework serviceUrl credential boundary before merge.

Security
Needs attention: The diff improves Teams activity credential routing, but a concrete Bot Framework attachment serviceUrl token path remains outside the new allowlist.

Review findings

  • [P1] Guard the Bot Framework attachment serviceUrl path — extensions/msteams/src/monitor-handler/message-handler.ts:157
Review details

Best possible solution:

Land one complete Teams serviceUrl hardening path that reuses the same allowlist for every token-bearing Bot Framework URL surface, with maintainer/security approval and explicit proof for default-host send/update/delete, proactive reuse, and attachment-download behavior.

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

Yes. Source inspection shows a default-allowed trafficmanager.net serviceUrl can reach the Bot Framework attachment downloader, which acquires a Bot Framework token and sends Authorization on the initial fetch; the contributor proof covers send/update/delete but not this sibling path.

Is this the best way to solve the issue?

No. The send/update/delete guard is the right direction, but the PR is incomplete until the inbound Bot Framework attachment serviceUrl path reuses the same allowlist or is explicitly split to a merged canonical fix.

Full review comments:

  • [P1] Guard the Bot Framework attachment serviceUrl path — extensions/msteams/src/monitor-handler/message-handler.ts:157
    This sanitizes the stored reference, but the same inbound activity.serviceUrl still flows into resolveMSTeamsInboundMedia. For personal-DM attachment fallbacks, downloadMSTeamsBotFrameworkAttachment accepts default trafficmanager.net media hosts, gets a Bot Framework token, and sends it on the initial ${serviceUrl}/v3/attachments/... request before authAllowHosts can strip redirects. Reuse this serviceUrl allowlist for that media path, or merge the equivalent attachment-auth fix before this PR lands.
    Confidence: 0.88

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against d2a1f62d238b.

Label changes

Label changes:

  • add merge-risk: 🚨 security-boundary: The PR is meant to prevent Bot Framework credentials from reaching untrusted serviceUrl hosts, and one sibling token-bearing path remains unresolved.
  • add proof: sufficient: Contributor real behavior proof is sufficient. The follow-up comment provides redacted live output from a one-off runtime harness using the actual PR adapter and FS cleanup paths; it is sufficient for the changed local behavior but does not cover the remaining attachment path or live Teams tenant traffic.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🐚 platinum hermit and patch quality is 🧂 unranked krab.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The follow-up comment provides redacted live output from a one-off runtime harness using the actual PR adapter and FS cleanup paths; it is sufficient for the changed local behavior but does not cover the remaining attachment path or live Teams tenant traffic.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.
  • remove status: 📣 needs proof: Current PR status label is status: ⏳ waiting on author.

Label justifications:

  • P1: This is an urgent Teams channel credential-boundary fix that can affect real message delivery and token routing.
  • merge-risk: 🚨 compatibility: Existing stored references or legitimate Teams service hosts outside the new allowlist can start failing after upgrade.
  • merge-risk: 🚨 message-delivery: A missing allowed host or removed stored reference can suppress Teams send/update/delete/proactive delivery.
  • merge-risk: 🚨 security-boundary: The PR is meant to prevent Bot Framework credentials from reaching untrusted serviceUrl hosts, and one sibling token-bearing path remains unresolved.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🐚 platinum hermit and patch quality is 🧂 unranked krab.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The follow-up comment provides redacted live output from a one-off runtime harness using the actual PR adapter and FS cleanup paths; it is sufficient for the changed local behavior but does not cover the remaining attachment path or live Teams tenant traffic.
  • proof: sufficient: Contributor real behavior proof is sufficient. The follow-up comment provides redacted live output from a one-off runtime harness using the actual PR adapter and FS cleanup paths; it is sufficient for the changed local behavior but does not cover the remaining attachment path or live Teams tenant traffic.
Evidence reviewed

PR surface:

Source +111, Tests +259. Total +370 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 5 131 20 +111
Tests 3 273 14 +259
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 404 34 +370

Security concerns:

  • [high] Bot Framework attachment token can still follow raw serviceUrl — extensions/msteams/src/monitor-handler/message-handler.ts:157
    The current attachment downloader builds Bot Framework attachment URLs from the inbound serviceUrl and sends Authorization on the first fetch; this PR does not extend its new allowlist to that path, leaving the same credential-boundary class partially open.
    Confidence: 0.86

Acceptance criteria:

  • node scripts/run-vitest.mjs extensions/msteams/src/sdk.test.ts extensions/msteams/src/send-context.test.ts extensions/msteams/src/monitor-handler/message-handler.authz.test.ts
  • node scripts/run-vitest.mjs extensions/msteams/src/attachments/bot-framework.test.ts extensions/msteams/src/attachments/shared.test.ts extensions/msteams/src/monitor-handler/inbound-media.test.ts

What I checked:

  • Repository policy applied: Root AGENTS.md and extensions/AGENTS.md were read fully; the Teams plugin change is compatibility- and security-sensitive under the repo guidance for bundled plugins, provider/auth state, and whole-surface review. (AGENTS.md:13, d2a1f62d238b)
  • PR send/update/delete hardening: The PR adds bot-framework-service-url.ts and normalizes or rejects serviceUrl before the Teams SDK client and update/delete REST paths use Bot Framework tokens. (extensions/msteams/src/bot-framework-service-url.ts:8, f199b817d07c)
  • Current attachment default allowlist is broad: Current main allows trafficmanager.net for media downloads while the auth allowlist is narrower; that makes the Bot Framework attachment path part of the same credential boundary. (extensions/msteams/src/attachments/shared.ts:42, d2a1f62d238b)
  • Current attachment path can send the token on the first hop: Current main obtains a Bot Framework-scoped token after the serviceUrl host passes media allowHosts and then builds the attachment URL from serviceUrl with an Authorization header before the initial safeFetchWithPolicy call. (extensions/msteams/src/attachments/bot-framework.ts:190, d2a1f62d238b)
  • Initial fetch does not strip auth: safeFetchWithPolicy passes the initial request headers through; authorizationAllowHosts is only applied when following redirects, so callers must avoid adding Authorization for a non-auth-allowlisted first-hop URL. (extensions/msteams/src/attachments/shared.ts:547, d2a1f62d238b)
  • Raw inbound serviceUrl still feeds media: The message handler currently passes activity.serviceUrl into resolveMSTeamsInboundMedia, and this PR only normalizes the stored conversation reference in that file. (extensions/msteams/src/monitor-handler/message-handler.ts:607, d2a1f62d238b)

Likely related people:

  • steipete: Recent path history shows shared coercion and bounded media-download refactors touching the Teams SDK and media/auth helper surfaces involved in this review. (role: recent area contributor; confidence: medium; commits: 77d9ac30bb8d, 53d007bc878c; files: extensions/msteams/src/sdk.ts, extensions/msteams/src/attachments/shared.ts)
  • sudie-codes: Introduced the Bot Framework DM media attachment path that now needs to be reconciled with the new serviceUrl guard. (role: feature introducer; confidence: high; commits: ab9be8dba547; files: extensions/msteams/src/attachments/bot-framework.ts)
  • Beandon13: Recently worked on Teams Bot Framework JWT validation and outbound reply network-error behavior in the same SDK and monitor area. (role: recent auth/runtime contributor; confidence: medium; commits: eecda912ee75; files: extensions/msteams/src/sdk.ts, extensions/msteams/src/monitor.ts, extensions/msteams/src/monitor-handler/message-handler.ts)
  • vincentkoc: Recent Teams auth history includes binding global audience tokens to the app id in the validator surface adjacent to this PR's credential handling. (role: auth behavior contributor; confidence: medium; commits: e1840b858125; files: extensions/msteams/src/sdk.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.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. 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. labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress.

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.
What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@eleqtrizit

Copy link
Copy Markdown
Contributor Author

[CODEX BEHAVIORAL PROOF]

Behavior addressed: Teams outbound activity send/update/delete still work for an allowed Microsoft Bot Framework serviceUrl, and blocked serviceUrl hosts are rejected before Bot Framework token lookup, SDK send, or fetch. Existing blocked stored conversation references are also removed before proactive reuse.

Real environment tested: Local Linux source checkout at PR head f199b817d07ca83bcb0c0d32e544620e307bccd8. The proof imported the actual PR code from extensions/msteams/src/sdk.ts, used the actual createMSTeamsAdapter runtime path, and used the actual fetchWithSsrFGuard path for update/delete. No real Teams tenant secret was used; the token provider returned a redacted sentinel token. Crabbox/Testbox was not available in this container because the local Crabbox binary failed wrapper sanity checks.

Exact steps or command run after this patch: Ran a one-off runtime harness with node --import tsx --input-type=module from the repo root. It exercised:

  • allowed proactive ctx.sendActivity, ctx.updateActivity, and ctx.deleteActivity using https://smba.trafficmanager.net/amer/
  • blocked inbound sendActivity, updateActivity, and deleteActivity using a redacted non-Microsoft host
  • blocked stored-reference proactive reuse and the real FS conversation-store cleanup path

Evidence after fix:

{
  "adapterRuntimeProof": {
    "result": "PASS",
    "allowed": {
      "sdkCreates": 1,
      "fetchCalls": 2,
      "tokenLookups": 3,
      "fetchMethods": [
        "PUT:smba.trafficmanager.net",
        "DELETE:smba.trafficmanager.net"
      ]
    },
    "blocked": [
      {
        "method": "sendActivity",
        "status": 500,
        "tokenLookupsDelta": 0,
        "fetchCallsDelta": 0,
        "sdkCreateCallsDelta": 0
      },
      {
        "method": "updateActivity",
        "status": 500,
        "tokenLookupsDelta": 0,
        "fetchCallsDelta": 0,
        "sdkCreateCallsDelta": 0
      },
      {
        "method": "deleteActivity",
        "status": 500,
        "tokenLookupsDelta": 0,
        "fetchCallsDelta": 0,
        "sdkCreateCallsDelta": 0
      },
      {
        "method": "storedReference",
        "error": "Blocked Microsoft Teams serviceUrl host: <blocked-host>",
        "tokenLookupsDelta": 0,
        "fetchCallsDelta": 0,
        "sdkCreateCallsDelta": 0
      }
    ]
  },
  "storedReferenceFsProof": {
    "result": "PASS",
    "removedFromFsStore": true,
    "error": "Stored Microsoft Teams conversation reference has blocked serviceUrl host: <blocked-host>. The bot must receive a new message from this conversation before it can send proactively."
  }
}

Observed result after fix: The allowed host path normalized the service URL to https://smba.trafficmanager.net/amer, constructed the SDK send client, performed a redacted token lookup for send/update/delete, and issued PUT/DELETE fetches through the guarded connector URL. The blocked inbound and blocked stored-reference paths performed no token lookup, no SDK send, and no fetch. The blocked FS-backed stored reference was removed from the conversation store before proactive send setup continued.

Dependency and host-contract proof: @microsoft/teams.api@2.0.11 builds conversation activity URLs from the supplied serviceUrl, and @microsoft/teams.common@2.0.11 attaches Authorization: Bearer ... when a token callback is configured. Microsoft Learn lists the public, GCC, GCC High, and DoD proactive Teams Bot Framework service URL endpoints covered by this PR's allowlist: https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tutorial-step=2

What was not tested: Live Microsoft Teams tenant traffic, real Bot Framework credentials, and remote Crabbox/Testbox proof.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 27, 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:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 27, 2026
@eleqtrizit eleqtrizit merged commit 6255071 into openclaw:main May 27, 2026
182 of 200 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 28, 2026
@eleqtrizit eleqtrizit deleted the 699 branch May 28, 2026 20:20
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 31, 2026
…026.5.28) (#759)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.5.27` → `2026.5.28` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.5.28`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026528)

[Compare Source](openclaw/openclaw@v2026.5.27...v2026.5.28)

##### Highlights

- Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;87409](openclaw/openclaw#87409), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;88129](openclaw/openclaw#88129))
- Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;87160](openclaw/openclaw#87160))
- Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;87531](openclaw/openclaw#87531), [#&#8203;87682](openclaw/openclaw#87682), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;ngutman](https://github.com/ngutman) and [@&#8203;BunsDev](https://github.com/BunsDev).
- Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. ([#&#8203;82887](openclaw/openclaw#82887))
- Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87751](openclaw/openclaw#87751), [#&#8203;87794](openclaw/openclaw#87794))
- CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924)) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. ([#&#8203;86699](openclaw/openclaw#86699))
- Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening.

##### Changes

- Status: show active subagent details in status output.
- Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. ([#&#8203;87370](openclaw/openclaw#87370), [#&#8203;87372](openclaw/openclaw#87372)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- ClawHub: add plugin display names plus skill verification and trust surfaces. ([#&#8203;87354](openclaw/openclaw#87354), [#&#8203;86699](openclaw/openclaw#86699)) Thanks [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow) and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin) and [@&#8203;ngutman](https://github.com/ngutman).
- Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. ([#&#8203;87313](openclaw/openclaw#87313), [#&#8203;63050](openclaw/openclaw#63050), [#&#8203;87685](openclaw/openclaw#87685)) Thanks [@&#8203;bdjben](https://github.com/bdjben), [@&#8203;liaoandi](https://github.com/liaoandi), and [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow).
- PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. ([#&#8203;87670](openclaw/openclaw#87670), [#&#8203;87751](openclaw/openclaw#87751))
- Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87794](openclaw/openclaw#87794)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package.
- Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata.
- Workboard: add agent coordination tools for tracking and handing off active agent work.
- Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. ([#&#8203;85200](openclaw/openclaw#85200))
- Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. ([#&#8203;82823](openclaw/openclaw#82823), [#&#8203;87165](openclaw/openclaw#87165)) Thanks [@&#8203;piersonr](https://github.com/piersonr) and [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. ([#&#8203;85572](openclaw/openclaw#85572), [#&#8203;85744](openclaw/openclaw#85744), [#&#8203;86768](openclaw/openclaw#86768))

##### Fixes

- Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces.
- Tighten phone-control mutation authorization \[AI]. ([#&#8203;87150](openclaw/openclaw#87150)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Clarify directive persistence authorization policy \[AI]. ([#&#8203;86369](openclaw/openclaw#86369)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;86123](openclaw/openclaw#86123), [#&#8203;88129](openclaw/openclaw#88129), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;72574](openclaw/openclaw#72574), [#&#8203;87383](openclaw/openclaw#87383), [#&#8203;87400](openclaw/openclaw#87400), [#&#8203;83022](openclaw/openclaw#83022), [#&#8203;87671](openclaw/openclaw#87671), [#&#8203;87738](openclaw/openclaw#87738), [#&#8203;87747](openclaw/openclaw#87747), [#&#8203;87706](openclaw/openclaw#87706), [#&#8203;87546](openclaw/openclaw#87546), [#&#8203;87541](openclaw/openclaw#87541), [#&#8203;81048](openclaw/openclaw#81048)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky), [@&#8203;Alix-007](https://github.com/Alix-007), [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;yetval](https://github.com/yetval), [@&#8203;sjf](https://github.com/sjf), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;benjamin1492](https://github.com/benjamin1492), [@&#8203;c19354837](https://github.com/c19354837), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;pfrederiksen](https://github.com/pfrederiksen), and [@&#8203;dodge1218](https://github.com/dodge1218).
- Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly.
- Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87465](openclaw/openclaw#87465), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;76262](openclaw/openclaw#76262), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;87581](openclaw/openclaw#87581), [#&#8203;77114](openclaw/openclaw#77114), [#&#8203;86426](openclaw/openclaw#86426), [#&#8203;85529](openclaw/openclaw#85529), [#&#8203;87160](openclaw/openclaw#87160)) Thanks [@&#8203;zeroaltitude](https://github.com/zeroaltitude), [@&#8203;lukeboyett](https://github.com/lukeboyett), [@&#8203;jarvis-mns1](https://github.com/jarvis-mns1), [@&#8203;xiaotian](https://github.com/xiaotian), [@&#8203;funmerlin](https://github.com/funmerlin), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;heyitsaamir](https://github.com/heyitsaamir), [@&#8203;amittell](https://github.com/amittell), [@&#8203;lidge-jun](https://github.com/lidge-jun), [@&#8203;liorb-mountapps](https://github.com/liorb-mountapps), [@&#8203;masatohoshino](https://github.com/masatohoshino), [@&#8203;bladin](https://github.com/bladin), and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;87719](openclaw/openclaw#87719), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924), [#&#8203;84362](openclaw/openclaw#84362)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;samzong](https://github.com/samzong), [@&#8203;giodl73-repo](https://github.com/giodl73-repo), [@&#8203;alkor2000](https://github.com/alkor2000), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;nxmxbbd](https://github.com/nxmxbbd), and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. ([#&#8203;87810](openclaw/openclaw#87810), [#&#8203;87833](openclaw/openclaw#87833), [#&#8203;75089](openclaw/openclaw#75089)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;litang9](https://github.com/litang9).
- Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. ([#&#8203;87883](openclaw/openclaw#87883)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts.
- Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. ([#&#8203;82887](openclaw/openclaw#82887)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code).
- Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. ([#&#8203;87683](openclaw/openclaw#87683))
- WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. ([#&#8203;82492](openclaw/openclaw#82492)) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options.
- Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. ([#&#8203;87476](openclaw/openclaw#87476), [#&#8203;87423](openclaw/openclaw#87423))
- Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. ([#&#8203;86611](openclaw/openclaw#86611)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).
- Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. ([#&#8203;87593](openclaw/openclaw#87593), [#&#8203;87493](openclaw/openclaw#87493), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764)) Thanks [@&#8203;Pluviobyte](https://github.com/Pluviobyte) and [@&#8203;eleqtrizit](https://github.com/eleqtrizit).
- Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. ([#&#8203;87523](openclaw/openclaw#87523), [#&#8203;87982](openclaw/openclaw#87982))
- File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled.
- Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. ([#&#8203;87760](openclaw/openclaw#87760))
- Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. ([#&#8203;87647](openclaw/openclaw#87647), [#&#8203;87477](openclaw/openclaw#87477)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. ([#&#8203;87839](openclaw/openclaw#87839))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/759
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: msteams Channel integration: msteams maintainer Maintainer-authored PR 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. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: M status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant