feat(codex): add portable Codex command pickers#82224
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed May 31, 2026, 9:13 AM ET / 13:13 UTC. Summary PR surface: Source +276, Tests +118. Total +394 across 10 files. Reproducibility: yes. from source inspection: raw Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Mantis proof suggestion Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Land only after Telegram presentation slash-command callbacks preserve native command dispatch, the Do we have a high-confidence way to reproduce the issue? Yes from source inspection: raw Is this the best way to solve the issue? No, not yet; portable picker buttons are the right owner-boundary direction, but Telegram must preserve native command dispatch for those button taps before the implementation is safe to merge. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 3ca4e5f61676. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +276, Tests +118. Total +394 across 10 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
91bf635 to
a8c78eb
Compare
|
note that cmds like for now, would reduce scope of this pr to just |
|
Perfect, that scope reduction makes sense and the OAuth flow for plugins with apps is definitely your territory. Will reduce this PR to |
|
@openclaw-mantis verify this PR on Telegram Desktop. Please generate before/after GIF evidence for the Telegram Codex picker UX. Use the |
Mantis Telegram Desktop ProofSummary: Mantis captured native Telegram Desktop before/after GIF evidence.
Motion-trimmed clips: Raw QA files: https://artifacts.openclaw.ai/mantis/telegram-desktop/pr-82224/run-25964724153-1/index.json |
|
heads up that i've merged a change to add /codex plugins |
a8c78eb to
997ffd8
Compare
chat surface - /codex (no-arg) returns a 2x2 button picker (plugins / permissions / account / help) - /codex fast menu, /codex permissions menu, /codex computer-use menu open sub-pickers - Telegram callback handler dispatches cdx_* callback_data to a new picker library at extensions/telegram/src/codex-picker-buttons.ts; navigation buttons editMessage in place, leaf actions stay on the existing tgcmd: synthesis path so they fire as real chat commands and pass through mainline's canMutateCodexPlugins auth gate from openclaw#83293. - No new plugin verbs beyond canonical list / enable / disable; toggle / remove / add are intentionally not picker-exposed (per maintainer guidance on the prior shape of openclaw#82224). - Rebased on top of openclaw#83293 (mainline list/enable/disable). openclaw#82219 marketplace work is excluded from this PR. Closes openclaw#82218 Related openclaw#82219, openclaw#83293
chat surface - /codex (no-arg) returns a 2x2 button picker (plugins / permissions / account / help) - /codex fast menu, /codex permissions menu, /codex computer-use menu open sub-pickers - Telegram callback handler dispatches cdx_* callback_data to a new picker library at extensions/telegram/src/codex-picker-buttons.ts; navigation buttons editMessage in place, leaf actions stay on the existing tgcmd: synthesis path so they fire as real chat commands and pass through mainline's canMutateCodexPlugins auth gate from openclaw#83293. - No new plugin verbs beyond canonical list / enable / disable; toggle / remove / add are intentionally not picker-exposed (per maintainer guidance on the prior shape of openclaw#82224). - Rebased on top of openclaw#83293 (mainline list/enable/disable). openclaw#82219 marketplace work is excluded from this PR. Closes openclaw#82218 Related openclaw#82219, openclaw#83293
147f6c4 to
cbf85a9
Compare
chat surface - /codex (no-arg) returns a 2x2 button picker (plugins / permissions / account / help) - /codex fast menu, /codex permissions menu, /codex computer-use menu open sub-pickers - Telegram callback handler dispatches cdx_* callback_data to a new picker library at extensions/telegram/src/codex-picker-buttons.ts; navigation buttons editMessage in place, leaf actions stay on the existing tgcmd: synthesis path so they fire as real chat commands and pass through mainline's canMutateCodexPlugins auth gate from openclaw#83293. - No new plugin verbs beyond canonical list / enable / disable; toggle / remove / add are intentionally not picker-exposed (per maintainer guidance on the prior shape of openclaw#82224). - Rebased on top of openclaw#83293 (mainline list/enable/disable). openclaw#82219 marketplace work is excluded from this PR. Closes openclaw#82218 Related openclaw#82219, openclaw#83293
51507e1 to
8072d13
Compare
|
Verification before merge on head
Known gap: no live Telegram bot roundtrip was run. |
…n-rotation-current * origin/main: docs: strengthen review dependency inspection rules refactor: expand acp core package (#88618) fix(doctor): diagnose malformed provider catalogs fix(agents): normalize prefixed Anthropic model ids (#88587) chore: bump OpenClaw version to 2026.5.31 feat(codex): add portable Codex command pickers (#82224) fix(tui): preserve pending local runs during session sync (#87959) docs: clarify inline code comments fix(auto-reply): warn on substantive private message-tool finals fix(tui): use middle truncation for paths and commands in tool display (#88050) fix(webchat): suppress stale active session rows (#87962) fix(tui): skip history reload when final event has displayable output (#88004) test(discord): isolate timer-sensitive request tests fix(auth): coerce persisted device auth tokens fix(e2e): heartbeat resource-sampled docker lanes # Conflicts: # src/gateway/server-methods/exec-approvals.ts # src/gateway/server-methods/nodes-pending.ts # src/infra/node-pairing.ts # src/tui/tui-command-handlers.test.ts
Refactor Codex slash-command pickers so the Codex plugin owns the native command tree and returns portable presentation buttons for channels to render. Telegram now maps portable slash-command buttons to `tgcmd:` native callbacks while preserving approval callback shortening/bypass behavior, and the old Telegram-specific Codex callback menu path is gone. Verification: - `node scripts/run-vitest.mjs extensions/codex/src/command-plugins-management.test.ts extensions/codex/src/commands.test.ts extensions/telegram/src/button-types.test.ts` - `node scripts/run-vitest.mjs extensions/telegram/src/bot.test.ts extensions/telegram/src/button-types.test.ts extensions/telegram/src/bot-native-commands.test.ts extensions/telegram/src/shared.test.ts` - `node scripts/run-vitest.mjs run --config test/vitest/vitest.media-understanding.config.ts --reporter=verbose` - `pnpm check:test-types` - `pnpm tsgo:prod` - `pnpm lint --threads=8` - `git diff --check` - `.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main` - CI `26714121462` Co-authored-by: Soham Patankar <102520430+yaanfpv@users.noreply.github.com>
Refactor Codex slash-command pickers so the Codex plugin owns the native command tree and returns portable presentation buttons for channels to render. Telegram now maps portable slash-command buttons to `tgcmd:` native callbacks while preserving approval callback shortening/bypass behavior, and the old Telegram-specific Codex callback menu path is gone. Verification: - `node scripts/run-vitest.mjs extensions/codex/src/command-plugins-management.test.ts extensions/codex/src/commands.test.ts extensions/telegram/src/button-types.test.ts` - `node scripts/run-vitest.mjs extensions/telegram/src/bot.test.ts extensions/telegram/src/button-types.test.ts extensions/telegram/src/bot-native-commands.test.ts extensions/telegram/src/shared.test.ts` - `node scripts/run-vitest.mjs run --config test/vitest/vitest.media-understanding.config.ts --reporter=verbose` - `pnpm check:test-types` - `pnpm tsgo:prod` - `pnpm lint --threads=8` - `git diff --check` - `.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main` - CI `26714121462` Co-authored-by: Soham Patankar <102520430+yaanfpv@users.noreply.github.com>
Refactor Codex slash-command pickers so the Codex plugin owns the native command tree and returns portable presentation buttons for channels to render. Telegram now maps portable slash-command buttons to `tgcmd:` native callbacks while preserving approval callback shortening/bypass behavior, and the old Telegram-specific Codex callback menu path is gone. Verification: - `node scripts/run-vitest.mjs extensions/codex/src/command-plugins-management.test.ts extensions/codex/src/commands.test.ts extensions/telegram/src/button-types.test.ts` - `node scripts/run-vitest.mjs extensions/telegram/src/bot.test.ts extensions/telegram/src/button-types.test.ts extensions/telegram/src/bot-native-commands.test.ts extensions/telegram/src/shared.test.ts` - `node scripts/run-vitest.mjs run --config test/vitest/vitest.media-understanding.config.ts --reporter=verbose` - `pnpm check:test-types` - `pnpm tsgo:prod` - `pnpm lint --threads=8` - `git diff --check` - `.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main` - CI `26714121462` Co-authored-by: Soham Patankar <102520430+yaanfpv@users.noreply.github.com>




Summary
/codexpicker ownership into the Codex plugin: core/native command handling returns portableMessagePresentationbuttons for Codex submenus, plugin management, fast mode, permissions, and computer-use.Verification
node scripts/run-vitest.mjs extensions/codex/src/command-plugins-management.test.ts extensions/codex/src/commands.test.ts extensions/telegram/src/button-types.test.tsnode scripts/run-vitest.mjs extensions/telegram/src/bot.test.ts extensions/telegram/src/button-types.test.ts extensions/telegram/src/bot-native-commands.test.ts extensions/telegram/src/shared.test.tsnode scripts/run-vitest.mjs run --config test/vitest/vitest.media-understanding.config.ts --reporter=verbosepnpm check:test-typespnpm tsgo:prodpnpm lint --threads=8git diff --check.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main-> clean, no accepted/actionable findingsReal behavior proof
Behavior addressed:
/codexno-arg and submenu pickers now expose native slash-command actions as portable presentation buttons, and Telegram maps those slash buttons into native callback routing without Codex-specific Telegram callback ids.Real environment tested: Local OpenClaw checkout on the rebased PR head, loading the real Telegram extension button mapper through the repo runtime (
node --import tsx).Exact steps or command run after this patch: Ran this command after the final Telegram native callback and approval preservation fixes:
Evidence after fix: Terminal output from the real mapper:
[ [ { "text": "plugins", "callback_data": "tgcmd:/codex plugins menu" }, { "text": "allow plugin", "callback_data": "/approve plugin:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa always" } ] ]Observed result after fix: The portable Codex slash command is emitted as a Telegram native callback, while the long plugin approval action stays on the raw approval callback path and is shortened to fit Telegram callback data.
What was not tested: No live Telegram bot roundtrip was run.