commandmate 0.37.0 → 0.38.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 +190 -190
- package/.next/app-path-routes-manifest.json +33 -33
- 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.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.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 +1 -1
- 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 +1 -1
- 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.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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +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/[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.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/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.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 +1 -1
- 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]/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.js +4 -3
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +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.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.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 +1 -6
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +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.js +2 -7
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +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.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +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 +11 -9
- 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 +33 -33
- package/.next/server/chunks/1467.js +1 -1
- package/.next/server/chunks/1707.js +1 -1
- package/.next/server/chunks/1886.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3480.js +1 -18
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/4207.js +5 -0
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- 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/6677.js +2 -2
- package/.next/server/chunks/6793.js +13 -0
- package/.next/server/chunks/7075.js +1 -1
- package/.next/server/chunks/8052.js +74 -0
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/9080.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-c4b1d2aae7e3f59b.js → 2407-6fd60b674e20ec06.js} +1 -1
- package/.next/static/chunks/4388-a778968d9c4e9327.js +1 -0
- package/.next/static/chunks/4949-7dbce1029c6bdbb9.js +1 -0
- package/.next/static/chunks/998-292ebcd30f329eb1.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-86ef4510c70adefc.js +1 -0
- package/.next/trace +14 -14
- package/dist/cli/commands/ls.d.ts +64 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +238 -30
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +14 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +154 -15
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +37 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/server-url.d.ts +27 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +48 -6
- package/dist/lib/cli-tools/types.d.ts +22 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +8 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +8 -0
- package/dist/server/locales/en/worktree.json +21 -0
- package/dist/server/locales/ja/worktree.json +21 -0
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +327 -0
- package/dist/server/src/lib/cli-tools/base.js +22 -0
- package/dist/server/src/lib/cmate-parser.js +26 -6
- package/dist/server/src/lib/cmate-validator.js +354 -0
- package/dist/server/src/lib/detection/cli-patterns.js +40 -2
- package/dist/server/src/lib/detection/model-info-extractor.js +40 -3
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +44 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +9 -0
- package/dist/server/src/lib/detection/tools/command-code/detect.js +14 -3
- package/dist/server/src/lib/detection/tools/command-code/permission.js +104 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +8 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +20 -2
- package/dist/server/src/lib/prompt-answer-sender.js +339 -16
- package/dist/server/src/lib/session/claude-executor.js +190 -17
- package/dist/server/src/types/cli-tool-contracts.js +75 -1
- package/dist/types/cli-tool-contracts.d.ts +162 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +75 -1
- package/package.json +1 -1
- package/.next/server/chunks/6337.js +0 -1
- package/.next/server/chunks/663.js +0 -79
- package/.next/static/chunks/4388-410b1d8ed0d8d98b.js +0 -1
- package/.next/static/chunks/4949-5b97d1eb769482d2.js +0 -1
- package/.next/static/chunks/998-ac0ded6d5eeb4dc0.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f993ca88fe758599.js +0 -1
- /package/.next/static/{0WNCXbrakAsDUEgDarN8N → rM1BO5QIz3tynGdyJy0T-}/_buildManifest.js +0 -0
- /package/.next/static/{0WNCXbrakAsDUEgDarN8N → rM1BO5QIz3tynGdyJy0T-}/_ssgManifest.js +0 -0
|
@@ -1080,6 +1080,27 @@
|
|
|
1080
1080
|
"changedRecently": "変更あり",
|
|
1081
1081
|
"changedRecentlyDetail": "モデルが {from} から {to} に変わりました。タップで閉じます。"
|
|
1082
1082
|
},
|
|
1083
|
+
"agentMode": {
|
|
1084
|
+
"label": "モード",
|
|
1085
|
+
"cycleAria": "エージェントの権限モードを切り替える (shift+tab)",
|
|
1086
|
+
"cycleFromAria": "エージェントの権限モードを切り替える。現在は {mode}。(shift+tab)",
|
|
1087
|
+
"note": {
|
|
1088
|
+
"codexModelCoupled": "Codex はモードと連動してモデルと推論の強さも変わります。"
|
|
1089
|
+
},
|
|
1090
|
+
"noteShort": {
|
|
1091
|
+
"codexModelCoupled": "モデルも変わる"
|
|
1092
|
+
},
|
|
1093
|
+
"mode": {
|
|
1094
|
+
"default": "default",
|
|
1095
|
+
"manual": "manual",
|
|
1096
|
+
"accept-edits": "accept edits",
|
|
1097
|
+
"plan": "plan",
|
|
1098
|
+
"auto": "auto",
|
|
1099
|
+
"autopilot": "autopilot",
|
|
1100
|
+
"bypass": "permission bypass",
|
|
1101
|
+
"dont-ask": "don't-ask"
|
|
1102
|
+
}
|
|
1103
|
+
},
|
|
1083
1104
|
"sessionNote": {
|
|
1084
1105
|
"menuItem": "セッションメモ",
|
|
1085
1106
|
"placeholder": "このセッションで何をしているか",
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* How each CLI cycles its permission mode, and how that mode is read off the
|
|
4
|
+
* pane (Issue #2592).
|
|
5
|
+
*
|
|
6
|
+
* `BaseCLITool.agentModeSpec()` answers from this table, the way it already
|
|
7
|
+
* answers `describeComposer()` from `./composer-spec`, `captureSpec()` from
|
|
8
|
+
* `./capture-spec` and `livenessSpec()` from `./liveness-spec`. Nothing outside
|
|
9
|
+
* `src/lib/cli-tools/**` branches on a `CLIToolType` to find a mode.
|
|
10
|
+
*
|
|
11
|
+
* ## What `shift+tab` is, per tool (measured 2026-09-16, Issue #2592)
|
|
12
|
+
*
|
|
13
|
+
* Eight tools were driven on a private tmux socket at 200x60 from a repository
|
|
14
|
+
* root, pressing `BTab` until the display returned to where it started:
|
|
15
|
+
*
|
|
16
|
+
* | tool | version | what `shift+tab` does | measured cycle |
|
|
17
|
+
* |----------------|----------|----------------------------------|-----------------------------------------------|
|
|
18
|
+
* | claude | 2.1.273 | permission-mode cycle | auto → manual → accept edits → plan → auto |
|
|
19
|
+
* | command-code | 1.53.1 | permission-mode cycle | default → accept edits → plan → default |
|
|
20
|
+
* | codex | 0.154.0 | two-value toggle | Default ⇄ Plan |
|
|
21
|
+
* | copilot | 1.0.83 | mode cycle | default → plan → autopilot → default |
|
|
22
|
+
* | | 1.0.85 | (UAT) autopilot may read `autopilot (limited)` | same cycle |
|
|
23
|
+
* | antigravity | 1.2.4 | mode cycle | default → accept-edits → plan → default |
|
|
24
|
+
* | gemini | 0.58.0 | `app.cycleApprovalMode` (docs) | **NOT MEASURED** — see below |
|
|
25
|
+
* | opencode | 1.18.30 | agent switch, not a mode | — (already shipped as #2046's quick keys) |
|
|
26
|
+
* | vibe-local | — | nothing (5 presses, no change) | — (`-y` AUTO-APPROVE is fixed) |
|
|
27
|
+
*
|
|
28
|
+
* ## The three tools this table deliberately leaves out
|
|
29
|
+
*
|
|
30
|
+
* - **opencode.** `BTab` there is `agent_cycle_reverse`, and it already has a
|
|
31
|
+
* UI — `OpencodeQuickKeys`' `agentPrev` button (#2046). Giving opencode a
|
|
32
|
+
* mode spec would put a second button on the same key with a different
|
|
33
|
+
* promise. The separation is a DECLARATION (no entry here), not a tool-id
|
|
34
|
+
* check in the UI.
|
|
35
|
+
* - **vibe-local.** Five presses produced a byte-identical frame. There is no
|
|
36
|
+
* mode to cycle; the wrapper fixes `-y`.
|
|
37
|
+
* - **gemini.** Its bundled `docs/reference/keyboard-shortcuts.md` does bind
|
|
38
|
+
* `app.cycleApprovalMode`, so the binding is not in doubt — the *footer
|
|
39
|
+
* spelling* is, because sign-in failed with `This client is no longer
|
|
40
|
+
* supported for Gemini Code Assist for individuals` and the TUI was never
|
|
41
|
+
* reached. Drawing a button means promising to say what happens when it is
|
|
42
|
+
* pressed, and for gemini nothing here could. Adding it is a follow-up for
|
|
43
|
+
* whoever has an account that signs in.
|
|
44
|
+
*
|
|
45
|
+
* ## Why the indicators are patterns on a windowed tail and not positions
|
|
46
|
+
*
|
|
47
|
+
* The five declaring tools put the mode in five structurally different places —
|
|
48
|
+
* a dedicated footer row (claude), an independent row above the shortcut hint
|
|
49
|
+
* (Command Code 1.53.1) or *replacing* it (1.49.0), the right end of a status
|
|
50
|
+
* bar (codex), a word spliced into a hint bar whose element count changes with
|
|
51
|
+
* the mode (copilot), and a right-aligned footer segment plus a banner inside
|
|
52
|
+
* the composer box (agy). No column index, no row offset and no "nth segment"
|
|
53
|
+
* rule survives that set, so each tool declares what its row LOOKS like and the
|
|
54
|
+
* reader scans a small window of non-blank tail rows for it.
|
|
55
|
+
*
|
|
56
|
+
* @module lib/cli-tools/agent-mode-spec
|
|
57
|
+
*/
|
|
58
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.AGENT_MODE_TOOL_IDS = void 0;
|
|
60
|
+
exports.resolveAgentModeSpec = resolveAgentModeSpec;
|
|
61
|
+
/**
|
|
62
|
+
* claude's permission-mode footer row.
|
|
63
|
+
*
|
|
64
|
+
* The four spellings are #1927's measurement table (claude-cli 2.1.240, 200x1000),
|
|
65
|
+
* re-confirmed by #2592 on 2.1.273 and visible verbatim in the live captures
|
|
66
|
+
* this repository already keeps — `tests/fixtures/claude-live-2247/*.txt` and
|
|
67
|
+
* `tests/unit/lib/tmux/fixtures/capture-claude-*.txt` carry the `auto` and
|
|
68
|
+
* `manual` rows respectively:
|
|
69
|
+
*
|
|
70
|
+
* ` ⏸ manual mode on · ? for shortcuts · ← for agents /rc · focus`
|
|
71
|
+
* ` ⏵⏵ auto mode on (shift+tab to cycle) · ← for agents /rc · focus`
|
|
72
|
+
* ` ⏸ plan mode on (shift+tab to cycle) · ⇥ for agents`
|
|
73
|
+
* ` ⏵⏵ accept edits on (shift+tab to cycle) · ⇥ for agents`
|
|
74
|
+
*
|
|
75
|
+
* The leading glyph is REQUIRED in every pattern, and that is what separates a
|
|
76
|
+
* footer from a permission dialog quoting the same words: `tests/fixtures/canary/
|
|
77
|
+
* permission-hook-no-decision.raw.txt:33` reads
|
|
78
|
+
* `2. Yes, and switch to accept edits (auto-approve …) for this session (shift+tab)`,
|
|
79
|
+
* which contains "accept edits" and must never be read as a mode.
|
|
80
|
+
*
|
|
81
|
+
* claude has no `default`: `manual` IS its base mode and it prints a row for it,
|
|
82
|
+
* which is why claude is the one declaring tool whose every cycle member is
|
|
83
|
+
* readable.
|
|
84
|
+
*/
|
|
85
|
+
const CLAUDE_MODE_SPEC = {
|
|
86
|
+
key: 'BTab',
|
|
87
|
+
cycle: ['auto', 'manual', 'accept-edits', 'plan'],
|
|
88
|
+
indicators: [
|
|
89
|
+
{ mode: 'accept-edits', pattern: /⏵⏵\s*accept edits on\b/ },
|
|
90
|
+
{ mode: 'auto', pattern: /⏵⏵\s*auto mode on\b/ },
|
|
91
|
+
{ mode: 'plan', pattern: /⏸\s*plan mode on\b/ },
|
|
92
|
+
{ mode: 'manual', pattern: /⏸\s*manual mode on\b/ },
|
|
93
|
+
],
|
|
94
|
+
// The row is the LAST content row of every measured frame (row 1000 of a
|
|
95
|
+
// 200x1000 alternate-screen capture). Three rows of slack for the `/rc · focus`
|
|
96
|
+
// continuation and for a build that grows a row under it; not more, because
|
|
97
|
+
// claude renders in the alternate screen and a wider window reaches nothing
|
|
98
|
+
// new anyway.
|
|
99
|
+
tailRows: 3,
|
|
100
|
+
noteId: null,
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Command Code's mode row.
|
|
104
|
+
*
|
|
105
|
+
* Two shapes, nine minor versions apart, and the reader has to answer both:
|
|
106
|
+
*
|
|
107
|
+
* - **1.49.0** (`tests/fixtures/command-code-live-2250/README.md`): `ModeIndicator`
|
|
108
|
+
* REPLACES the shortcut hint, so the footer is one row that reads
|
|
109
|
+
* `? for shortcuts · taste on` in default and `» accept edits on` /
|
|
110
|
+
* `plan mode` / `» permission bypass on` / `» don't-ask on` otherwise.
|
|
111
|
+
* - **1.53.1** (#2592): the mode is its OWN row directly above the
|
|
112
|
+
* `? for shortcuts` row, spelled `» accept edits on [shift+tab]` /
|
|
113
|
+
* `plan mode [shift+tab]`.
|
|
114
|
+
*
|
|
115
|
+
* One consequence drives the ordering below. On 1.53.1 `? for shortcuts` is
|
|
116
|
+
* drawn in EVERY mode, so an indicator that reads it as `default` is only
|
|
117
|
+
* correct once every mode row has been checked first — hence `default` last.
|
|
118
|
+
* `bypass` and `dont-ask` are checked even though `shift+tab` skips them
|
|
119
|
+
* (#2592 measured the cycle as default → accept edits → plan), because without
|
|
120
|
+
* them a 1.53.1 pane sitting in `permission bypass` would fall through to
|
|
121
|
+
* `? for shortcuts` and publish `default`.
|
|
122
|
+
*
|
|
123
|
+
* The spellings are `cli-patterns.ts`'s `COMMAND_CODE_FOOTER_PATTERN`
|
|
124
|
+
* alternatives, which is the same list read off the same bundle.
|
|
125
|
+
*/
|
|
126
|
+
const COMMAND_CODE_MODE_SPEC = {
|
|
127
|
+
key: 'BTab',
|
|
128
|
+
cycle: ['default', 'accept-edits', 'plan'],
|
|
129
|
+
indicators: [
|
|
130
|
+
{ mode: 'accept-edits', pattern: /»\s*accept edits on\b/ },
|
|
131
|
+
{ mode: 'bypass', pattern: /»\s*permission bypass on\b/ },
|
|
132
|
+
{ mode: 'dont-ask', pattern: /»\s*don't-ask on\b/ },
|
|
133
|
+
{ mode: 'plan', pattern: /^[^\S\n]*plan mode\b/ },
|
|
134
|
+
// LAST, and the only positive reading of a base mode in this file. It is a
|
|
135
|
+
// row Command Code actually draws, not the absence of one: #2592 §3's
|
|
136
|
+
// "default が無表示" applies to codex / copilot / agy, not here.
|
|
137
|
+
{ mode: 'default', pattern: /\?\s+for\s+shortcuts\b/ },
|
|
138
|
+
],
|
|
139
|
+
// Command Code renders INLINE — #2250 measured `alternate_on` 0 and a pane
|
|
140
|
+
// that keeps its scrollback — so a 1000-row capture holds every footer the
|
|
141
|
+
// session has ever drawn. Four rows covers 1.53.1's `mode row + rule +
|
|
142
|
+
// shortcut row` stack and nothing above it.
|
|
143
|
+
tailRows: 4,
|
|
144
|
+
noteId: null,
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* codex's Plan-mode badge, at the right end of the status bar.
|
|
148
|
+
*
|
|
149
|
+
* `Plan mode (shift+tab to cycle)`, measured on 0.154.0. **There is no default
|
|
150
|
+
* indicator, on purpose.** codex prints nothing at all in Default — #2592
|
|
151
|
+
* §「設計に効く事実」3 — so the only honest answer for a Default pane is
|
|
152
|
+
* `unknown`, and the chip is not drawn. Reading Default off the absence of the
|
|
153
|
+
* badge would publish `default` for every frame captured mid-repaint and for
|
|
154
|
+
* every future build that renames the badge.
|
|
155
|
+
*
|
|
156
|
+
* Note the footer's LEFT segment is not consulted either, although it moves with
|
|
157
|
+
* the mode: `tests/fixtures/codex-live-2310/idle-composer.txt` ends
|
|
158
|
+
* `gpt-5.6-sol default · /private/tmp/…`, and that `default` is the reasoning
|
|
159
|
+
* preset `CODEX_FOOTER_MODEL_PATTERN` already reads as a model/effort pair. Two
|
|
160
|
+
* readers on one token is how one of them ends up publishing the other's value.
|
|
161
|
+
*/
|
|
162
|
+
const CODEX_MODE_SPEC = {
|
|
163
|
+
key: 'BTab',
|
|
164
|
+
cycle: ['default', 'plan'],
|
|
165
|
+
indicators: [
|
|
166
|
+
{ mode: 'plan', pattern: /\bPlan mode\s*\(shift\+tab to cycle\)/i },
|
|
167
|
+
],
|
|
168
|
+
tailRows: 3,
|
|
169
|
+
// #2592 §4: codex couples the mode to the model tier and reasoning effort
|
|
170
|
+
// (xhigh ⇄ medium, measured). One press of a button labelled "mode" therefore
|
|
171
|
+
// also moves the model, and the UI has to say so rather than let it be found.
|
|
172
|
+
noteId: 'codexModelCoupled',
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* One mode-naming segment of a status bar (Issue #2592).
|
|
176
|
+
*
|
|
177
|
+
* copilot and antigravity both put the mode into a row that is otherwise their
|
|
178
|
+
* status bar, as one segment among `·`-separated others, and neither puts it in
|
|
179
|
+
* a fixed place. The grammar, as measured on the live frames under
|
|
180
|
+
* `tests/fixtures/agent-mode-2592/`:
|
|
181
|
+
*
|
|
182
|
+
* left boundary start of row | `·` | a column gap (two spaces)
|
|
183
|
+
* the word `plan`, `accept-edits`, `autopilot` (+ an optional ` mode`)
|
|
184
|
+
* qualifier optional ` (limited)` — copilot 1.0.85 prints
|
|
185
|
+
* `autopilot (limited)` after the user answers its permission
|
|
186
|
+
* dialog with "Continue with limited permissions"
|
|
187
|
+
* right boundary `·` | a column gap | end of row
|
|
188
|
+
*
|
|
189
|
+
* The column gap on the LEFT is what agy 1.2.4 needs, and what the first cut of
|
|
190
|
+
* this file did not accept: agy draws `? for shortcuts` and the right-aligned
|
|
191
|
+
* `accept-edits · Gemini 3.8 Flash · hi` on the SAME row, 150 columns apart, so
|
|
192
|
+
* the mode word is preceded by spaces and nothing else. The first fixture had
|
|
193
|
+
* been built from the Issue's prose with the segment on a row of its own, where
|
|
194
|
+
* `^` matched — and the live UAT read `unknown` on every agy step.
|
|
195
|
+
*
|
|
196
|
+
* The gap is exactly two spaces immediately before the word rather than "two or
|
|
197
|
+
* more then any": each alternative is anchored at one position (`^`, a `·`, or
|
|
198
|
+
* the last two columns of a run), so the scan stays linear in the row width
|
|
199
|
+
* instead of re-walking every run of padding from every start position. A single
|
|
200
|
+
* space is deliberately NOT a boundary — that is what keeps prose such as
|
|
201
|
+
* `Follow the plan` from reading as a mode.
|
|
202
|
+
*
|
|
203
|
+
* @param word - Regex source for the mode word (no capture groups)
|
|
204
|
+
*/
|
|
205
|
+
function statusBarSegment(word) {
|
|
206
|
+
const gap = '[^\\S\\n]';
|
|
207
|
+
return new RegExp(`(?:^${gap}*|·${gap}*|${gap}{2})${word}` +
|
|
208
|
+
`(?:${gap}\\([^()\\n]{1,32}\\))?` +
|
|
209
|
+
`(?:${gap}*·|${gap}{2}|${gap}*$)`, 'i');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* copilot's mode word, spliced into the hint bar.
|
|
213
|
+
*
|
|
214
|
+
* The bar is the last content row of the pane — `readCopilotBarRow` in
|
|
215
|
+
* `lib/detection/model-info-extractor.ts` relies on exactly that, and
|
|
216
|
+
* `tests/fixtures/tool-liveness-2070/copilot-ready-1080.txt:1001` shows it:
|
|
217
|
+
*
|
|
218
|
+
* ` … · ← open sidebar · / commands · ? help · tab next tab GPT-5.6 Terra`
|
|
219
|
+
*
|
|
220
|
+
* #2592 measured `default → plan → autopilot → default` on 1.0.83, with the mode
|
|
221
|
+
* word inserted as a `·`-delimited segment of that bar and `? help` DISAPPEARING
|
|
222
|
+
* in autopilot — i.e. the bar's element count is itself mode-dependent, which is
|
|
223
|
+
* why the patterns below are delimiter-anchored rather than positional and why
|
|
224
|
+
* nothing here requires `? help` to be present.
|
|
225
|
+
*
|
|
226
|
+
* The UAT on 1.0.85 (`tests/fixtures/agent-mode-2592/copilot-*.txt`) placed the
|
|
227
|
+
* word directly after `← open sidebar`:
|
|
228
|
+
*
|
|
229
|
+
* ` ← open sidebar · plan · / commands · ? help · tab next tab GPT-5.6 Terra`
|
|
230
|
+
* ` ← open sidebar · autopilot (limited) · / commands · tab next tab GPT-5.6 Terra`
|
|
231
|
+
*
|
|
232
|
+
* The second is what copilot draws for the rest of the session once its
|
|
233
|
+
* autopilot permission dialog is answered "Continue with limited permissions";
|
|
234
|
+
* it is still autopilot, so {@link statusBarSegment} reads the parenthetical as a
|
|
235
|
+
* qualifier rather than as a different mode. Before the UAT it was read as
|
|
236
|
+
* nothing, and every autopilot step of the cycle published `unknown`.
|
|
237
|
+
*
|
|
238
|
+
* No default indicator: the measurement found no word for it.
|
|
239
|
+
*/
|
|
240
|
+
const COPILOT_MODE_SPEC = {
|
|
241
|
+
key: 'BTab',
|
|
242
|
+
cycle: ['default', 'plan', 'autopilot'],
|
|
243
|
+
indicators: [
|
|
244
|
+
{ mode: 'autopilot', pattern: statusBarSegment('autopilot') },
|
|
245
|
+
{ mode: 'plan', pattern: statusBarSegment('plan(?:[^\\S\\n]mode)?') },
|
|
246
|
+
],
|
|
247
|
+
// The bar is the last content row. Two rows of slack and no more: copilot
|
|
248
|
+
// renders in the alternate screen, and its transcript is measured (#1885 /
|
|
249
|
+
// #1897) to repeat its own status-bar vocabulary as body text — position is
|
|
250
|
+
// the only thing that separates the bar from a sentence about it.
|
|
251
|
+
tailRows: 2,
|
|
252
|
+
noteId: null,
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* antigravity's mode segment, at the right end of the footer.
|
|
256
|
+
*
|
|
257
|
+
* agy's footer is the last content row. On 1.2.4 it is ONE row holding both the
|
|
258
|
+
* shortcut hint at the left edge and the model chip at the right, with the mode
|
|
259
|
+
* spliced in front of the chip (`tests/fixtures/agent-mode-2592/antigravity-*.txt`,
|
|
260
|
+
* captured live in the #2592 UAT, row 20, 200 columns):
|
|
261
|
+
*
|
|
262
|
+
* `? for shortcuts … accept-edits · Gemini 3.8 Flash · hi`
|
|
263
|
+
* `? for shortcuts … plan · Gemini 3.8 Flash · hi`
|
|
264
|
+
* `? for shortcuts … Gemini 3.8 Flash · hig`
|
|
265
|
+
*
|
|
266
|
+
* Nothing is drawn for default. The segment is preceded by a column gap and not
|
|
267
|
+
* by a `·`, which is the case {@link statusBarSegment}'s left boundary had to
|
|
268
|
+
* learn; see there.
|
|
269
|
+
*
|
|
270
|
+
* agy ALSO paints a mode banner inside its composer box
|
|
271
|
+
* (`> Plan mode: research & plan only (shift+tab to cycle)`), and that is
|
|
272
|
+
* deliberately not read here: one row, the footer, is enough. The banner matters
|
|
273
|
+
* to STATUS detection instead — it replaces the bare `>` the idle rule looks for,
|
|
274
|
+
* which is why `ANTIGRAVITY_PROMPT_PATTERN` in `lib/detection/cli-patterns.ts`
|
|
275
|
+
* accepts it — and it is the region `extractComposerText` walks. (It cannot
|
|
276
|
+
* collide with that today — agy is not
|
|
277
|
+
* in `SUPPORTED_COMPOSER_TOOLS`, so `extractComposerText` short-circuits to
|
|
278
|
+
* `unsupported_tool` and `UnsentComposerBar` can never draw for it. #2592's
|
|
279
|
+
* §「設計に効く事実」5 is therefore answered by construction, and
|
|
280
|
+
* `tests/unit/lib/detection/agent-mode-2592.test.ts` pins it so a future
|
|
281
|
+
* widening of that set has to face the question.)
|
|
282
|
+
*/
|
|
283
|
+
const ANTIGRAVITY_MODE_SPEC = {
|
|
284
|
+
key: 'BTab',
|
|
285
|
+
cycle: ['default', 'accept-edits', 'plan'],
|
|
286
|
+
indicators: [
|
|
287
|
+
{ mode: 'accept-edits', pattern: statusBarSegment('accept-edits') },
|
|
288
|
+
{ mode: 'plan', pattern: statusBarSegment('plan(?:[^\\S\\n]mode)?') },
|
|
289
|
+
],
|
|
290
|
+
tailRows: 2,
|
|
291
|
+
noteId: null,
|
|
292
|
+
};
|
|
293
|
+
/**
|
|
294
|
+
* The declarations, keyed by tool.
|
|
295
|
+
*
|
|
296
|
+
* A `Partial` rather than a total record on purpose: "this tool has no mode on
|
|
297
|
+
* `shift+tab`" is a statement three tools make, and making it by ABSENCE keeps
|
|
298
|
+
* `resolveAgentModeSpec` from needing a sentinel value that a caller could
|
|
299
|
+
* mistake for a spec.
|
|
300
|
+
*/
|
|
301
|
+
const AGENT_MODE_SPECS = {
|
|
302
|
+
claude: CLAUDE_MODE_SPEC,
|
|
303
|
+
'command-code': COMMAND_CODE_MODE_SPEC,
|
|
304
|
+
codex: CODEX_MODE_SPEC,
|
|
305
|
+
copilot: COPILOT_MODE_SPEC,
|
|
306
|
+
antigravity: ANTIGRAVITY_MODE_SPEC,
|
|
307
|
+
};
|
|
308
|
+
/**
|
|
309
|
+
* How one CLI cycles its permission mode, or `null` when it does not have one.
|
|
310
|
+
*
|
|
311
|
+
* @param cliToolId - CLI tool identifier
|
|
312
|
+
* @returns That tool's {@link AgentModeSpec}, or `null`
|
|
313
|
+
*/
|
|
314
|
+
function resolveAgentModeSpec(cliToolId) {
|
|
315
|
+
return AGENT_MODE_SPECS[cliToolId] ?? null;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The tool ids that declare a mode cycle, for a reader that cannot call
|
|
319
|
+
* `ICLITool.agentModeSpec()`.
|
|
320
|
+
*
|
|
321
|
+
* The browser is such a reader: `ICLITool` lives behind the CLITool gateway on
|
|
322
|
+
* the server (§4 D4). This is the same arrangement — and the same hazard —
|
|
323
|
+
* `SESSION_SCOPE_KEY_TOOL_IDS` has carried since #2297, so it is pinned against
|
|
324
|
+
* the real registry the same way, by
|
|
325
|
+
* `tests/unit/lib/cli-tools/agent-mode-declaration-2592.test.ts`.
|
|
326
|
+
*/
|
|
327
|
+
exports.AGENT_MODE_TOOL_IDS = Object.keys(AGENT_MODE_SPECS);
|
|
@@ -15,6 +15,7 @@ const session_name_1 = require("./session-name");
|
|
|
15
15
|
const tmux_1 = require("../tmux/tmux");
|
|
16
16
|
const composer_spec_1 = require("./composer-spec");
|
|
17
17
|
const capture_spec_1 = require("./capture-spec");
|
|
18
|
+
const agent_mode_spec_1 = require("./agent-mode-spec");
|
|
18
19
|
const graceful_exit_1 = require("./graceful-exit");
|
|
19
20
|
const liveness_spec_1 = require("./liveness-spec");
|
|
20
21
|
const session_liveness_1 = require("./session-liveness");
|
|
@@ -596,6 +597,27 @@ class BaseCLITool {
|
|
|
596
597
|
navigationKeys() {
|
|
597
598
|
return { keys: terminal_keys_1.NAVIGATION_KEY_VALUES, leaderKey: null };
|
|
598
599
|
}
|
|
600
|
+
/**
|
|
601
|
+
* Declare how this tool cycles its permission mode (Issue #2592).
|
|
602
|
+
*
|
|
603
|
+
* The default is `null` — "this tool has no mode on `shift+tab`" — and that is
|
|
604
|
+
* the answer for three of the eight: opencode (whose `BTab` switches AGENTS,
|
|
605
|
+
* and already has `OpencodeQuickKeys`' `agentPrev` button from #2046),
|
|
606
|
+
* vibe-local (measured: five presses, byte-identical frame) and gemini (its
|
|
607
|
+
* own docs bind `app.cycleApprovalMode`, but sign-in refused the CLI and the
|
|
608
|
+
* footer spelling was never measured — a button is a promise about what
|
|
609
|
+
* happens when it is pressed).
|
|
610
|
+
*
|
|
611
|
+
* The five that DO declare one are answered from `./agent-mode-spec`, the same
|
|
612
|
+
* §4 D4 arrangement `describeComposer()` / `captureSpec()` / `livenessSpec()`
|
|
613
|
+
* already take. Nothing overrides this method today; a tool would only need to
|
|
614
|
+
* if its mode could not be expressed as "a row that looks like this".
|
|
615
|
+
*
|
|
616
|
+
* @returns This tool's {@link AgentModeSpec}, or `null`
|
|
617
|
+
*/
|
|
618
|
+
agentModeSpec() {
|
|
619
|
+
return (0, agent_mode_spec_1.resolveAgentModeSpec)(this.id);
|
|
620
|
+
}
|
|
599
621
|
}
|
|
600
622
|
exports.BaseCLITool = BaseCLITool;
|
|
601
623
|
/**
|
|
@@ -26,6 +26,7 @@ const promises_1 = require("fs/promises");
|
|
|
26
26
|
const path_1 = __importDefault(require("path"));
|
|
27
27
|
const types_1 = require("../lib/cli-tools/types");
|
|
28
28
|
const cmate_cli_tool_parser_1 = require("../lib/cmate-cli-tool-parser");
|
|
29
|
+
const cmate_validator_1 = require("../lib/cmate-validator");
|
|
29
30
|
const schedule_config_1 = require("../config/schedule-config");
|
|
30
31
|
const cmate_constants_1 = require("../config/cmate-constants");
|
|
31
32
|
Object.defineProperty(exports, "CMATE_FILENAME", { enumerable: true, get: function () { return cmate_constants_1.CMATE_FILENAME; } });
|
|
@@ -192,9 +193,7 @@ function parseSchedulesSection(rows) {
|
|
|
192
193
|
continue;
|
|
193
194
|
}
|
|
194
195
|
// Parse enabled (default: true)
|
|
195
|
-
const enabled = enabledStr
|
|
196
|
-
enabledStr === '' ||
|
|
197
|
-
enabledStr.toLowerCase() === 'true';
|
|
196
|
+
const enabled = (0, cmate_validator_1.isScheduleEnabled)(enabledStr);
|
|
198
197
|
// Parse and validate CLI tool column via shared pipeline (DR1-007)
|
|
199
198
|
const { result: parsed, errors: cliToolErrors } = (0, cmate_cli_tool_parser_1.parseAndValidateCliToolColumn)(rawCliTool || '');
|
|
200
199
|
if (cliToolErrors.length > 0) {
|
|
@@ -231,9 +230,10 @@ function parseSchedulesSection(rows) {
|
|
|
231
230
|
// Issue #2454: the column vocabulary is the six-value
|
|
232
231
|
// COMMAND_CODE_SCHEDULE_PERMISSIONS, not the five `--permission-mode`
|
|
233
232
|
// choices. An empty cell therefore resolves to `yolo` through
|
|
234
|
-
// `defaultPermission` above, which is the only value that
|
|
235
|
-
// `commandcode -p`
|
|
236
|
-
//
|
|
233
|
+
// `defaultPermission` above, which is the only value that lifts
|
|
234
|
+
// `commandcode -p`'s print gate -- with any of the five modes the write
|
|
235
|
+
// tools the agent calls directly are rejected while the run still
|
|
236
|
+
// reports success (Issue #2576 warns about those rows below).
|
|
237
237
|
case 'command-code':
|
|
238
238
|
allowedValues = schedule_config_1.COMMAND_CODE_SCHEDULE_PERMISSIONS;
|
|
239
239
|
break;
|
|
@@ -259,6 +259,26 @@ function parseSchedulesSection(rows) {
|
|
|
259
259
|
logger.warn('parse:invalid-permission', { name: sanitizedName, cliToolId: resolvedCliToolId, permission, defaultPermission });
|
|
260
260
|
permission = defaultPermission;
|
|
261
261
|
}
|
|
262
|
+
// Issue #2576: CMATE.md edited by hand never shows the dialog note, so the
|
|
263
|
+
// one reader every schedule goes through says it here. A warning, not a
|
|
264
|
+
// skip -- a run that only reports its final answer is a legitimate use.
|
|
265
|
+
// Disabled rows do not run, so they are not warned about (the same rule as
|
|
266
|
+
// `collectScheduleWarnings`). schedule-manager re-parses when CMATE.md's
|
|
267
|
+
// mtime changes (and when its mtime cache is empty, e.g. at startup), not on
|
|
268
|
+
// every sync, so this does not repeat every minute.
|
|
269
|
+
//
|
|
270
|
+
// Dependency direction: this server-only module imports the fs-free
|
|
271
|
+
// cmate-validator, never the reverse -- the validator is bundled into
|
|
272
|
+
// client components.
|
|
273
|
+
if (enabled && (0, cmate_validator_1.isCommandCodeDirectWriteToolsDenied)(resolvedCliToolId, permission)) {
|
|
274
|
+
logger.warn('parse:command-code-direct-write-tools-denied', {
|
|
275
|
+
code: cmate_validator_1.COMMAND_CODE_DIRECT_WRITE_TOOLS_DENIED,
|
|
276
|
+
name: sanitizedName,
|
|
277
|
+
cliToolId: resolvedCliToolId,
|
|
278
|
+
permission,
|
|
279
|
+
deniedTools: [...cmate_validator_1.COMMAND_CODE_PRINT_GATED_TOOLS],
|
|
280
|
+
});
|
|
281
|
+
}
|
|
262
282
|
entries.push({
|
|
263
283
|
name: sanitizedName,
|
|
264
284
|
cronExpression: cronExpression.trim(),
|