Skip to content

refactor: remove pre-2026.4 compatibility shims and legacy migrations#104650

Merged
steipete merged 14 commits into
mainfrom
claude/cleanup-old-compatibility-d21f95
Jul 11, 2026
Merged

refactor: remove pre-2026.4 compatibility shims and legacy migrations#104650
steipete merged 14 commits into
mainfrom
claude/cleanup-old-compatibility-d21f95

Conversation

@steipete

@steipete steipete commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Closes #104648

What Problem This Solves

The tree carried compatibility code for state shapes and call sites that have not shipped since before the 2026.4 release train: the Matrix flat-storage/legacy-crypto migration stack, a pre-tsdown daemon-CLI dist shim rebuilt on every build, deprecated model-facing tool params in the diffs plugin, Control UI readers for pre-gateway-scoped localStorage, and assorted deprecated aliases. Per repo policy these are migration debt: runtime must read canonical shapes only, and doctor owns legacy normalization.

Why This Change Was Made

Requested cleanup pass: anything older than April 2026 goes, to reduce LOC and simplify. Net effect: -4,087 lines (145 added, 4,232 deleted) across 81 files, 21 files deleted outright.

  • Matrix (-3.1k): removed the pre-account-scoped flat-storage migration, legacy rust-crypto detection/preparation/restore, migration snapshots, the gateway startup-maintenance hook, and the doctor preview/repair for those paths. The June 2026 file-to-SQLite sidecar imports in maybeMigrateLegacyStorage and doctor-contract-api.ts are untouched. docs/channels/matrix-migration.md now documents the 2026.6 stepping-stone upgrade for flat-layout installs.
  • Build: deleted src/cli/daemon-cli-compat.ts and scripts/write-cli-compat.ts (the dist/cli/daemon-cli.js shim only served pre-tsdown installed updaters) plus its build-step wiring.
  • Diffs: removed deprecated imageQuality/imageFormat/imageScale/imageMaxWidth/format tool params and duplicated image*/format output detail aliases. Config-key aliases (defaults.image*) stay until a doctor rename rule exists.
  • Control UI: removed the unscoped openclaw.control.settings.v1 blob reader/claim heuristics, the legacy theme-name map, the <think>-tag transcript fallback, and channel-prefixed legacy session keys. Legacy token scrubbing is kept (security).
  • Assorted: msteams pre-Agents-SDK bot ref field and findByUserId; discord thread-binding expiresAt/sessionKey read-compat moved out of runtime into the doctor JSON import where it belongs; ollama createConfiguredOllamaCompatNumCtxWrapper; gateway-client connectDelayMs; net-policy validateIPv4AddressInput; two dead exec-approval reply wrappers; macOS no-op migrateLegacyDefaults.

User Impact

No impact for installs on any 2026.4+ release: every removed migration already ran there. Installs upgrading directly from pre-2026.4 releases with unmigrated Matrix flat storage step through a 2026.6 release first (documented). Agents calling the diffs tool with the deprecated image* params must use the file* names (deprecated in the schema since March).

Evidence

  • pnpm check:changed green on Blacksmith Testbox through Crabbox: tbx_01kx97v5k9j2cv559n4ed70avd (all guard/typecheck/lint/format lanes + changed-file Vitest shards), Actions run https://github.com/openclaw/openclaw/actions/runs/29163971600
  • Targeted suites on Testbox: matrix 1445/1445 (tbx_01kx98xc11s28v6jh5nt8ga9bn), msteams 1095/1095 + discord 2000/2000 (tbx_01kx99saz4ce50v4rvsnysanym + post-fix rerun), UI settings/theme/session-display/chat 233/233 (tbx_01kx98t27gatv5nfhw4t26tgya), gateway-client/net-policy/exec-approval/build-all shards green (tbx_01kx98xc11s28v6jh5nt8ga9bn)
  • Docs link audit + MDX check + regenerated docs_map.md clean locally
  • Targeted post-fix suites on Testbox: discord 2000/2000 (tbx_01kx9a1c3ta415fm1ap52k0567), msteams 1097/1097 incl. two new bot-only regression tests (tbx_...brrgzvgfv run)
  • Structured Codex review (gpt-5.6-sol, xhigh): clean on the cli, discord-doctor, and msteams fix+tests bundles; diffs finding rejected (repo changelog policy: release generation owns CHANGELOG.md, migration note lives in this PR body); the durable-data finding on the assorted commit was accepted for msteams (read fallback restored + regression tests) and rejected for discord with code proof (its doctor JSON import normalizes before write). The matrix and ui commit bundles were refused by the reviewer's secret scanner (token-like test fixture strings, false positive); those two commits are covered by the matrix 1445-test and UI 233-test suites plus manual line review.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams app: macos App: macos app: web-ui App: web-ui cli CLI command changes scripts Repository scripts commands Command implementations extensions: diffs extensions: ollama extensions: xai size: XL maintainer Maintainer-authored PR labels Jul 11, 2026

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

Copy link
Copy Markdown
Contributor

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: ac78cf55c8

ℹ️ 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 thread extensions/msteams/src/messenger.ts Outdated
throw new Error("Invalid stored reference: missing conversation.id");
}
const agent = ref.agent ?? ref.bot ?? undefined;
const agent = ref.agent ?? undefined;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Migrate legacy Teams bot references before dropping fallback

When a stored Teams conversation was created before the Agents SDK, or imported by extensions/msteams/doctor-contract-api.ts:311 without rewriting the reference shape, it can have bot but no agent. With this fallback removed, buildConversationReference throws missing agent.id before proactive sends/replies can use that conversation, so existing users lose Teams proactive delivery until a new inbound message refreshes each reference. Please keep the fallback or move the botagent rewrite into the doctor/state migration before removing it from runtime.

Useful? React with 👍 / 👎.

@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 11, 2026, 4:15 PM ET / 20:15 UTC.

Summary
The PR removes pre-April-2026 compatibility shims and legacy migrations across Matrix, Control UI, plugins, packages, build scripts, and deprecated public aliases.

Reproducibility: yes. for the UI regression from current-head source: seed only openclaw.control.settings.v1 with a token, call loadSettings(), and the canonical-only read path does not consume or delete that key. The broader cleanup is not a single reproducible bug.

Review metrics: 2 noteworthy metrics.

  • Upgrade contract changes: 1 required Matrix stepping-stone plus multiple deprecated API removals. The migration route exists in v2026.6.11, but direct older upgrades and existing deprecated callers intentionally stop working.
  • Credential cleanup paths: 1 legacy localStorage key loses its load-time reader. The key can contain a gateway token, so its deletion must remain independent of preference migration.

Stored data model
Persistent data-model change detected: durable storage schema: extensions/matrix/src/matrix/client/storage.test.ts, durable storage schema: extensions/matrix/src/matrix/client/storage.ts, migration/backfill/repair: docs/docs_map.md, migration/backfill/repair: extensions/matrix/runtime-heavy-api.ts, migration/backfill/repair: extensions/matrix/src/doctor.test.ts, migration/backfill/repair: extensions/matrix/src/doctor.ts, and 26 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #104648
Summary: This PR is the direct candidate implementation for the linked compatibility-cleanup issue.

Members:

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

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🌊 off-meta tidepool
Patch quality: 🦐 gold shrimp
Result: ready for maintainer review.

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

Rank-up moves:

  • Restore independent legacy token scrubbing and regression coverage.
  • Provide redacted Matrix stepping-stone and browser-storage transition proof for maintainer confidence.
  • Record explicit approval for the direct-upgrade and deprecated API cutoff.

Risk before merge

  • [P1] A legacy unscoped Control UI settings blob containing a gateway token can remain in localStorage indefinitely when the user loads the app but does not later save settings.
  • [P1] Merging intentionally requires pre-2026.4 Matrix installs to upgrade through v2026.6.11 and removes deprecated model-facing and public plugin/package APIs; that compatibility cutoff needs explicit maintainer ownership.

Maintainer options:

  1. Fix token cleanup, then approve cutoff (recommended)
    Add unconditional startup cleanup for the legacy settings key, then accept the shipped Matrix stepping-stone and deprecated API removals.
  2. Keep deprecated APIs temporarily
    Land internal dead-code and migration cleanup while retaining public aliases and model-facing deprecated parameters.
  3. Split persisted-state changes
    Defer the Matrix and Control UI stored-state removals into focused PRs if maintainers do not accept the compatibility cutoff.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Preserve canonical gateway-scoped settings behavior while unconditionally removing the legacy unscoped settings key during load; add a regression test proving a stored token is scrubbed without importing legacy preferences.

Next step before merge

  • [P1] The token-cleanup regression is narrow and mechanically repairable; the remaining compatibility cutoff requires maintainer approval after the fix.

Maintainer decision needed

  • Question: After restoring unconditional legacy token scrubbing, should this release intentionally require the v2026.6.11 Matrix stepping-stone and remove the listed deprecated public APIs?
  • Rationale: The intermediate Matrix migration is shipped and the cleanup matches repository direction, but ending direct old-version upgrades and exported compatibility calls is a deliberate support-policy choice.
  • Likely owner: steipete — They defined the cleanup cutoff and upgrade contract and have the strongest merged history across the affected surfaces.
  • Options:
    • Approve cutoff after token fix (recommended): Merge after independent token cleanup is restored, accepting v2026.6.11 as the required Matrix stepping-stone and removing the deprecated APIs.
    • Preserve public aliases longer: Land internal migration cleanup while retaining exported and model-facing deprecated aliases for another deprecation window.
    • Retain direct Matrix migration: Move the old flat-layout migration into doctor so pre-2026.4 installs can upgrade directly without the stepping-stone.

Security
Needs attention: The Control UI change can leave a legacy plaintext gateway token in localStorage after normal startup.

Review findings

  • [P1] Scrub the legacy settings token during load — ui/src/app/settings.ts:377
Review details

Best possible solution:

Keep canonical scoped settings and current runtime shapes, independently delete the legacy token-bearing settings key during startup, then land the cleanup only after maintainers explicitly accept the documented stepping-stone and deprecated public API cutoff.

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

Yes for the UI regression from current-head source: seed only openclaw.control.settings.v1 with a token, call loadSettings(), and the canonical-only read path does not consume or delete that key. The broader cleanup is not a single reproducible bug.

Is this the best way to solve the issue?

No as currently written; canonical-only readers are appropriate, but credential cleanup must be independent of legacy preference migration and the intentional compatibility cutoff needs explicit approval.

Full review comments:

  • [P1] Scrub the legacy settings token during load — ui/src/app/settings.ts:377
    Removing the unscoped settings reader also removes the ordinary startup path that reached cleanup for openclaw.control.settings.v1. If that blob contains a persisted gateway token, loadSettings() now ignores it and leaves the plaintext credential in localStorage until a later settings save. Delete or scrub this key independently on load without restoring its legacy preferences.
    Confidence: 0.96

Overall correctness: patch is incorrect
Overall confidence: 0.95

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The PR removes shipped migration behavior, deprecated model parameters, and public package/plugin exports.
  • add merge-risk: 🚨 security-boundary: The legacy Control UI settings blob can contain a gateway token that ordinary startup no longer reliably scrubs.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🌊 off-meta tidepool and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The PR carries the protected maintainer label, so the external-contributor proof gate does not apply; its Testbox and CI evidence remains useful supplemental validation.

Label justifications:

  • P1: The current UI change can leave a plaintext gateway token stored, while the broad compatibility cutoff can disrupt upgrades and existing callers.
  • merge-risk: 🚨 compatibility: The PR removes shipped migration behavior, deprecated model parameters, and public package/plugin exports.
  • merge-risk: 🚨 security-boundary: The legacy Control UI settings blob can contain a gateway token that ordinary startup no longer reliably scrubs.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🌊 off-meta tidepool and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The PR carries the protected maintainer label, so the external-contributor proof gate does not apply; its Testbox and CI evidence remains useful supplemental validation.
Evidence reviewed

Security concerns:

  • [medium] Legacy token survives reader removal — ui/src/app/settings.ts:377
    The unscoped settings blob can contain a gateway token; ignoring it without deleting the key extends sensitive credential persistence on the user's device.
    Confidence: 0.96

Acceptance criteria:

  • [P1] node scripts/crabbox-wrapper.mjs run -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changed.
  • [P1] Run the focused Control UI settings test through the selected Testbox using pnpm test ui/src/app/settings.node.test.ts.

What I checked:

  • Legacy UI source no longer read on load: The current head reads only the gateway-scoped settings key and returns null otherwise; the unscoped openclaw.control.settings.v1 key is not consumed by this load path. (ui/src/app/settings.ts:373, 5c366b5d1bf9)
  • Matrix stepping-stone is shipped: Release v2026.6.11 contains the flat-layout migration, recovery snapshot, doctor sequence, startup maintenance, and legacy crypto restore paths removed by this PR, supporting the documented intermediate-upgrade route. (extensions/matrix/src/startup-maintenance.ts:46, e085fa1a3ffd)
  • Newer Matrix migration remains: The PR head still imports account-scoped sync cache, recovery-key state, legacy crypto migration state, and IndexedDB snapshots into SQLite before archiving the old files. (extensions/matrix/src/matrix/client/storage.ts:416, 5c366b5d1bf9)
  • Earlier Matrix blocker addressed: The current head preserves the June account-scoped migration while documenting v2026.6.11 as the migration owner for pre-account-scoped state, so the prior review's missing-owner concern is no longer raised. Public docs: docs/channels/matrix-migration.md. (docs/channels/matrix-migration.md:25, 5c366b5d1bf9)
  • Repository remained clean: All inspection was read-only and the checkout remained on clean main. (e34bff22763d)

Likely related people:

  • steipete: Defined the linked cleanup and upgrade contract; git blame shows the removed Matrix flat-state migration originated in their merged work, and history connects them to the UI and diffs surfaces. (role: cleanup scope owner and recent area contributor; confidence: high; commits: 8bebdd0d03, efd1a9ace6f5, 2ded26a5d6be; files: extensions/matrix/src/legacy-state.ts, ui/src/app/settings.ts, extensions/diffs/src/tool.ts)
  • vincentkoc: Recent merged work touched the daemon CLI compatibility and session-display paths included in this cross-area cleanup. (role: recent adjacent contributor; confidence: medium; commits: f8610da4c5cb, f95c7062984a; files: src/cli/daemon-cli-compat.ts, ui/src/lib/session-display.ts)
  • vignesh07: Authored the merged hardening change for the daemon CLI compatibility shim, making them relevant to its removal boundary. (role: compatibility-path introducer; confidence: medium; commits: 277b2de49134; files: src/cli/daemon-cli-compat.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

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

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (1 earlier review cycle)
  • reviewed 2026-07-11T19:52:06.745Z sha edb4c19 :: needs real behavior proof before merge. :: [P1] Preserve a migration owner before removing all Matrix triggers

@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. 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 Jul 11, 2026
@steipete
steipete force-pushed the claude/cleanup-old-compatibility-d21f95 branch from edb4c19 to cccd8cc Compare July 11, 2026 19:54
@clawsweeper

clawsweeper Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper status: review started.

I am starting a fresh review of this pull request: refactor: remove pre-2026.4 compatibility shims and legacy migrations This is item 1/1 in the current shard. Shard 0/1.

This placeholder means the worker is alive and reading the current context. I will edit this same comment with the actual review when the claws are done clicking.

Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted.

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

Copy link
Copy Markdown
Contributor

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: a9103fbbfb

ℹ️ 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 thread ui/src/app/settings.ts
legacyAliases: [pageDerivedUrl],
remoteLegacyPageUrl: pageDerivedUrl,
});
const defaultSource = readSettingsForGateway(storage, defaultUrl);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Scrub legacy settings even after dropping migration

For users who still have the old unscoped openclaw.control.settings.v1 blob with a persisted token, this now returns no source, so loadSettings() falls back to defaults and never reaches the token rewrite/removal path; persistSettings() is the only remaining code that removes LEGACY_SETTINGS_KEY. That leaves the plaintext gateway token in localStorage indefinitely unless the user later saves settings, despite the intended legacy token scrub. Please remove or scrub the legacy key on load even if its preferences are no longer migrated.

Useful? React with 👍 / 👎.

@steipete
steipete force-pushed the claude/cleanup-old-compatibility-d21f95 branch from a9103fb to 5c366b5 Compare July 11, 2026 20:09
@clawsweeper clawsweeper Bot removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. 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. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 11, 2026

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

Copy link
Copy Markdown
Contributor

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: 5c366b5d1b

ℹ️ 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".

env: params.env,
log: logger,
});
fs.mkdirSync(params.storagePaths.rootDir, { recursive: true });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Badge Preserve snapshots for remaining Matrix sidecar imports

When a 2026.6-era account-scoped Matrix root still has file sidecars, this path still mutates user state by importing into SQLite and archiving bot-storage.json, recovery-key.json, legacy-crypto-migration.json, or IndexedDB snapshots as .migrated, but the pre-mutation maybeCreateMatrixMigrationSnapshot gate was removed for the whole path. If any import or archive step goes wrong, users no longer have the focused recovery archive that the previous implementation created before these same account-scoped migrations; keep the snapshot guard for the still-supported sidecar imports while dropping only the flat-store migration.

Useful? React with 👍 / 👎.

@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. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jul 11, 2026
@steipete
steipete merged commit 8fe6ac7 into main Jul 11, 2026
139 of 146 checks passed
@steipete
steipete deleted the claude/cleanup-old-compatibility-d21f95 branch July 11, 2026 20:22
@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
(cherry picked from commit d466a80)
(cherry picked from commit f5b4fe40dd5c961322f8553cc80b2fdfb3f6503e)
(cherry picked from commit 7340b4749a4cc4c72f7a41cce1bc9cb550cae038)
(cherry picked from commit a151f41808f23ae60b10305ccd2bc959b9169a86)
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
(cherry picked from commit d466a80)
(cherry picked from commit f5b4fe40dd5c961322f8553cc80b2fdfb3f6503e)
(cherry picked from commit 7340b4749a4cc4c72f7a41cce1bc9cb550cae038)
(cherry picked from commit a151f41808f23ae60b10305ccd2bc959b9169a86)
(cherry picked from commit 60397dd)
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
(cherry picked from commit d466a80)
(cherry picked from commit f5b4fe40dd5c961322f8553cc80b2fdfb3f6503e)
(cherry picked from commit 7340b4749a4cc4c72f7a41cce1bc9cb550cae038)
(cherry picked from commit a151f41808f23ae60b10305ccd2bc959b9169a86)
steipete added a commit that referenced this pull request Jul 12, 2026
* fix(gateway): approval registry hardening and protocol-surface follow-ups

Follow-up delta to the merged #103579 head, rebased onto current main:
- gateway-protocol wire types derive from owner-module schema consts
  (types.ts tombstone) and ProtocolSchemas leaves the package index so the
  public plugin-sdk d.ts graph tree-shakes the registry declaration
- approval access authority follows the operator.approvals scope tier with
  reviewerDeviceIds as the opt-in restriction (cross-surface
  first-answer-wins; requester identity gates only legacy adapters)
- plugin node.invoke approvals register directly so unrenderable
  presentations fail closed before request routing
- exec-approval manager reconciliation with #103515 revocation hardening
  (resolution source attribution, one-shot ask-fallback consumption)
- surface-report pins and plugin-sdk API baseline refreshed; Swift models
  regenerated

* feat(channels): add typed operator approval actions

Squash-rebased #103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
(cherry picked from commit d466a80)
(cherry picked from commit f5b4fe40dd5c961322f8553cc80b2fdfb3f6503e)
(cherry picked from commit 7340b4749a4cc4c72f7a41cce1bc9cb550cae038)
(cherry picked from commit a151f41808f23ae60b10305ccd2bc959b9169a86)

* fix(approvals): preserve typed transport ownership

* test(imessage): narrow chunked approval text

* refactor(protocol): remove retired type tombstone

* fix(plugin-sdk): align surface budgets after rebase

* docs(changelog): note typed operator approvals

* docs(changelog): defer typed approval release note
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 12, 2026
…openclaw#104650)

* refactor(matrix): retire pre-2026.4 legacy crypto and flat-storage migrations

* refactor(cli): drop pre-tsdown daemon-cli dist compat shim from the build

* refactor(diffs): remove deprecated image*/format tool params and output aliases

* refactor(ui): drop pre-gateway-scoped localStorage readers and legacy theme map

* refactor: remove assorted pre-2026.4 compat shims and deprecated aliases

* fix(discord): map legacy thread-binding fields in the doctor JSON import

* fix(msteams): keep bot read fallback for legacy imported conversation rows

* test(msteams): cover legacy bot-only imported conversation references

* fix(ui): keep channel-prefixed session key display fallback

* chore: refresh native i18n inventory and build-docker step count

* chore(matrix): drop now-unused migration-config module

* chore: re-pin plugin SDK public export budget after compat removals

* chore: refresh native i18n inventory after rebase

* chore: re-pin plugin SDK callable budget and refresh i18n inventory after rebase
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 12, 2026
…3679)

* fix(gateway): approval registry hardening and protocol-surface follow-ups

Follow-up delta to the merged openclaw#103579 head, rebased onto current main:
- gateway-protocol wire types derive from owner-module schema consts
  (types.ts tombstone) and ProtocolSchemas leaves the package index so the
  public plugin-sdk d.ts graph tree-shakes the registry declaration
- approval access authority follows the operator.approvals scope tier with
  reviewerDeviceIds as the opt-in restriction (cross-surface
  first-answer-wins; requester identity gates only legacy adapters)
- plugin node.invoke approvals register directly so unrenderable
  presentations fail closed before request routing
- exec-approval manager reconciliation with openclaw#103515 revocation hardening
  (resolution source attribution, one-shot ask-fallback consumption)
- surface-report pins and plugin-sdk API baseline refreshed; Swift models
  regenerated

* feat(channels): add typed operator approval actions

Squash-rebased openclaw#103679 segment onto the durable-approval-registry tip on
current main. Typed approval/command/select presentation actions replace
raw-string inference across slack/telegram/discord/matrix/imessage/whatsapp,
approval.resolve carries an explicit kind, and channel adapters map native
callback envelopes through the typed action registry.

Drift reconciliation: deprecated buildExecApprovalInteractiveReply assertions
dropped (openclaw#104650 removed the shims); worker_environments bootstrap-column
migration kept alongside the approval resolution_ref backfill; plugin-sdk API
baseline regenerated.

(cherry picked from commit 68765a5d39d2118c88a7a54d00387337912d4494)
(cherry picked from commit 8642ac12af142e4b751f4f30d4b114615e7e5f66)
(cherry picked from commit 036c4bc39499925fc03de16ec9302e346769350a)
(cherry picked from commit 19dc350d6bc34e29a5169c6bc80971b0ad12adde)
(cherry picked from commit fc978b0bad86aef421c79f6a211b25cc1b743c01)
(cherry picked from commit 10de4d1ed5071f9be6ad1ee5d1e32c0fa8c9d11c)
(cherry picked from commit 9a664ced1b1fa740172b258f355f1a82925ae41c)
(cherry picked from commit c5ff69abbf444139e9e007bfa45beb0f00ffea54)
(cherry picked from commit d466a80)
(cherry picked from commit f5b4fe40dd5c961322f8553cc80b2fdfb3f6503e)
(cherry picked from commit 7340b4749a4cc4c72f7a41cce1bc9cb550cae038)
(cherry picked from commit a151f41808f23ae60b10305ccd2bc959b9169a86)

* fix(approvals): preserve typed transport ownership

* test(imessage): narrow chunked approval text

* refactor(protocol): remove retired type tombstone

* fix(plugin-sdk): align surface budgets after rebase

* docs(changelog): note typed operator approvals

* docs(changelog): defer typed approval release note
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: macos App: macos app: web-ui App: web-ui channel: discord Channel integration: discord channel: matrix Channel integration: matrix channel: msteams Channel integration: msteams cli CLI command changes commands Command implementations docs Improvements or additions to documentation extensions: diffs extensions: ollama extensions: xai maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. scripts Repository scripts size: XL 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.

Remove pre-2026.4 compatibility shims and legacy migrations

1 participant