CAS-112: align dynamic UI eligibility - #42633
Conversation
|
Review focus: this deliberately moves UI eligibility out of Slack-specific prompt-time schema projection. Please check the boundary between the stable full wire schema, live renderer enforcement, and clientless surface persistence. |
Co-authored-by: Cursor <cursoragent@cursor.com>
Part of CAS-112. Tool definitions stay identical across Slack, desktop, and clientless turns so the tools cache prefix can reuse. Live Slack still rejects unsupported surfaces at execution. Background turns persist UI and are told not to wait or claim the surface is visible. Activation-rail conversations still receive the optional activation_moment property because that state is conversation-stable. The watch-retro docs now match the shipped clientless UI contract: ui_show stays on the wire, and the retro still reports through watch_retro_report so the daemon can append the card after the turn. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9d7adb4712
ℹ️ About Codex in GitHub
Codex has been enabled to automatically 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 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| let allBaseDefs = [...scopedCoreDefs, ...scopedWorkspaceDefs, ...scopedMcpDefs].filter( | ||
| (d) => !excluded.has(d.name), | ||
| ); |
There was a problem hiding this comment.
Return background-safe results for newly exposed visuals
When a clientless Slack turn selects the newly exposed visual surface type, surfaceProxyResolver persists the surface but returns the existing result at conversation-surfaces.ts:3685-3690, which says the visual is already visible inline and instructs the model not to describe or restate it. No client rendered the surface during this turn, so the model can suppress the only Slack-visible result and leave the user with no output unless they later open the conversation in a capable app. Previously the Slack projection excluded visual; either return a clientless-specific result that requires a prose response or keep this type unavailable in that context.
Useful? React with 👍 / 👎.
Summary
ui_showschema stable across live Slack and clientless background turns.Validation
bun test src/__tests__/subagent-tool-gate-mode.test.tsbun test src/__tests__/conversation-surfaces-task-progress.test.tsbun test src/__tests__/conversation-runtime-assembly.test.tsbun test src/__tests__/ui-channel-variants.test.tsbun test src/__tests__/channel-capabilities-dedupe.test.tsbun run lintbun run typecheck:fastgit diff --check