commandmate 0.26.1 → 0.27.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 +435 -407
- package/.next/app-path-routes-manifest.json +30 -26
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +6 -6
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_not-found/page_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 +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 +2 -2
- 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 -0
- package/.next/server/app/api/capabilities/route.js.nft.json +1 -0
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -0
- 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.js +2 -2
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +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 +19 -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.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/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.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.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.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/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.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.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.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.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 -0
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.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 +2 -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.js +2 -0
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -0
- 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.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.js.nft.json +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.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.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.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.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.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.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.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.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]/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.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.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.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.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.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]/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.js +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -0
- 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 -5
- 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 -6
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 +3 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.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]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.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.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 +3 -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.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +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/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]/route.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/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.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -7
- 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 +30 -26
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1068.js +3 -1
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1538.js +7 -0
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +3 -2
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2546.js +1 -1
- package/.next/server/chunks/2689.js +13 -0
- package/.next/server/chunks/2759.js +8 -0
- package/.next/server/chunks/2839.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3292.js +1 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3480.js +1 -17
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4423.js +1 -0
- package/.next/server/chunks/4444.js +22 -8
- package/.next/server/chunks/4565.js +3 -0
- package/.next/server/chunks/467.js +1 -0
- package/.next/server/chunks/4905.js +5 -0
- package/.next/server/chunks/5017.js +1 -0
- package/.next/server/chunks/5089.js +1 -0
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5220.js +1 -0
- package/.next/server/chunks/5354.js +1 -0
- package/.next/server/chunks/552.js +19 -0
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5998.js +3 -3
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +11 -11
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/7472.js +1 -0
- package/.next/server/chunks/7506.js +1 -0
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/880.js +1 -1
- package/.next/server/chunks/8807.js +5 -5
- package/.next/server/chunks/9067.js +1 -1
- package/.next/server/chunks/9284.js +1 -0
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9508.js +1 -0
- package/.next/server/chunks/9938.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2053-dfac2d49227cc942.js → 2053-c0e931eb4391baa1.js} +1 -1
- package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +1 -0
- package/.next/static/chunks/3922.0d2e64daf9f187da.js +1 -0
- package/.next/static/chunks/{5229-35f9acab97a553c5.js → 5229-1f5f19740a8d6c11.js} +1 -1
- package/.next/static/chunks/{6381-0e097c0286155883.js → 6381-b7250e8ca7a44c6c.js} +1 -1
- package/.next/static/chunks/{8649-f551b0010dba4986.js → 8521-c43994fb58501d13.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/chat/{page-439b35c9cb90dbe0.js → page-231df45127e876c2.js} +1 -1
- package/.next/static/chunks/app/login/{page-eefd515d8c37e5ee.js → page-adc51f0f7cbb7ac6.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/more/{page-889b7546a8a553dc.js → page-3266dfa945972649.js} +1 -1
- package/.next/static/chunks/app/{page-a8d04ac0e3e4c9fc.js → page-0305431f43195431.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/repositories/{page-f3c4d8839b1ca203.js → page-ae8fa55749976f79.js} +1 -1
- package/.next/static/chunks/app/review/{page-6dc88649fe88ac16.js → page-8f63aff862fee421.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-2c9ed9e969097688.js → page-4d5382b257077c14.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-19beef6121c4c982.js → page-aaf0bcb1dfb558b9.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-d5b9cef6d21fabda.js → page-dafc486410e839b7.js} +1 -1
- package/.next/static/chunks/app/skills/{page-06ef637e07dd9377.js → page-9e3c91da31514893.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-5fed3984fafcd910.js → page-90f96977c741bbf8.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e4f28966b4fc0ce1.js +1 -0
- package/.next/static/chunks/{webpack-9d892a9ff07c289d.js → webpack-6a9668cf54a26eba.js} +1 -1
- package/.next/static/css/928e5a8830fbf997.css +1 -0
- package/.next/static/t0BoV4H46ZgKmTjSi7GIz/_buildManifest.js +1 -0
- package/.next/trace +13 -12
- package/.next/types/app/api/capabilities/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/clear-composer/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/env/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/resolve-target/route.ts +347 -0
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +40 -2
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +28 -13
- package/dist/cli/commands/instances.d.ts +30 -18
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +32 -36
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +73 -1
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +18 -1
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +21 -15
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +38 -0
- package/dist/cli/commands/wait.d.ts +26 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +390 -43
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +16 -0
- package/dist/cli/config/cli-tool-ids.d.ts +11 -0
- package/dist/cli/config/cli-tool-ids.d.ts.map +1 -1
- package/dist/cli/config/cli-tool-ids.js +12 -1
- package/dist/cli/types/api-responses.d.ts +443 -2
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +18 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +22 -0
- package/dist/cli/utils/server-capabilities.d.ts +56 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -0
- package/dist/cli/utils/server-capabilities.js +166 -0
- package/dist/cli/utils/session-target.d.ts +70 -0
- package/dist/cli/utils/session-target.d.ts.map +1 -0
- package/dist/cli/utils/session-target.js +118 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +79 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/copilot-executable.js +155 -0
- package/dist/lib/cli-tools/types.d.ts +61 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +41 -0
- package/dist/lib/detection/ansi.d.ts +2 -1
- package/dist/lib/detection/ansi.d.ts.map +1 -1
- package/dist/lib/detection/ansi.js +3 -2
- package/dist/lib/detection/tools/verified-against.d.ts +84 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -0
- package/dist/lib/detection/tools/verified-against.js +88 -0
- package/dist/lib/detection/version-probes.d.ts +207 -0
- package/dist/lib/detection/version-probes.d.ts.map +1 -0
- package/dist/lib/detection/version-probes.js +290 -0
- package/dist/lib/security/env-sanitizer.d.ts +198 -0
- package/dist/lib/security/env-sanitizer.d.ts.map +1 -0
- package/dist/lib/security/env-sanitizer.js +232 -0
- package/dist/server/locales/en/notifications.json +17 -6
- package/dist/server/locales/ja/notifications.json +17 -6
- package/dist/server/src/config/activity-bar-config.js +4 -0
- package/dist/server/src/config/cli-tool-timing-config.js +59 -2
- package/dist/server/src/config/copilot-constants.js +11 -1
- package/dist/server/src/config/detection-evidence-config.js +129 -0
- package/dist/server/src/config/schedule-config.js +56 -7
- package/dist/server/src/config/tmux-pane-config.js +18 -1
- package/dist/server/src/lib/auto-yes-poller.js +36 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +4 -2
- package/dist/server/src/lib/cli-tools/base.js +131 -10
- package/dist/server/src/lib/cli-tools/capture-spec.js +56 -0
- package/dist/server/src/lib/cli-tools/claude.js +1 -1
- package/dist/server/src/lib/cli-tools/codex.js +6 -2
- package/dist/server/src/lib/cli-tools/composer-spec.js +96 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +155 -0
- package/dist/server/src/lib/cli-tools/copilot.js +307 -81
- package/dist/server/src/lib/cli-tools/gemini.js +8 -6
- package/dist/server/src/lib/cli-tools/graceful-exit.js +181 -0
- package/dist/server/src/lib/cli-tools/index.js +11 -1
- package/dist/server/src/lib/cli-tools/manager.js +56 -4
- package/dist/server/src/lib/cli-tools/opencode-config.js +195 -24
- package/dist/server/src/lib/cli-tools/opencode.js +233 -30
- package/dist/server/src/lib/cli-tools/session-name.js +57 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +213 -30
- package/dist/server/src/lib/cli-tools/types.js +41 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +7 -3
- package/dist/server/src/lib/cmate-cli-tool-parser.js +29 -1
- package/dist/server/src/lib/cmate-parser.js +12 -4
- package/dist/server/src/lib/db/db.js +5 -1
- package/dist/server/src/lib/db/migrations/v41-push-subscriptions.js +11 -0
- package/dist/server/src/lib/db/push-subscriptions-db.js +60 -3
- package/dist/server/src/lib/detection/ansi.js +3 -2
- package/dist/server/src/lib/detection/cli-patterns.js +901 -67
- package/dist/server/src/lib/detection/composer-text.js +455 -0
- package/dist/server/src/lib/detection/idle-evidence-observation.js +51 -0
- package/dist/server/src/lib/detection/model-info-extractor.js +195 -4
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
- package/dist/server/src/lib/detection/status-detector.js +76 -675
- package/dist/server/src/lib/detection/status-reason.js +57 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +75 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +144 -0
- package/dist/server/src/lib/detection/tools/claude/patterns.js +98 -0
- package/dist/server/src/lib/detection/tools/claude/prompt.js +124 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +343 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +104 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +185 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +89 -0
- package/dist/server/src/lib/detection/tools/dialog-block.js +159 -0
- package/dist/server/src/lib/detection/tools/frame.js +47 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +242 -0
- package/dist/server/src/lib/detection/tools/opencode/prompt.js +85 -0
- package/dist/server/src/lib/detection/tools/registry.js +58 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +202 -0
- package/dist/server/src/lib/detection/tools/types.js +34 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +88 -0
- package/dist/server/src/lib/hooks/agent-event-types.js +19 -1
- package/dist/server/src/lib/hooks/permission-adjudication.js +160 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +81 -14
- package/dist/server/src/lib/hooks/permission-decision-state.js +62 -0
- package/dist/server/src/lib/hooks/permission-request-payload.js +18 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +20 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +403 -50
- package/dist/server/src/lib/hooks/sources/copilot/source.js +40 -4
- package/dist/server/src/lib/hooks/sources/define-source.js +23 -1
- package/dist/server/src/lib/hooks/sources/event-mapper.js +29 -1
- package/dist/server/src/lib/hooks/sources/gemini/source.js +10 -0
- package/dist/server/src/lib/hooks/sources/index.js +3 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +96 -1
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +12 -0
- package/dist/server/src/lib/hooks/sources/opencode/client.js +295 -32
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +120 -42
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +95 -3
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +70 -9
- package/dist/server/src/lib/hooks/sources/opencode/runtime.js +62 -4
- package/dist/server/src/lib/hooks/sources/opencode/source.js +54 -3
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +254 -26
- package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +119 -4
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +40 -2
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +67 -0
- package/dist/server/src/lib/hooks/tool-input-normalization.js +157 -0
- package/dist/server/src/lib/job-executor.js +16 -4
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +184 -0
- package/dist/server/src/lib/polling/response-checker.js +243 -26
- package/dist/server/src/lib/push/failure-episode-state.js +127 -0
- package/dist/server/src/lib/push/failure-push-notifier.js +344 -0
- package/dist/server/src/lib/push/index.js +35 -1
- package/dist/server/src/lib/push/prompt-card-state.js +93 -0
- package/dist/server/src/lib/push/prompt-push-gate.js +130 -0
- package/dist/server/src/lib/push/push-sender.js +82 -7
- package/dist/server/src/lib/push/resolution-push-notifier.js +193 -0
- package/dist/server/src/lib/push/waiting-push-notifier.js +42 -0
- package/dist/server/src/lib/response-cleaner.js +93 -20
- package/dist/server/src/lib/response-extractor.js +98 -5
- package/dist/server/src/lib/security/env-sanitizer.js +179 -5
- package/dist/server/src/lib/session/agent-event-state.js +1038 -189
- package/dist/server/src/lib/session/agent-session-lifecycle.js +8 -0
- package/dist/server/src/lib/session/claude-executor.js +23 -3
- package/dist/server/src/lib/session/claude-session.js +11 -1
- package/dist/server/src/lib/session/composer-clear.js +95 -0
- package/dist/server/src/lib/session/current-output-builder.js +267 -25
- package/dist/server/src/lib/session/provisional-turn.js +310 -0
- package/dist/server/src/lib/session/resolve-session-target.js +156 -0
- package/dist/server/src/lib/session/send-user-message.js +14 -18
- package/dist/server/src/lib/session/session-start-error.js +53 -1
- package/dist/server/src/lib/session/status-evidence.js +217 -0
- package/dist/server/src/lib/session/structured-prompt.js +46 -4
- package/dist/server/src/lib/session/waiting-episode-state.js +24 -0
- package/dist/server/src/lib/tmux/key-sequence.js +120 -0
- package/dist/server/src/lib/tmux/tmux.js +91 -19
- package/dist/server/src/lib/tui-accumulator.js +68 -1
- package/dist/server/src/lib/verification/gate-runner.js +84 -1
- package/dist/server/src/lib/ws-server.js +8 -5
- package/dist/server/src/types/cli-tool-contracts.js +75 -0
- package/dist/server/src/types/terminal-keys.js +37 -0
- package/dist/types/cli-tool-contracts.d.ts +235 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -0
- package/dist/types/cli-tool-contracts.js +75 -0
- package/package.json +3 -2
- package/public/sw.js +65 -2
- package/.next/server/chunks/1841.js +0 -1
- package/.next/server/chunks/233.js +0 -1
- package/.next/server/chunks/3022.js +0 -1
- package/.next/server/chunks/3270.js +0 -1
- package/.next/server/chunks/4455.js +0 -1
- package/.next/server/chunks/5959.js +0 -27
- package/.next/server/chunks/7458.js +0 -6
- package/.next/server/chunks/8730.js +0 -1
- package/.next/server/chunks/9058.js +0 -1
- package/.next/server/chunks/9687.js +0 -3
- package/.next/static/chunks/3898-ef488bfa804507d9.js +0 -1
- package/.next/static/chunks/9263.f2034ec525abcf72.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-fdfca039b7f5837e.js +0 -1
- package/.next/static/css/e865c4979a41aa03.css +0 -1
- package/.next/static/wyFLOpmKpr45BHZ4svYpE/_buildManifest.js +0 -1
- /package/.next/static/{wyFLOpmKpr45BHZ4svYpE → t0BoV4H46ZgKmTjSi7GIz}/_ssgManifest.js +0 -0
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Copilot CLI tool implementation
|
|
4
|
-
* Issue #545: Provides integration with GitHub Copilot CLI
|
|
4
|
+
* Issue #545: Provides integration with GitHub Copilot CLI
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Copilot CLI is a standalone executable (`brew install copilot-cli`,
|
|
7
|
+
* `npm i -g @github/copilot`), NOT a gh extension — the `gh-copilot` extension
|
|
8
|
+
* this module was written against is a different, retired product, and `gh`'s
|
|
9
|
+
* own `copilot` command is a preview wrapper that *downloads* the standalone
|
|
10
|
+
* binary when `PATH` has none. So the base command is `copilot` and `gh copilot`
|
|
11
|
+
* is only the fallback for a machine whose copy gh downloaded for itself
|
|
12
|
+
* (Issue #1907).
|
|
13
|
+
*
|
|
14
|
+
* isInstalled() is overridden to require positive evidence — an executable that
|
|
15
|
+
* answers `--version` — rather than the absence of an error from a help screen.
|
|
16
|
+
* See `./copilot-executable`, which also keeps execFile (not exec) for security
|
|
17
|
+
* [SEC4-001].
|
|
9
18
|
*/
|
|
10
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.CopilotTool = void 0;
|
|
12
|
-
const child_process_1 = require("child_process");
|
|
20
|
+
exports.CopilotTool = exports.COPILOT_EXIT_COMMAND = void 0;
|
|
13
21
|
const base_1 = require("./base");
|
|
14
22
|
const tmux_1 = require("../tmux/tmux");
|
|
15
23
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
16
24
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
17
25
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
26
|
+
const copilot_executable_1 = require("./copilot-executable");
|
|
18
27
|
const copilot_constants_1 = require("../../config/copilot-constants");
|
|
19
28
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
20
29
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
@@ -22,9 +31,8 @@ const hook_settings_1 = require("../../lib/hooks/sources/copilot/hook-settings")
|
|
|
22
31
|
const tool_id_1 = require("../../lib/hooks/sources/copilot/tool-id");
|
|
23
32
|
const errors_1 = require("../../lib/errors");
|
|
24
33
|
const logger_1 = require("../../lib/logger");
|
|
34
|
+
const session_start_error_1 = require("../session/session-start-error");
|
|
25
35
|
const logger = (0, logger_1.createLogger)('cli-tools/copilot');
|
|
26
|
-
/** Wait for Copilot CLI to initialize after launch */
|
|
27
|
-
const COPILOT_INIT_WAIT_MS = 4000;
|
|
28
36
|
/** Interval for polling prompt detection */
|
|
29
37
|
const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
30
38
|
/** Max attempts for initialization polling (30 * 1000ms = 30s total window) */
|
|
@@ -32,57 +40,109 @@ const COPILOT_INIT_MAX_ATTEMPTS = 30;
|
|
|
32
40
|
/** Timeout for waiting for prompt before sending a message */
|
|
33
41
|
const COPILOT_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
34
42
|
/**
|
|
35
|
-
* Copilot CLI slash commands that
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
43
|
+
* Copilot CLI slash commands that open a picker.
|
|
44
|
+
*
|
|
45
|
+
* Sending one is not like sending a message: the picker takes the composer
|
|
46
|
+
* away, so anything typed afterwards lands in the picker's own search field and
|
|
47
|
+
* any stray Enter/`n`/`x` is a keystroke the picker acts on. (Measured while
|
|
48
|
+
* capturing the frames for Issue #1895: text sent into an open `/session`
|
|
49
|
+
* picker created a session. `/session` is also the one picker `esc` does not
|
|
50
|
+
* close.) That is why this branch sends the command, waits for positive
|
|
51
|
+
* evidence that the picker is up, and then stops.
|
|
52
|
+
*
|
|
53
|
+
* All eleven commands #1913 measured on 1.0.80 are listed. The set was
|
|
54
|
+
* `model`/`agent`/`theme`, and the note left in its place said to widen it "once
|
|
55
|
+
* the pattern actually matches 1.0.80 frames" -- which is what Issue #1895 did:
|
|
56
|
+
* {@link isCopilotSelectionFrame} matches all eleven of the live frames in
|
|
57
|
+
* `tests/unit/lib/detection/fixtures/copilot-picker-1895/`, so the wait now
|
|
58
|
+
* returns on evidence in ~300ms instead of expiring at 5s. Widening was cheap
|
|
59
|
+
* only because of that; each entry still buys a wait, so this stays the eleven
|
|
60
|
+
* that were opened and captured rather than a guess about the rest of the
|
|
61
|
+
* catalogue.
|
|
62
|
+
*
|
|
63
|
+
* Issue #1906 is what made any of it live. Until then `send-user-message.ts` and
|
|
64
|
+
* the terminal route both bypassed this method with a raw `sendKeys` + delayed
|
|
65
|
+
* Enter, so this branch — and `waitForPrompt`'s folder-trust answer (#1886) —
|
|
66
|
+
* were unreachable in production. Both bypasses are gone; every path that types
|
|
67
|
+
* a message at copilot comes through here.
|
|
68
|
+
*/
|
|
69
|
+
const SELECTION_LIST_COMMANDS = new Set([
|
|
70
|
+
'model',
|
|
71
|
+
'agent',
|
|
72
|
+
'theme',
|
|
73
|
+
'permissions',
|
|
74
|
+
'skills',
|
|
75
|
+
'mcp',
|
|
76
|
+
'settings',
|
|
77
|
+
'statusline',
|
|
78
|
+
'subagents',
|
|
79
|
+
'resume',
|
|
80
|
+
'session',
|
|
81
|
+
]);
|
|
82
|
+
/**
|
|
83
|
+
* The composer row, matched one line at a time (Issue #1907).
|
|
84
|
+
*
|
|
85
|
+
* `COPILOT_PROMPT_PATTERN` is written for whole frames, where its `\s` can match
|
|
86
|
+
* the newline that follows a bare `❯`; against a single line there is nothing
|
|
87
|
+
* after the glyph for it to match. Anchored at column 0, which is where copilot
|
|
88
|
+
* draws the composer and where it draws nothing else — while a dialog is up the
|
|
89
|
+
* row is removed from the frame entirely (Issue #1886).
|
|
39
90
|
*/
|
|
40
|
-
const
|
|
91
|
+
const COPILOT_COMPOSER_ROW_PATTERN = /^[>❯](?:\s|$)/;
|
|
92
|
+
/**
|
|
93
|
+
* The TUI command that ends a Copilot session (Issue #1905).
|
|
94
|
+
*
|
|
95
|
+
* Copilot 1.0.80 accepts several spellings — `/exit`, `Ctrl+C` twice and
|
|
96
|
+
* `Ctrl+D` all end the process, and a bare `exit` submitted from the composer
|
|
97
|
+
* does too (measured; the Issue's premise that it merely becomes a chat message
|
|
98
|
+
* is wrong for this version). The slash form is the documented one and the only
|
|
99
|
+
* one that cannot be mistaken for a prompt, so it is what is sent.
|
|
100
|
+
*/
|
|
101
|
+
exports.COPILOT_EXIT_COMMAND = '/exit';
|
|
41
102
|
/**
|
|
42
103
|
* Copilot CLI tool implementation
|
|
43
104
|
* Manages GitHub Copilot interactive sessions using tmux
|
|
44
105
|
*
|
|
45
|
-
* command = '
|
|
46
|
-
*
|
|
47
|
-
*
|
|
106
|
+
* command = 'copilot': the standalone executable, which is what both supported
|
|
107
|
+
* installers put on PATH. It used to be `gh`, from the days when copilot was the
|
|
108
|
+
* `gh-copilot` extension (Issue #1907).
|
|
109
|
+
*
|
|
110
|
+
* isInstalled() overrides BaseCLITool because `which copilot` is not enough
|
|
111
|
+
* evidence on its own and because gh's downloaded copy is deliberately off PATH.
|
|
112
|
+
* [DR1-004][SEC4-001]
|
|
48
113
|
*/
|
|
49
114
|
class CopilotTool extends base_1.BaseCLITool {
|
|
50
115
|
id = 'copilot';
|
|
51
116
|
name = 'Copilot';
|
|
52
|
-
command = '
|
|
117
|
+
command = 'copilot';
|
|
53
118
|
/**
|
|
54
119
|
* Check if GitHub Copilot CLI is available.
|
|
55
|
-
* Two-stage check using execFile (not exec) for security [SEC4-001]:
|
|
56
|
-
* 1. Verify `gh` is installed (gh --version)
|
|
57
|
-
* 2. Verify copilot extension is available (gh copilot --help)
|
|
58
120
|
*
|
|
59
|
-
*
|
|
121
|
+
* Issue #1907: this used to be `gh --version` followed by `gh copilot --help`,
|
|
122
|
+
* both of which exit 0 on a machine with no copilot at all — `copilot` is a
|
|
123
|
+
* preview command built into gh, and its help says it will *download* the CLI
|
|
124
|
+
* if none is installed. The badge was wrong and, worse, `startSession` then
|
|
125
|
+
* typed `gh copilot` into the pane and the download ran there.
|
|
126
|
+
*
|
|
127
|
+
* Delegates to {@link resolveCopilotExecutable}, which answers with positive
|
|
128
|
+
* evidence only: an executable file that exits 0 on `--version` and prints a
|
|
129
|
+
* version string.
|
|
130
|
+
*
|
|
131
|
+
* @returns True when a copilot executable was found and answered
|
|
60
132
|
*/
|
|
61
133
|
async isInstalled() {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
(0, child_process_1.execFile)('gh', ['copilot', '--help'], { timeout: 5000 }, (error) => {
|
|
75
|
-
if (error)
|
|
76
|
-
reject(error);
|
|
77
|
-
else
|
|
78
|
-
resolve();
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
134
|
+
return (await (0, copilot_executable_1.resolveCopilotExecutable)()) !== null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The command line that starts the resolved copilot in a pane.
|
|
138
|
+
*
|
|
139
|
+
* `PATH` first (Issue #1907). `gh copilot` is reached only for a copy gh
|
|
140
|
+
* downloaded for itself: it is not on PATH by design, and gh prefers PATH, so
|
|
141
|
+
* gh runs exactly the file that was probed. Because the probe already proved
|
|
142
|
+
* that file exists, this branch cannot trigger gh's download either.
|
|
143
|
+
*/
|
|
144
|
+
launchExecutable(resolved) {
|
|
145
|
+
return resolved.source === 'path' ? this.command : hook_settings_1.COPILOT_LAUNCH_COMMAND;
|
|
86
146
|
}
|
|
87
147
|
/**
|
|
88
148
|
* Check if Copilot session is running for a worktree
|
|
@@ -96,16 +156,19 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
96
156
|
}
|
|
97
157
|
/**
|
|
98
158
|
* Start a new Copilot session for a worktree
|
|
99
|
-
* Launches
|
|
159
|
+
* Launches copilot in interactive mode within tmux
|
|
100
160
|
*
|
|
101
161
|
* @param worktreeId - Worktree ID
|
|
102
162
|
* @param worktreePath - Worktree path
|
|
103
163
|
*/
|
|
104
|
-
async
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
164
|
+
async launchSession(worktreeId, worktreePath, instanceId) {
|
|
165
|
+
// Issue #1907: resolved once, and the same resolution decides both whether to
|
|
166
|
+
// start at all and what to type. Asking `isInstalled()` and then launching a
|
|
167
|
+
// hardcoded command is how `gh copilot` came to be sent to machines that had
|
|
168
|
+
// no copilot: the answer and the action have to come from one measurement.
|
|
169
|
+
const resolved = await (0, copilot_executable_1.resolveCopilotExecutable)();
|
|
170
|
+
if (!resolved) {
|
|
171
|
+
throw new session_start_error_1.SessionStartUnavailableError(this.name, `GitHub Copilot CLI is not installed. ${copilot_constants_1.COPILOT_INSTALL_HINT}`);
|
|
109
172
|
}
|
|
110
173
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
111
174
|
// Check if session already exists
|
|
@@ -140,47 +203,151 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
140
203
|
// lifecycle events and Auto-Yes adjudication exist without the operator
|
|
141
204
|
// having edited ~/.copilot/settings.json by hand.
|
|
142
205
|
//
|
|
143
|
-
// The returned command is
|
|
144
|
-
// in front of it. Copilot's config is one file for the whole
|
|
145
|
-
// unlike Claude's `--settings` it cannot carry the correlation
|
|
146
|
-
// they ride in the environment and the hook reads them when it
|
|
147
|
-
// See `lib/hooks/sources/copilot/hook-settings`.
|
|
206
|
+
// The returned command is the resolved executable with two environment
|
|
207
|
+
// assignments in front of it. Copilot's config is one file for the whole
|
|
208
|
+
// machine, so unlike Claude's `--settings` it cannot carry the correlation
|
|
209
|
+
// keys — they ride in the environment and the hook reads them when it
|
|
210
|
+
// fires. See `lib/hooks/sources/copilot/hook-settings`.
|
|
148
211
|
//
|
|
149
212
|
// Fails open in every branch: with `CM_AGENT_HOOKS_INJECT=0`, or with a
|
|
150
|
-
// settings file that cannot be read or written, this is
|
|
151
|
-
//
|
|
213
|
+
// settings file that cannot be read or written, this is the bare launch
|
|
214
|
+
// command and nothing else.
|
|
152
215
|
const launchCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({
|
|
153
216
|
target: { worktreeId, cliToolId: tool_id_1.COPILOT_CLI_TOOL_ID, instanceId },
|
|
154
|
-
executablePath:
|
|
217
|
+
executablePath: this.launchExecutable(resolved),
|
|
155
218
|
worktreePath,
|
|
156
219
|
});
|
|
157
220
|
// Start Copilot CLI in interactive mode
|
|
158
221
|
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
159
|
-
//
|
|
160
|
-
|
|
161
|
-
//
|
|
222
|
+
// Issue #1907: no blind sleep before this. The 4-second one that used to
|
|
223
|
+
// sit here was a guess at how long copilot takes to paint (measured on
|
|
224
|
+
// 1.0.80: banner at ~1.3 s, folder-trust dialog at ~2.5 s), and it was
|
|
225
|
+
// load-bearing only because it hid the shell prompt from the first poll.
|
|
226
|
+
// `waitForReady` now recognises copilot's own composer rather than any
|
|
227
|
+
// `❯`, so it can start looking immediately and stop as soon as the pane is
|
|
228
|
+
// really ready.
|
|
162
229
|
await this.waitForReady(sessionName);
|
|
163
|
-
logger.info('started-copilot-session'
|
|
230
|
+
logger.info('started-copilot-session', {
|
|
231
|
+
executableSource: resolved.source,
|
|
232
|
+
version: resolved.version,
|
|
233
|
+
});
|
|
164
234
|
}
|
|
165
235
|
catch (error) {
|
|
166
236
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
167
237
|
throw new Error(`Failed to start Copilot session: ${errorMessage}`);
|
|
168
238
|
}
|
|
169
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Answer copilot's "Confirm folder trust" dialog when the pane is sitting on
|
|
242
|
+
* it (Issue #1886).
|
|
243
|
+
*
|
|
244
|
+
* Sends the session-only option (`1. Yes`) and nothing else. Option 2 ("Yes,
|
|
245
|
+
* and remember this folder for future sessions") writes `trustedFolders` into
|
|
246
|
+
* `~/.copilot/config.json`, one file shared by every checkout on the machine,
|
|
247
|
+
* so `isCopilotFolderTrustDialog` refuses the frame outright if the list is
|
|
248
|
+
* ever reordered and `1` is no longer the session-only choice -- the same rule
|
|
249
|
+
* that makes codex's launch decline its hooks-review dialog (Issue #1760):
|
|
250
|
+
* CommandMate answers on the operator's behalf only where the answer does not
|
|
251
|
+
* write the operator's config.
|
|
252
|
+
*
|
|
253
|
+
* `sendEnter=false` because 1.0.80 confirms on the digit alone (measured on a
|
|
254
|
+
* live pane); a trailing Enter would land as an empty submit on the composer
|
|
255
|
+
* that the dismissal reveals.
|
|
256
|
+
*
|
|
257
|
+
* The capture cache is dropped afterwards because the cached frame is now
|
|
258
|
+
* wrong in a way that blocks work: a consumer reading the dialog frame reports
|
|
259
|
+
* `waiting`, and the send guard refuses a `waiting` session for as long as
|
|
260
|
+
* that entry lives.
|
|
261
|
+
*
|
|
262
|
+
* @param sessionName - tmux session name
|
|
263
|
+
* @param output - ANSI-stripped pane capture
|
|
264
|
+
* @returns True when the dialog was found and answered
|
|
265
|
+
*/
|
|
266
|
+
async answerFolderTrustDialog(sessionName, output) {
|
|
267
|
+
if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
await (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false);
|
|
271
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
272
|
+
logger.info('copilot-folder-trust-answered');
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Whether copilot's own composer is drawn on the pane (Issue #1907).
|
|
277
|
+
*
|
|
278
|
+
* `COPILOT_PROMPT_PATTERN` alone answers "is there a `❯` or `>` at column 0",
|
|
279
|
+
* and a great many shell prompts are exactly that. That was harmless while a
|
|
280
|
+
* fixed 4-second sleep stood between the launch keystroke and the first poll;
|
|
281
|
+
* with the sleep gone, the very first capture is the shell echoing the launch
|
|
282
|
+
* command, and on any `❯`-prefixed prompt (starship, pure, agnoster) it would
|
|
283
|
+
* read as ready — the session would be declared started before copilot had
|
|
284
|
+
* drawn anything, and the message would be typed into a booting TUI.
|
|
285
|
+
*
|
|
286
|
+
* So readiness needs a signal that belongs to copilot rather than to whoever
|
|
287
|
+
* owns the pane. Measured on 1.0.80 at production geometry, copilot draws its
|
|
288
|
+
* composer as three rows: a full-width rule, the `❯` row, another full-width
|
|
289
|
+
* rule. Nothing else on the boot path has that shape — not the shell, not the
|
|
290
|
+
* banner-only frame, and not the folder-trust dialog, whose option rows are
|
|
291
|
+
* boxed and whose neighbours are dialog text (see
|
|
292
|
+
* `tests/fixtures/copilot-launch-boot-1080.ts`).
|
|
293
|
+
*
|
|
294
|
+
* A false negative here is the pre-existing behaviour: the loop times out,
|
|
295
|
+
* logs, and the launch continues. A false positive is a message typed into a
|
|
296
|
+
* shell, so the check is deliberately the strict one.
|
|
297
|
+
*
|
|
298
|
+
* @param output - ANSI-stripped pane capture (box drawing still present)
|
|
299
|
+
*/
|
|
300
|
+
isComposerDrawn(output) {
|
|
301
|
+
const lines = output.split('\n');
|
|
302
|
+
for (let i = 1; i < lines.length - 1; i++) {
|
|
303
|
+
if (!COPILOT_COMPOSER_ROW_PATTERN.test(lines[i]))
|
|
304
|
+
continue;
|
|
305
|
+
if (cli_patterns_1.COPILOT_SEPARATOR_PATTERN.test(lines[i - 1].trimEnd()) &&
|
|
306
|
+
cli_patterns_1.COPILOT_SEPARATOR_PATTERN.test(lines[i + 1].trimEnd())) {
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
170
312
|
/**
|
|
171
313
|
* Wait for Copilot CLI to become ready (prompt visible).
|
|
172
|
-
*
|
|
314
|
+
*
|
|
315
|
+
* Readiness is asserted by seeing the composer, never by a dialog's absence:
|
|
316
|
+
* copilot draws `❯` at column 0 and removes that row entirely while a dialog
|
|
317
|
+
* is up, so a `COPILOT_PROMPT_PATTERN` match is a real input prompt and never
|
|
318
|
+
* an option row. Do NOT feed this check a `stripBoxDrawing`ed frame -- that
|
|
319
|
+
* turns the trust dialog's `│ ❯ 1. Yes` into `❯ 1. Yes` and the dialog starts
|
|
320
|
+
* reading as ready (both halves are pinned in the Issue #1886 tests).
|
|
321
|
+
*
|
|
322
|
+
* Issue #1886: on an untrusted git repository copilot shows the folder-trust
|
|
323
|
+
* dialog before anything else runs, and nothing in that frame matches the
|
|
324
|
+
* composer -- so this loop used to burn its whole 30-second window and then
|
|
325
|
+
* hand `sendMessage` a session still parked on the dialog. Answer it once and
|
|
326
|
+
* keep polling for the composer on the normal cadence; no extra sleep, and the
|
|
327
|
+
* one-shot guard means a frame that somehow still shows the dialog cannot draw
|
|
328
|
+
* a second digit.
|
|
329
|
+
*
|
|
330
|
+
* Issue #1907 tightened "composer visible" from `COPILOT_PROMPT_PATTERN` to
|
|
331
|
+
* {@link isComposerDrawn}, because with the launch path's blind sleep gone the
|
|
332
|
+
* first frame this sees is the shell that has just echoed the launch command.
|
|
333
|
+
* Both halves of the #1886 contract still hold: the boxed dialog has no `❯` at
|
|
334
|
+
* column 0, and a `stripBoxDrawing`ed dialog's `❯ 1. Yes` has dialog text
|
|
335
|
+
* either side of it rather than copilot's rules.
|
|
173
336
|
*/
|
|
174
337
|
async waitForReady(sessionName) {
|
|
338
|
+
let trustDialogHandled = false;
|
|
175
339
|
for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
|
|
176
340
|
try {
|
|
177
341
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
178
342
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
179
|
-
// Check if
|
|
180
|
-
if (
|
|
343
|
+
// Check if copilot's own composer is on screen
|
|
344
|
+
if (this.isComposerDrawn(output)) {
|
|
181
345
|
logger.info('copilot-prompt-detected');
|
|
182
346
|
return;
|
|
183
347
|
}
|
|
348
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
349
|
+
trustDialogHandled = true;
|
|
350
|
+
}
|
|
184
351
|
}
|
|
185
352
|
catch {
|
|
186
353
|
// Capture may fail during initialization - continue polling
|
|
@@ -193,12 +360,33 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
193
360
|
* Wait for Copilot prompt before sending a message.
|
|
194
361
|
* Used by sendMessage to ensure Copilot is ready to accept input.
|
|
195
362
|
*
|
|
363
|
+
* Issue #1906 is the first change that lets a GUI/CLI send reach this wait, so
|
|
364
|
+
* what it actually costs was measured (copilot 1.0.80, private tmux socket,
|
|
365
|
+
* `tmux -L`):
|
|
366
|
+
*
|
|
367
|
+
* - **Composer on screen — idle or mid-response: ~0 ms.** copilot keeps drawing
|
|
368
|
+
* `❯` at column 0 while it is Working, the loop captures BEFORE its first
|
|
369
|
+
* sleep, and `COPILOT_PROMPT_PATTERN` matches immediately. A whole
|
|
370
|
+
* `sendMessage` measured 338 ms end to end, verification included.
|
|
371
|
+
* - **Composer gone — a dialog is up: the full 15 s, then it sends anyway.**
|
|
372
|
+
* Measured against a session parked on copilot's own `Asked user …` question:
|
|
373
|
+
* the window expired and the body was typed into the QUESTION's input line,
|
|
374
|
+
* which is single-line, so a four-line message arrived as
|
|
375
|
+
* `ping oneping twoping three…`.
|
|
376
|
+
*
|
|
377
|
+
* That second case is #559's objection, and it is real — but it is not a
|
|
378
|
+
* reason to skip this method, because skipping it is what produced the same
|
|
379
|
+
* outcome in 0 ms instead of 15 s. What keeps it out of production is the layer
|
|
380
|
+
* above: `sendUserMessage` and the terminal route both consult
|
|
381
|
+
* `isPromptWaiting` (#1708/#1737) and refuse before reaching here.
|
|
382
|
+
*
|
|
196
383
|
* @param sessionName - tmux session name
|
|
197
384
|
* @param timeoutMs - Optional timeout in ms (default: COPILOT_PROMPT_WAIT_TIMEOUT_MS)
|
|
198
385
|
*/
|
|
199
386
|
async waitForPrompt(sessionName, timeoutMs = COPILOT_PROMPT_WAIT_TIMEOUT_MS) {
|
|
200
387
|
const startTime = Date.now();
|
|
201
388
|
const pollInterval = 500;
|
|
389
|
+
let trustDialogHandled = false;
|
|
202
390
|
while (Date.now() - startTime < timeoutMs) {
|
|
203
391
|
try {
|
|
204
392
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
@@ -206,6 +394,18 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
206
394
|
if (cli_patterns_1.COPILOT_PROMPT_PATTERN.test(output)) {
|
|
207
395
|
return;
|
|
208
396
|
}
|
|
397
|
+
// Issue #1886: `startSession` returns early for a session that already
|
|
398
|
+
// exists, so a pane adopted from outside CommandMate -- or one whose
|
|
399
|
+
// trust dialog nobody answered -- arrives here still sitting on it.
|
|
400
|
+
// Unlike codex's, this method only logs on timeout and lets the send
|
|
401
|
+
// proceed, which types the message body INTO the dialog; the body's
|
|
402
|
+
// digits are option selections there, so a message containing `2` picks
|
|
403
|
+
// "Yes, and remember this folder" and writes the operator's
|
|
404
|
+
// machine-global ~/.copilot/config.json. Answer it here for the same
|
|
405
|
+
// reason the launch path does, rather than leaving the worse outcome.
|
|
406
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
407
|
+
trustDialogHandled = true;
|
|
408
|
+
}
|
|
209
409
|
}
|
|
210
410
|
catch {
|
|
211
411
|
// Capture may fail - continue polling
|
|
@@ -227,7 +427,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
227
427
|
}
|
|
228
428
|
/**
|
|
229
429
|
* Wait for the selection list to appear after sending a selection list command.
|
|
230
|
-
* Polls the terminal output for
|
|
430
|
+
* Polls the terminal output for {@link isCopilotSelectionFrame}.
|
|
231
431
|
*
|
|
232
432
|
* @returns true if selection list was detected, false if timed out
|
|
233
433
|
*/
|
|
@@ -238,9 +438,11 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
238
438
|
while (Date.now() - startTime < maxWaitMs) {
|
|
239
439
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
240
440
|
try {
|
|
441
|
+
// 50 rows is bottom-anchored (`-S -50 -E -`), which is the half of the
|
|
442
|
+
// pane `isCopilotSelectionFrame` reads. Issue #1895.
|
|
241
443
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
242
444
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
243
|
-
if (cli_patterns_1.
|
|
445
|
+
if ((0, cli_patterns_1.isCopilotSelectionFrame)(output.split('\n'))) {
|
|
244
446
|
logger.info('copilot-selection-list-detected');
|
|
245
447
|
return true;
|
|
246
448
|
}
|
|
@@ -287,6 +489,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
287
489
|
sessionName,
|
|
288
490
|
message,
|
|
289
491
|
cliToolId: 'copilot',
|
|
492
|
+
composer: this.describeComposer(),
|
|
290
493
|
textInputWaitMs: copilot_constants_1.COPILOT_TEXT_INPUT_DELAY_MS,
|
|
291
494
|
verifyDelayMs: copilot_constants_1.COPILOT_SEND_ENTER_DELAY_MS,
|
|
292
495
|
});
|
|
@@ -306,9 +509,17 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
306
509
|
* Flow:
|
|
307
510
|
* 1. Verify session exists
|
|
308
511
|
* 2. Send `/model <modelName>` + Enter
|
|
309
|
-
* 3. Wait for
|
|
310
|
-
*
|
|
311
|
-
*
|
|
512
|
+
* 3. Wait for prompt recovery with extended timeout
|
|
513
|
+
*
|
|
514
|
+
* Steps 3 and 4 of the original flow -- wait up to 5s for the picker, then
|
|
515
|
+
* send Enter if it appeared -- are gone (Issue #1895). `/model` opens a picker
|
|
516
|
+
* only when it is given NO argument; with one it switches in place and prints
|
|
517
|
+
* `● Model changed from gpt-5.6-terra (xhigh) to gpt-5-mini (medium) for this
|
|
518
|
+
* session.` (measured on 1.0.80: the status bar carries the new model within
|
|
519
|
+
* ~300ms and the composer is back). An unknown id prints the list of valid
|
|
520
|
+
* ids and changes nothing -- also no picker. So the wait could only ever
|
|
521
|
+
* expire, and the `C-m` it guarded was a bare Enter aimed at whatever was on
|
|
522
|
+
* screen 5 seconds after a switch that had already finished.
|
|
312
523
|
*
|
|
313
524
|
* @param worktreeId - Worktree ID
|
|
314
525
|
* @param modelName - Model name to switch to
|
|
@@ -321,14 +532,9 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
321
532
|
throw new Error(`Copilot session ${sessionName} does not exist. Start the session first.`);
|
|
322
533
|
}
|
|
323
534
|
try {
|
|
324
|
-
// Send /model <modelName> command with Enter
|
|
535
|
+
// Send /model <modelName> command with Enter. An argument means an
|
|
536
|
+
// in-place switch, never a picker (Issue #1895).
|
|
325
537
|
await (0, tmux_1.sendKeys)(sessionName, `/model ${modelName}`, true);
|
|
326
|
-
// Wait for selection list to appear
|
|
327
|
-
const selectionListDetected = await this.waitForSelectionList(sessionName);
|
|
328
|
-
// If selection list appeared, send Enter to confirm the selection
|
|
329
|
-
if (selectionListDetected) {
|
|
330
|
-
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-m');
|
|
331
|
-
}
|
|
332
538
|
// Wait for prompt recovery with extended timeout for model switching
|
|
333
539
|
await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS);
|
|
334
540
|
// Invalidate cache after model switch
|
|
@@ -343,7 +549,25 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
343
549
|
/**
|
|
344
550
|
* Kill Copilot session
|
|
345
551
|
*
|
|
552
|
+
* Issue #1905 is the first change to reach this method from the GUI / CLI at
|
|
553
|
+
* all: `POST /api/worktrees/:id/kill-session` used to call `lib/tmux`'s
|
|
554
|
+
* `killSession` directly, and the only other caller (the Assistant session
|
|
555
|
+
* route) does not allow copilot. Two things were wrong here as a result.
|
|
556
|
+
*
|
|
557
|
+
* 1. The body and Enter were batched into one `send-keys <body> C-m`. The
|
|
558
|
+
* repository moved off that shape for message sends in #1471 because ink
|
|
559
|
+
* TUIs swallow the trailing `C-m` as part of a bracketed paste; the exit
|
|
560
|
+
* command is the same keystroke sequence and had been left behind.
|
|
561
|
+
* 2. `TUI_EXIT_WAIT_MS` (500 ms) was shorter than the shutdown takes on
|
|
562
|
+
* copilot 1.0.80 — 11 measured samples ran 1.006 s to 2.193 s — so the
|
|
563
|
+
* tmux kill always landed mid-shutdown. See {@link COPILOT_EXIT_WAIT_MS}.
|
|
564
|
+
*
|
|
565
|
+
* The `Ctrl+C` first is kept: it interrupts an in-flight generation so the
|
|
566
|
+
* composer is accepting input by the time the command is typed. tmux kill
|
|
567
|
+
* still runs unconditionally afterwards, as the fallback.
|
|
568
|
+
*
|
|
346
569
|
* @param worktreeId - Worktree ID
|
|
570
|
+
* @param instanceId - Optional agent instance ID (defaults to primary)
|
|
347
571
|
*/
|
|
348
572
|
async killSession(worktreeId, instanceId) {
|
|
349
573
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
@@ -353,9 +577,11 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
353
577
|
// Send Ctrl+C to interrupt any running operation
|
|
354
578
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'C-c');
|
|
355
579
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_INTERRUPT_SETTLE_MS));
|
|
356
|
-
//
|
|
357
|
-
await (0, tmux_1.sendKeys)(sessionName,
|
|
358
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
580
|
+
// Type the exit command, then submit it as a separate tmux command.
|
|
581
|
+
await (0, tmux_1.sendKeys)(sessionName, exports.COPILOT_EXIT_COMMAND, false);
|
|
582
|
+
await new Promise((resolve) => setTimeout(resolve, copilot_constants_1.COPILOT_TEXT_INPUT_DELAY_MS));
|
|
583
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
584
|
+
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.COPILOT_EXIT_WAIT_MS));
|
|
359
585
|
}
|
|
360
586
|
// Kill the tmux session
|
|
361
587
|
const killed = await (0, tmux_1.killSession)(sessionName);
|
|
@@ -13,12 +13,15 @@ exports.GeminiTool = exports.GEMINI_PANE_HEIGHT = void 0;
|
|
|
13
13
|
const base_1 = require("./base");
|
|
14
14
|
const tmux_1 = require("../tmux/tmux");
|
|
15
15
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
16
|
+
const capture_spec_1 = require("./capture-spec");
|
|
17
|
+
Object.defineProperty(exports, "GEMINI_PANE_HEIGHT", { enumerable: true, get: function () { return capture_spec_1.GEMINI_PANE_HEIGHT; } });
|
|
16
18
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
17
19
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
18
20
|
const sources_1 = require("../../lib/hooks/sources");
|
|
19
21
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
20
22
|
const logger_1 = require("../../lib/logger");
|
|
21
23
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
24
|
+
const session_start_error_1 = require("../session/session-start-error");
|
|
22
25
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
23
26
|
/**
|
|
24
27
|
* Extract error message from unknown error type (DRY)
|
|
@@ -28,8 +31,6 @@ function getErrorMessage(error) {
|
|
|
28
31
|
}
|
|
29
32
|
/** Wait for Gemini CLI to initialize after launch (banner + auth + dialog) */
|
|
30
33
|
const GEMINI_INIT_WAIT_MS = 6000;
|
|
31
|
-
/** Gemini runs in a 200-line tmux pane and keeps the prompt near the top. */
|
|
32
|
-
exports.GEMINI_PANE_HEIGHT = 200;
|
|
33
34
|
/** Interval for polling trust dialog / prompt detection */
|
|
34
35
|
const GEMINI_POLL_INTERVAL_MS = 1000;
|
|
35
36
|
/** Max attempts for initialization polling (30 * 1000ms = 30s total window) */
|
|
@@ -61,11 +62,11 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
61
62
|
* @param worktreeId - Worktree ID
|
|
62
63
|
* @param worktreePath - Worktree path
|
|
63
64
|
*/
|
|
64
|
-
async
|
|
65
|
+
async launchSession(worktreeId, worktreePath, instanceId) {
|
|
65
66
|
// Check if Gemini is installed
|
|
66
67
|
const geminiAvailable = await this.isInstalled();
|
|
67
68
|
if (!geminiAvailable) {
|
|
68
|
-
throw new
|
|
69
|
+
throw new session_start_error_1.SessionStartUnavailableError(this.name, 'Gemini CLI is not installed or not in PATH');
|
|
69
70
|
}
|
|
70
71
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
71
72
|
// Check if session already exists
|
|
@@ -131,7 +132,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
131
132
|
let trustDialogHandled = false;
|
|
132
133
|
for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
|
|
133
134
|
try {
|
|
134
|
-
const rawOutput = await (0, tmux_1.capturePane)(sessionName,
|
|
135
|
+
const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
|
|
135
136
|
// Strip ANSI escape codes before pattern matching
|
|
136
137
|
// (Gemini TUI uses 24-bit color codes that break regex matching)
|
|
137
138
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
@@ -164,7 +165,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
164
165
|
const pollInterval = 500;
|
|
165
166
|
while (Date.now() - startTime < GEMINI_PROMPT_WAIT_TIMEOUT_MS) {
|
|
166
167
|
try {
|
|
167
|
-
const rawOutput = await (0, tmux_1.capturePane)(sessionName,
|
|
168
|
+
const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
|
|
168
169
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
169
170
|
if (cli_patterns_1.GEMINI_PROMPT_PATTERN.test(output)) {
|
|
170
171
|
return;
|
|
@@ -199,6 +200,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
199
200
|
sessionName,
|
|
200
201
|
message,
|
|
201
202
|
cliToolId: 'gemini',
|
|
203
|
+
composer: this.describeComposer(),
|
|
202
204
|
});
|
|
203
205
|
// Issue #405: Invalidate cache after sending message
|
|
204
206
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|