Skip to content

feat(ui): add standalone operator approval links#103698

Merged
steipete merged 4 commits into
mainfrom
codex/approval-deep-links
Jul 12, 2026
Merged

feat(ui): add standalone operator approval links#103698
steipete merged 4 commits into
mainfrom
codex/approval-deep-links

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Related: #103505

Stacked on #103679. Review this branch from codex/approval-typed-actions.

What Problem This Solves

Approval prompts currently require the operator to remain on the surface that raised them. Even after the durable approval registry and typed channel actions, OpenClaw has no stable, mobile-friendly document that can be opened directly and refreshed to recover canonical approval state.

Why This Change Was Made

This adds a standalone authenticated ${controlUiBasePath}/approve/{approvalId} Control UI document backed by approval.get and approval.resolve. The Gateway reserves the one-segment approval namespace before plugins and static-file heuristics, including asset-like IDs, and fails closed with 404 when Control UI serving is disabled.

The document is bound to the Gateway that served it. It does not copy or overwrite the full app's saved remote-Gateway selection; URL/session authentication remains ephemeral until an operator explicitly confirms a different Gateway. Approval IDs are decoded once, credentials never enter the approval URL, and terminal state always comes from the SQLite-backed canonical record.

Resolution returns committed SQLite truth before best-effort channel, push, and legacy-event follow-up. A slow or failed secondary surface therefore cannot delay the winning response or replace its result.

User Impact

Operators can open a stable approval link on a phone or desktop, authenticate, inspect the sanitized command or plugin preview, and approve or deny. Concurrent answers show Approved here on the winner and Resolved elsewhere with the recorded canonical decision on losers. Reload, reconnect, expiry, cancellation, malformed data, and unavailable approvals all fail closed without usable decision controls.

Evidence

  • Source-blind built-UI behavior validation passed all 9/9 contract clauses: standalone routing, mounted authentication, exact ID/kind/decision submission, first-answer winner and loser states, terminal reload, fail-closed malformed data, reconnect recovery, dynamic content, 48px mobile targets, no horizontal overflow, and zero browser page/console errors.
  • Exact Control UI E2E passed 6/6 scenarios on Testbox, including mobile pending, competing surface, mounted base path, malformed Gateway data, disconnect/reconnect, and content anti-cheat checks.
  • Focused Gateway suites passed 430/430 tests; focused UI suites passed 53/53; unified approval handler passed 60/60; UI localization validation passed for all 20 locales.
  • Full exact-tree pnpm check:changed passed every changed lane, structural guard, typecheck, core/extensions/scripts lint, and runtime import-cycle check in 4m51s (run).
  • Fresh exact-tree structured autoreview found no accepted or actionable findings.
  • Final mobile/desktop proof artifacts were generated outside the repository and inspected individually; no screenshots or videos are committed to the product branch.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation app: web-ui App: web-ui gateway Gateway runtime size: XL maintainer Maintainer-authored PR labels Jul 10, 2026
@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. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 10, 2026
@clawsweeper

clawsweeper Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 11, 2026, 9:39 PM ET / July 12, 2026, 01:39 UTC.

Summary
Adds a standalone authenticated Control UI page for opening and resolving durable operator approvals from direct links.

Reproducibility: yes. for the review defects: current source deterministically shows the misordered token-helper arguments, inconsistent locale generation, and stale docs map. The feature itself is new rather than a current-main bug reproduction.

Review metrics: 3 noteworthy metrics.

  • Authentication behavior: 1 page-scoped Gateway-selection path changed. The approval page must authenticate to its serving Gateway without overwriting or losing the user's saved remote selection.
  • Reserved HTTP surface: 1 new /approve/{id} namespace. The route is claimed ahead of plugin and static routing for every HTTP method, creating a compatibility boundary that CI cannot settle.
  • Generated localization surface: 20 locale bundles and 20 translation-memory files changed. Generated consistency affects visible copy and whether later translation refreshes can repair fallback text.

Stored data model
Persistent data-model change detected: persistent cache schema: ui/src/i18n/.i18n/id.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/it.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/ja-JP.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/ko.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/nl.tm.jsonl, persistent cache schema: ui/src/i18n/.i18n/pl.tm.jsonl, and 14 more. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #103505
Summary: This PR is the candidate implementation for the standalone deep-link portion of the broader durable approvals issue; adjacent stacked PRs own typed channel actions and native mobile clients.

Members:

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

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦪 silver shellfish
Result: blocked until real behavior proof is added.

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

Rank-up moves:

  • [P1] Fix the token-scope call and generated outputs, then restack the standalone segment onto current main.
  • Obtain maintainer acceptance for the reserved plugin-route namespace and attach redacted mobile and desktop browser proof.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR describes source-blind browser and Testbox runs but provides no inspectable screenshot, recording, live output, logs, or linked artifact showing the after-fix approval flow on the current head; add redacted mobile and desktop proof, then update the PR body for automatic re-review or ask a maintainer to comment @clawsweeper re-review.

Risk before merge

  • [P1] The new core-owned /approve/{id} namespace is checked before plugin HTTP routing, so an existing plugin using that path would become unreachable after upgrade.
  • [P1] The dirty stacked branch must be refreshed before maintainers can verify the actual three-way merge result against current main.
  • [P1] The claimed mobile and desktop behavior cannot be independently reviewed without a published, redacted artifact from the repaired exact head.

Maintainer options:

  1. Fix defects and accept the reservation (recommended)
    Repair authentication and generated outputs, document the core-owned route, and merge only after explicit maintainer acceptance of the plugin namespace cost.
  2. Choose a non-colliding core path
    Retarget the standalone page to a more explicitly reserved prefix and update routing, documentation, and browser proof accordingly.
  3. Pause the stacked PR
    Do not merge while the branch is conflicted, the behavior is unproven, or the namespace policy remains undecided.

Next step before merge

  • [P1] A maintainer must decide the permanent route namespace; after that, the contributor should refresh the conflict-blocked branch, address all three findings, and provide exact-head browser proof.

Maintainer decision needed

  • Question: Should OpenClaw permanently reserve ${controlUiBasePath}/approve/{id} ahead of plugin HTTP routes, accepting that an existing plugin using that one-segment namespace would stop receiving those requests?
  • Rationale: The route can be implemented mechanically, but only maintainers can accept the upgrade and plugin compatibility boundary created by claiming it in core.
  • Likely owner: steipete — This person authored the approval architecture and the route reservation requiring the compatibility decision.
  • Options:
    • Reserve the namespace (recommended): Accept /approve/{id} as a core-owned route, document the reservation, and merge after the deterministic defects and proof gap are fixed.
    • Use a collision-resistant path: Move the document beneath a more explicitly core-owned prefix before merge to avoid shadowing existing plugin routes.
    • Pause the feature: Keep this PR open until the permanent plugin HTTP namespace policy is decided.

Security
Needs attention: The route requires normal Gateway authentication and keeps credentials out of the URL, but the serving-Gateway token defect must be fixed before merge.

Review findings

  • [P2] Pass the serving Gateway URL as the next token scope — ui/src/app/settings.ts:361
  • [P2] Regenerate or remove the non-English approval locale outputs — ui/src/i18n/locales/fr.ts:523-526
  • [P3] Refresh the generated docs map — docs/web/control-ui.md:571
Review details

Best possible solution:

Restack the standalone approval segment onto current main, fix the token-helper call and generated locale/docs outputs, obtain explicit acceptance of the reserved plugin-route namespace, and publish redacted mobile and desktop browser proof from that exact head.

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

Yes for the review defects: current source deterministically shows the misordered token-helper arguments, inconsistent locale generation, and stale docs map. The feature itself is new rather than a current-main bug reproduction.

Is this the best way to solve the issue?

Yes in architecture: a Gateway-owned authenticated document backed by canonical approval RPCs is the narrowest maintainable cross-device solution, but this implementation is not merge-ready until the defects, proof gap, conflict, and namespace decision are resolved.

Full review comments:

  • [P2] Pass the serving Gateway URL as the next token scope — ui/src/app/settings.ts:361
    Call resolveGatewayTokenForUrlEdit(settings.gatewayUrl, effectiveUrl, settings.token). The current argument order treats the token as a URL and the serving URL as the current token, so a document opened while the full UI has a saved remote Gateway cannot recover its valid serving-Gateway session token and may be forced back through authentication.
    Confidence: 0.99
  • [P2] Regenerate or remove the non-English approval locale outputs — ui/src/i18n/locales/fr.ts:523-526
    The new non-English approvalPage blocks contain mostly English copy, but their metadata files do not mark those keys as fallbacks. This makes the generated state look translated and prevents later synchronization from reliably replacing it; follow ui/AGENTS.md by committing only en.ts or running the authenticated locale generator so bundles, translation memory, and metadata agree.
    Confidence: 0.98
  • [P3] Refresh the generated docs map — docs/web/control-ui.md:571
    docs/web/control-ui.md adds the Approval links section, but docs/docs_map.md still jumps from assistant media authentication to building the UI. Regenerate the docs map so the committed documentation index matches the changed page.
    Confidence: 0.99

Overall correctness: patch is incorrect
Overall confidence: 0.99

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add merge-risk: 🚨 compatibility: The new core-owned approval route is checked before plugin HTTP routes and can shadow an existing plugin using that namespace.

Label justifications:

  • P2: The PR has concrete merge-blocking defects in a bounded new operator workflow, without evidence of an urgent regression affecting current released behavior.
  • merge-risk: 🚨 compatibility: The new core-owned approval route is checked before plugin HTTP routes and can shadow an existing plugin using that namespace.
  • merge-risk: 🚨 auth-provider: The PR changes session-token and Gateway-selection behavior for an authenticated approval document and currently misroutes token-helper arguments.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦪 silver shellfish.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR describes source-blind browser and Testbox runs but provides no inspectable screenshot, recording, live output, logs, or linked artifact showing the after-fix approval flow on the current head; add redacted mobile and desktop proof, then update the PR body for automatic re-review or ask a maintainer to comment @clawsweeper re-review.
Evidence reviewed

Security concerns:

  • [medium] Serving-Gateway session token is discarded — ui/src/app/settings.ts:361
    Misordered arguments in the page-specific token resolver can replace a usable page token with the serving URL string or an empty lookup result, breaking the intended authenticated recovery flow.
    Confidence: 0.99

What I checked:

  • Serving-Gateway token bug: The page-specific settings path passes the token and target URL in the wrong positions to the three-argument token-scope helper, causing lookup under the token string and potentially returning the serving URL as the token. (ui/src/app/settings.ts:361, 7f72cbfc7b77)
  • Generated locale inconsistency: Non-English locale bundles contain mostly English approval-page copy, while their metadata lacks matching fallback entries, so later synchronization can incorrectly treat the copy as translated. (ui/src/i18n/locales/fr.ts:523, 7f72cbfc7b77)
  • Generated docs map drift: The documentation adds an Approval links heading, but the branch's generated docs map still omits that heading. Public docs: docs/web/control-ui.md. (docs/web/control-ui.md:571, 7f72cbfc7b77)
  • Gateway-owned authenticated design: The one-segment approval namespace is reserved before plugin routing, while the page validates canonical approval.get and approval.resolve responses before presenting or recording decisions. (src/gateway/control-ui-routing.ts:26, 7f72cbfc7b77)
  • Review continuity: All three findings remain applicable at the reviewed head; the token and locale discussions are also live, non-outdated review threads. (ui/src/app/settings.ts:361, 7f72cbfc7b77)
  • Live merge state: GitHub reports the exact head as dirty and not cleanly mergeable after the stacked typed-actions predecessor merged into current main. (7f72cbfc7b77)

Likely related people:

  • steipete: Authored the durable approval stack and the standalone deep-link implementation, including its Gateway route, page, authentication behavior, and tests. (role: introduced behavior; confidence: high; commits: 09159361432f, 7f72cbfc7b77; files: ui/src/pages/approval/approval-page.ts, ui/src/app/settings.ts, src/gateway/control-ui-routing.ts)
  • xingzhou: Blame and history tie the token-scope helper consumed by the new approval page to recent Control UI connection work. (role: recent adjacent contributor; confidence: medium; commits: 57c2d65ad532; files: ui/src/app/settings.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 (5 earlier review cycles)
  • reviewed 2026-07-10T13:43:38.558Z sha 2316b1a :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-10T19:48:48.825Z sha 72e8289 :: needs real behavior proof before merge. :: [P1] Keep same-Gateway login ephemeral
  • reviewed 2026-07-11T14:47:41.780Z sha 548cca6 :: needs real behavior proof before merge. :: [P2] Pass the serving Gateway URL when retargeting tokens
  • reviewed 2026-07-12T00:57:39.839Z sha dcf1cb6 :: needs real behavior proof before merge. :: [P2] Pass the serving Gateway URL when retargeting tokens
  • reviewed 2026-07-12T01:31:32.085Z sha 7f72cbf :: needs real behavior proof before merge. :: [P2] Regenerate the Control UI locale outputs | [P3] Refresh the generated docs map

@steipete
steipete force-pushed the codex/approval-typed-actions branch from 9966705 to 6f6f1fc Compare July 10, 2026 19:26
@steipete
steipete force-pushed the codex/approval-deep-links branch from 2316b1a to 72e8289 Compare July 10, 2026 19:26
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 10, 2026
@steipete
steipete force-pushed the codex/approval-typed-actions branch from 6f6f1fc to 27b821f Compare July 11, 2026 14:24
@steipete
steipete force-pushed the codex/approval-deep-links branch from 72e8289 to fdad6d7 Compare July 11, 2026 14:24
@steipete

Copy link
Copy Markdown
Contributor Author

Land-ready update: the ClawSweeper P1 is fixed — ephemeral approval-document login no longer persists the serving gateway over a saved remote selection (connect() treats only a genuinely changed URL as an explicit selection; login-gate regression test added with a pre-existing saved remote gateway, verified failing before the fix). Also: a server-level test now pins the all-method 404 reservation (the module-level POST test was renamed to say which layer owns the terminal 404), the e2e mock-gateway helper gained setMethodResponse reconciliation with main's offline helper, and the reserved /approve/{id} namespace is documented in docs/web/control-ui.md.

Validation: gateway-store 9/9, plugin-http-auth reservation suite, control-ui http suite, UI approval page suites green on Testbox (tbx_01kx8fg3fptsqz31ckaj9jwcym, tbx_01kx8r0r4g46agd58kdt2rqbfg); structured Codex review of the fix commit clean.

@steipete
steipete force-pushed the codex/approval-typed-actions branch from 27b821f to 7776776 Compare July 11, 2026 14:31
@steipete
steipete force-pushed the codex/approval-deep-links branch from fdad6d7 to 12ec1bc Compare July 11, 2026 14:31
@steipete
steipete force-pushed the codex/approval-typed-actions branch from 7776776 to d5ed331 Compare July 11, 2026 14:34
@steipete
steipete force-pushed the codex/approval-deep-links branch from 12ec1bc to 548cca6 Compare July 11, 2026 14:34
@steipete
steipete marked this pull request as ready for review July 11, 2026 14:37
@steipete
steipete requested a review from a team as a code owner July 11, 2026 14:38
@clawsweeper clawsweeper Bot removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. 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: 548cca69b7

ℹ️ 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 Outdated
return {
...settings,
gatewayUrl: effectiveUrl,
token: resolveGatewayTokenForUrlEdit(settings.gatewayUrl, settings.token, effectiveUrl),

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 Pass the serving gateway URL when retargeting tokens

When a standalone approval document overrides a persisted remote gateway selection, this call passes settings.token as nextGatewayUrl and effectiveUrl as currentToken, but resolveGatewayTokenForUrlEdit(currentGatewayUrl, nextGatewayUrl, currentToken) uses its second argument to load the session-scoped token. In a tab that already has a token for the serving gateway but the full app is currently pointed at a remote gateway, the approval page now looks up sessionStorage under the token string instead of the serving URL, drops the usable token, and sends the operator back through auth on reload/cleaned deep links. Swap the second and third arguments so the standalone page can reuse the serving-gateway token without changing the saved remote selection.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jul 11, 2026
@openclaw-barnacle openclaw-barnacle Bot added channel: msteams Channel integration: msteams channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web scripts Repository scripts agents Agent runtime and tooling channel: feishu Channel integration: feishu channel: qqbot labels Jul 12, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. label Jul 12, 2026
steipete added 4 commits July 11, 2026 19:08
Squash-rebased #103698 segment onto the typed-actions tip on current main.
Adds the tokenless /approve/{id} standalone approval UI served by the
gateway control-UI router, gateway-store ephemeral login fix (selectGateway
only on changed URL), and approval-page i18n strings.

Drift reconciliation: union-merged i18n translation-memory caches and
regenerated locale metadata via control-ui-i18n sync (33 approvalPage keys
remain English fallbacks in minor locales, as on the original branch).

(cherry picked from commit c82f56011bfe9f0debb8ebe052f14590c187340d)
(cherry picked from commit 80f5636a8b67a3d6a5f330620541a39d4ef3fe6f)
(cherry picked from commit a3e300d337a92bf1b593a0bb52b7ec4549910a21)
(cherry picked from commit 860ad01f9658bba54cb3d59644e5e1a032c0bb3f)
(cherry picked from commit d8b697b28a847950a1797da07fc0ae4c24928492)
(cherry picked from commit 8a654e3271fd5721358812f961a7a7bb386d6726)
(cherry picked from commit 2f776d2e7bf910271fcbd9697597f6f5478b0f30)
(cherry picked from commit 14e64e6e4d763be830830801eeec1a6f17441688)
(cherry picked from commit 4df9ec828d0034fdc76540ff0fe341e599b0f281)
(cherry picked from commit e52968f)
(cherry picked from commit 7214fc25013966f99ff4b2d506aa2f5f789e2113)
(cherry picked from commit c6259ff79787c759c136086e1a54c9ead8e89539)
(cherry picked from commit a58d9f271d27481615f0c94a828704c563d5354f)
(cherry picked from commit dcf1cb6)
steipete added a commit that referenced this pull request Jul 12, 2026
Squash-rebased #103698 segment onto the typed-actions tip on current main.
Adds the tokenless /approve/{id} standalone approval UI served by the
gateway control-UI router, gateway-store ephemeral login fix (selectGateway
only on changed URL), and approval-page i18n strings.

Drift reconciliation: union-merged i18n translation-memory caches and
regenerated locale metadata via control-ui-i18n sync (33 approvalPage keys
remain English fallbacks in minor locales, as on the original branch).

(cherry picked from commit c82f56011bfe9f0debb8ebe052f14590c187340d)
(cherry picked from commit 80f5636a8b67a3d6a5f330620541a39d4ef3fe6f)
(cherry picked from commit a3e300d337a92bf1b593a0bb52b7ec4549910a21)
(cherry picked from commit 860ad01f9658bba54cb3d59644e5e1a032c0bb3f)
(cherry picked from commit d8b697b28a847950a1797da07fc0ae4c24928492)
(cherry picked from commit 8a654e3271fd5721358812f961a7a7bb386d6726)
(cherry picked from commit 2f776d2e7bf910271fcbd9697597f6f5478b0f30)
(cherry picked from commit 14e64e6e4d763be830830801eeec1a6f17441688)
(cherry picked from commit 4df9ec828d0034fdc76540ff0fe341e599b0f281)
(cherry picked from commit e52968f)
(cherry picked from commit 7214fc25013966f99ff4b2d506aa2f5f789e2113)
(cherry picked from commit c6259ff79787c759c136086e1a54c9ead8e89539)
(cherry picked from commit a58d9f271d27481615f0c94a828704c563d5354f)
(cherry picked from commit dcf1cb6)
(cherry picked from commit 7f72cbf)
@steipete
steipete force-pushed the codex/approval-deep-links branch from 7f72cbf to 1bf6791 Compare July 12, 2026 02:08
@steipete
steipete changed the base branch from main to codex/approval-typed-actions July 12, 2026 02:09
@steipete
steipete force-pushed the codex/approval-deep-links branch from 1bf6791 to 115acda Compare July 12, 2026 02:09
@openclaw-barnacle openclaw-barnacle Bot removed channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: imessage Channel integration: imessage channel: matrix Channel integration: matrix channel: mattermost Channel integration: mattermost channel: msteams Channel integration: msteams channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram labels Jul 12, 2026
@steipete

Copy link
Copy Markdown
Contributor Author

Land-ready review complete on 115acdadc0c18c2748dae84e59664bee8cc7c422.

Improvements made before landing:

  • fixed the approval page Gateway-auth argument order so a page-scoped session credential is loaded without replacing the saved Gateway selection;
  • kept disconnect handling fail-closed across every locale instead of claiming an unconfirmed decision was preserved;
  • integrated the current-main owner-local chat protocol type fix and removed the stale stack commits from this PR;
  • retained exact opaque approval IDs, first-answer-wins readback, and disabled controls for malformed or uncertain outcomes.

Proof:

  • AWS Crabbox cbx_1f29bfe3fbc6, run_dcc6c14c1bb1: 50 focused unit tests passed.
  • AWS Crabbox run_deb426cc6811: 6/6 Chromium approval-page E2E scenarios passed.
  • Visual artifacts inspected: pending mobile, competing-answer loser desktop, and terminal reload mobile; layout, redaction, and terminal statuses are correct.
  • AWS Crabbox run_2d5351f8f418: widened changed gate passed formatting, full project typecheck, core/extensions/scripts lint, runtime import-cycle checks, and policy guards.
  • Fresh structured autoreview passes reported no accepted/actionable findings.
  • scripts/pr review-validate-artifacts 103698, OPENCLAW_TESTBOX=1 scripts/pr prepare-run 103698, and scripts/pr merge-verify 103698 passed.

The red build-artifacts and check-docs jobs share the same unchanged current-main raw-copy baseline drift for chat-composer “Interrupted” strings; this PR does not touch that surface. The repo-native hosted-gate classifier accepted the head, and merge verification found no relevant mainline drift or required checks.

@steipete

Copy link
Copy Markdown
Contributor Author

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant