commandmate 0.30.2 → 0.31.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 +160 -160
- package/.next/app-path-routes-manifest.json +27 -27
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.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/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/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +3 -3
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +4 -4
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/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 +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 +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/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/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/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.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.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.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/todos/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_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]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.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.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/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.js +4 -3
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +4 -3
- 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 +2 -2
- 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.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/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +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_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 +1 -1
- 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_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_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +27 -27
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1262.js +1 -1
- package/.next/server/chunks/1886.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -1
- package/.next/server/chunks/3123.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +5 -4
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +1 -5
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5043.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/552.js +2 -2
- package/.next/server/chunks/6072.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/663.js +4 -3
- package/.next/server/chunks/6894.js +2 -2
- package/.next/server/chunks/7187.js +1 -0
- package/.next/server/chunks/7472.js +1 -1
- package/.next/server/chunks/{880.js → 7859.js} +6 -6
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8800.js +2 -2
- package/.next/server/chunks/8918.js +7 -0
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +4 -4
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9696.js +1 -1
- package/.next/server/chunks/9798.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +1 -0
- package/.next/static/chunks/4718-de1224c9e8a6e7fc.js +1 -0
- package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +1 -0
- package/.next/static/chunks/{5229-6c89475b61bd2c8b.js → 6170-951b9f5fe6b4b3b5.js} +1 -1
- package/.next/static/chunks/app/chat/{page-9aa2011410895b0d.js → page-37d7615d17d7e2a0.js} +1 -1
- package/.next/static/chunks/app/layout-4c2f21e3f653ee4c.js +1 -0
- package/.next/static/chunks/app/more/{page-333bba1c8bbc9c11.js → page-353a3924e6d7968e.js} +1 -1
- package/.next/static/chunks/app/{page-214f7ffa13a0cf10.js → page-c2bf871d953a1d6f.js} +1 -1
- package/.next/static/chunks/app/repositories/{page-4951cac905e50224.js → page-7d0f26df0537254c.js} +1 -1
- package/.next/static/chunks/app/review/{page-a0899b2d285318c3.js → page-e3f141b2829973e9.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-fb36145ec732092a.js → page-53f188ed9ca49e5f.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-9099e26b60442873.js → page-80569b720aea59cc.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-182e32368696d824.js → page-dbd2690ad72da95b.js} +1 -1
- package/.next/static/chunks/app/skills/{page-d3fdc88239ebe0ab.js → page-dacd36f9c11aa7da.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-97205088520255a5.js +1 -0
- package/.next/static/css/5c13ea243dfdcb66.css +1 -0
- package/.next/trace +13 -13
- package/README.md +37 -11
- package/dist/cli/commands/attach.d.ts +50 -0
- package/dist/cli/commands/attach.d.ts.map +1 -0
- package/dist/cli/commands/attach.js +204 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +114 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -2
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +41 -1
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +34 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +5 -0
- package/dist/cli/types/index.d.ts +36 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/config/tmux-pane-config.d.ts +153 -0
- package/dist/config/tmux-pane-config.d.ts.map +1 -0
- package/dist/config/tmux-pane-config.js +172 -0
- package/dist/lib/cli-tools/session-name.d.ts +44 -0
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -0
- package/dist/lib/cli-tools/session-name.js +57 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +6 -1
- package/dist/lib/cli-tools/validation.d.ts +34 -0
- package/dist/lib/cli-tools/validation.d.ts.map +1 -0
- package/dist/lib/cli-tools/validation.js +41 -0
- package/dist/lib/detection/status-reason.d.ts +18 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +18 -0
- package/dist/lib/detection/tools/verified-against.d.ts +57 -7
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +59 -8
- package/dist/lib/detection/version-probes.d.ts +26 -5
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +28 -6
- package/dist/lib/session/tmux-session-surface.d.ts +369 -0
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -0
- package/dist/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/config/cli-tool-timing-config.js +12 -1
- package/dist/server/src/config/detection-evidence-config.js +5 -0
- package/dist/server/src/config/schedule-config.js +28 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -2
- package/dist/server/src/lib/cli-tools/base.js +13 -8
- package/dist/server/src/lib/cli-tools/claude.js +20 -0
- package/dist/server/src/lib/cli-tools/codex.js +205 -61
- package/dist/server/src/lib/cli-tools/command-code.js +349 -0
- package/dist/server/src/lib/cli-tools/composer-spec.js +6 -0
- package/dist/server/src/lib/cli-tools/copilot.js +2 -2
- package/dist/server/src/lib/cli-tools/gemini.js +2 -2
- package/dist/server/src/lib/cli-tools/graceful-exit.js +16 -1
- package/dist/server/src/lib/cli-tools/index.js +4 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +131 -0
- package/dist/server/src/lib/cli-tools/liveness-spec.js +18 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode.js +2 -2
- package/dist/server/src/lib/cli-tools/start-availability.js +18 -11
- package/dist/server/src/lib/cli-tools/types.js +6 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
- package/dist/server/src/lib/cmate-parser.js +6 -0
- package/dist/server/src/lib/detection/cli-patterns.js +441 -8
- package/dist/server/src/lib/detection/opencode-modal-overlay.js +66 -100
- package/dist/server/src/lib/detection/selection-shape.js +341 -0
- package/dist/server/src/lib/detection/sgr-background.js +210 -0
- package/dist/server/src/lib/detection/status-detector.js +6 -0
- package/dist/server/src/lib/detection/status-reason.js +18 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -15
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +392 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +83 -2
- package/dist/server/src/lib/detection/tools/command-code/detect.js +159 -0
- package/dist/server/src/lib/detection/tools/registry.js +6 -4
- package/dist/server/src/lib/detection/tools/verified-against.js +59 -8
- package/dist/server/src/lib/detection/version-probes.js +28 -6
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +77 -16
- package/dist/server/src/lib/hooks/sources/claude/history.js +94 -18
- package/dist/server/src/lib/hooks/sources/codex/history.js +84 -15
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +130 -17
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +145 -0
- package/dist/server/src/lib/hooks/sources/command-code/history.js +865 -0
- package/dist/server/src/lib/hooks/sources/command-code/hooks-config.js +390 -0
- package/dist/server/src/lib/hooks/sources/command-code/source.js +290 -0
- package/dist/server/src/lib/hooks/sources/command-code/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +604 -0
- package/dist/server/src/lib/hooks/sources/index.js +3 -1
- package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +24 -28
- package/dist/server/src/lib/hooks/sources/registry.js +4 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +77 -19
- package/dist/server/src/lib/job-executor.js +12 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +6 -0
- package/dist/server/src/lib/polling/response-checker.js +112 -7
- package/dist/server/src/lib/polling/structured-history-gate.js +15 -8
- package/dist/server/src/lib/realtime/types.js +15 -5
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +223 -4
- package/dist/server/src/lib/session/cli-session.js +52 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +117 -1
- package/dist/server/src/lib/tmux/geometry-delegation.js +143 -0
- package/dist/server/src/lib/tmux/read-mode-pager.js +76 -10
- package/dist/server/src/lib/tmux/read-mode.js +44 -2
- package/dist/server/src/lib/tmux/session-hook-scripts.js +249 -0
- package/dist/server/src/lib/tmux/session-hooks.js +122 -0
- package/dist/server/src/lib/tmux/session-status-options.js +213 -0
- package/dist/server/src/lib/tmux/tmux.js +79 -2
- package/dist/server/src/lib/version-checker.js +110 -0
- package/dist/server/src/lib/ws-server.js +16 -10
- package/dist/server/src/types/agent-transcript.js +73 -1
- package/dist/server/src/types/terminal-keys.js +131 -3
- package/dist/types/terminal-keys.d.ts +100 -3
- package/dist/types/terminal-keys.d.ts.map +1 -1
- package/dist/types/terminal-keys.js +131 -3
- package/package.json +1 -1
- package/.next/server/chunks/3099.js +0 -5
- package/.next/server/chunks/7824.js +0 -1
- package/.next/static/chunks/3916-0e929d089282dc5d.js +0 -1
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +0 -1
- package/.next/static/chunks/6381-147dde2a967e9458.js +0 -1
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2f73d69187936627.js +0 -1
- package/.next/static/css/23f9c40ecc458c77.css +0 -1
- /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → nXW4dPkpE_9xUf_9ySRff}/_buildManifest.js +0 -0
- /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → nXW4dPkpE_9xUf_9ySRff}/_ssgManifest.js +0 -0
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* @module types/agent-transcript
|
|
40
40
|
*/
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.AGENT_MARKDOWN_REQUEST_ID_PREFIXES = exports.ANTIGRAVITY_PROMPT_REQUEST_ID_PREFIX = exports.ANTIGRAVITY_MARKDOWN_REQUEST_ID_PREFIX = exports.CODEX_PROMPT_REQUEST_ID_PREFIX = exports.CODEX_MARKDOWN_REQUEST_ID_PREFIX = exports.CLAUDE_PROMPT_REQUEST_ID_PREFIX = exports.CLAUDE_MARKDOWN_REQUEST_ID_PREFIX = exports.AGENT_MARKDOWN_REQUEST_ID_PREFIX = void 0;
|
|
42
|
+
exports.AGENT_MARKDOWN_REQUEST_ID_PREFIXES = exports.COMMAND_CODE_PROMPT_REQUEST_ID_PREFIX = exports.COMMAND_CODE_MARKDOWN_REQUEST_ID_PREFIX = exports.ANTIGRAVITY_PROMPT_REQUEST_ID_PREFIX = exports.ANTIGRAVITY_MARKDOWN_REQUEST_ID_PREFIX = exports.CODEX_PROMPT_REQUEST_ID_PREFIX = exports.CODEX_MARKDOWN_REQUEST_ID_PREFIX = exports.CLAUDE_PROMPT_REQUEST_ID_PREFIX = exports.CLAUDE_MARKDOWN_REQUEST_ID_PREFIX = exports.AGENT_MARKDOWN_REQUEST_ID_PREFIX = void 0;
|
|
43
43
|
exports.isAgentAuthoredMarkdown = isAgentAuthoredMarkdown;
|
|
44
44
|
exports.opencodeTurnRequestId = opencodeTurnRequestId;
|
|
45
45
|
exports.claudeTurnRequestId = claudeTurnRequestId;
|
|
@@ -48,6 +48,8 @@ exports.codexTurnRequestId = codexTurnRequestId;
|
|
|
48
48
|
exports.codexPromptRequestId = codexPromptRequestId;
|
|
49
49
|
exports.antigravityTurnRequestId = antigravityTurnRequestId;
|
|
50
50
|
exports.antigravityPromptRequestId = antigravityPromptRequestId;
|
|
51
|
+
exports.commandCodeTurnRequestId = commandCodeTurnRequestId;
|
|
52
|
+
exports.commandCodePromptRequestId = commandCodePromptRequestId;
|
|
51
53
|
/**
|
|
52
54
|
* Prefix on `chat_messages.request_id` for a row whose `content` is opencode's
|
|
53
55
|
* own Markdown rather than a scrape of its terminal.
|
|
@@ -152,6 +154,40 @@ exports.ANTIGRAVITY_MARKDOWN_REQUEST_ID_PREFIX = 'antigravity-turn:';
|
|
|
152
154
|
* a codex turn can.
|
|
153
155
|
*/
|
|
154
156
|
exports.ANTIGRAVITY_PROMPT_REQUEST_ID_PREFIX = 'antigravity-prompt:';
|
|
157
|
+
/**
|
|
158
|
+
* The same, for a turn read out of Command Code's transcript JSONL (Issue #2252).
|
|
159
|
+
*
|
|
160
|
+
* A fifth namespace for the fifth reader, for the reason
|
|
161
|
+
* {@link CLAUDE_MARKDOWN_REQUEST_ID_PREFIX} gives: the value is an idempotency
|
|
162
|
+
* key as well as a marker, and Command Code names its records with an **8-hex
|
|
163
|
+
* short id of its own minting** (`cb06ab09`), which is a far smaller space than
|
|
164
|
+
* claude's uuids. Sharing a prefix with claude would therefore not merely be
|
|
165
|
+
* untidy — a `command-code` id is exactly the shape a claude uuid's first
|
|
166
|
+
* segment has, and a collision between two tools' ids reads as "already saved",
|
|
167
|
+
* which is the one failure a key must not have.
|
|
168
|
+
*
|
|
169
|
+
* `command-code-` and not `cc-`: the string is what an operator reads in the row
|
|
170
|
+
* when they ask why History shows Markdown, and the tool id is what they will
|
|
171
|
+
* search the codebase for.
|
|
172
|
+
*/
|
|
173
|
+
exports.COMMAND_CODE_MARKDOWN_REQUEST_ID_PREFIX = 'command-code-turn:';
|
|
174
|
+
/**
|
|
175
|
+
* Prefix on a **user** row whose text was read out of Command Code's transcript
|
|
176
|
+
* JSONL (Issue #2252).
|
|
177
|
+
*
|
|
178
|
+
* Deliberately absent from {@link AGENT_MARKDOWN_REQUEST_ID_PREFIXES}, for the
|
|
179
|
+
* whole of the reason {@link CLAUDE_PROMPT_REQUEST_ID_PREFIX} states: the
|
|
180
|
+
* operator's own text is drawn verbatim and must not change shape because it
|
|
181
|
+
* happened to contain a `#` or a `|`.
|
|
182
|
+
*
|
|
183
|
+
* Keyed on the same record id as the turn's assistant row, which is claude's
|
|
184
|
+
* arrangement rather than codex's. It is the right one here because Command
|
|
185
|
+
* Code opens a turn with exactly one fresh `role: "user"` record — its own
|
|
186
|
+
* `isFreshUserTurn` is `role === 'user' && no tool_result block`, and a prompt
|
|
187
|
+
* typed while a turn is running is appended as a `meta.source: "steering"`
|
|
188
|
+
* record that opens a turn of its own rather than joining the one in flight.
|
|
189
|
+
*/
|
|
190
|
+
exports.COMMAND_CODE_PROMPT_REQUEST_ID_PREFIX = 'command-code-prompt:';
|
|
155
191
|
/**
|
|
156
192
|
* Every prefix that means "this row holds source, not a rendering".
|
|
157
193
|
*
|
|
@@ -166,6 +202,7 @@ exports.AGENT_MARKDOWN_REQUEST_ID_PREFIXES = [
|
|
|
166
202
|
exports.CLAUDE_MARKDOWN_REQUEST_ID_PREFIX,
|
|
167
203
|
exports.CODEX_MARKDOWN_REQUEST_ID_PREFIX,
|
|
168
204
|
exports.ANTIGRAVITY_MARKDOWN_REQUEST_ID_PREFIX,
|
|
205
|
+
exports.COMMAND_CODE_MARKDOWN_REQUEST_ID_PREFIX,
|
|
169
206
|
];
|
|
170
207
|
/**
|
|
171
208
|
* Whether this row's `content` may be rendered as Markdown.
|
|
@@ -314,3 +351,38 @@ function antigravityTurnRequestId(conversationId, stepIndex) {
|
|
|
314
351
|
function antigravityPromptRequestId(conversationId, stepIndex) {
|
|
315
352
|
return `${exports.ANTIGRAVITY_PROMPT_REQUEST_ID_PREFIX}${antigravityTurnKey(conversationId, stepIndex)}`;
|
|
316
353
|
}
|
|
354
|
+
/**
|
|
355
|
+
* The row id for one Command Code turn (Issue #2252).
|
|
356
|
+
*
|
|
357
|
+
* The turn is named by the **prompt record it answers** — the `id` of the fresh
|
|
358
|
+
* `role: "user"` record the operator's text arrived on. That is claude's
|
|
359
|
+
* arrangement (#2121) and antigravity's (#2198) rather than codex's, because
|
|
360
|
+
* Command Code writes nothing that closes a turn and nothing that links a reply
|
|
361
|
+
* back to its prompt: `parentId` chains one record to the previous one in file
|
|
362
|
+
* order, not a reply to its question, so what opens the turn is the only
|
|
363
|
+
* boundary in the file.
|
|
364
|
+
*
|
|
365
|
+
* Deliberately not the assistant record's own `id`: one turn produces one
|
|
366
|
+
* assistant record per round of the agent loop — the captured two-tool turn has
|
|
367
|
+
* two — and keying on those would split one reply into several History rows.
|
|
368
|
+
*
|
|
369
|
+
* @param promptId - `id` of the user record that opened the turn
|
|
370
|
+
*/
|
|
371
|
+
function commandCodeTurnRequestId(promptId) {
|
|
372
|
+
return `${exports.COMMAND_CODE_MARKDOWN_REQUEST_ID_PREFIX}${promptId}`;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* The row id for the **prompt** that opened one Command Code turn (Issue #2252).
|
|
376
|
+
*
|
|
377
|
+
* Same `id`, different prefix, and therefore a different row — exactly the
|
|
378
|
+
* relationship {@link claudePromptRequestId} has with {@link claudeTurnRequestId},
|
|
379
|
+
* and for the same reason: one record names one turn, and a turn is a user row
|
|
380
|
+
* plus an assistant row, so keying both on the record that opened it is what
|
|
381
|
+
* makes the pair reconstructible from the transcript alone, including on a
|
|
382
|
+
* re-read where both halves must resolve to "already there" independently.
|
|
383
|
+
*
|
|
384
|
+
* @param promptId - `id` of the user record the operator's text arrived on
|
|
385
|
+
*/
|
|
386
|
+
function commandCodePromptRequestId(promptId) {
|
|
387
|
+
return `${exports.COMMAND_CODE_PROMPT_REQUEST_ID_PREFIX}${promptId}`;
|
|
388
|
+
}
|
|
@@ -19,7 +19,74 @@
|
|
|
19
19
|
* Values only — no tmux process access — so this module is safe from any layer.
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.NAVIGATION_KEY_VALUES = void 0;
|
|
22
|
+
exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
|
|
23
|
+
/**
|
|
24
|
+
* The characters a dialog is answered WITH rather than navigated by (Issue #2254).
|
|
25
|
+
*
|
|
26
|
+
* `1`–`9` are the option numbers every numbered TUI dialog in this repository
|
|
27
|
+
* offers (codex's trust / `/model` pickers, claude's `PermissionRequest`
|
|
28
|
+
* screens, the hooks-review flow), and `y` / `n` are the two letters a bare
|
|
29
|
+
* `[y/n]` accepts. They are LITERAL characters on the wire, exactly like the
|
|
30
|
+
* codex pager's `q` has been since #1017 and opencode's chord letters since
|
|
31
|
+
* #2046 — `tmux send-keys -- 1` types a `1`.
|
|
32
|
+
*
|
|
33
|
+
* WHY THEY ARE IN THE BASE VOCABULARY, i.e. offered to every tool
|
|
34
|
+
* ---------------------------------------------------------------
|
|
35
|
+
* The state this exists for is "a wait is on screen and nothing could read it"
|
|
36
|
+
* (`ChatSurface`'s `promptUnreadable`). By construction nobody knows which tool
|
|
37
|
+
* drew that dialog *shape*, so there is no per-tool declaration to hang these
|
|
38
|
+
* off; what IS known is that the dialog is waiting for an answer, and that the
|
|
39
|
+
* chat surface had no way to send one before this Issue — the `/send` route
|
|
40
|
+
* refuses with `prompt_waiting`, and `/special-keys` published only arrows.
|
|
41
|
+
*
|
|
42
|
+
* The cost is the same one #2046 weighed for opencode's letters: a caller may
|
|
43
|
+
* POST `{cliToolId:"claude", keys:["y"]}` at an IDLE pane and type a `y` into
|
|
44
|
+
* the composer. That is a typo, not an escalation — the route has always been
|
|
45
|
+
* able to type `q` into any composer, sending a character is what the route is
|
|
46
|
+
* FOR, and the UI only draws these buttons while a wait is unreadable. What is
|
|
47
|
+
* deliberately still refused is a free string: `/send`'s `prompt_waiting` guard
|
|
48
|
+
* is untouched, `MAX_KEYS_LENGTH` is 10, and every other letter stays a 400.
|
|
49
|
+
*
|
|
50
|
+
* Note the overlap with {@link OPENCODE_LEADER_CHORD_VALUES}: `n` is in both,
|
|
51
|
+
* and `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pins the
|
|
52
|
+
* intersection to exactly `['n']` so a future widening of either list cannot
|
|
53
|
+
* quietly hand another tool an opencode chord letter.
|
|
54
|
+
*/
|
|
55
|
+
exports.ANSWER_KEY_VALUES = [
|
|
56
|
+
'1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
57
|
+
'y', 'n',
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* claude's "use this session only" key (Issue #2297).
|
|
61
|
+
*
|
|
62
|
+
* MEASURED on claude 2.1.259 / 2.1.260 (`tests/fixtures/chat-dialog-card-2254/
|
|
63
|
+
* claude-model-2-1-259.txt`, and a live 200x1000 probe re-run for #2297): the
|
|
64
|
+
* `/model` overlay's footer reads
|
|
65
|
+
*
|
|
66
|
+
* Enter to set as default · s to use this session only · Esc to cancel
|
|
67
|
+
*
|
|
68
|
+
* so on that ONE screen `Enter` is not "confirm" — it rewrites `model` in
|
|
69
|
+
* `~/.claude/settings.json` (Issue #1495), and `s` is the only key that takes
|
|
70
|
+
* the highlighted model for the current session and leaves the file alone.
|
|
71
|
+
* Neither the shared pad nor the transport carried `s`, so the chat surface
|
|
72
|
+
* could offer the destructive half of that footer and not the safe half.
|
|
73
|
+
*
|
|
74
|
+
* A LITERAL character on the wire, exactly like the codex pager's `q` (#1017),
|
|
75
|
+
* opencode's chord letters (#2046) and the answer characters (#2254):
|
|
76
|
+
* `tmux send-keys -- s` types an `s`.
|
|
77
|
+
*
|
|
78
|
+
* WHY IT IS **NOT** IN {@link NAVIGATION_KEY_VALUES}
|
|
79
|
+
* -------------------------------------------------
|
|
80
|
+
* Unlike #2254's answer characters, this one has a named owner. `s` is a live
|
|
81
|
+
* binding on other tools' screens — copilot's session picker footer reads
|
|
82
|
+
* `s sort:relevance` (measured on 1.0.82), and opencode types a bare letter
|
|
83
|
+
* into its composer whenever a leader chord is not in flight. Publishing `s` to
|
|
84
|
+
* every tool would hand those screens a button that does something else. So it
|
|
85
|
+
* is declared by the claude-family tools alone, through
|
|
86
|
+
* {@link CLAUDE_NAVIGATION_KEY_VALUES}, and the route's per-tool check
|
|
87
|
+
* (Issue #2046) answers 400 for everyone else.
|
|
88
|
+
*/
|
|
89
|
+
exports.SESSION_SCOPE_KEY = 's';
|
|
23
90
|
/**
|
|
24
91
|
* Navigation keys accepted by the special-keys API and the terminal UI.
|
|
25
92
|
*
|
|
@@ -34,7 +101,46 @@ exports.NAVIGATION_KEY_VALUES = [
|
|
|
34
101
|
// Issue #1017: Codex pager / edit-previous mode keys surfaced by NavigationButtons.
|
|
35
102
|
// 'q' is the pager quit key (literal char). PageUp/PageDown/Home/End are tmux named keys.
|
|
36
103
|
'PageUp', 'PageDown', 'Home', 'End', 'q',
|
|
104
|
+
// Issue #2254: the answer characters. Appended rather than interleaved so the
|
|
105
|
+
// pre-#2254 prefix of this list is still readable as one line in a diff.
|
|
106
|
+
...exports.ANSWER_KEY_VALUES,
|
|
37
107
|
];
|
|
108
|
+
/**
|
|
109
|
+
* What a claude-family pane may be sent: the base pad plus
|
|
110
|
+
* {@link SESSION_SCOPE_KEY} (Issue #2297).
|
|
111
|
+
*
|
|
112
|
+
* Returned by `ClaudeTool.navigationKeys()` and `CommandCodeTool.navigationKeys()`
|
|
113
|
+
* — the two tools whose TUI is claude's inline overlay renderer. Command Code
|
|
114
|
+
* takes it for kinship rather than for a measured `/model` footer of its own:
|
|
115
|
+
* its own picker (v1.40.1, measured for this Issue) is a name list with a search
|
|
116
|
+
* box and an `enter to select · esc to cancel` footer and offers no session
|
|
117
|
+
* scope at all, so nothing DRAWS the `s` button there — see
|
|
118
|
+
* `readSelectionListShape()`, which gates the button on the footer being on
|
|
119
|
+
* screen rather than on the tool id. Declaring the key for both keeps the two
|
|
120
|
+
* halves of the claude family from drifting apart the day Command Code grows the
|
|
121
|
+
* footer, and costs nothing while it has not: an undrawn button sends nothing.
|
|
122
|
+
*
|
|
123
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts` pins the membership
|
|
124
|
+
* in both directions, and the #2046 suite still pins every OTHER tool to the
|
|
125
|
+
* base pad exactly.
|
|
126
|
+
*/
|
|
127
|
+
exports.CLAUDE_NAVIGATION_KEY_VALUES = [
|
|
128
|
+
...exports.NAVIGATION_KEY_VALUES,
|
|
129
|
+
exports.SESSION_SCOPE_KEY,
|
|
130
|
+
];
|
|
131
|
+
/**
|
|
132
|
+
* The tool ids whose `navigationKeys()` carry {@link SESSION_SCOPE_KEY}.
|
|
133
|
+
*
|
|
134
|
+
* Read by the chat surface, which cannot call `navigationKeys()` — that lives
|
|
135
|
+
* behind the CLITool gateway on the server — but must not draw a button whose
|
|
136
|
+
* key the route would answer 400 for. Pinned against the real registry by
|
|
137
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts`, so this list and
|
|
138
|
+
* the declarations cannot disagree.
|
|
139
|
+
*
|
|
140
|
+
* Typed as a plain string tuple rather than `CLIToolType[]` so this module keeps
|
|
141
|
+
* the "values only, safe from any layer" property its header depends on.
|
|
142
|
+
*/
|
|
143
|
+
exports.SESSION_SCOPE_KEY_TOOL_IDS = ['claude', 'command-code'];
|
|
38
144
|
// ---------------------------------------------------------------------------
|
|
39
145
|
// Per-tool vocabularies (Issue #2046)
|
|
40
146
|
// ---------------------------------------------------------------------------
|
|
@@ -74,6 +180,25 @@ exports.OPENCODE_LEADER_CHORD_VALUES = [
|
|
|
74
180
|
* `Tab` / `BTab` cycle the agent and are already in {@link NAVIGATION_KEY_VALUES}.
|
|
75
181
|
*/
|
|
76
182
|
exports.OPENCODE_DIRECT_KEY_VALUES = ['C-p', 'C-t'];
|
|
183
|
+
/**
|
|
184
|
+
* {@link OPENCODE_LEADER_CHORD_VALUES} minus what the base pad already carries.
|
|
185
|
+
*
|
|
186
|
+
* Issue #2254 moved `n` into {@link ANSWER_KEY_VALUES}, and therefore into
|
|
187
|
+
* {@link NAVIGATION_KEY_VALUES}, which every tool's declaration starts from —
|
|
188
|
+
* so spreading the full chord list into the two unions below would list `n`
|
|
189
|
+
* twice. A duplicate is harmless to `Array.prototype.includes`, which is all the
|
|
190
|
+
* route does with these, and that is exactly why it needs its own guard: the
|
|
191
|
+
* only thing that would notice is the "no duplicate entries" assertion in
|
|
192
|
+
* `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts`.
|
|
193
|
+
*
|
|
194
|
+
* Written out rather than filtered at runtime because both unions are `as const`
|
|
195
|
+
* tuples whose LITERAL member types are the `TerminalKey` union — a
|
|
196
|
+
* `.filter()` would collapse them to `string[]` and take the compile-time check
|
|
197
|
+
* with it. The same suite pins this list to
|
|
198
|
+
* `OPENCODE_LEADER_CHORD_VALUES \ NAVIGATION_KEY_VALUES` so it cannot drift out
|
|
199
|
+
* of step with either side.
|
|
200
|
+
*/
|
|
201
|
+
const OPENCODE_CHORD_ONLY_VALUES = ['a', 'l', 't', 'm', 'g', 'u', 'r', 'c'];
|
|
77
202
|
/**
|
|
78
203
|
* Everything an opencode pane may be sent — the base navigation pad plus this
|
|
79
204
|
* tool's own chords. Returned by `OpenCodeTool.navigationKeys()`.
|
|
@@ -82,7 +207,7 @@ exports.OPENCODE_NAVIGATION_KEY_VALUES = [
|
|
|
82
207
|
...exports.NAVIGATION_KEY_VALUES,
|
|
83
208
|
exports.OPENCODE_LEADER_KEY,
|
|
84
209
|
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
85
|
-
...
|
|
210
|
+
...OPENCODE_CHORD_ONLY_VALUES,
|
|
86
211
|
];
|
|
87
212
|
/**
|
|
88
213
|
* The union of every tool's vocabulary — what the tmux transport must be able to
|
|
@@ -99,7 +224,10 @@ exports.OPENCODE_NAVIGATION_KEY_VALUES = [
|
|
|
99
224
|
*/
|
|
100
225
|
exports.TERMINAL_KEY_VALUES = [
|
|
101
226
|
...exports.NAVIGATION_KEY_VALUES,
|
|
227
|
+
// Issue #2297: claude / Command Code declare it; nothing else does.
|
|
228
|
+
exports.SESSION_SCOPE_KEY,
|
|
102
229
|
exports.OPENCODE_LEADER_KEY,
|
|
103
230
|
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
104
|
-
|
|
231
|
+
// Issue #2254: `n` is in the base pad now — see OPENCODE_CHORD_ONLY_VALUES.
|
|
232
|
+
...OPENCODE_CHORD_ONLY_VALUES,
|
|
105
233
|
];
|
|
@@ -17,6 +17,70 @@
|
|
|
17
17
|
*
|
|
18
18
|
* Values only — no tmux process access — so this module is safe from any layer.
|
|
19
19
|
*/
|
|
20
|
+
/**
|
|
21
|
+
* The characters a dialog is answered WITH rather than navigated by (Issue #2254).
|
|
22
|
+
*
|
|
23
|
+
* `1`–`9` are the option numbers every numbered TUI dialog in this repository
|
|
24
|
+
* offers (codex's trust / `/model` pickers, claude's `PermissionRequest`
|
|
25
|
+
* screens, the hooks-review flow), and `y` / `n` are the two letters a bare
|
|
26
|
+
* `[y/n]` accepts. They are LITERAL characters on the wire, exactly like the
|
|
27
|
+
* codex pager's `q` has been since #1017 and opencode's chord letters since
|
|
28
|
+
* #2046 — `tmux send-keys -- 1` types a `1`.
|
|
29
|
+
*
|
|
30
|
+
* WHY THEY ARE IN THE BASE VOCABULARY, i.e. offered to every tool
|
|
31
|
+
* ---------------------------------------------------------------
|
|
32
|
+
* The state this exists for is "a wait is on screen and nothing could read it"
|
|
33
|
+
* (`ChatSurface`'s `promptUnreadable`). By construction nobody knows which tool
|
|
34
|
+
* drew that dialog *shape*, so there is no per-tool declaration to hang these
|
|
35
|
+
* off; what IS known is that the dialog is waiting for an answer, and that the
|
|
36
|
+
* chat surface had no way to send one before this Issue — the `/send` route
|
|
37
|
+
* refuses with `prompt_waiting`, and `/special-keys` published only arrows.
|
|
38
|
+
*
|
|
39
|
+
* The cost is the same one #2046 weighed for opencode's letters: a caller may
|
|
40
|
+
* POST `{cliToolId:"claude", keys:["y"]}` at an IDLE pane and type a `y` into
|
|
41
|
+
* the composer. That is a typo, not an escalation — the route has always been
|
|
42
|
+
* able to type `q` into any composer, sending a character is what the route is
|
|
43
|
+
* FOR, and the UI only draws these buttons while a wait is unreadable. What is
|
|
44
|
+
* deliberately still refused is a free string: `/send`'s `prompt_waiting` guard
|
|
45
|
+
* is untouched, `MAX_KEYS_LENGTH` is 10, and every other letter stays a 400.
|
|
46
|
+
*
|
|
47
|
+
* Note the overlap with {@link OPENCODE_LEADER_CHORD_VALUES}: `n` is in both,
|
|
48
|
+
* and `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pins the
|
|
49
|
+
* intersection to exactly `['n']` so a future widening of either list cannot
|
|
50
|
+
* quietly hand another tool an opencode chord letter.
|
|
51
|
+
*/
|
|
52
|
+
export declare const ANSWER_KEY_VALUES: readonly ["1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n"];
|
|
53
|
+
/**
|
|
54
|
+
* claude's "use this session only" key (Issue #2297).
|
|
55
|
+
*
|
|
56
|
+
* MEASURED on claude 2.1.259 / 2.1.260 (`tests/fixtures/chat-dialog-card-2254/
|
|
57
|
+
* claude-model-2-1-259.txt`, and a live 200x1000 probe re-run for #2297): the
|
|
58
|
+
* `/model` overlay's footer reads
|
|
59
|
+
*
|
|
60
|
+
* Enter to set as default · s to use this session only · Esc to cancel
|
|
61
|
+
*
|
|
62
|
+
* so on that ONE screen `Enter` is not "confirm" — it rewrites `model` in
|
|
63
|
+
* `~/.claude/settings.json` (Issue #1495), and `s` is the only key that takes
|
|
64
|
+
* the highlighted model for the current session and leaves the file alone.
|
|
65
|
+
* Neither the shared pad nor the transport carried `s`, so the chat surface
|
|
66
|
+
* could offer the destructive half of that footer and not the safe half.
|
|
67
|
+
*
|
|
68
|
+
* A LITERAL character on the wire, exactly like the codex pager's `q` (#1017),
|
|
69
|
+
* opencode's chord letters (#2046) and the answer characters (#2254):
|
|
70
|
+
* `tmux send-keys -- s` types an `s`.
|
|
71
|
+
*
|
|
72
|
+
* WHY IT IS **NOT** IN {@link NAVIGATION_KEY_VALUES}
|
|
73
|
+
* -------------------------------------------------
|
|
74
|
+
* Unlike #2254's answer characters, this one has a named owner. `s` is a live
|
|
75
|
+
* binding on other tools' screens — copilot's session picker footer reads
|
|
76
|
+
* `s sort:relevance` (measured on 1.0.82), and opencode types a bare letter
|
|
77
|
+
* into its composer whenever a leader chord is not in flight. Publishing `s` to
|
|
78
|
+
* every tool would hand those screens a button that does something else. So it
|
|
79
|
+
* is declared by the claude-family tools alone, through
|
|
80
|
+
* {@link CLAUDE_NAVIGATION_KEY_VALUES}, and the route's per-tool check
|
|
81
|
+
* (Issue #2046) answers 400 for everyone else.
|
|
82
|
+
*/
|
|
83
|
+
export declare const SESSION_SCOPE_KEY = "s";
|
|
20
84
|
/**
|
|
21
85
|
* Navigation keys accepted by the special-keys API and the terminal UI.
|
|
22
86
|
*
|
|
@@ -26,11 +90,44 @@
|
|
|
26
90
|
* [DR3-001] Named NAVIGATION_KEY_VALUES to avoid collision with existing SPECIAL_KEY_VALUES.
|
|
27
91
|
* [DR2-004] Exported as an `as const` array + type guard (not a Set) for immutability.
|
|
28
92
|
*/
|
|
29
|
-
export declare const NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q"];
|
|
93
|
+
export declare const NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n"];
|
|
30
94
|
/**
|
|
31
95
|
* Navigation key type derived from NAVIGATION_KEY_VALUES.
|
|
32
96
|
*/
|
|
33
97
|
export type NavigationKey = typeof NAVIGATION_KEY_VALUES[number];
|
|
98
|
+
/**
|
|
99
|
+
* What a claude-family pane may be sent: the base pad plus
|
|
100
|
+
* {@link SESSION_SCOPE_KEY} (Issue #2297).
|
|
101
|
+
*
|
|
102
|
+
* Returned by `ClaudeTool.navigationKeys()` and `CommandCodeTool.navigationKeys()`
|
|
103
|
+
* — the two tools whose TUI is claude's inline overlay renderer. Command Code
|
|
104
|
+
* takes it for kinship rather than for a measured `/model` footer of its own:
|
|
105
|
+
* its own picker (v1.40.1, measured for this Issue) is a name list with a search
|
|
106
|
+
* box and an `enter to select · esc to cancel` footer and offers no session
|
|
107
|
+
* scope at all, so nothing DRAWS the `s` button there — see
|
|
108
|
+
* `readSelectionListShape()`, which gates the button on the footer being on
|
|
109
|
+
* screen rather than on the tool id. Declaring the key for both keeps the two
|
|
110
|
+
* halves of the claude family from drifting apart the day Command Code grows the
|
|
111
|
+
* footer, and costs nothing while it has not: an undrawn button sends nothing.
|
|
112
|
+
*
|
|
113
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts` pins the membership
|
|
114
|
+
* in both directions, and the #2046 suite still pins every OTHER tool to the
|
|
115
|
+
* base pad exactly.
|
|
116
|
+
*/
|
|
117
|
+
export declare const CLAUDE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "s"];
|
|
118
|
+
/**
|
|
119
|
+
* The tool ids whose `navigationKeys()` carry {@link SESSION_SCOPE_KEY}.
|
|
120
|
+
*
|
|
121
|
+
* Read by the chat surface, which cannot call `navigationKeys()` — that lives
|
|
122
|
+
* behind the CLITool gateway on the server — but must not draw a button whose
|
|
123
|
+
* key the route would answer 400 for. Pinned against the real registry by
|
|
124
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts`, so this list and
|
|
125
|
+
* the declarations cannot disagree.
|
|
126
|
+
*
|
|
127
|
+
* Typed as a plain string tuple rather than `CLIToolType[]` so this module keeps
|
|
128
|
+
* the "values only, safe from any layer" property its header depends on.
|
|
129
|
+
*/
|
|
130
|
+
export declare const SESSION_SCOPE_KEY_TOOL_IDS: readonly ["claude", "command-code"];
|
|
34
131
|
/**
|
|
35
132
|
* opencode's leader prefix — the first half of a two-step chord.
|
|
36
133
|
*
|
|
@@ -69,7 +166,7 @@ export declare const OPENCODE_DIRECT_KEY_VALUES: readonly ["C-p", "C-t"];
|
|
|
69
166
|
* Everything an opencode pane may be sent — the base navigation pad plus this
|
|
70
167
|
* tool's own chords. Returned by `OpenCodeTool.navigationKeys()`.
|
|
71
168
|
*/
|
|
72
|
-
export declare const OPENCODE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "C-x", "C-p", "C-t", "a", "l", "
|
|
169
|
+
export declare const OPENCODE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "C-x", "C-p", "C-t", "a", "l", "t", "m", "g", "u", "r", "c"];
|
|
73
170
|
/**
|
|
74
171
|
* The union of every tool's vocabulary — what the tmux transport must be able to
|
|
75
172
|
* deliver.
|
|
@@ -83,7 +180,7 @@ export declare const OPENCODE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Le
|
|
|
83
180
|
* `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pin both
|
|
84
181
|
* halves.
|
|
85
182
|
*/
|
|
86
|
-
export declare const TERMINAL_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "C-x", "C-p", "C-t", "a", "l", "
|
|
183
|
+
export declare const TERMINAL_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "s", "C-x", "C-p", "C-t", "a", "l", "t", "m", "g", "u", "r", "c"];
|
|
87
184
|
/** Any key name a tool may declare in its {@link NavigationKeySpec}. */
|
|
88
185
|
export type TerminalKey = typeof TERMINAL_KEY_VALUES[number];
|
|
89
186
|
//# sourceMappingURL=terminal-keys.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-keys.d.ts","sourceRoot":"","sources":["../../src/types/terminal-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"terminal-keys.d.ts","sourceRoot":"","sources":["../../src/types/terminal-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,iBAAiB,kEAGpB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,6KAQxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,kLAG/B,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,qCAAsC,CAAC;AAM9E;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,wDAE/B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,yBAA0B,CAAC;AAsBlE;;;GAGG;AACH,eAAO,MAAM,8BAA8B,0OAKjC,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,+OAQtB,CAAC;AAEX,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -19,7 +19,74 @@
|
|
|
19
19
|
* Values only — no tmux process access — so this module is safe from any layer.
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.NAVIGATION_KEY_VALUES = void 0;
|
|
22
|
+
exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
|
|
23
|
+
/**
|
|
24
|
+
* The characters a dialog is answered WITH rather than navigated by (Issue #2254).
|
|
25
|
+
*
|
|
26
|
+
* `1`–`9` are the option numbers every numbered TUI dialog in this repository
|
|
27
|
+
* offers (codex's trust / `/model` pickers, claude's `PermissionRequest`
|
|
28
|
+
* screens, the hooks-review flow), and `y` / `n` are the two letters a bare
|
|
29
|
+
* `[y/n]` accepts. They are LITERAL characters on the wire, exactly like the
|
|
30
|
+
* codex pager's `q` has been since #1017 and opencode's chord letters since
|
|
31
|
+
* #2046 — `tmux send-keys -- 1` types a `1`.
|
|
32
|
+
*
|
|
33
|
+
* WHY THEY ARE IN THE BASE VOCABULARY, i.e. offered to every tool
|
|
34
|
+
* ---------------------------------------------------------------
|
|
35
|
+
* The state this exists for is "a wait is on screen and nothing could read it"
|
|
36
|
+
* (`ChatSurface`'s `promptUnreadable`). By construction nobody knows which tool
|
|
37
|
+
* drew that dialog *shape*, so there is no per-tool declaration to hang these
|
|
38
|
+
* off; what IS known is that the dialog is waiting for an answer, and that the
|
|
39
|
+
* chat surface had no way to send one before this Issue — the `/send` route
|
|
40
|
+
* refuses with `prompt_waiting`, and `/special-keys` published only arrows.
|
|
41
|
+
*
|
|
42
|
+
* The cost is the same one #2046 weighed for opencode's letters: a caller may
|
|
43
|
+
* POST `{cliToolId:"claude", keys:["y"]}` at an IDLE pane and type a `y` into
|
|
44
|
+
* the composer. That is a typo, not an escalation — the route has always been
|
|
45
|
+
* able to type `q` into any composer, sending a character is what the route is
|
|
46
|
+
* FOR, and the UI only draws these buttons while a wait is unreadable. What is
|
|
47
|
+
* deliberately still refused is a free string: `/send`'s `prompt_waiting` guard
|
|
48
|
+
* is untouched, `MAX_KEYS_LENGTH` is 10, and every other letter stays a 400.
|
|
49
|
+
*
|
|
50
|
+
* Note the overlap with {@link OPENCODE_LEADER_CHORD_VALUES}: `n` is in both,
|
|
51
|
+
* and `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pins the
|
|
52
|
+
* intersection to exactly `['n']` so a future widening of either list cannot
|
|
53
|
+
* quietly hand another tool an opencode chord letter.
|
|
54
|
+
*/
|
|
55
|
+
exports.ANSWER_KEY_VALUES = [
|
|
56
|
+
'1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
57
|
+
'y', 'n',
|
|
58
|
+
];
|
|
59
|
+
/**
|
|
60
|
+
* claude's "use this session only" key (Issue #2297).
|
|
61
|
+
*
|
|
62
|
+
* MEASURED on claude 2.1.259 / 2.1.260 (`tests/fixtures/chat-dialog-card-2254/
|
|
63
|
+
* claude-model-2-1-259.txt`, and a live 200x1000 probe re-run for #2297): the
|
|
64
|
+
* `/model` overlay's footer reads
|
|
65
|
+
*
|
|
66
|
+
* Enter to set as default · s to use this session only · Esc to cancel
|
|
67
|
+
*
|
|
68
|
+
* so on that ONE screen `Enter` is not "confirm" — it rewrites `model` in
|
|
69
|
+
* `~/.claude/settings.json` (Issue #1495), and `s` is the only key that takes
|
|
70
|
+
* the highlighted model for the current session and leaves the file alone.
|
|
71
|
+
* Neither the shared pad nor the transport carried `s`, so the chat surface
|
|
72
|
+
* could offer the destructive half of that footer and not the safe half.
|
|
73
|
+
*
|
|
74
|
+
* A LITERAL character on the wire, exactly like the codex pager's `q` (#1017),
|
|
75
|
+
* opencode's chord letters (#2046) and the answer characters (#2254):
|
|
76
|
+
* `tmux send-keys -- s` types an `s`.
|
|
77
|
+
*
|
|
78
|
+
* WHY IT IS **NOT** IN {@link NAVIGATION_KEY_VALUES}
|
|
79
|
+
* -------------------------------------------------
|
|
80
|
+
* Unlike #2254's answer characters, this one has a named owner. `s` is a live
|
|
81
|
+
* binding on other tools' screens — copilot's session picker footer reads
|
|
82
|
+
* `s sort:relevance` (measured on 1.0.82), and opencode types a bare letter
|
|
83
|
+
* into its composer whenever a leader chord is not in flight. Publishing `s` to
|
|
84
|
+
* every tool would hand those screens a button that does something else. So it
|
|
85
|
+
* is declared by the claude-family tools alone, through
|
|
86
|
+
* {@link CLAUDE_NAVIGATION_KEY_VALUES}, and the route's per-tool check
|
|
87
|
+
* (Issue #2046) answers 400 for everyone else.
|
|
88
|
+
*/
|
|
89
|
+
exports.SESSION_SCOPE_KEY = 's';
|
|
23
90
|
/**
|
|
24
91
|
* Navigation keys accepted by the special-keys API and the terminal UI.
|
|
25
92
|
*
|
|
@@ -34,7 +101,46 @@ exports.NAVIGATION_KEY_VALUES = [
|
|
|
34
101
|
// Issue #1017: Codex pager / edit-previous mode keys surfaced by NavigationButtons.
|
|
35
102
|
// 'q' is the pager quit key (literal char). PageUp/PageDown/Home/End are tmux named keys.
|
|
36
103
|
'PageUp', 'PageDown', 'Home', 'End', 'q',
|
|
104
|
+
// Issue #2254: the answer characters. Appended rather than interleaved so the
|
|
105
|
+
// pre-#2254 prefix of this list is still readable as one line in a diff.
|
|
106
|
+
...exports.ANSWER_KEY_VALUES,
|
|
37
107
|
];
|
|
108
|
+
/**
|
|
109
|
+
* What a claude-family pane may be sent: the base pad plus
|
|
110
|
+
* {@link SESSION_SCOPE_KEY} (Issue #2297).
|
|
111
|
+
*
|
|
112
|
+
* Returned by `ClaudeTool.navigationKeys()` and `CommandCodeTool.navigationKeys()`
|
|
113
|
+
* — the two tools whose TUI is claude's inline overlay renderer. Command Code
|
|
114
|
+
* takes it for kinship rather than for a measured `/model` footer of its own:
|
|
115
|
+
* its own picker (v1.40.1, measured for this Issue) is a name list with a search
|
|
116
|
+
* box and an `enter to select · esc to cancel` footer and offers no session
|
|
117
|
+
* scope at all, so nothing DRAWS the `s` button there — see
|
|
118
|
+
* `readSelectionListShape()`, which gates the button on the footer being on
|
|
119
|
+
* screen rather than on the tool id. Declaring the key for both keeps the two
|
|
120
|
+
* halves of the claude family from drifting apart the day Command Code grows the
|
|
121
|
+
* footer, and costs nothing while it has not: an undrawn button sends nothing.
|
|
122
|
+
*
|
|
123
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts` pins the membership
|
|
124
|
+
* in both directions, and the #2046 suite still pins every OTHER tool to the
|
|
125
|
+
* base pad exactly.
|
|
126
|
+
*/
|
|
127
|
+
exports.CLAUDE_NAVIGATION_KEY_VALUES = [
|
|
128
|
+
...exports.NAVIGATION_KEY_VALUES,
|
|
129
|
+
exports.SESSION_SCOPE_KEY,
|
|
130
|
+
];
|
|
131
|
+
/**
|
|
132
|
+
* The tool ids whose `navigationKeys()` carry {@link SESSION_SCOPE_KEY}.
|
|
133
|
+
*
|
|
134
|
+
* Read by the chat surface, which cannot call `navigationKeys()` — that lives
|
|
135
|
+
* behind the CLITool gateway on the server — but must not draw a button whose
|
|
136
|
+
* key the route would answer 400 for. Pinned against the real registry by
|
|
137
|
+
* `tests/unit/lib/cli-tools/session-scope-key-2297.test.ts`, so this list and
|
|
138
|
+
* the declarations cannot disagree.
|
|
139
|
+
*
|
|
140
|
+
* Typed as a plain string tuple rather than `CLIToolType[]` so this module keeps
|
|
141
|
+
* the "values only, safe from any layer" property its header depends on.
|
|
142
|
+
*/
|
|
143
|
+
exports.SESSION_SCOPE_KEY_TOOL_IDS = ['claude', 'command-code'];
|
|
38
144
|
// ---------------------------------------------------------------------------
|
|
39
145
|
// Per-tool vocabularies (Issue #2046)
|
|
40
146
|
// ---------------------------------------------------------------------------
|
|
@@ -74,6 +180,25 @@ exports.OPENCODE_LEADER_CHORD_VALUES = [
|
|
|
74
180
|
* `Tab` / `BTab` cycle the agent and are already in {@link NAVIGATION_KEY_VALUES}.
|
|
75
181
|
*/
|
|
76
182
|
exports.OPENCODE_DIRECT_KEY_VALUES = ['C-p', 'C-t'];
|
|
183
|
+
/**
|
|
184
|
+
* {@link OPENCODE_LEADER_CHORD_VALUES} minus what the base pad already carries.
|
|
185
|
+
*
|
|
186
|
+
* Issue #2254 moved `n` into {@link ANSWER_KEY_VALUES}, and therefore into
|
|
187
|
+
* {@link NAVIGATION_KEY_VALUES}, which every tool's declaration starts from —
|
|
188
|
+
* so spreading the full chord list into the two unions below would list `n`
|
|
189
|
+
* twice. A duplicate is harmless to `Array.prototype.includes`, which is all the
|
|
190
|
+
* route does with these, and that is exactly why it needs its own guard: the
|
|
191
|
+
* only thing that would notice is the "no duplicate entries" assertion in
|
|
192
|
+
* `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts`.
|
|
193
|
+
*
|
|
194
|
+
* Written out rather than filtered at runtime because both unions are `as const`
|
|
195
|
+
* tuples whose LITERAL member types are the `TerminalKey` union — a
|
|
196
|
+
* `.filter()` would collapse them to `string[]` and take the compile-time check
|
|
197
|
+
* with it. The same suite pins this list to
|
|
198
|
+
* `OPENCODE_LEADER_CHORD_VALUES \ NAVIGATION_KEY_VALUES` so it cannot drift out
|
|
199
|
+
* of step with either side.
|
|
200
|
+
*/
|
|
201
|
+
const OPENCODE_CHORD_ONLY_VALUES = ['a', 'l', 't', 'm', 'g', 'u', 'r', 'c'];
|
|
77
202
|
/**
|
|
78
203
|
* Everything an opencode pane may be sent — the base navigation pad plus this
|
|
79
204
|
* tool's own chords. Returned by `OpenCodeTool.navigationKeys()`.
|
|
@@ -82,7 +207,7 @@ exports.OPENCODE_NAVIGATION_KEY_VALUES = [
|
|
|
82
207
|
...exports.NAVIGATION_KEY_VALUES,
|
|
83
208
|
exports.OPENCODE_LEADER_KEY,
|
|
84
209
|
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
85
|
-
...
|
|
210
|
+
...OPENCODE_CHORD_ONLY_VALUES,
|
|
86
211
|
];
|
|
87
212
|
/**
|
|
88
213
|
* The union of every tool's vocabulary — what the tmux transport must be able to
|
|
@@ -99,7 +224,10 @@ exports.OPENCODE_NAVIGATION_KEY_VALUES = [
|
|
|
99
224
|
*/
|
|
100
225
|
exports.TERMINAL_KEY_VALUES = [
|
|
101
226
|
...exports.NAVIGATION_KEY_VALUES,
|
|
227
|
+
// Issue #2297: claude / Command Code declare it; nothing else does.
|
|
228
|
+
exports.SESSION_SCOPE_KEY,
|
|
102
229
|
exports.OPENCODE_LEADER_KEY,
|
|
103
230
|
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
104
|
-
|
|
231
|
+
// Issue #2254: `n` is in the base pad now — see OPENCODE_CHORD_ONLY_VALUES.
|
|
232
|
+
...OPENCODE_CHORD_ONLY_VALUES,
|
|
105
233
|
];
|
package/package.json
CHANGED