feat(codex): enable native plugin app support#78733
Conversation
|
Codex review: needs changes before merge. Summary Reproducibility: not applicable. as a current-main bug: current main intentionally lacks Real behavior proof Next step before merge Security Review findings
Review detailsBest possible solution: Keep the explicit fail-closed native plugin model, but isolate source discovery from target auth while leaving authenticated install/apply behavior on the target side. Do we have a high-confidence way to reproduce the issue? Not applicable as a current-main bug: current main intentionally lacks Is this the best way to solve the issue? No for the current diff: the explicit config and fail-closed native app policy are the right shape, but source migration inventory should not run through the target OpenClaw auth bridge. The safer repair is an auth-disabled source inventory path while preserving target-side install/auth behavior for apply. Full review comments:
Overall correctness: patch is incorrect Security concerns:
Acceptance criteria:
What I checked:
Likely related people:
Remaining risk / open question:
Codex review notes: model gpt-5.5, reasoning high; reviewed against b75e5c50bf64. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2661767c54
ℹ️ 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".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6c3fa9292c
ℹ️ 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".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5bef5450bc
ℹ️ 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".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d713370a6e
ℹ️ 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".
d713370 to
b3678ae
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0d56d22ff7
ℹ️ 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".
0d56d22 to
02e69cc
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 02e69ccf9d
ℹ️ 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".
d0731f1 to
bbf1071
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bbf1071675
ℹ️ 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".
| const policyContext = params.binding.pluginAppPolicyContext; | ||
| return Boolean(policyContext && Object.keys(policyContext.apps).length === 0); |
There was a problem hiding this comment.
Rebuild partially recovered plugin app bindings
When a thread starts with multiple migrated plugins and at least one app is already exposed, any other plugin app that was missing, disabled, or auth-blocked is never reconsidered after the app inventory later refreshes: isCodexPluginThreadBindingStale only compares the stable input fingerprint, and this recovery path only rebuilds bindings whose saved policy context has zero apps. In that partial-success scenario the binding resumes with the old pluginAppPolicyContext and config, so newly authenticated or newly available plugin apps stay unavailable until the user manually resets the thread.
Useful? React with 👍 / 👎.
bbf1071 to
f4c4e5d
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4c4e5dc9f
ℹ️ 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".
f4c4e5d to
ffc39ed
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ffc39edaf0
ℹ️ 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".
ffc39ed to
a27d202
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a27d2027ed
ℹ️ 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".
a27d202 to
90114ca
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 90114ca6e9
ℹ️ 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".
bea17f3 to
eb6e070
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eb6e070af2
ℹ️ 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".
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
* feat(codex): add native plugin config schema * feat(codex): add native plugin inventory activation * feat(codex): configure native plugin apps for threads * feat(codex): enforce plugin elicitation policy * feat(codex): migrate native plugins * docs(codex): document native plugin support * fix(codex): harden plugin migration refresh * fix(codex): satisfy plugin activation lint * fix: stabilize codex plugin app config * fix: address codex plugin review feedback * fix: key codex plugin app cache by websocket credentials * fix: keep codex plugin app fingerprints stable * fix: refresh codex plugin cache test fixtures * fix: refresh plugin app readiness after activation * fix: support remote codex plugin activation * fix: recover plugin app bindings after cache refresh * fix: force codex app refresh after plugin activation * fix: recover partial codex plugin app bindings * fix: sync codex plugin selection config * fix: keep codex plugin activation fail closed * fix: align codex plugin protocol types with main * fix: refresh partial codex plugin app bindings * fix: key codex app cache by env api key * fix: skip failed codex plugin migration config * test: update codex prompt snapshots * fix: fail closed on missing codex app inventory entries * fix(codex): enforce native plugin policy gates * fix(codex): normalize native plugin policy types * fix(codex): fail closed on plugin refresh errors * fix(codex): use native plugin destructive policy * fix(codex): key plugin cache by api-key profiles * fix(codex): drop unshipped plugin fingerprint compat * fix(codex): let native app policy gate plugin tools * fix(codex): allow open-world plugin app tools * fix(codex): revalidate native plugin app bindings * fix(codex): preserve plugin binding on recheck failure * docs(codex): clarify plugin harness scope * fix(codex): return activation report state exhaustively * test(codex): refresh prompt snapshots after rebase * fix(codex): match namespaced plugin ids
Summary
codexPluginsconfig, curated plugin inventory/activation, per-session Codex app config, plugin-scoped elicitation handling, migration support, tests, docs, changelog coverage, and a follow-up hardening fix for PR review feedback.Change Type (select all)
Scope (select all touched areas)
Linked Issue/PR
Real behavior proof (required for external PRs)
Behavior or issue addressed: migrated Codex plugins can be enabled for the native Codex app-server path and invoked through the same Codex harness thread policy surface.
Real environment tested: local macOS OpenClaw dev gateway/TUI against the user's live Codex app-server/plugin install state.
Exact steps or command run after this patch: replayed all milestone Showboat proofs in
.mem/main/proofs/demo-1-1-codex-plugin-config-schema.mdthrough.mem/main/proofs/demo-1-6-codex-plugin-docs.md; ran Codex migration forgoogle-calendar; enabledallow_destructive_actions; created and then searched forOpenClaw gerbil proof 20260507T060415Zthrough the live dev gateway/TUI; verified.mem/main/proofs/demo-1-7-codex-calendar-live-proof.mdwithuvx showboat verify .mem/main/proofs/demo-1-7-codex-calendar-live-proof.md.Evidence after fix: copied live output from the Showboat replay and gateway/TUI proof. Fresh destructive Google Calendar proof is captured in
.mem/main/proofs/demo-1-7-codex-calendar-live-proof.mdand verified withuvx showboat verify .mem/main/proofs/demo-1-7-codex-calendar-live-proof.md. The proof contents are included below so the live behavior is visible in the PR body, not just linked from a local artifact.Observed result after fix: live output showed config loads, inventory/activation resolves the installed Google Calendar plugin, Codex thread app config is built, plugin elicitations are accepted/declined according to
allow_destructive_actions, migration writes explicit plugin config and callsplugin/install, documented config boots a dev gateway, TUI connects to that gateway, and the same Codex harness thread created then found a real Google Calendar event.What was not tested: broader destructive-action coverage across every supported third-party plugin; the live external write proof used Google Calendar.
Before evidence: N/A; this is a new feature path.
Scenario Tested
invalid-marketplace-startup: gateway_exit=1; invalid_marketplace_error_seendisabled-read: agent_exit=0; calendar_search_not_exposeddisabled-plugin-enabled-read: agent_exit=0; calendar_search_not_exposedglobal-destructive-true-plugin-unset: agent_exit=0; calendar_search_succeeded; calendar_create_succeededglobal-destructive-true-plugin-false: agent_exit=0; calendar_search_succeeded; calendar_create_failed_closedglobal-destructive-false-plugin-true: agent_exit=0; calendar_search_succeeded; calendar_create_succeededglobal-destructive-false-plugin-unset: agent_exit=0; calendar_search_succeeded; calendar_create_failed_closedmanual-github-config-installs: agent_exit=0; github_tool_started; github_plugin_enabled_after_runLive Google Calendar Showboat proof contents
OpenClaw Codex Calendar Plugin Proof
2026-05-07T06:09:23Z by Showboat 0.6.1
This proof exercises the live OpenClaw dev gateway and TUI. It verifies that the Codex harness session used native Codex app/plugin support for Google Calendar, with destructive actions allowed in the dev profile, and that the created calendar event can be found again through the same gateway/TUI session.
rg -n "^\[features\]|^apps = true|^codex_hooks = true|^\[apps\._default\]|^\[plugins\.\"google-calendar@openai-curated\"\]|^enabled = true" /Users/kevinlin/.openclaw-dev/agents/dev/agent/codex-home/config.tomljq '.summary, (.items[] | select(.id == "plugin:google-calendar" or .id == "config:codex-plugins") | {id,status,reason,details})' /Users/kevinlin/.openclaw-dev/migration/codex/2026-05-07T05-35-50.227Z/report.jsonRoot Cause (if applicable)
Regression Test Plan (if applicable)
extensions/codex/src/app-server/*plugin*.test.ts,extensions/codex/src/app-server/run-attempt.test.ts,extensions/codex/src/migration/provider.test.ts,src/commands/migrate*.test.ts.User-visible / Behavior Changes
plugins.entries.codex.config.codexPluginsfor explicit native Codex plugin enablement.allow_destructive_actions, defaulting false globally and per plugin.openclaw migrate --from codex --plugin <name>can migrate selected source-installed curated plugins into explicit OpenClaw Codex plugin config.Diagram (if applicable)
Security Impact (required)
Yes/No) YesYes/No) NoYes/No) YesYes/No) YesYes/No) YesYes, explain risk + mitigation: the feature exposes migrated Codex app/plugin capabilities to the Codex harness thread. Mitigations are explicitcodexPluginsentries, onlyopenai-curatedmigrated plugin activation in v1, no wildcard config,_defaultapp disablement, fail-closed destructive-action elicitation policy unless explicitly enabled, and no-overwrite migration conflict handling for existing plugin config.Repro + Verification
Environment
.mem/integ/tmp/codex-plugin-*OpenClaw configs withplugins.entries.codex.config.codexPlugins.enabled: trueSteps
origin/main.git diff --check origin/main...HEAD.pnpm test extensions/codex/src/migration/provider.test.ts src/commands/migrate.test.ts src/commands/migrate/selection.test.ts extensions/codex/src/app-server/app-inventory-cache.test.ts extensions/codex/src/app-server/plugin-activation.test.ts extensions/codex/src/app-server/plugin-inventory.test.ts extensions/codex/src/app-server/plugin-thread-config.test.ts extensions/codex/src/app-server/run-attempt.test.ts extensions/codex/src/app-server/elicitation-bridge.test.ts.pnpm check:changed.node scripts/run-node.mjs --dev migrate apply codex --from /Users/kevinlin/.codex --plugin google-calendar --overwrite, then created and searched forOpenClaw gerbil proof 20260507T060415Zthrough the live dev gateway/TUI withallow_destructive_actions: true.Expected
Actual
showboat_all_verified=true; the fresh Calendar proof created eventqjq1rfttlb1smrap3brmuuo8loand the follow-up search found the same id/title/start/end.Evidence
Attach at least one:
Human Verification (required)
What you personally verified (not just CI), and how:
openai-curatedvalidation, stale app-list cache refresh behavior, forced post-install app-list refresh, destructive policy false/true, unrelated elicitation fallthrough, unsafe/ambiguous elicitation decline paths, migration without wildcard config, migration conflict guard, and preserving existing destructive-action policy with overwrite.Review Conversations
Compatibility / Migration
Yes/No) YesYes/No) YesYes/No) Optionalopenclaw migrate --from codex --plugin <name>; the migration writes explicitcodexPluginsconfig and callsplugin/installfor selected source-installed curated plugins. ExistingcodexPluginsconfig requires--overwrite, and overwrite preserves an explicit globalallow_destructive_actionspolicy.Risks and Mitigations
List only real risks for this PR. Add/remove entries as needed. If none, write
None.allow_destructive_actions: true.openai-curatedplugins and has no wildcard or install switch.--overwriteand preserves explicit destructive-action policy when overwrite is used.Fast Follow Work
on-requestapproval for destructive actions