commandmate 0.39.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +457 -452
- package/.next/app-path-routes-manifest.json +32 -31
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js +1 -1
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +10 -10
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +32 -31
- package/.next/server/chunks/{7086.js → 1674.js} +4 -4
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/252.js +1 -0
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3323.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5742.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6793.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +29 -29
- package/.next/server/chunks/8673.js +14 -0
- package/.next/server/chunks/8728.js +4 -3
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/9080.js +1 -1
- package/.next/server/chunks/9731.js +2 -2
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1642-767aed8e7c61ef7f.js +1 -0
- package/.next/static/chunks/{2053-ce3fe896ad45e50f.js → 2053-611dd27d42721b79.js} +1 -1
- package/.next/static/chunks/{2407-8fe4e4d0bab1931a.js → 2407-e259744922e0834c.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/{3922.9c1ec01fff819c88.js → 3922.8e79fc89f593280b.js} +1 -1
- package/.next/static/chunks/4768-979c8a03bed218e7.js +1 -0
- package/.next/static/chunks/6192-a67df090838b9aad.js +1 -0
- package/.next/static/chunks/7705-25076b57224da370.js +1 -0
- package/.next/static/chunks/8165-8944f74c53f3021f.js +1 -0
- package/.next/static/chunks/8318-01e7d1e5ad0a15a3.js +1 -0
- package/.next/static/chunks/8407-9a72e6f07c5d5458.js +1 -0
- package/.next/static/chunks/8606-9a381b996f9b6834.js +1 -0
- package/.next/static/chunks/9619-22adf5367c4b7080.js +1 -0
- package/.next/static/chunks/app/api/agents/update/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
- package/.next/static/chunks/app/api/agents/versions/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
- package/.next/static/chunks/app/api/app/release-notes/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
- package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/layout-b90cce6a51c91f4c.js +1 -0
- package/.next/static/chunks/app/login/{page-269a9de3b91a45a2.js → page-38d401f553693b03.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/more/page-30057cf1e0762ad2.js +1 -0
- package/.next/static/chunks/app/{page-0c1a29ff3609bd8b.js → page-8483ba400af011f5.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/repositories/{page-e9ceeefacf87d470.js → page-6f7511f4ac8449e2.js} +1 -1
- package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +1 -0
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-6f62668eabb635f5.js → page-ab7e432b69fccb3b.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-c6c4ac5e26c4e73e.js → page-e000102a01a42c98.js} +1 -1
- package/.next/static/chunks/app/skills/{page-bec1d4924004d4de.js → page-56b4fa11223e0cbd.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-2e98f11956fe1aea.js → page-5445205c8dd80109.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e9ebdcd317b62e4a.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/chunks/{webpack-9f75198882fdaf08.js → webpack-7e5907979c182510.js} +1 -1
- package/.next/static/css/974314e796232f53.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/direct-input/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +9 -0
- package/dist/cli/commands/peers.d.ts.map +1 -1
- package/dist/cli/commands/peers.js +4 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +20 -6
- package/dist/cli/config/model-validation.d.ts +22 -0
- package/dist/cli/config/model-validation.d.ts.map +1 -1
- package/dist/cli/config/model-validation.js +35 -1
- package/dist/cli/types/api-responses.d.ts +11 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +13 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +13 -0
- package/dist/lib/detection/tools/verified-against.d.ts +74 -5
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +74 -5
- package/dist/server/locales/en/worktree.json +58 -0
- package/dist/server/locales/ja/worktree.json +58 -0
- package/dist/server/src/config/claude-constants.js +27 -0
- package/dist/server/src/lib/cli-tools/base.js +2 -1
- package/dist/server/src/lib/cli-tools/claude.js +5 -1
- package/dist/server/src/lib/cli-tools/command-code.js +5 -1
- package/dist/server/src/lib/cli-tools/direct-input.js +22 -0
- package/dist/server/src/lib/cmate-cli-tool-parser.js +31 -0
- package/dist/server/src/lib/detection/cli-patterns.js +44 -5
- package/dist/server/src/lib/detection/selection-shape.js +274 -19
- package/dist/server/src/lib/detection/status-detector.js +2 -0
- package/dist/server/src/lib/detection/status-reason.js +13 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +67 -27
- package/dist/server/src/lib/detection/tools/codex/detect.js +18 -3
- package/dist/server/src/lib/detection/tools/command-code/detect.js +46 -0
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +116 -25
- package/dist/server/src/lib/detection/tools/verified-against.js +74 -5
- package/dist/server/src/lib/detection/tui-detection-frame.js +18 -3
- package/dist/server/src/lib/polling/auto-yes-resolver.js +8 -0
- package/dist/server/src/lib/prompt-answer-sender.js +255 -1
- package/dist/server/src/lib/realtime-snippet.js +53 -0
- package/dist/server/src/lib/session/claude-session.js +19 -2
- package/dist/server/src/lib/session/current-output-builder.js +4 -1
- package/dist/server/src/lib/session/status-mapping.js +58 -8
- package/dist/server/src/lib/tmux/key-sequence.js +27 -1
- package/dist/server/src/lib/tmux/tmux-control-client.js +26 -3
- package/dist/server/src/lib/tmux/tmux.js +64 -3
- package/dist/server/src/types/direct-input.js +113 -0
- package/dist/server/src/types/sidebar.js +67 -7
- package/dist/server/src/types/terminal-keys.js +33 -1
- package/dist/types/terminal-keys.d.ts +28 -1
- package/dist/types/terminal-keys.d.ts.map +1 -1
- package/dist/types/terminal-keys.js +33 -1
- package/package.json +3 -2
- package/public/sw.js +5 -5
- package/release-notes/0.39.1.json +29 -0
- package/release-notes/0.40.0.json +69 -0
- package/.next/server/chunks/1707.js +0 -14
- package/.next/server/chunks/366.js +0 -1
- package/.next/server/chunks/8550.js +0 -1
- package/.next/static/chunks/1032-9e43405ac6bf6848.js +0 -1
- package/.next/static/chunks/3504-0100ab50762f591b.js +0 -1
- package/.next/static/chunks/4322-f54abdc5d16b7462.js +0 -1
- package/.next/static/chunks/4768-0ad5eb716bed5de9.js +0 -1
- package/.next/static/chunks/4949-a13ace141c0183d6.js +0 -1
- package/.next/static/chunks/5529-83e705fc4134a503.js +0 -1
- package/.next/static/chunks/6022-d2d7bd9373ff3ae9.js +0 -1
- package/.next/static/chunks/8019-cc6ac1cc033fd5f0.js +0 -1
- package/.next/static/chunks/8606-e893c1dab6fb81bc.js +0 -1
- package/.next/static/chunks/9619-c3c4c623b0a4f681.js +0 -1
- package/.next/static/chunks/998-292ebcd30f329eb1.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/relays/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/skills/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/templates/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/layout-f43045c9edbc4d1f.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/more/page-3963a5e56e550442.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/review/page-3028fe95de490236.js +0 -1
- package/.next/static/chunks/app/sessions/page-3f39f99b878fdda0.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-70779af8b4c8259a.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-0305d80c8ebda4cb.js +0 -1
- package/.next/static/css/2c63c5531f77719e.css +0 -1
- /package/.next/static/{CqFH31RhKQbrRZXsMNosJ → o3mZdwNhCks6IlcAOPinc}/_buildManifest.js +0 -0
- /package/.next/static/{CqFH31RhKQbrRZXsMNosJ → o3mZdwNhCks6IlcAOPinc}/_ssgManifest.js +0 -0
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
* ESC[1mESC[38;5;6m› 1. Yes, proceed (y)ESC[0m approval option → bold label
|
|
45
45
|
* ESC[1mESC[38;5;6m› [ ] Network proxy Apply network… /experimental → bold label
|
|
46
46
|
* ESC[1mESC[38;5;6m› Global - Open Agents unboundESC[0m /keymap → bold label
|
|
47
|
-
* ESC[38;5;6m› 1. Yes, continueESC[39m trust dialog →
|
|
47
|
+
* ESC[38;5;6m› 1. Yes, continueESC[39m trust dialog → glyph colour runs into the label
|
|
48
48
|
* ```
|
|
49
49
|
*
|
|
50
50
|
* `composer-residual-leading-number.txt` is the frame that rules out the cheap
|
|
@@ -53,9 +53,37 @@
|
|
|
53
53
|
* `waiting` — the shape #1883 turned into a send guard that rejected every send.
|
|
54
54
|
*
|
|
55
55
|
* {@link readCodexGlyphRowKind} therefore recognises an option **positively**
|
|
56
|
-
* (bold label, or
|
|
57
|
-
* as "not the composer". Every unrecognised shape falls to
|
|
58
|
-
*
|
|
56
|
+
* (bold label, or the glyph's colour running on into the label) instead of
|
|
57
|
+
* defining it as "not the composer". Every unrecognised shape falls to
|
|
58
|
+
* `composer`, which is what the code did before #2310.
|
|
59
|
+
*
|
|
60
|
+
* ## codex 0.155.1 colours the composer glyph (Issue #2798)
|
|
61
|
+
*
|
|
62
|
+
* Through 0.154.0 a coloured glyph was only ever a dialog's, so "the glyph has a
|
|
63
|
+
* non-default foreground" was read as an option on its own. 0.155.1 draws the
|
|
64
|
+
* idle composer's glyph bold AND in truecolor orange
|
|
65
|
+
* (`tests/fixtures/codex-idle-composer-0155/`):
|
|
66
|
+
*
|
|
67
|
+
* ```text
|
|
68
|
+
* ESC[1mESC[38;2;255;178;66m›ESC[0m ESC[2mAsk Codex to do anythingESC[0m composer, empty (0.155.1)
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* Read by colour alone that is an option, so every finished turn on 0.155.1
|
|
72
|
+
* published `waiting` / `codex_selection_list` next to a `ghost` composer: the
|
|
73
|
+
* chat pane stuck on the selection-list card, `commandmate wait` returned
|
|
74
|
+
* exit 10 instead of completing, and the Pick pad offered the assistant's own
|
|
75
|
+
* numbered paragraphs as choices. What still separates the two is where the
|
|
76
|
+
* colour stops. A dialog paints its highlighted row as ONE span — glyph and
|
|
77
|
+
* label in the same colour, with no attribute change between them — while the
|
|
78
|
+
* composer resets (`ESC[0m`) right after its glyph, on every measured build, so
|
|
79
|
+
* its label carries its own styling or none. The rule therefore reads the
|
|
80
|
+
* colour as option evidence only when the label is drawn in the glyph's colour,
|
|
81
|
+
* and reads a dim label — the composer's placeholder, the same signal
|
|
82
|
+
* `composer-text.ts` calls `ghost` — as the composer before it looks at colour.
|
|
83
|
+
* `codex-pasted-content.capture` (#2464, 0.154.0) is why "the label is coloured
|
|
84
|
+
* too" is not enough: a composer holding pasted text draws its
|
|
85
|
+
* `[Pasted Content …]` label cyan, and on 0.155.1 that label would sit next to
|
|
86
|
+
* an orange glyph.
|
|
59
87
|
*
|
|
60
88
|
* ## Why this duplicates a little of `composer-text.ts`
|
|
61
89
|
*
|
|
@@ -84,16 +112,18 @@ exports.CODEX_GLYPH = '›';
|
|
|
84
112
|
* The codex build these dialog rules were read off.
|
|
85
113
|
*
|
|
86
114
|
* Separate from `CODEX_VERIFIED_AGAINST` on purpose: that stamp is the whole
|
|
87
|
-
* detector's (`tools/verified-against.ts
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
115
|
+
* detector's (`tools/verified-against.ts`). It was held at 0.148.0 while one
|
|
116
|
+
* idle frame of the same 0.155.1 probe was misread for a reason outside these
|
|
117
|
+
* rules — the status-bar boundary — and advanced to 0.155.1 once Issue #2818
|
|
118
|
+
* fixed that boundary. The dialog frames themselves
|
|
119
|
+
* all read correctly on 0.155.1 (Issue #2808, `tests/fixtures/codex-dialogs-0155/`):
|
|
120
|
+
* the command approval, `/model`, `/experimental`, `/keymap` and the
|
|
121
|
+
* directory-trust screen are `waiting`, and every highlighted row is the
|
|
122
|
+
* one-span shape these rules key on. The rules were first read off 0.153.2.
|
|
93
123
|
*/
|
|
94
124
|
exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
|
|
95
|
-
version: '0.
|
|
96
|
-
capturedAt: '2026-09-
|
|
125
|
+
version: '0.155.1',
|
|
126
|
+
capturedAt: '2026-09-21',
|
|
97
127
|
paneGeometry: '200x1000',
|
|
98
128
|
};
|
|
99
129
|
/**
|
|
@@ -116,12 +146,13 @@ exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
|
|
|
116
146
|
* | `Press t to trust all; enter to review hooks; esc to close` | hooks list | both |
|
|
117
147
|
* | `Press t to trust; esc to go back` | hooks detail | both |
|
|
118
148
|
* | `Press space to select or enter to save for next conversation` | `/experimental` | 1st |
|
|
149
|
+
* | `Press space to select or enter to save` | `/experimental` (0.155.1) | 1st |
|
|
119
150
|
* | `left/right group · enter edit shortcut · … · esc close` | `/keymap` | 2nd |
|
|
120
151
|
*
|
|
121
152
|
* No `/g` (keeps `.test()` stateless) and no nested quantifiers (ReDoS-safe).
|
|
122
153
|
*/
|
|
123
154
|
exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back)/i;
|
|
124
|
-
const INITIAL_SGR = { bold: false, dim: false,
|
|
155
|
+
const INITIAL_SGR = { bold: false, dim: false, fg: null };
|
|
125
156
|
/**
|
|
126
157
|
* Apply one SGR parameter list to the running attribute state.
|
|
127
158
|
*
|
|
@@ -133,7 +164,7 @@ const INITIAL_SGR = { bold: false, dim: false, coloured: false };
|
|
|
133
164
|
*/
|
|
134
165
|
function applySgr(params, state) {
|
|
135
166
|
const parts = params === '' ? ['0'] : params.split(';');
|
|
136
|
-
let { bold, dim,
|
|
167
|
+
let { bold, dim, fg } = state;
|
|
137
168
|
for (let i = 0; i < parts.length; i++) {
|
|
138
169
|
const code = parts[i] === '' ? 0 : Number(parts[i]);
|
|
139
170
|
if (Number.isNaN(code))
|
|
@@ -141,13 +172,9 @@ function applySgr(params, state) {
|
|
|
141
172
|
if (code === 38) {
|
|
142
173
|
const mode = parts[i + 1] === '' || parts[i + 1] === undefined ? -1 : Number(parts[i + 1]);
|
|
143
174
|
// 5 = 256-colour (one argument), 2 = 24-bit RGB (three arguments).
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
i += 4;
|
|
148
|
-
else
|
|
149
|
-
i += 1;
|
|
150
|
-
coloured = true;
|
|
175
|
+
const argCount = mode === 5 ? 2 : mode === 2 ? 4 : 1;
|
|
176
|
+
fg = parts.slice(i + 1, i + 1 + argCount).join(';');
|
|
177
|
+
i += argCount;
|
|
151
178
|
continue;
|
|
152
179
|
}
|
|
153
180
|
if (code === 48 || code === 58) {
|
|
@@ -164,7 +191,7 @@ function applySgr(params, state) {
|
|
|
164
191
|
if (code === 0) {
|
|
165
192
|
bold = false;
|
|
166
193
|
dim = false;
|
|
167
|
-
|
|
194
|
+
fg = null;
|
|
168
195
|
}
|
|
169
196
|
else if (code === 1)
|
|
170
197
|
bold = true;
|
|
@@ -175,11 +202,11 @@ function applySgr(params, state) {
|
|
|
175
202
|
dim = false;
|
|
176
203
|
}
|
|
177
204
|
else if (code === 39)
|
|
178
|
-
|
|
205
|
+
fg = null;
|
|
179
206
|
else if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97))
|
|
180
|
-
|
|
207
|
+
fg = String(code);
|
|
181
208
|
}
|
|
182
|
-
return { bold, dim,
|
|
209
|
+
return { bold, dim, fg };
|
|
183
210
|
}
|
|
184
211
|
/**
|
|
185
212
|
* Split one raw pane row into rendered characters tagged with their attributes.
|
|
@@ -259,8 +286,21 @@ function readCodexGlyphRowKind(rawRow) {
|
|
|
259
286
|
if (glyph.dim)
|
|
260
287
|
return 'transcript-echo';
|
|
261
288
|
const label = chars.slice(glyphIndex + 1).find(c => c.ch.trim() !== '');
|
|
262
|
-
//
|
|
263
|
-
if (label?.attrs.bold
|
|
289
|
+
// A dialog renders its highlighted label bold; composer text never is.
|
|
290
|
+
if (label?.attrs.bold)
|
|
291
|
+
return 'option';
|
|
292
|
+
// Issue #2798: a dim label is the placeholder codex paints into an EMPTY
|
|
293
|
+
// composer (`Ask Codex to do anything`), which is the input box saying so
|
|
294
|
+
// itself. Checked before the colour, because from 0.155.1 on the composer's
|
|
295
|
+
// glyph is coloured too.
|
|
296
|
+
if (label?.attrs.dim)
|
|
297
|
+
return 'composer';
|
|
298
|
+
// Issue #2798: a coloured glyph alone is not a dialog — 0.155.1 draws the idle
|
|
299
|
+
// composer's `›` in orange. A dialog paints glyph and label as one span, so
|
|
300
|
+
// the colour counts only when the label is drawn in the glyph's own colour;
|
|
301
|
+
// the composer resets right after its glyph, and its pasted-content label is
|
|
302
|
+
// cyan, not the glyph's orange.
|
|
303
|
+
if (glyph.fg !== null && label?.attrs.fg === glyph.fg)
|
|
264
304
|
return 'option';
|
|
265
305
|
return 'composer';
|
|
266
306
|
}
|
|
@@ -41,10 +41,18 @@ exports.VERIFIED_AGAINST = verified_against_1.CODEX_VERIFIED_AGAINST;
|
|
|
41
41
|
*/
|
|
42
42
|
const CODEX_CONFIRMATION_FOOTER_PATTERN = /press\s+(?:number|enter)\s+to\s+confirm/i;
|
|
43
43
|
const CODEX_NUMBERED_OPTION_PATTERN = /^\s*[❯›●]?\s*\d{1,2}[.)]\s/;
|
|
44
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Index of the Codex status bar within the last 10 content rows, or -1.
|
|
46
|
+
*
|
|
47
|
+
* Issue #2818: a bar carrying a thread title or the Plan-mode badge after the
|
|
48
|
+
* path (codex 0.154.0+) is the same bar, so it is a boundary too. Without it
|
|
49
|
+
* such frames fell to branch D, whose 15-row tail still holds a finished
|
|
50
|
+
* turn's `• Ran …` record, and an idle session read `running`.
|
|
51
|
+
*/
|
|
45
52
|
function findCodexFooterBoundary(contentLines) {
|
|
46
53
|
for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
|
|
47
|
-
|
|
54
|
+
const line = contentLines[ci];
|
|
55
|
+
if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line) || cli_patterns_1.CODEX_TRAILED_STATUS_BAR_PATTERN.test(line))
|
|
48
56
|
return ci;
|
|
49
57
|
}
|
|
50
58
|
return -1;
|
|
@@ -216,7 +224,8 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
216
224
|
// prompts high in scrollback to falsely trigger NavigationButtons.
|
|
217
225
|
//
|
|
218
226
|
// Issue #1150: the status bar is located via CODEX_STATUS_BAR_PATTERN (version-
|
|
219
|
-
// independent; matches both legacy "N% left ·" and v0.141 "model · path" bars)
|
|
227
|
+
// independent; matches both legacy "N% left ·" and v0.141 "model · path" bars),
|
|
228
|
+
// and since #2818 via CODEX_TRAILED_STATUS_BAR_PATTERN too (0.154+ "· <title>").
|
|
220
229
|
const codexFooterBoundary = findCodexFooterBoundary(contentLines);
|
|
221
230
|
let codexContentEnd = codexFooterBoundary >= 0 ? codexFooterBoundary - 1 : contentLines.length - 1;
|
|
222
231
|
while (codexContentEnd >= 0 && contentLines[codexContentEnd].trim() === '') {
|
|
@@ -402,6 +411,12 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
402
411
|
// Claude's interrupt-hint net. Gated so idle frames are unaffected:
|
|
403
412
|
// only fires when the tail is NOT the idle › prompt, so an idle session still
|
|
404
413
|
// falls through to the generic composer check.
|
|
414
|
+
//
|
|
415
|
+
// That gate does not hold when the bar is drawn but not recognised: the tail
|
|
416
|
+
// is then the bar, not the `›`, and a finished turn's `• Ran …` record in the
|
|
417
|
+
// 15-row window reads as running. That is how 0.154's titled bar misread
|
|
418
|
+
// idle sessions until #2818 taught findCodexFooterBoundary its shape — the
|
|
419
|
+
// cost of this net whenever codex redraws the bar again.
|
|
405
420
|
let codexTailIdx = contentLines.length - 1;
|
|
406
421
|
while (codexTailIdx >= 0 && contentLines[codexTailIdx].trim() === '') {
|
|
407
422
|
codexTailIdx--;
|
|
@@ -95,6 +95,15 @@
|
|
|
95
95
|
* reading declines. The move to `beforePrompt` is part of that: see the branch
|
|
96
96
|
* for why the generic parser must not get this frame either before or after.
|
|
97
97
|
*
|
|
98
|
+
* Issue #2761 put a second reading in `beforePrompt`, ahead of that one: the
|
|
99
|
+
* plan review overlay (1.58.0), identified by `Approve ctrl+a` / `Cancel esc`.
|
|
100
|
+
* It is there for the same reason — the shared parser must not get the frame —
|
|
101
|
+
* but for a different hazard: the rows above its footer are the plan itself, and
|
|
102
|
+
* a plan that ends in `(y/n)` reads as a yes/no prompt. Issue #2793 extended that
|
|
103
|
+
* reading to the two states of the overlay #2763 measured and #2761 had not seen:
|
|
104
|
+
* the action list focused (`❯ Approve ctrl+a`), and the radio `ctrl+a` asks
|
|
105
|
+
* with comments pending.
|
|
106
|
+
*
|
|
98
107
|
* ## What #2304 re-measured, and what it did not change
|
|
99
108
|
*
|
|
100
109
|
* Nothing here changed, and that is the finding. Seven frames were captured
|
|
@@ -138,6 +147,43 @@ exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector
|
|
|
138
147
|
tool: 'command-code',
|
|
139
148
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
140
149
|
beforePrompt(frame) {
|
|
150
|
+
// Issue #2761. The plan review overlay, read off its two footer rows.
|
|
151
|
+
//
|
|
152
|
+
// `beforePrompt` and not `afterPrompt`, and that placement is the point: the
|
|
153
|
+
// rows above the footer are the PLAN — free text the agent wrote — and the
|
|
154
|
+
// last eight of them sit inside the 15-row window the shared parser reads.
|
|
155
|
+
// A plan whose last line is `Do you want to proceed? (y/n)` or `Approve?` is
|
|
156
|
+
// read by that parser as a yes/no prompt (measured), which publishes
|
|
157
|
+
// `hasActivePrompt: true` and lets Auto-Yes type `y` — into the plan, as a
|
|
158
|
+
// comment. So this screen must be claimed before the parser sees it.
|
|
159
|
+
//
|
|
160
|
+
// `waiting` + the selection-list family: the arrows move a line cursor, a
|
|
161
|
+
// human has to decide, and nothing on this pane moves until they do.
|
|
162
|
+
// `hasActivePrompt: false` — there is no payload to answer with, and approval
|
|
163
|
+
// is never something Auto-Yes may do on its own.
|
|
164
|
+
//
|
|
165
|
+
// Issue #2793 widened what "this screen" covers, on two frames each that
|
|
166
|
+
// #2763 measured and this branch had missed:
|
|
167
|
+
//
|
|
168
|
+
// - **the action list focused** (`❯ Approve ctrl+a` / `❯ Cancel esc`).
|
|
169
|
+
// The footer pattern now takes the `❯` on either row. Missing it was a
|
|
170
|
+
// false completion, not a gap: the frame fell through to the composer
|
|
171
|
+
// check, `COMMAND_CODE_PROMPT_PATTERN` read the `❯` row as the composer,
|
|
172
|
+
// and `wait` exited 0 on a plan nobody had approved;
|
|
173
|
+
// - **the approve-with-comments radio** `ctrl+a` opens when comments are
|
|
174
|
+
// pending (`←/→ choose · enter confirm · esc back`). The same verdict: it is
|
|
175
|
+
// the same overlay, still waiting on a human's decision about the plan,
|
|
176
|
+
// and the arrow pad (`◀` `▶` `Enter` `Esc`) is exactly what it asks for.
|
|
177
|
+
if (selection_shape_1.COMMAND_CODE_PLAN_REVIEW_FOOTER.test(frame.lastLines) ||
|
|
178
|
+
(0, selection_shape_1.isCommandCodePlanApproveChoice)(frame.lastLines)) {
|
|
179
|
+
return {
|
|
180
|
+
status: 'waiting',
|
|
181
|
+
confidence: 'high',
|
|
182
|
+
reason: status_reason_1.STATUS_REASON.COMMAND_CODE_PLAN_REVIEW,
|
|
183
|
+
hasActivePrompt: false,
|
|
184
|
+
evidence: 'positive',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
141
187
|
// Issue #2521 recognised this screen; Issue #2522 reads it.
|
|
142
188
|
//
|
|
143
189
|
// `AskUserQuestion` draws no footer, so neither `afterPrompt` branch below
|
|
@@ -139,19 +139,57 @@ const COMMAND_CODE_FREE_TEXT_OPTION_PATTERN = /^[^\S\n]*type\s+something\b/i;
|
|
|
139
139
|
/**
|
|
140
140
|
* A checkbox option — the row shape of a MULTI-select question.
|
|
141
141
|
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
142
|
+
* Issue #2522 used this to DECLINE the screen: on a checkbox list the digit
|
|
143
|
+
* toggles a box and the confirm is a separate `Submit` / `Next` row, so a
|
|
144
|
+
* payload claiming "option 2 is the answer" had `respond 2` tick a box and stop,
|
|
145
|
+
* leaving the question up and the operator told it was answered.
|
|
146
|
+
*
|
|
147
|
+
* Issue #2755 turns it into a READING instead. The prefix is stripped off the
|
|
148
|
+
* label, the ticked rows are reported as {@link MultipleChoiceOption.checked},
|
|
149
|
+
* and the payload says `multiSelect: true` so that every consumer that turns a
|
|
150
|
+
* number into keys branches on it. The decline survives for the one screen that
|
|
151
|
+
* still cannot be answered — a checkbox list with no confirm row, where nothing
|
|
152
|
+
* measured says how the question is committed.
|
|
153
|
+
*
|
|
154
|
+
* Three tick glyphs, all measured: `[x]` on the 1.54.1 capture #2753 was raised
|
|
155
|
+
* from, `[✔]` (U+2714) across #2754's twenty-six, and `[X]` because the two
|
|
156
|
+
* differ only in case and a build that switches is not worth a second Issue.
|
|
157
|
+
*/
|
|
158
|
+
const CHECKBOX_OPTION_PATTERN = /^\[[ xX\u2714]\]\s/;
|
|
159
|
+
/** The tick half of {@link CHECKBOX_OPTION_PATTERN}: a box that is ON. */
|
|
160
|
+
const CHECKBOX_TICKED_PATTERN = /^\[[xX\u2714]\]\s/;
|
|
161
|
+
/**
|
|
162
|
+
* The confirm row of a multi-select question (Issue #2755).
|
|
163
|
+
*
|
|
164
|
+
* `Submit` on the last question of a call, `Next` on every other one, measured
|
|
165
|
+
* on 1.54.1. It carries NO number — the strict `1.`…`N.` run ends one row above
|
|
166
|
+
* it — and it is the row `findNumberedOptionBlock` files as `footer` and this
|
|
167
|
+
* module used to fold into the bottom option's label:
|
|
168
|
+
*
|
|
169
|
+
* options[4].label = "[ ] Type something... Submit Enter to select | …"
|
|
170
|
+
*
|
|
171
|
+
* The cursor glyph is optional and is the reason this is not
|
|
172
|
+
* `/^\s*Submit\s*$/`: 1.54.1 draws `❯ Submit` the moment the cursor parks
|
|
173
|
+
* there (#2754 実測 1), and a pattern that missed that spelling would fold the
|
|
174
|
+
* row back into the label on exactly the frames #2755 exists for.
|
|
175
|
+
*/
|
|
176
|
+
const COMMAND_CODE_CONFIRM_ROW_PATTERN = /^[^\S\n]*(?:\u276F[^\S\n]*)?(?:Submit|Next)[^\S\n]*$/;
|
|
177
|
+
/**
|
|
178
|
+
* 1.54.1's hint bar, which is not part of any option either (Issue #2755).
|
|
179
|
+
*
|
|
180
|
+
* Enter to select | Arrow keys to navigate | 1-9 quick select | n notes | c chat | Esc to cancel
|
|
181
|
+
*
|
|
182
|
+
* Drawn only when the call carries more than one question (#2754 実測 3), which
|
|
183
|
+
* is why it is NOT used as evidence that this screen is up — the most dangerous
|
|
184
|
+
* spelling, one question with the cursor on `Submit`, draws no footer at all.
|
|
185
|
+
* It is read here for the one thing it is good for: keeping it out of the last
|
|
186
|
+
* option's label, where the tail walk would otherwise put it along with its
|
|
187
|
+
* `requiresTextInput` flag.
|
|
188
|
+
*
|
|
189
|
+
* Distinct from {@link COMMAND_CODE_SELECTION_LIST_FOOTER}, which is the `·`
|
|
190
|
+
* separated picker footer and is left exactly as #2753 left it.
|
|
153
191
|
*/
|
|
154
|
-
const
|
|
192
|
+
const COMMAND_CODE_QUESTION_HINT_BAR_PATTERN = /^[^\S\n]*Enter\s+to\s+select\b.*\|.*\bEsc\s+to\s+cancel[^\S\n]*$/i;
|
|
155
193
|
/**
|
|
156
194
|
* The same tail limits `prompt-detector.ts` applies to `rawContent`
|
|
157
195
|
* (`RAW_CONTENT_MAX_LINES` / `RAW_CONTENT_MAX_CHARS`), restated because that
|
|
@@ -182,6 +220,13 @@ function unsupported(reason) {
|
|
|
182
220
|
function readCommandCodeQuestionDialog(frame) {
|
|
183
221
|
if (!frame)
|
|
184
222
|
return { kind: 'none' };
|
|
223
|
+
// Issue #2755 §7: the Review page, before the question reading, because the
|
|
224
|
+
// two are told apart by what the rows SAY and not by their shape. Declined
|
|
225
|
+
// outright — see `'review-page'` — so neither this reader nor, through
|
|
226
|
+
// `beforePrompt`'s fallback verdict, the generic parser can turn `1. Submit`
|
|
227
|
+
// into an answerable default.
|
|
228
|
+
if ((0, selection_shape_1.readCommandCodeReviewPage)(frame) !== null)
|
|
229
|
+
return unsupported('review-page');
|
|
185
230
|
// The positive recognition is #2521's, unchanged and not re-derived: the last
|
|
186
231
|
// qualifying rule row, a tab strip under it, a question, a strict `1.`…`N.`
|
|
187
232
|
// run and exactly one `❯` on one of its rows, with the pickers and panels the
|
|
@@ -199,6 +244,13 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
199
244
|
? unsupported('numbering-unreadable')
|
|
200
245
|
: { kind: 'none' };
|
|
201
246
|
}
|
|
247
|
+
// Issue #2755 §2 / §8. The region is this screen and the `❯` is not on a
|
|
248
|
+
// numbered row: `Submit`, `Next` or the `notes:` input. Nothing here can be
|
|
249
|
+
// answered — the digits are dead while the cursor is off the list — but the
|
|
250
|
+
// pane is a live question, so it takes #2521's manual-operation fallback and
|
|
251
|
+
// NOT the `ready` the composer check would otherwise publish off `❯ Submit`.
|
|
252
|
+
if (!region.cursorOnOptionRow)
|
|
253
|
+
return unsupported('cursor-outside-options');
|
|
202
254
|
const lines = frame.replace(/\r\n/g, '\n').split('\n').map(ansi_1.stripAnsi);
|
|
203
255
|
const regionRows = lines.slice(region.firstLineIndex, region.lastLineIndex + 1);
|
|
204
256
|
if (regionRows.length > exports.COMMAND_CODE_QUESTION_MAX_REGION_ROWS) {
|
|
@@ -213,16 +265,32 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
213
265
|
if (block === null)
|
|
214
266
|
return unsupported('option-block-unreadable');
|
|
215
267
|
const labels = [...block.options];
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
268
|
+
// Rows below the bottom option. On 1.53.0 there were none but a wrapped
|
|
269
|
+
// description, which 確定仕様 A folds into that option. 1.54.1 draws two rows
|
|
270
|
+
// that are NOT anybody's description — the `Submit` / `Next` confirm and the
|
|
271
|
+
// hint bar — and folding them produced the label #2754 recorded:
|
|
272
|
+
//
|
|
273
|
+
// "[ ] Type something... Submit Enter to select | Arrow keys to navigate | …"
|
|
274
|
+
//
|
|
275
|
+
// Issue #2755 takes them out here rather than in `findNumberedOptionBlock`:
|
|
276
|
+
// that reader is shared by every tool's `prompt.ts`, and what a row below the
|
|
277
|
+
// last option MEANS is exactly the per-tool knowledge a tool module owns.
|
|
278
|
+
const tailRows = block.footer === '' ? [] : block.footer.split('\n');
|
|
279
|
+
const hasConfirmRow = tailRows.some((row) => COMMAND_CODE_CONFIRM_ROW_PATTERN.test(row));
|
|
280
|
+
const description = tailRows.filter((row) => !COMMAND_CODE_CONFIRM_ROW_PATTERN.test(row) &&
|
|
281
|
+
!COMMAND_CODE_QUESTION_HINT_BAR_PATTERN.test(row));
|
|
282
|
+
if (description.length > 0) {
|
|
220
283
|
const last = labels.length - 1;
|
|
221
|
-
labels[last] = [labels[last], ...
|
|
284
|
+
labels[last] = [labels[last], ...description].join(' ').trim();
|
|
222
285
|
}
|
|
223
286
|
if (labels.length !== region.optionCount)
|
|
224
287
|
return unsupported('option-count-mismatch');
|
|
225
|
-
|
|
288
|
+
// Issue #2755: a checkbox list is READ rather than declined — but only when
|
|
289
|
+
// the screen also draws the row that commits it. Without one, the digit
|
|
290
|
+
// toggles a box and nothing on this frame says what finishes the question, so
|
|
291
|
+
// #2522's decline stands.
|
|
292
|
+
const multiSelect = labels.some((label) => CHECKBOX_OPTION_PATTERN.test(label));
|
|
293
|
+
if (multiSelect && !hasConfirmRow)
|
|
226
294
|
return unsupported('multi-select');
|
|
227
295
|
// The default. Not `selectedGlyph` alone: `findNumberedOptionBlock`'s glyph
|
|
228
296
|
// union is `[❯›●>]` because it serves every CLI, and `●` is this screen's TAB
|
|
@@ -259,11 +327,25 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
259
327
|
// matters is that the descriptions are inside both: a deny pattern has to see
|
|
260
328
|
// the sentence the option is actually promising.
|
|
261
329
|
const dialogText = (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(regionRows, tabOffset + 1, regionRows.length);
|
|
262
|
-
|
|
330
|
+
// Issue #2755: the checkbox comes OFF the label and becomes state. A label
|
|
331
|
+
// that still read `[ ] calc.js` is what a user reported as "cannot pick more
|
|
332
|
+
// than one" (#2753's capture), and it is also what every label-matching
|
|
333
|
+
// consumer downstream — the deny patterns, `respond`'s semantic resolution,
|
|
334
|
+
// the answer panels — would have had to learn to strip for itself.
|
|
335
|
+
//
|
|
336
|
+
// `checked` is written on BOTH states of a multi-select row, because the
|
|
337
|
+
// sender computes a symmetric difference against it and "absent" would be
|
|
338
|
+
// indistinguishable from "unticked" at the one place the distinction decides
|
|
339
|
+
// whether a box is turned OFF. On a single-select row it is written on
|
|
340
|
+
// neither: 受入基準 (a) pins those payloads with `toStrictEqual`, and an
|
|
341
|
+
// added `checked: false` is exactly the drift that pin exists to catch.
|
|
342
|
+
const readOptions = labels.map((label, index) => ({
|
|
263
343
|
number: index + 1,
|
|
264
|
-
label,
|
|
344
|
+
label: multiSelect ? label.replace(CHECKBOX_OPTION_PATTERN, '') : label,
|
|
265
345
|
isDefault: index === block.selectedIndex,
|
|
266
|
-
|
|
346
|
+
...(multiSelect ? { checked: CHECKBOX_TICKED_PATTERN.test(label) } : {}),
|
|
347
|
+
}));
|
|
348
|
+
const built = (0, prompt_detect_multiple_choice_1.buildMultipleChoiceResult)(question, readOptions, { instructionText: dialogText, approvalTarget: dialogText }, regionRows.join('\n'), truncateRawContent,
|
|
267
349
|
// 確定仕様 D. The measured `QuestionPrompt` hands the ordinary choices to a
|
|
268
350
|
// `SelectInput`, which calls `onSelect` on the DIGIT — so a trailing Enter
|
|
269
351
|
// would land on whatever the tool painted next (the following question, or
|
|
@@ -290,10 +372,19 @@ function readCommandCodeQuestionDialog(frame) {
|
|
|
290
372
|
...built,
|
|
291
373
|
promptData: {
|
|
292
374
|
...promptData,
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
375
|
+
// Only ever added, never set to `false`: see the `checked` note above.
|
|
376
|
+
...(multiSelect ? { multiSelect: true } : {}),
|
|
377
|
+
// `buildMultipleChoiceResult` rebuilds every option from the three
|
|
378
|
+
// fields it takes, so `checked` is re-applied here rather than trusted
|
|
379
|
+
// to survive the shared builder (Issue #2755).
|
|
380
|
+
options: promptData.options.map((option, index) => {
|
|
381
|
+
const checked = readOptions[index]?.checked;
|
|
382
|
+
const withState = checked === undefined ? option : { ...option, checked };
|
|
383
|
+
return option.requiresTextInput === true ||
|
|
384
|
+
COMMAND_CODE_FREE_TEXT_OPTION_PATTERN.test(option.label)
|
|
385
|
+
? { ...withState, requiresTextInput: true }
|
|
386
|
+
: withState;
|
|
387
|
+
}),
|
|
297
388
|
},
|
|
298
389
|
},
|
|
299
390
|
};
|
|
@@ -33,10 +33,37 @@ exports.CLAUDE_VERIFIED_AGAINST = {
|
|
|
33
33
|
capturedAt: '2026-08-23',
|
|
34
34
|
paneGeometry: '200x1000',
|
|
35
35
|
};
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* codex-cli these rules were read off (#1628 / #1829 / #1890 fixtures; re-read
|
|
38
|
+
* on 0.155.1 by #2808 / #2818).
|
|
39
|
+
*
|
|
40
|
+
* ## Held back by Issue #2808, advanced to 0.155.1 by Issue #2818
|
|
41
|
+
*
|
|
42
|
+
* #2808 re-captured codex **0.155.1** on a private tmux socket at 200x1000
|
|
43
|
+
* (`tests/fixtures/codex-dialogs-0155/`, 2026-09-21): the command approval,
|
|
44
|
+
* `/model`, `/experimental`, `/keymap` and the directory-trust screen all read
|
|
45
|
+
* `waiting`, each highlighted row the same one-span shape as the 0.146.0-0.153.2
|
|
46
|
+
* captures, and the idle composers read `ready`. The stamp stayed at 0.148.0
|
|
47
|
+
* because one frame of that probe was misread: the idle composer after a
|
|
48
|
+
* declined approval read `running`. From 0.154.0 on the status bar carries the
|
|
49
|
+
* thread's title after the path, `CODEX_STATUS_BAR_PATTERN` wants the path last,
|
|
50
|
+
* so the detector found no bar and its bar-independent branch D read the
|
|
51
|
+
* declined command's lingering `• Ran` row in the 15-row tail.
|
|
52
|
+
*
|
|
53
|
+
* #2818 made the titled bar a boundary (`CODEX_TRAILED_STATUS_BAR_PATTERN`) and
|
|
54
|
+
* probed 0.155.1 again on its own socket (`tests/fixtures/codex-thread-title-probe/`,
|
|
55
|
+
* 2026-09-21): a turn running `sleep 30` under a titled bar, the same turn after
|
|
56
|
+
* the command finished and codex was still working, and the idle composer once
|
|
57
|
+
* it had answered — the last with the `• Ran sleep 30` row still in the tail,
|
|
58
|
+
* which read `running` before the fix. The two running frames read `running`,
|
|
59
|
+
* both idle frames read `ready`, and no other frame in the tree changed its
|
|
60
|
+
* verdict. **The stamp moved to 0.155.1 because every 0.155.1 frame now reads
|
|
61
|
+
* correctly** (`codex-thread-title-bar-2818.test.ts`,
|
|
62
|
+
* `codex-dialogs-0155-2808.test.ts`).
|
|
63
|
+
*/
|
|
37
64
|
exports.CODEX_VERIFIED_AGAINST = {
|
|
38
|
-
version: '0.
|
|
39
|
-
capturedAt: '2026-
|
|
65
|
+
version: '0.155.1',
|
|
66
|
+
capturedAt: '2026-09-21',
|
|
40
67
|
paneGeometry: '200x1000',
|
|
41
68
|
};
|
|
42
69
|
/**
|
|
@@ -140,10 +167,52 @@ exports.ANTIGRAVITY_VERIFIED_AGAINST = {
|
|
|
140
167
|
* `detectDialog` declares. The rule itself was read off the 1.40.1 and 1.49.0
|
|
141
168
|
* dialog frames above, and no 1.53.1 frame was added to the fixture directory,
|
|
142
169
|
* so the condition in the previous paragraph is still unmet.
|
|
170
|
+
*
|
|
171
|
+
* ## Held back by Issue #2754, advanced to 1.54.1 by Issue #2773
|
|
172
|
+
*
|
|
173
|
+
* #2754 finally did the probe the paragraph above asked for: a live **1.54.1**
|
|
174
|
+
* session on a private tmux socket at 200x1000, twenty-six captures in
|
|
175
|
+
* `tests/fixtures/command-code-askuserquestion-2754/` (`capturedAt` is the day
|
|
176
|
+
* that probe ran, 2026-09-20), and every key in the screen's footer sent ONE AT
|
|
177
|
+
* A TIME with a capture on each side of it. By the letter of that paragraph the
|
|
178
|
+
* stamp could have moved then. It did not, because what the probe measured was
|
|
179
|
+
* that **the rules did not answer for 1.54.1**: nine of the 26 captures came out
|
|
180
|
+
* wrong, and six of those published `ready` / `input_prompt` for a live,
|
|
181
|
+
* unanswered question — #2521's 偽完了 on a real capture. Stamping 1.54.1 over
|
|
182
|
+
* frames the rules demonstrably misread would have made the probe report a
|
|
183
|
+
* measurement that said the opposite of what was measured — the fail-open
|
|
184
|
+
* version of the #2304 precedent rather than an application of it.
|
|
185
|
+
*
|
|
186
|
+
* The defects it found were closed one Issue at a time:
|
|
187
|
+
*
|
|
188
|
+
* - **#2753** added `COMMAND_CODE_TAB_ANSWERED_MARKERS` (`✔`, U+2714), so a
|
|
189
|
+
* strip like `✔ Party size | ● Update scope | ◯ Review` passes
|
|
190
|
+
* `isCommandCodeQuestionTabRow` and eight frames left the generic parser;
|
|
191
|
+
* - **#2755** closed the rest: (a) a `❯` outside the option list (`❯ Submit`,
|
|
192
|
+
* `❯ Next`, `❯ notes:`) is named `cursor-outside-options` and hands the human
|
|
193
|
+
* the screen instead of publishing `ready`; (b) the Review page is named
|
|
194
|
+
* `review-page` and publishes no payload, so its default can no longer COMMIT
|
|
195
|
+
* the answers; (c) checkbox lists (`1. [ ] …` / `Submit`) are read as
|
|
196
|
+
* multi-select with the box off the label and the 1.54.1 footer off the last
|
|
197
|
+
* option.
|
|
198
|
+
*
|
|
199
|
+
* **The stamp moved to 1.54.1 because all twenty-six frames now read correctly**
|
|
200
|
+
* (`askuserquestion-1541-2754.test.ts` pins each): fifteen publish an answerable
|
|
201
|
+
* payload, six are `cursor-outside-options` and two are `review-page` (both
|
|
202
|
+
* decline on purpose — a human is sent to the screen, Auto-Yes has nothing to
|
|
203
|
+
* send), two are `ready` because the question is gone, and one is `running`
|
|
204
|
+
* because it was caught mid-turn. False completions went from six to zero.
|
|
205
|
+
* The rules were re-read off THESE frames, so 1.54.1 is the build they were read
|
|
206
|
+
* off — not the build that happens to be installed. `getDetectorFreshness`
|
|
207
|
+
* compares this stamp with the CLI installed now and will say `stale` once that
|
|
208
|
+
* is newer, which is the probe doing its job.
|
|
209
|
+
*
|
|
210
|
+
* This stamp answers "which build were these rules read off", and
|
|
211
|
+
* {@link getDetectorFreshness} turns it into "are they current".
|
|
143
212
|
*/
|
|
144
213
|
exports.COMMAND_CODE_VERIFIED_AGAINST = {
|
|
145
|
-
version: '1.
|
|
146
|
-
capturedAt: '2026-09-
|
|
214
|
+
version: '1.54.1',
|
|
215
|
+
capturedAt: '2026-09-20',
|
|
147
216
|
paneGeometry: '200x1000',
|
|
148
217
|
};
|
|
149
218
|
/**
|
|
@@ -9,12 +9,27 @@
|
|
|
9
9
|
* known prompt footers, excludes overlays rendered below the active prompt.
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.isClaudeFooter = isClaudeFooter;
|
|
12
13
|
exports.normalizeTuiFrameForDetection = normalizeTuiFrameForDetection;
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
// A real footer starts its row: in every capture measured for Issue 2776 only
|
|
15
|
+
// whitespace precedes it (plus one SGR colour sequence in a raw capture), while
|
|
16
|
+
// every measured quote of it has visible text first (`「`, `- Approval footer: `,
|
|
17
|
+
// `navigate · `). A quote above the live prompt otherwise cut the frame at the
|
|
18
|
+
// quote (Issue 2774: 963 of 1002 rows). The row end is NOT anchored: real
|
|
19
|
+
// footers go on with more key hints (` · Esc to cancel`, ` · ctrl+e to explain`).
|
|
20
|
+
// Position and discard-size limits were measured and rejected — see
|
|
21
|
+
// docs/design/tui-frame-footer-scan-2776.md.
|
|
22
|
+
const CLAUDE_PROMPT_FOOTER_PATTERN = /^(?:\s|\x1b\[[0-9;]*m)*Esc\s+to\s+cancel\s*[·•]\s*Tab\s+to\s+amend/i;
|
|
23
|
+
const CLAUDE_PICKER_FOOTER_PATTERN = /^(?:\s|\x1b\[[0-9;]*m)*Enter\s+to\s+select\b.*\bnavigate\b/i;
|
|
15
24
|
// A prompt/thinking/input anchor below a footer means that footer belongs to an
|
|
16
25
|
// older frame. Task-panel rows intentionally do not match these patterns.
|
|
17
|
-
|
|
26
|
+
// `›` (U+203A) is codex's composer glyph. Without it, a line anywhere in the
|
|
27
|
+
// transcript that merely QUOTES a picker footer truncates the frame at that
|
|
28
|
+
// line and the live composer below it is discarded — the agent then reads as
|
|
29
|
+
// `running` / `default` forever (Issue 2774). The other six tools draw
|
|
30
|
+
// `>` or `❯`, so this class is what they are already covered by.
|
|
31
|
+
const CLAUDE_LOWER_INTERACTIVE_ANCHOR = /^\s*[>❯›]\s*(?:\d{1,2}[.)])?|esc\s+to\s+interrupt|[✻✽✶✢✳⦿◉●⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+.+…/i;
|
|
32
|
+
/** Whether `line` is one of Claude's prompt/picker footer rows (not a quote of one). */
|
|
18
33
|
function isClaudeFooter(line) {
|
|
19
34
|
return CLAUDE_PROMPT_FOOTER_PATTERN.test(line) || CLAUDE_PICKER_FOOTER_PATTERN.test(line);
|
|
20
35
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Base rules (unchanged since Issue #479):
|
|
6
6
|
* - yes/no prompt -> 'y'
|
|
7
|
+
* - multiple_choice with `multiSelect: true` -> null (Issue #2755: the number
|
|
8
|
+
* ticks a box, the confirm is a separate row, so a default is half an answer)
|
|
7
9
|
* - multiple_choice with default option -> default option number
|
|
8
10
|
* - multiple_choice without default -> first option number
|
|
9
11
|
* - option requiring text input -> null (skip)
|
|
@@ -45,6 +47,12 @@ function resolveBaseAnswer(promptData) {
|
|
|
45
47
|
return 'y';
|
|
46
48
|
}
|
|
47
49
|
if (promptData.type === 'multiple_choice') {
|
|
50
|
+
// Issue #2755: a checkbox question. A number ticks a box and the confirm is
|
|
51
|
+
// a separate row, so "the default option" is not an answer — it is half of
|
|
52
|
+
// one. Auto-Yes refuses the prompt instead of ticking something and stopping.
|
|
53
|
+
if (promptData.multiSelect === true) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
48
56
|
const defaultOpt = promptData.options.find(o => o.isDefault);
|
|
49
57
|
const target = defaultOpt ?? promptData.options[0];
|
|
50
58
|
if (!target) {
|