Skip to content

[Fix] Prefer external session delivery context#87476

Merged
steipete merged 3 commits into
openclaw:mainfrom
samzong:fix/session-delivery-context-precedence
May 29, 2026
Merged

[Fix] Prefer external session delivery context#87476
steipete merged 3 commits into
openclaw:mainfrom
samzong:fix/session-delivery-context-precedence

Conversation

@samzong

@samzong samzong commented May 28, 2026

Copy link
Copy Markdown
Contributor

Summary

What problem does this PR solve?

  • sessions_send announce delivery could fall back to stale internal WebChat route fields even when the persisted session row had an external delivery context.

Why does this matter now?

What is the intended outcome?

  • A deliverable external deliveryContext wins over stale internal route data, while preserving account and thread metadata.

What is intentionally out of scope?

  • No Feishu-specific branch.
  • No new config flag.
  • No broader channel routing rewrite.

What does success look like?

  • A row with stale webchat route state and external delivery context resolves to the external target and sends through that channel.
  • Tool-only contexts such as sessions_send are not treated as channel delivery targets.

What should reviewers focus on?

  • The precedence rule in src/utils/delivery-context.shared.ts.
  • The sessions_send announce path through src/agents/tools/sessions-announce-target.ts.
  • Whether the fix stays generic instead of special-casing one channel.

Linked context

Which issue does this close?

Closes #76104

Which issues, PRs, or discussions are related?

Related #33786, #47797, #63143, #63506, #66073, #72806

Was this requested by a maintainer or owner?

Issue #76104 came from user-reported behavior and maintainer triage.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: sessions_send announce target resolution no longer lets stale internal webchat route state override a deliverable external deliveryContext.

  • Real environment tested: Local OpenClaw Gateway child process with a temp config/state dir, real WebSocket Gateway RPC, real sessions.list, production resolveAnnounceTarget, real send RPC, bundled qa-channel plugin loaded through the OpenClaw plugin loader, and qa-lab HTTP bus outbound capture. qa-channel is OpenClaw's deterministic transport for exercising the same channel plugin boundary as external transports.

  • Exact steps or command run after this patch: Ran node --import tsx --input-type=module from the repo root with a proof script that started qa-lab bus, wrote a temp OpenClaw config, loaded the clickclack and qa-channel plugin registry entries through loadOpenClawPlugins, seeded sessions.json with channel=webchat, lastTo=session:dashboard, and deliveryContext.channel=qa-channel, started node scripts/run-node.mjs gateway run --port <port> --auth token --token <token> --allow-unconfigured --ws-log compact, called sessions.list, called production resolveAnnounceTarget, called Gateway send, and waited for the qa-lab bus outbound message.

  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):

    Config warnings:
    - plugins: plugin: ignored plugins.load.paths entry that points at OpenClaw's legacy bundled plugin directory; remove this redundant path or run openclaw doctor --fix
    [proof] gateway health ok version=unknown port=49308
    [proof] qa-channel bus=http://127.0.0.1:49309
    [proof] qa-channel ready accountStatus=running
    [proof] sessions.list row key=agent:main:clickclack:channel:proof-room channel=webchat lastChannel=qa-channel lastTo=group:qa-proof-room route.channel=undefined route.to=undefined deliveryContext.channel=qa-channel deliveryContext.to=group:qa-proof-room deliveryContext.threadId=thread-77
    [proof] resolveAnnounceTarget channel=qa-channel to=group:qa-proof-room accountId=default threadId=thread-77
    [proof] send RPC ok channel=qa-channel messageId=7a28b92b-50c8-406c-92a6-6eeff7799046
    [proof] qa-bus outbound direction=outbound conversation.kind=channel conversation.id=qa-proof-room threadId=thread-77 text=real-proof-76104-31e07741
    [proof] PASS external deliveryContext won over stale webchat route and delivered through qa-channel outbound bus
    
  • Observed result after fix: The announce target resolved to qa-channel/group:qa-proof-room/thread-77, and the Gateway send RPC produced an outbound qa-bus message for that conversation and thread. It did not target session:dashboard or WebChat.

  • What was not tested: Live Feishu delivery with real Feishu credentials was not run in this local environment.

  • Proof limitations or environment constraints: The proof uses OpenClaw's bundled deterministic qa-channel transport in place of Feishu while keeping the changed Gateway/session route-resolution boundary real. The warning about plugins.load.paths is from intentionally pointing the temp config at a bundled plugin directory for the local proof run; the plugin still loaded and ran.

  • Before evidence (optional but encouraged): No live pre-patch capture was kept. The proof seeded the stale webchat route shape from the reported failure and captured the after-fix Gateway behavior on this PR head.

Tests and validation

Which commands did you run?

  • node --import tsx --input-type=module real Gateway/qa-channel proof command above.
  • node scripts/run-vitest.mjs src/gateway/server.sessions-send.test.ts
  • node scripts/run-vitest.mjs src/utils/delivery-context.test.ts src/agents/tools/sessions.test.ts
  • pnpm exec oxfmt --check src/gateway/server.sessions-send.test.ts src/utils/delivery-context.shared.ts src/utils/delivery-context.test.ts src/agents/tools/sessions.test.ts
  • git diff --cached --check
  • .agents/skills/autoreview/scripts/autoreview --mode local

What regression coverage was added or updated?

  • Added coverage for external delivery context winning over stale internal WebChat route state in the session delivery-context merge logic.
  • Added coverage for sessions_send announce delivery through Gateway send using the external delivery context.
  • Updated session target coverage so tool-only contexts are not promoted as channel delivery targets.

What failed before this fix, if known?

  • The reported failure mode was that a Feishu-originated sessions_send reply could route to WebChat because stale internal session route fields won over the persisted external delivery context.

If no test was added, why not?

  • Regression coverage was added.

Risk checklist

Did user-visible behavior change? (Yes/No)

Yes.

Did config, environment, or migration behavior change? (Yes/No)

No.

Did security, auth, secrets, network, or tool execution behavior change? (Yes/No)

No.

What is the highest-risk area?

Session delivery-context precedence for channel replies and sessions_send announce delivery.

How is that risk mitigated?

The change is scoped to internal/non-delivery route fallback handling, keeps external route-first behavior intact, and is covered by focused regression tests plus the real Gateway/qa-channel proof above.

Current review state

What is the next action?

Ready for maintainer review.

What is still waiting on author, maintainer, CI, or external proof?

Waiting on GitHub CI and maintainer review.

Which bot or reviewer comments were addressed?

The PR body was rewritten to follow the template's Real behavior proof format with real Gateway behavior proof instead of using unit-test output as proof.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime agents Agent runtime and tooling size: M triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels May 28, 2026
@clawsweeper

clawsweeper Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed May 28, 2026, 10:53 PM ET / 02:53 UTC.

Summary
The PR changes session announce routing so a persisted external deliveryContext can win over stale internal WebChat route fields, adds Feishu metadata and routing tests, and refreshes adjacent cron/TUI test support and prompt snapshots.

PR surface: Source +50, Tests +307. Total +357 across 15 files.

Reproducibility: yes. Source inspection shows current main can return the parsed Feishu session-key fallback before sessions.list hydration unless the channel metadata opt-in is present; the linked report provides the mixed webchat plus Feishu deliveryContext row shape.

Review metrics: 2 noteworthy metrics.

  • Announce lookup opt-ins: 1 runtime channel opt-in added, 0 package/catalog opt-ins added. Feishu announce delivery depends on the opt-in being present on every metadata surface that can represent the channel before sessions.list hydration runs.
  • Shared routing precedence: 1 session delivery normalizer changed. The PR changes persisted session delivery precedence for mixed internal and external route state, which is user-visible for upgraded sessions.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • [P2] Mirror preferSessionLookupForAnnounceTarget into Feishu package/catalog metadata and add a focused test for that surface.
  • Rebase or otherwise resolve the dirty branch against current main before maintainer merge review.
  • Rerun the targeted sessions_send, delivery-context, Feishu metadata, and snapshot checks on the final head.

Risk before merge

  • [P1] Merging changes precedence for persisted session rows, so stale or incorrect external deliveryContext values can now override internal WebChat route state and affect upgraded sessions.
  • [P2] Feishu package/catalog metadata currently lacks the new announce lookup opt-in, so metadata-derived channel surfaces may still skip sessions.list and route by key fallback instead of the persisted external deliveryContext.
  • [P1] The branch is currently dirty against main, so maintainers need a rebase/conflict pass before trusting the final merge result.

Maintainer options:

  1. Fix metadata and rebase before merge (recommended)
    Mirror the Feishu announce lookup flag into package/catalog metadata, add coverage for that metadata path, then rebase the dirty branch and rerun the focused routing checks.
  2. Accept runtime-only scope deliberately
    Maintainers could land this as-is only if they are comfortable that all affected Feishu sessions_send paths load the full runtime plugin before announce target resolution.
  3. Pause until the routing cluster settles
    If the dirty branch overlaps too much with nearby session-routing PRs, pause this PR and keep the linked Feishu issue open until one canonical routing fix owns the cluster.

Next step before merge

  • [P2] Human follow-up is needed because the branch is dirty and the remaining metadata-surface blocker affects whether the Feishu routing fix really applies in all supported plugin discovery paths.

Security
Cleared: The diff does not add dependencies, workflows, permissions, secrets handling, downloaded code, or new code-execution paths; the security-sensitive surface is unchanged.

Review findings

  • [P1] Mirror the Feishu announce flag into package metadata — extensions/feishu/src/channel.ts:142
Review details

Best possible solution:

Land a rebased PR that keeps the generic delivery-context precedence fix, mirrors the Feishu announce lookup flag across runtime and package/catalog metadata, and preserves the focused regression tests plus real Gateway proof.

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

Yes. Source inspection shows current main can return the parsed Feishu session-key fallback before sessions.list hydration unless the channel metadata opt-in is present; the linked report provides the mixed webchat plus Feishu deliveryContext row shape.

Is this the best way to solve the issue?

No, not as-is. The generic precedence change is the right repair direction, but the Feishu opt-in needs package/catalog metadata coverage and the dirty branch needs a rebase before this is the narrow maintainable fix.

Full review comments:

  • [P1] Mirror the Feishu announce flag into package metadata — extensions/feishu/src/channel.ts:142
    This only adds the sessions.list announce lookup opt-in to feishuPlugin.meta. Feishu also has package/openclaw channel metadata used by catalog and lightweight plugin surfaces, and that metadata still lacks the flag, so those paths can keep returning the key-derived Feishu fallback before the new external deliveryContext precedence runs. Please mirror the flag into the package/catalog metadata path and cover that lookup surface.
    Confidence: 0.86

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 6e25112aad71.

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The shared normalizer changes how existing persisted session rows with mixed WebChat and external delivery context are interpreted after upgrade.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body supplies copied live Gateway/qa-channel output showing the after-fix route resolving to the external channel and producing an outbound bus message; it does not cover the remaining Feishu package metadata gap.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: 👀 ready for maintainer look: Current PR status label is status: ⏳ waiting on author.

Label justifications:

  • P1: The PR targets a broken sessions_send channel workflow that can route real external-channel replies to WebChat instead of the user’s originating conversation.
  • merge-risk: 🚨 compatibility: The shared normalizer changes how existing persisted session rows with mixed WebChat and external delivery context are interpreted after upgrade.
  • merge-risk: 🚨 message-delivery: The diff changes the channel and target chosen for sessions_send announce delivery, so a mistake can send replies to the wrong surface or suppress them from the origin channel.
  • merge-risk: 🚨 session-state: The behavior depends on persisted session route, origin, last*, and deliveryContext fields, and the PR changes precedence between those stored fields.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (live_output): The PR body supplies copied live Gateway/qa-channel output showing the after-fix route resolving to the external channel and producing an outbound bus message; it does not cover the remaining Feishu package metadata gap.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body supplies copied live Gateway/qa-channel output showing the after-fix route resolving to the external channel and producing an outbound bus message; it does not cover the remaining Feishu package metadata gap.
Evidence reviewed

PR surface:

Source +50, Tests +307. Total +357 across 15 files.

View PR surface stats
Area Files Added Removed Net
Source 4 73 23 +50
Tests 11 369 62 +307
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 15 442 85 +357

What I checked:

  • Current announce lookup gate: Current main returns the parsed session-key fallback before reading sessions.list unless the channel plugin metadata has preferSessionLookupForAnnounceTarget, so the Feishu fix depends on that flag being present on the channel metadata surface used at runtime. (src/agents/tools/sessions-announce-target.ts:30, 6e25112aad71)
  • PR adds only runtime Feishu opt-in: The PR head adds preferSessionLookupForAnnounceTarget to feishuPlugin.meta in channel.ts, which covers the full runtime plugin path. (extensions/feishu/src/channel.ts:142, 7ae56ca8b813)
  • Feishu package metadata still lacks the opt-in: The PR head leaves extensions/feishu/package.json openclaw.channel without preferSessionLookupForAnnounceTarget, unlike the runtime metadata and unlike comparable package metadata for Discord/ClickClack. (extensions/feishu/package.json:32, 7ae56ca8b813)
  • Package metadata supports the flag: The package manifest type and channel metadata builder already carry preferSessionLookupForAnnounceTarget when package channel metadata provides it, so mirroring the Feishu flag there is the narrow consistency fix. (src/plugins/manifest.ts:1774, 6e25112aad71)
  • Real behavior proof supplied: The PR body includes copied live output from a local Gateway child process using real WebSocket Gateway RPC, production resolveAnnounceTarget, Gateway send, plugin loader, qa-channel, and qa-lab outbound capture showing delivery to the external qa-channel target instead of WebChat. (7ae56ca8b813)
  • Branch merge state: The provided live GitHub context reports mergeableState dirty for head 7ae56ca against base 6e25112, so the final merge result still needs a rebase/conflict pass. (7ae56ca8b813)

Likely related people:

  • mariosousa-finn: Merged related work in fix(agents,gateway): keep subagent announces in the original thread #63143 that changed sessions announce target hydration and tests for thread-aware delivery. (role: recent announce-routing contributor; confidence: high; commits: ac13b09b742d; files: src/agents/tools/sessions-announce-target.ts, src/agents/tools/sessions.test.ts)
  • SnowSky1: Merged related work in fix(agents): preserve announce threadId on sessions.list fallback #63506 that preserved threadId on the sessions.list announce fallback path. (role: recent announce-routing contributor; confidence: high; commits: 03f2951e63c4; files: src/agents/tools/sessions-announce-target.ts, src/agents/tools/sessions.test.ts)
  • Takhoffman: Authored the related merged routing-invariant synthesis in fix(routing): unify session delivery invariants for duplicate suppression #33786, which the current PR cites as adjacent session delivery-context history. (role: prior session-routing invariant contributor; confidence: medium; commits: 7f2708a8c369; files: src/utils/delivery-context.shared.ts, src/agents/tools/sessions.test.ts)
  • brokemac79: Authored related merged work in fix(session): preserve external channel route when webchat views session (#47745) #47797 around preserving external channel routes when WebChat views sessions. (role: prior external-route preservation contributor; confidence: medium; commits: fb47777d3881; files: src/utils/delivery-context.shared.ts, src/config/sessions/delivery-info.ts)
  • Dallin Romney: The limited checkout's blame for the current delivery-context and announce-target files points to c8f2bbf, so this is a low-confidence current-main routing signal rather than feature ownership. (role: recent current-main area contributor; confidence: low; commits: c8f2bbf76ddc; files: src/utils/delivery-context.shared.ts, src/agents/tools/sessions-announce-target.ts, extensions/feishu/src/channel.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. labels May 28, 2026
@clawsweeper

clawsweeper Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🌱 uncommon Cosmic Clawlet

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.

Rarity: 🌱 uncommon.
Trait: sleeps inside passing CI.
Image traits: location CI tidepool; accessory miniature diff map; palette sunrise gold and clean white; mood sparkly; pose leaning over a miniature review desk; shell brushed metal shell; lighting moonlit rim light; background small review tokens.
Share on X: post this hatch
Copy: My PR egg hatched a 🌱 uncommon Cosmic Clawlet in ClawSweeper.

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.

@clawsweeper clawsweeper Bot added P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels May 28, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels May 28, 2026
@samzong

samzong commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 28, 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: 🐚 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: 🦪 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 28, 2026
@BingqingLyu

This comment was marked as spam.

@steipete steipete force-pushed the fix/session-delivery-context-precedence branch from 923782d to 5b85b6e Compare May 29, 2026 02:03
@steipete steipete self-assigned this May 29, 2026
@openclaw-barnacle openclaw-barnacle Bot added the channel: feishu Channel integration: feishu label May 29, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5b85b6e5dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

blurb: "飞书/Lark enterprise messaging.",
aliases: ["lark"],
order: 70,
preferSessionLookupForAnnounceTarget: true,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mirror the Feishu announce flag into package metadata

This only opts the runtime feishuPlugin.meta into session lookup, but Feishu is also discovered from the package openclaw.channel metadata/official catalog in setup and lightweight plugin paths. In those contexts the flag remains absent, so resolveAnnounceTarget can still skip the sessions.list hydration and return the parsed Feishu key before the new external deliveryContext precedence runs. Please mirror preferSessionLookupForAnnounceTarget into the Feishu package metadata/catalog so the fix applies when Feishu is discovered without executing channel.ts.

Useful? React with 👍 / 👎.

@steipete steipete force-pushed the fix/session-delivery-context-precedence branch from 5b85b6e to 7ae56ca Compare May 29, 2026 02:45
Signed-off-by: samzong <samzong.lu@gmail.com>
@clawsweeper clawsweeper Bot added 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. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. 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 May 29, 2026
@steipete steipete force-pushed the fix/session-delivery-context-precedence branch from 7ae56ca to 13f681f Compare May 29, 2026 02:54

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 13f681fb83

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +157 to +161
const routeInternalContext = mergeDeliveryContext(routeContext, legacyContext);
const routeIsInternalFallback =
isInternalRouteContext(routeContext) && hasExternalDeliveryTarget(deliveryContext);
const merged = routeIsInternalFallback
? mergeExternalDeliveryContextOverInternalRoute(deliveryContext, routeInternalContext)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve legacy external account when replacing stale routes

When a stale internal route is present but the legacy session fields still carry the real external account (for example lastChannel: "whatsapp", lastAccountId: "work", and deliveryContext only has channel/to), this merge uses routeContext as the primary value and drops the legacy account because the channels conflict. The following branch then builds the external delivery context from deliveryContext plus this already-stripped internal context, so announce delivery can go out without the stored accountId/threadId for multi-account or threaded sessions. The internal fallback path should still preserve compatible metadata from the legacy external context before discarding the stale route channel.

Useful? React with 👍 / 👎.

@steipete

Copy link
Copy Markdown
Contributor

Proof for final head 13f681fb839cef5f9abe79f430ce4d55466f44a2.

Behavior addressed: sessions_send delivery now prefers an explicit external deliveryContext over stale internal/webchat fields, while preserving current internal routes when only stale legacy external fields exist. Feishu opts into persisted session lookup for announce delivery. Cron schedule identity accepts the normalized schedule input shape used by execution.

Real environment tested: local macOS checkout plus GitHub PR CI.

Exact steps or command run after this patch:

  • pnpm exec oxfmt --check src/utils/delivery-context.shared.ts src/utils/delivery-context.test.ts src/agents/tools/sessions.test.ts src/gateway/server.sessions-send.test.ts extensions/feishu/src/channel.ts extensions/feishu/src/channel.test.ts src/cron/schedule-identity.ts
  • pnpm test src/utils/delivery-context.test.ts src/agents/tools/sessions.test.ts extensions/feishu/src/channel.test.ts src/gateway/server.sessions-send.test.ts src/cron/schedule-identity.test.ts -- --reporter=verbose
  • /Users/steipete/Projects/agent-skills/skills/autoreview/scripts/autoreview --mode branch --base origin/main
  • PR CI on 13f681fb839cef5f9abe79f430ce4d55466f44a2: https://github.com/openclaw/openclaw/actions/runs/26615145463

Evidence after fix: formatting passed, 5 focused Vitest shards passed, autoreview reported no accepted/actionable findings, and PR CI passed.

Observed result after fix: explicit external delivery contexts route announcements to the external conversation, stale legacy external fields no longer override a current webchat route, and Feishu announce targeting uses the stored delivery context.

What was not tested: live Feishu API delivery; coverage is via unit/integration gateway and plugin metadata tests.

@steipete steipete merged commit c237de5 into openclaw:main May 29, 2026
109 of 110 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 29, 2026
* fix(sessions): prefer external delivery context

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix: route Feishu session announces from delivery context

* fix: accept normalized cron schedule inputs

---------

Signed-off-by: samzong <samzong.lu@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
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
* fix(sessions): prefer external delivery context

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix: route Feishu session announces from delivery context

* fix: accept normalized cron schedule inputs

---------

Signed-off-by: samzong <samzong.lu@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix(sessions): prefer external delivery context

Signed-off-by: samzong <samzong.lu@gmail.com>

* fix: route Feishu session announces from delivery context

* fix: accept normalized cron schedule inputs

---------

Signed-off-by: samzong <samzong.lu@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: feishu Channel integration: feishu gateway Gateway runtime 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: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. 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.

sessions_send reply routes to webchat instead of origin channel (Feishu)

3 participants