commandmate 0.43.0 → 0.44.1
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 +357 -361
- package/.next/app-path-routes-manifest.json +33 -33
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.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.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 +2 -2
- 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 +2 -2
- 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.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +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.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.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.js.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +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.js.nft.json +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 +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.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.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.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 +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +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 +103 -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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +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.nft.json +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.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.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.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/config/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +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.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.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 +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +33 -33
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-f1f258d4a1d92620.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-308072f285c34787.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-da66300cc20244ed.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +90 -605
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +34 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +171 -6
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +11 -0
- package/dist/cli/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +368 -0
- package/dist/cli/types/api-responses.d.ts +21 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -0
- package/dist/lib/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +41 -7
- package/dist/server/locales/ja/worktree.json +41 -7
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +30 -4
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/cli-patterns.js +94 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +138 -16
- package/dist/server/src/lib/session/current-output-builder.js +49 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- package/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/release-notes/0.44.1.json +54 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/layout-057c850cd0df978e.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → 57lOiz8zSEHdw97XIm0af}/_ssgManifest.js +0 -0
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* only the correlation.
|
|
37
37
|
*/
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.CommandCodeTool = exports.COMMAND_CODE_STARTING_WINDOW_MS = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
39
|
+
exports.CommandCodeTool = exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = exports.COMMAND_CODE_STARTING_WINDOW_MS = exports.COMMAND_CODE_EXIT_COMMAND = exports.COMMAND_CODE_LAUNCH_FLAGS = exports.COMMAND_CODE_COMMAND = void 0;
|
|
40
40
|
exports.buildCommandCodeLaunchCommand = buildCommandCodeLaunchCommand;
|
|
41
41
|
exports.isCommandCodeReady = isCommandCodeReady;
|
|
42
42
|
const base_1 = require("./base");
|
|
@@ -51,7 +51,9 @@ const tool_id_1 = require("../../lib/hooks/sources/command-code/tool-id");
|
|
|
51
51
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
52
52
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
53
53
|
const install_hints_1 = require("./install-hints");
|
|
54
|
+
const plan_review_state_1 = require("../detection/tools/command-code/plan-review-state");
|
|
54
55
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
56
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
55
57
|
const logger = (0, logger_1.createLogger)('cli-tools/command-code');
|
|
56
58
|
/** The executable CommandMate launches. See the module docblock for why not `cmd`. */
|
|
57
59
|
exports.COMMAND_CODE_COMMAND = 'commandcode';
|
|
@@ -144,6 +146,16 @@ function isCommandCodeReady(rawOutput) {
|
|
|
144
146
|
return false;
|
|
145
147
|
return !cli_patterns_1.COMMAND_CODE_THINKING_PATTERN.test((0, cli_patterns_1.stripAnsi)(rawOutput));
|
|
146
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Why `send` stops at the plan review overlay (Issue #3125).
|
|
151
|
+
*
|
|
152
|
+
* The overlay replaces the composer until a human decides, so waiting for the
|
|
153
|
+
* composer only ran out the clock (`prompt not ready` after the full timeout).
|
|
154
|
+
* Its comments, Submit review, approval and cancel go through `respond`.
|
|
155
|
+
*/
|
|
156
|
+
exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE = 'Command Code is showing a plan review (REVIEW), which takes review comments, not messages. ' +
|
|
157
|
+
'Comment with `commandmate respond <worktree-id> "<text>"`, then `--plan-review submit` (ctrl+r), ' +
|
|
158
|
+
'`--plan-review approve` (ctrl+a) or `--plan-review cancel` (esc).';
|
|
147
159
|
/**
|
|
148
160
|
* Command Code CLI tool implementation.
|
|
149
161
|
* Manages `commandcode` sessions using tmux.
|
|
@@ -247,11 +259,11 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
247
259
|
});
|
|
248
260
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
249
261
|
}
|
|
250
|
-
await (0, tmux_1.sendKeys)(sessionName, buildCommandCodeLaunchCommand({
|
|
262
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(buildCommandCodeLaunchCommand({
|
|
251
263
|
target: { worktreeId, cliToolId: tool_id_1.COMMAND_CODE_CLI_TOOL_ID, instanceId },
|
|
252
264
|
executablePath: this.command,
|
|
253
265
|
worktreePath,
|
|
254
|
-
}), true);
|
|
266
|
+
})), true);
|
|
255
267
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.COMMAND_CODE_INIT_WAIT_MS));
|
|
256
268
|
await this.waitForReady(sessionName);
|
|
257
269
|
logger.info('started-command-code-session');
|
|
@@ -301,15 +313,21 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
301
313
|
*
|
|
302
314
|
* @throws SessionStartTimeoutError when a just-launched session's composer
|
|
303
315
|
* has still not appeared
|
|
316
|
+
* @throws Error ({@link COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE}) at once when
|
|
317
|
+
* the plan review overlay is on screen (Issue #3125)
|
|
304
318
|
* @throws Error when the composer is not detected within the timeout
|
|
305
319
|
*/
|
|
306
320
|
async waitForPrompt(sessionName) {
|
|
307
321
|
const startTime = Date.now();
|
|
308
322
|
const pollInterval = 500;
|
|
323
|
+
let planReviewPolls = 0;
|
|
309
324
|
while (Date.now() - startTime < COMMAND_CODE_PROMPT_WAIT_TIMEOUT_MS) {
|
|
325
|
+
let planReviewUp = false;
|
|
310
326
|
try {
|
|
311
327
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, COMMAND_CODE_READINESS_CAPTURE_LINES);
|
|
312
|
-
|
|
328
|
+
// Read first: a focused action row (`❯ Approve ctrl+a`) is a `❯` row.
|
|
329
|
+
planReviewUp = (0, plan_review_state_1.readCommandCodePlanReviewState)(rawOutput) !== null;
|
|
330
|
+
if (!planReviewUp && isCommandCodeReady(rawOutput)) {
|
|
313
331
|
this.composerPendingSince.delete(sessionName);
|
|
314
332
|
return;
|
|
315
333
|
}
|
|
@@ -317,6 +335,14 @@ class CommandCodeTool extends base_1.BaseCLITool {
|
|
|
317
335
|
catch {
|
|
318
336
|
// Capture may fail - continue polling
|
|
319
337
|
}
|
|
338
|
+
// Issue #3125: no composer comes back until a human answers the review.
|
|
339
|
+
// Two polls in a row, because the frame redrawn just after `Esc` can
|
|
340
|
+
// still carry the footer (`after-cancel-partial-redraw.txt`, #2763).
|
|
341
|
+
planReviewPolls = planReviewUp ? planReviewPolls + 1 : 0;
|
|
342
|
+
if (planReviewPolls >= 2) {
|
|
343
|
+
logger.info('command-code-plan-review-blocks-send', { sessionName });
|
|
344
|
+
throw new Error(exports.COMMAND_CODE_PLAN_REVIEW_SEND_MESSAGE);
|
|
345
|
+
}
|
|
320
346
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
321
347
|
}
|
|
322
348
|
const launchedAt = this.composerPendingSince.get(sessionName);
|
|
@@ -35,6 +35,7 @@ const tool_id_1 = require("../../lib/hooks/sources/copilot/tool-id");
|
|
|
35
35
|
const errors_1 = require("../../lib/errors");
|
|
36
36
|
const logger_1 = require("../../lib/logger");
|
|
37
37
|
const install_hints_1 = require("./install-hints");
|
|
38
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
38
39
|
const logger = (0, logger_1.createLogger)('cli-tools/copilot');
|
|
39
40
|
/** Interval for polling prompt detection */
|
|
40
41
|
const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
@@ -369,7 +370,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
369
370
|
worktreePath,
|
|
370
371
|
});
|
|
371
372
|
// Start Copilot CLI in interactive mode
|
|
372
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
373
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
373
374
|
// Issue #1907: no blind sleep before this. The 4-second one that used to
|
|
374
375
|
// sit here was a guess at how long copilot takes to paint (measured on
|
|
375
376
|
// 1.0.80: banner at ~1.3 s, folder-trust dialog at ~2.5 s), and it was
|
|
@@ -22,6 +22,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
|
|
|
22
22
|
const logger_1 = require("../../lib/logger");
|
|
23
23
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
24
24
|
const install_hints_1 = require("./install-hints");
|
|
25
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
25
26
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
26
27
|
/**
|
|
27
28
|
* Extract error message from unknown error type (DRY)
|
|
@@ -128,7 +129,7 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
128
129
|
executablePath: this.command,
|
|
129
130
|
worktreePath,
|
|
130
131
|
});
|
|
131
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
132
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
132
133
|
// Wait for Gemini to initialize (minimum wait for banner/auth)
|
|
133
134
|
await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
|
|
134
135
|
// Poll until Gemini interactive prompt is ready
|
|
@@ -90,22 +90,40 @@ const ADDED_TOOL_DEFAULTS = {
|
|
|
90
90
|
*/
|
|
91
91
|
const LIVENESS_SPECS = {
|
|
92
92
|
/**
|
|
93
|
-
* claude's is `isSessionHealthy`,
|
|
93
|
+
* claude's is `isSessionHealthy`, expressed as a declaration.
|
|
94
94
|
*
|
|
95
|
-
*
|
|
96
|
-
* null` (the check has always tested the whole frame)
|
|
97
|
-
* []` (the length gate and the endings are the whole rule), and
|
|
95
|
+
* Two fields carry that history and are claude's alone: `aliveTailLines:
|
|
96
|
+
* null` (the check has always tested the whole frame) and
|
|
98
97
|
* `unreadableIsExited: true` (an empty pane and a capture that threw have
|
|
99
|
-
* both meant "unhealthy" since it was written).
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
98
|
+
* both meant "unhealthy" since it was written). Neither is "improved" here.
|
|
99
|
+
*
|
|
100
|
+
* `shellPromptPatterns` is NOT claude's alone any more (Issue #3191). #2070
|
|
101
|
+
* left it `[]` so claude's verdicts would not move, which kept claude on the
|
|
102
|
+
* length-gated endings rule — and that rule cannot see a prompt of 40
|
|
103
|
+
* characters or more. Measured 2026-10-04: after `/exit` the pane fell back
|
|
104
|
+
* to `maenokota@MAENOnoMac-Studio uat-repo-wt2 %` (42 characters) and the
|
|
105
|
+
* session stayed `running`, so the next send sat in `waitForPrompt` until
|
|
106
|
+
* `Prompt detection timeout (10000ms)`; the author's everyday prompt
|
|
107
|
+
* (`… MyCodeBranchDesk %`, 46) is past the gate too.
|
|
108
|
+
*
|
|
109
|
+
* The positive `user@host …` forms are therefore claude's as well. What made
|
|
110
|
+
* that safe to adopt unnarrowed: every row of every claude screen fixture in
|
|
111
|
+
* the repository (`tests/fixtures/claude-*`, `tests/unit/detection/tools/
|
|
112
|
+
* claude/fixtures/`, the #2070 frames — composer, transcript, dialogs,
|
|
113
|
+
* pickers, banners) was swept against both patterns and NONE matched, not
|
|
114
|
+
* just none on the bottom row; `tool-liveness-3191.test.ts` keeps that
|
|
115
|
+
* sweep. The whole-frame `CLAUDE_PROMPT_PATTERN` check still runs first, so
|
|
116
|
+
* a pane with claude's composer anywhere on it stays alive regardless. Below
|
|
117
|
+
* the 40-character gate the verdicts are unchanged — a pattern match there
|
|
118
|
+
* already ended in `$` / `%` / `#` — only the reason reads `shell prompt
|
|
119
|
+
* detected` instead of `shell prompt ending detected` for a `user@host:…`
|
|
120
|
+
* row.
|
|
103
121
|
*/
|
|
104
122
|
claude: {
|
|
105
123
|
...SHARED,
|
|
106
124
|
alivePatterns: [cli_patterns_1.CLAUDE_PROMPT_PATTERN],
|
|
107
125
|
aliveTailLines: null,
|
|
108
|
-
shellPromptPatterns:
|
|
126
|
+
shellPromptPatterns: tool_liveness_1.SHELL_PROMPT_LINE_PATTERNS,
|
|
109
127
|
unreadableIsExited: true,
|
|
110
128
|
fatalPatterns: cli_patterns_1.CLAUDE_SESSION_ERROR_PATTERNS,
|
|
111
129
|
fatalRegexPatterns: cli_patterns_1.CLAUDE_SESSION_ERROR_REGEX_PATTERNS,
|
|
@@ -57,6 +57,7 @@ const graceful_exit_1 = require("./graceful-exit");
|
|
|
57
57
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
58
58
|
const install_hints_1 = require("./install-hints");
|
|
59
59
|
const opencode_executable_1 = require("./opencode-executable");
|
|
60
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
60
61
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode-v2');
|
|
61
62
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
62
63
|
/** Interval between composer polls (launch and send). */
|
|
@@ -232,7 +233,7 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
|
|
|
232
233
|
if (port === null) {
|
|
233
234
|
logger.warn('opencode-v2-launch-without-server', { worktreeId, instanceId });
|
|
234
235
|
}
|
|
235
|
-
await (0, tmux_1.sendKeys)(sessionName, (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath }), true);
|
|
236
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)((0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath })), true);
|
|
236
237
|
await this.waitForReady(sessionName);
|
|
237
238
|
await (0, runtime_1.attachOpencodeV2EventStream)(target);
|
|
238
239
|
logger.info('started-opencode-v2-session');
|
|
@@ -75,6 +75,7 @@ const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
|
75
75
|
const install_hints_1 = require("./install-hints");
|
|
76
76
|
const opencode_executable_1 = require("./opencode-executable");
|
|
77
77
|
const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
|
|
78
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
78
79
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode');
|
|
79
80
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
80
81
|
/**
|
|
@@ -393,7 +394,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
393
394
|
});
|
|
394
395
|
}
|
|
395
396
|
const launchedAt = Date.now();
|
|
396
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
397
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
397
398
|
// Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
|
|
398
399
|
await this.waitForReady(sessionName);
|
|
399
400
|
// Issue #1763: subscribe once the server is up. Health-checked first, so
|
|
@@ -21,6 +21,7 @@ const logger_1 = require("../../lib/logger");
|
|
|
21
21
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
22
22
|
const install_hints_1 = require("./install-hints");
|
|
23
23
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
24
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
24
25
|
const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
|
|
25
26
|
/**
|
|
26
27
|
* Extract error message from unknown error type (DRY)
|
|
@@ -123,7 +124,7 @@ class VibeLocalTool extends base_1.BaseCLITool {
|
|
|
123
124
|
}
|
|
124
125
|
// Start vibe-local in interactive mode with auto-approve (-y)
|
|
125
126
|
// -y flag skips the permission confirmation prompt
|
|
126
|
-
await (0, tmux_1.sendKeys)(sessionName, vibeLocalCommand, true);
|
|
127
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(vibeLocalCommand), true);
|
|
127
128
|
// Wait for vibe-local to initialize (banner + model loading)
|
|
128
129
|
await new Promise((resolve) => setTimeout(resolve, VIBE_LOCAL_INIT_WAIT_MS));
|
|
129
130
|
logger.info('started-vibe-local-session:sessionname');
|
|
@@ -8,6 +8,9 @@ exports.findOpencodeV2DialogTitle = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = e
|
|
|
8
8
|
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_V2_SKIP_PATTERNS = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
|
+
exports.resolveClaudeTrustDialogKeys = resolveClaudeTrustDialogKeys;
|
|
12
|
+
exports.isClaudeTrustDialogOpen = isClaudeTrustDialogOpen;
|
|
13
|
+
exports.isShellPaneCommand = isShellPaneCommand;
|
|
11
14
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
12
15
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
13
16
|
exports.getCodexLifecycleDialog = getCodexLifecycleDialog;
|
|
@@ -229,6 +232,86 @@ function findClaudeChromeStart(lines) {
|
|
|
229
232
|
* tmux padding or other output. (SF-001)
|
|
230
233
|
*/
|
|
231
234
|
exports.CLAUDE_TRUST_DIALOG_PATTERN = /Yes, I trust this folder/m;
|
|
235
|
+
/** The option row of the trust dialog's cursor: `❯` (or legacy `>`) after the dialog's left padding. */
|
|
236
|
+
const CLAUDE_TRUST_CURSOR_ROW_PATTERN = /^\s*[>❯]\s+\S/;
|
|
237
|
+
/** How far the cursor row may sit from the `Yes, I trust this folder` row (the dialog has two options). */
|
|
238
|
+
const CLAUDE_TRUST_MAX_CURSOR_DISTANCE = 3;
|
|
239
|
+
/**
|
|
240
|
+
* Keys that answer Claude Code's folder-trust dialog with "Yes", or null when
|
|
241
|
+
* no answerable dialog is on screen (Issue #3078).
|
|
242
|
+
*
|
|
243
|
+
* The dialog comes in two layouts, and Enter alone is only right for one:
|
|
244
|
+
*
|
|
245
|
+
* - default Yes (Issue #201 era, `tests/unit/lib/claude-session.test.ts`):
|
|
246
|
+
* ` ❯ 1. Yes, I trust this folder` / ` 2. No, exit` — Enter confirms Yes.
|
|
247
|
+
* - default No (2.1.259 `tests/fixtures/chat-dialog-card-2254/claude-trust-2-1-259.txt`,
|
|
248
|
+
* 2.1.287 with a permission allow-list
|
|
249
|
+
* `tests/fixtures/claude-trust-dialog-3078/allowlist-default-no-2-1-287.txt`):
|
|
250
|
+
* ` ❯ No, exit` / ` Yes, I trust this folder` — Enter EXITS Claude Code.
|
|
251
|
+
*
|
|
252
|
+
* So the answer is read off the screen: the distance from the cursor row to the
|
|
253
|
+
* Yes row becomes that many `Up`/`Down` presses, then `Enter`. Only the last
|
|
254
|
+
* dialog in the capture counts, and a dialog followed by Claude's input-box
|
|
255
|
+
* separator is history in the scrollback, not an open dialog.
|
|
256
|
+
*
|
|
257
|
+
* @param output - ANSI-stripped pane output
|
|
258
|
+
* @returns tmux key names ending in `Enter` (just `['Enter']` when the cursor is
|
|
259
|
+
* already on Yes), or null when no open dialog / no readable cursor row
|
|
260
|
+
*/
|
|
261
|
+
function resolveClaudeTrustDialogKeys(output) {
|
|
262
|
+
const lines = output.split('\n');
|
|
263
|
+
const yesIndex = findOpenClaudeTrustYesRow(lines);
|
|
264
|
+
if (yesIndex === -1)
|
|
265
|
+
return null;
|
|
266
|
+
for (let distance = 0; distance <= CLAUDE_TRUST_MAX_CURSOR_DISTANCE; distance++) {
|
|
267
|
+
for (const direction of distance === 0 ? [0] : [-1, 1]) {
|
|
268
|
+
const index = yesIndex + direction * distance;
|
|
269
|
+
if (index < 0 || index >= lines.length)
|
|
270
|
+
continue;
|
|
271
|
+
if (!CLAUDE_TRUST_CURSOR_ROW_PATTERN.test(lines[index]))
|
|
272
|
+
continue;
|
|
273
|
+
// Cursor above Yes → move Down; below → move Up.
|
|
274
|
+
const key = direction < 0 ? 'Down' : 'Up';
|
|
275
|
+
return [...Array(distance).fill(key), 'Enter'];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Whether Claude Code's folder-trust dialog is the open screen (Issue #3078).
|
|
282
|
+
*
|
|
283
|
+
* The dialog's cursor row (` ❯ No, exit`) has the prompt glyph, so the start
|
|
284
|
+
* wait asks this before CLAUDE_PROMPT_PATTERN rather than reading the dialog as
|
|
285
|
+
* a ready prompt.
|
|
286
|
+
*
|
|
287
|
+
* @param output - ANSI-stripped pane output
|
|
288
|
+
*/
|
|
289
|
+
function isClaudeTrustDialogOpen(output) {
|
|
290
|
+
return findOpenClaudeTrustYesRow(output.split('\n')) !== -1;
|
|
291
|
+
}
|
|
292
|
+
/** `#{pane_current_command}` values of an interactive shell, with tmux's `-` login prefix removed. */
|
|
293
|
+
const SHELL_PANE_COMMANDS = new Set(['sh', 'bash', 'zsh', 'fish', 'dash', 'ksh', 'tcsh', 'csh']);
|
|
294
|
+
/**
|
|
295
|
+
* Whether a pane's foreground command is a shell rather than an agent
|
|
296
|
+
* (Issue #3089). Claude Code shows up as `claude`, `node` or its version
|
|
297
|
+
* string (`2.1.287`), never as one of these, so a shell here after the agent
|
|
298
|
+
* was seen running means the agent has exited.
|
|
299
|
+
*
|
|
300
|
+
* @param command - `#{pane_current_command}` of the pane
|
|
301
|
+
*/
|
|
302
|
+
function isShellPaneCommand(command) {
|
|
303
|
+
return SHELL_PANE_COMMANDS.has(command.trim().replace(/^-/, ''));
|
|
304
|
+
}
|
|
305
|
+
/** Row of the last `Yes, I trust this folder`, or -1 when absent or already answered. */
|
|
306
|
+
function findOpenClaudeTrustYesRow(lines) {
|
|
307
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
308
|
+
if (!exports.CLAUDE_TRUST_DIALOG_PATTERN.test(lines[i]))
|
|
309
|
+
continue;
|
|
310
|
+
// Claude's input box (separator rows) drawn below it: the dialog is scrollback.
|
|
311
|
+
return lines.slice(i + 1).some((line) => exports.CLAUDE_SEPARATOR_PATTERN.test(line)) ? -1 : i;
|
|
312
|
+
}
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
232
315
|
/**
|
|
233
316
|
* Codex prompt pattern
|
|
234
317
|
* T1.2: Improved to detect empty prompts as well
|
|
@@ -1470,12 +1553,22 @@ exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = /Enter\s+to\s+set\s+as\s+default\b
|
|
|
1470
1553
|
* "Enter to set as default · s to use this session only · Esc to cancel"
|
|
1471
1554
|
* (/model command footer as of Claude Code v2.1.218 — Issue #1495)
|
|
1472
1555
|
*
|
|
1556
|
+
* "←/→ to adjust · Enter to confirm · s for this session only · Esc to cancel"
|
|
1557
|
+
* (/effort slider footer as of Claude Code v2.1.257 — Issue #3052; before
|
|
1558
|
+
* 2.1.257 it was "Enter to confirm · Esc to cancel")
|
|
1559
|
+
*
|
|
1560
|
+
* The /effort branch keys on "Enter to confirm · s for this session only" rather
|
|
1561
|
+
* than "←/→ to adjust": the `s` hint is unique to the pickers (the trust dialog's
|
|
1562
|
+
* "Enter to confirm · Esc to cancel" and approval dialogs never carry it), and
|
|
1563
|
+
* keeping the match under the `Enter to` prefix leaves the pattern a single
|
|
1564
|
+
* linear alternation. Linear, no nested quantifiers — ReDoS safe.
|
|
1565
|
+
*
|
|
1473
1566
|
* The "set as default" branch lets status-detector classify the `/model` overlay
|
|
1474
1567
|
* as a Claude selection list (NavigationButtons + ESC hatch, hasActivePrompt=false)
|
|
1475
1568
|
* once detectPrompt() no longer reports it as a prompt (see
|
|
1476
1569
|
* CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN).
|
|
1477
1570
|
*/
|
|
1478
|
-
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc|set\s+as\s+default)/;
|
|
1571
|
+
exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+(?:Esc|s\s+for\s+this\s+session\s+only)|set\s+as\s+default)/;
|
|
1479
1572
|
/**
|
|
1480
1573
|
* OpenCode TUI separator pattern (Issue #379)
|
|
1481
1574
|
* Matches lines composed entirely of box-drawing / TUI decoration characters.
|
|
@@ -115,6 +115,23 @@ exports.STATUS_REASON = {
|
|
|
115
115
|
OPENCODE_RESPONSE_COMPLETE: 'opencode_response_complete',
|
|
116
116
|
INPUT_PROMPT: 'input_prompt',
|
|
117
117
|
NO_RECENT_OUTPUT: 'no_recent_output',
|
|
118
|
+
/**
|
|
119
|
+
* Issue #3179: the agent's launch is still in progress.
|
|
120
|
+
*
|
|
121
|
+
* Published by `current-output-builder` and `worktree-status-helper` while
|
|
122
|
+
* `lib/session/session-starting-state` holds a record for the instance — from
|
|
123
|
+
* `beginAgentSession` until `startSession` returns or throws, bounded by the
|
|
124
|
+
* tool's readiness wait and released early by a dialog the launch does not
|
|
125
|
+
* answer. The frame underneath (a shell prompt and the launch line, or a trust
|
|
126
|
+
* dialog the launch is about to answer) is not read while it is up: the status
|
|
127
|
+
* is `running`, and `isUnclassifiedActive` / `isSelectionListActive` /
|
|
128
|
+
* `isPromptWaiting` are all false, so no pad, no answer sheet and no `wait`
|
|
129
|
+
* exit 10 is raised for a screen nobody has to drive.
|
|
130
|
+
*
|
|
131
|
+
* ADDITIVE in the sense {@link STATUS_REASON.EXITED} is: a reader that does not
|
|
132
|
+
* know the token sees a `running` session.
|
|
133
|
+
*/
|
|
134
|
+
STARTING: 'starting',
|
|
118
135
|
/**
|
|
119
136
|
* Issue #2070: the tmux session is there, and the TOOL is not.
|
|
120
137
|
*
|
|
@@ -49,7 +49,9 @@ exports.SHELL_PROMPT_ENDINGS = ['$', '%', '#'];
|
|
|
49
49
|
* reproduced on renders as `maenokota@MAENOnoMac-Studio work-codex %` — forty
|
|
50
50
|
* characters exactly, i.e. one past this gate — so a codex session that had
|
|
51
51
|
* genuinely fallen back to the shell read as alive. See
|
|
52
|
-
* {@link SHELL_PROMPT_LINE_PATTERNS}.
|
|
52
|
+
* {@link SHELL_PROMPT_LINE_PATTERNS}. Issue #3191 found the same gap for claude
|
|
53
|
+
* (`… uat-repo-wt2 %`, 42 characters, after `/exit`), and claude now takes the
|
|
54
|
+
* line patterns too.
|
|
53
55
|
*/
|
|
54
56
|
exports.MAX_SHELL_PROMPT_LENGTH = 40;
|
|
55
57
|
/**
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.codexStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
18
18
|
exports.isCodexStalePrompt = isCodexStalePrompt;
|
|
19
|
+
exports.isCodexModelPickerFrame = isCodexModelPickerFrame;
|
|
19
20
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
20
21
|
const prompt_detector_1 = require("../../prompt-detector");
|
|
21
22
|
const status_reason_1 = require("../../status-reason");
|
|
22
23
|
const cli_patterns_2 = require("./cli-patterns");
|
|
23
24
|
const prompt_1 = require("./prompt");
|
|
24
25
|
const frame_1 = require("../frame");
|
|
26
|
+
const dialog_block_1 = require("../dialog-block");
|
|
25
27
|
const run_detection_1 = require("../run-detection");
|
|
26
28
|
const verified_against_1 = require("../verified-against");
|
|
27
29
|
const thinking_constants_1 = require("../../../../config/thinking-constants");
|
|
@@ -463,3 +465,27 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
463
465
|
return null;
|
|
464
466
|
},
|
|
465
467
|
});
|
|
468
|
+
/**
|
|
469
|
+
* Issue #3062: is this frame codex's `/model` picker (either stage)?
|
|
470
|
+
*
|
|
471
|
+
* Auto-Yes must not answer it: the digit is an immediate decision, so the
|
|
472
|
+
* poller would pick the model and the reasoning effort for the operator. It is
|
|
473
|
+
* judged by the picker's own footer row (`enter select · esc back`, `enter
|
|
474
|
+
* default · s session · esc back`) rather than by `detectDialog`'s `picker`
|
|
475
|
+
* kind, which also covers the hooks list/detail screens whose Auto-Yes
|
|
476
|
+
* behaviour is unchanged. The footer must sit under the option block of a frame
|
|
477
|
+
* `detectDialog` vouches for, so the same words quoted in a reply do not count.
|
|
478
|
+
* `/prompt-response` does not call this and keeps accepting an answer.
|
|
479
|
+
*
|
|
480
|
+
* @param cleanOutput - The capture Auto-Yes judged (ANSI and box drawing stripped)
|
|
481
|
+
*/
|
|
482
|
+
function isCodexModelPickerFrame(cleanOutput) {
|
|
483
|
+
const frame = (0, frame_1.normalizeFrame)(cleanOutput);
|
|
484
|
+
if (!exports.codexStatusDetector.detectDialog(frame))
|
|
485
|
+
return false;
|
|
486
|
+
const contentEnd = findCodexContentEnd(frame.contentLines);
|
|
487
|
+
const block = (0, dialog_block_1.findNumberedOptionBlock)((0, cli_patterns_1.stripBoxDrawing)(frame.clean).split('\n'), contentEnd);
|
|
488
|
+
return (block !== null &&
|
|
489
|
+
(cli_patterns_1.CODEX_PICKER_FOOTER_PATTERN.test(block.footer) ||
|
|
490
|
+
cli_patterns_1.CODEX_EFFORT_PICKER_FOOTER_PATTERN.test(block.footer)));
|
|
491
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which part of Command Code's plan review overlay has the keyboard
|
|
4
|
+
* (Issue #3125).
|
|
5
|
+
*
|
|
6
|
+
* The detector already says THAT the overlay is up
|
|
7
|
+
* (`command_code_plan_review`, see `detect.ts`). Answering it needs one more
|
|
8
|
+
* fact, because the same keys mean different things depending on where the
|
|
9
|
+
* focus is — measured on 1.58.0 (`tests/fixtures/command-code-plan-review-2763/`)
|
|
10
|
+
* and unchanged in the 1.74.0 rows #3059 observed
|
|
11
|
+
* (`tests/fixtures/command-code-plan-review-3125/`):
|
|
12
|
+
*
|
|
13
|
+
* | phase | hint bar (last content row) | `Enter` does |
|
|
14
|
+
* |------------------|----------------------------------------------|-------------------------|
|
|
15
|
+
* | `body` | `type + enter to comment · …` | opens / pins a comment |
|
|
16
|
+
* | `comment-box` | `enter to pin · esc discard` | pins what is typed |
|
|
17
|
+
* | `action-focus` | `↑/↓ choose · enter to run` (a `❯` on a row) | RUNS the focused action |
|
|
18
|
+
* | `approve-choice` | `←/→ choose · enter confirm · esc back` | confirms the approval |
|
|
19
|
+
*
|
|
20
|
+
* The body cursor itself is drawn by background colour alone and cannot be read
|
|
21
|
+
* off a plain capture; the hint bar and the `❯` can, which is all this needs.
|
|
22
|
+
*
|
|
23
|
+
* Browser-safe and pure, like `selection-shape.ts` it builds on.
|
|
24
|
+
*
|
|
25
|
+
* @module lib/detection/tools/command-code/plan-review-state
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.readCommandCodePlanReviewState = readCommandCodePlanReviewState;
|
|
29
|
+
const ansi_1 = require("../../ansi");
|
|
30
|
+
const selection_shape_1 = require("../../selection-shape");
|
|
31
|
+
/** Rows read from the end of the frame — the same 15 the detector reads. */
|
|
32
|
+
const TAIL_CONTENT_ROWS = 15;
|
|
33
|
+
const BODY_HINT = /^\s*type \+ enter to comment\b/i;
|
|
34
|
+
const COMMENT_BOX_HINT = /^\s*enter to pin\s*·\s*esc discard\s*$/i;
|
|
35
|
+
const ACTION_FOCUS_HINT = /^\s*↑\/↓ choose\s*·\s*enter to run\s*$/i;
|
|
36
|
+
const FOCUSED_ACTION_ROW = /^\s*❯ +(?:Submit review\b|Approve\s+ctrl\+a\b|Cancel\s+esc\b)/im;
|
|
37
|
+
const PENDING_BADGE = /^\s*REVIEW\s+(\d+)\s+pending comments?\b/im;
|
|
38
|
+
const APPROVE_WITH_COMMENTS_SELECTED = /\(•\)\s+with\s+\d+\s+comments?\s+as\s+notes/i;
|
|
39
|
+
/**
|
|
40
|
+
* Read the plan review overlay's focus off a capture.
|
|
41
|
+
*
|
|
42
|
+
* @param frame - a raw `capture-pane` frame, ANSI intact or stripped
|
|
43
|
+
* @returns null when the overlay is not at the bottom of this frame
|
|
44
|
+
*/
|
|
45
|
+
function readCommandCodePlanReviewState(frame) {
|
|
46
|
+
if (!frame)
|
|
47
|
+
return null;
|
|
48
|
+
const rows = (0, ansi_1.stripAnsi)(frame.replace(/\r\n/g, '\n'))
|
|
49
|
+
.split('\n')
|
|
50
|
+
.filter((row) => row.trim() !== '')
|
|
51
|
+
.slice(-TAIL_CONTENT_ROWS);
|
|
52
|
+
if (rows.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
const tail = rows.join('\n');
|
|
55
|
+
const pendingMatch = PENDING_BADGE.exec(tail);
|
|
56
|
+
const pendingComments = pendingMatch ? Number(pendingMatch[1]) : 0;
|
|
57
|
+
if ((0, selection_shape_1.isCommandCodePlanApproveChoice)(tail)) {
|
|
58
|
+
return {
|
|
59
|
+
phase: 'approve-choice',
|
|
60
|
+
pendingComments,
|
|
61
|
+
approveChoice: APPROVE_WITH_COMMENTS_SELECTED.test(tail) ? 'with-comments' : 'discard-comments',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (!(0, selection_shape_1.hasCommandCodePlanReviewFooterAtBottom)(tail))
|
|
65
|
+
return null;
|
|
66
|
+
const hint = rows[rows.length - 1];
|
|
67
|
+
let phase = 'unknown';
|
|
68
|
+
if (FOCUSED_ACTION_ROW.test(tail) || ACTION_FOCUS_HINT.test(hint))
|
|
69
|
+
phase = 'action-focus';
|
|
70
|
+
else if (COMMENT_BOX_HINT.test(hint))
|
|
71
|
+
phase = 'comment-box';
|
|
72
|
+
else if (BODY_HINT.test(hint))
|
|
73
|
+
phase = 'body';
|
|
74
|
+
return { phase, pendingComments, approveChoice: null };
|
|
75
|
+
}
|
|
@@ -59,6 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
59
59
|
exports.CLAUDE_END_TURN_STOP_REASON = exports.CLAUDE_HUMAN_PROMPT_SOURCES = exports.CLAUDE_HUMAN_ORIGIN_KIND = exports.CLAUDE_SLASH_COMMAND_PREFIX = exports.CLAUDE_THINKING_LABEL = exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH = exports.MAX_CLAUDE_TURN_BLOCKS = exports.CLAUDE_TURN_TRUNCATION_MARKER = exports.MAX_CLAUDE_TURN_BODY_LENGTH = exports.CLAUDE_PROJECTS_DIR_SEGMENTS = void 0;
|
|
60
60
|
exports.claudeProjectSlug = claudeProjectSlug;
|
|
61
61
|
exports.claudeSlashCommandPrompt = claudeSlashCommandPrompt;
|
|
62
|
+
exports.claudePastedContentPrompt = claudePastedContentPrompt;
|
|
62
63
|
exports.readClaudeContentBlock = readClaudeContentBlock;
|
|
63
64
|
exports.readClaudeTranscriptRecord = readClaudeTranscriptRecord;
|
|
64
65
|
exports.parseClaudeTranscript = parseClaudeTranscript;
|
|
@@ -210,6 +211,37 @@ function claudeSlashCommandPrompt(text) {
|
|
|
210
211
|
const args = CLAUDE_COMMAND_ARGS_PATTERN.exec(trimmed)?.[1].trim() ?? '';
|
|
211
212
|
return args.length === 0 ? name : `${name} ${args}`;
|
|
212
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* A paste's wrapper: `<pasted_content id="X">` … `</pasted_content id="X">`.
|
|
216
|
+
*
|
|
217
|
+
* The closing tag repeats the opening tag's id (`\1`), so a pair whose ids
|
|
218
|
+
* differ — or a tag only mentioned in prose — is not a wrapper and is left alone.
|
|
219
|
+
* One newline just inside each tag is the wrapper's own framing, not the body's.
|
|
220
|
+
*/
|
|
221
|
+
const CLAUDE_PASTED_CONTENT_PATTERN = /<pasted_content id="([^"<>\s]+)">\n?([\s\S]*?)\n?<\/pasted_content id="\1">/g;
|
|
222
|
+
/**
|
|
223
|
+
* The text a person sent, with Claude Code's paste wrapper taken off (Issue #3102).
|
|
224
|
+
*
|
|
225
|
+
* Claude Code records a multi-line message that arrived as a paste — which is
|
|
226
|
+
* what CommandMate's tmux send looks like to it — with the body wrapped in
|
|
227
|
+
* `<pasted_content id="X">…</pasted_content id="X">`. `recordUserTurn` compares
|
|
228
|
+
* the transcript's text with the `/send` row (and a relay row) byte for byte, so
|
|
229
|
+
* the wrapper made every such prompt look like a different message and a second
|
|
230
|
+
* `user` row was written. Unwrapping here lets the existing adoption rules match.
|
|
231
|
+
*
|
|
232
|
+
* Every wrapper in the text is replaced by its body, including one inside a
|
|
233
|
+
* sentence the person typed around a paste. When the result is empty the original
|
|
234
|
+
* is returned, so this never turns a record into a blank prompt.
|
|
235
|
+
*
|
|
236
|
+
* @param text - The record's text, as {@link ClaudeTranscriptRecord.text} holds it
|
|
237
|
+
* @returns The text without wrappers, or `text` itself when there is none to remove
|
|
238
|
+
*/
|
|
239
|
+
function claudePastedContentPrompt(text) {
|
|
240
|
+
if (!text.includes('<pasted_content id='))
|
|
241
|
+
return text;
|
|
242
|
+
const unwrapped = text.replace(CLAUDE_PASTED_CONTENT_PATTERN, (_match, _id, body) => body);
|
|
243
|
+
return unwrapped.trim().length === 0 ? text : unwrapped;
|
|
244
|
+
}
|
|
213
245
|
/**
|
|
214
246
|
* Read one `message.content` element.
|
|
215
247
|
*
|
|
@@ -517,7 +549,7 @@ function createClaudeTurn(record, sessionId) {
|
|
|
517
549
|
// A slash command's record is XML and the operator typed a line; #2265 puts
|
|
518
550
|
// the line on the turn so that the `user` row reads `/release v0.30.1` and
|
|
519
551
|
// the `/send` row holding those same bytes is adopted rather than doubled.
|
|
520
|
-
promptText: claudeSlashCommandPrompt(record.text) ?? record.text,
|
|
552
|
+
promptText: claudeSlashCommandPrompt(record.text) ?? claudePastedContentPrompt(record.text),
|
|
521
553
|
promptIsOperatorInput: isClaudeOperatorPromptRecord(record),
|
|
522
554
|
blocks: [],
|
|
523
555
|
assistantRecords: 0,
|
|
@@ -75,6 +75,9 @@ function snapshotFingerprint(payload) {
|
|
|
75
75
|
// client, or the Esc card outlives the panel it dismisses.
|
|
76
76
|
payload.isDismissablePanelActive ?? false,
|
|
77
77
|
payload.isUnclassifiedActive ?? false,
|
|
78
|
+
// Issue #3179: the launch ending is a change the client has to see even
|
|
79
|
+
// when the frame and every flag above are unchanged.
|
|
80
|
+
payload.startingSince ?? null,
|
|
78
81
|
]);
|
|
79
82
|
}
|
|
80
83
|
async function captureFreshPayload(worktreeId, cliToolId, instanceId) {
|
|
@@ -111,6 +114,8 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
|
|
|
111
114
|
isPagerActive: payload.isPagerActive ?? false,
|
|
112
115
|
isDismissablePanelActive: payload.isDismissablePanelActive ?? false,
|
|
113
116
|
isUnclassifiedActive: payload.isUnclassifiedActive ?? false,
|
|
117
|
+
// Issue #3179: so the push and the poll agree on "still starting".
|
|
118
|
+
startingSince: payload.startingSince ?? null,
|
|
114
119
|
version: nextVersion(key),
|
|
115
120
|
});
|
|
116
121
|
}
|
|
@@ -43,6 +43,7 @@ exports.buildAgentLaunchCommandLine = buildAgentLaunchCommandLine;
|
|
|
43
43
|
const sources_1 = require("../../lib/hooks/sources");
|
|
44
44
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
45
45
|
const session_generation_archive_1 = require("../../lib/session/session-generation-archive");
|
|
46
|
+
const session_starting_state_1 = require("../../lib/session/session-starting-state");
|
|
46
47
|
const logger_1 = require("../../lib/logger");
|
|
47
48
|
const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle');
|
|
48
49
|
/**
|
|
@@ -66,6 +67,16 @@ const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle')
|
|
|
66
67
|
* @param at - Epoch ms; defaults to now
|
|
67
68
|
*/
|
|
68
69
|
function beginAgentSession(target, at = Date.now()) {
|
|
70
|
+
// Issue #3179: the launch is in progress from here until
|
|
71
|
+
// `BaseCLITool.startSession` returns or throws (it clears the record in a
|
|
72
|
+
// `finally`). First, so the screen stops reading the about-to-be-created pane
|
|
73
|
+
// as a running agent before anything else here can fail.
|
|
74
|
+
// Issue #3195: the record is written under the token `startSession` is
|
|
75
|
+
// running the launch with (an `AsyncLocalStorage`, read inside
|
|
76
|
+
// `markSessionStarting`), which is how that `finally` knows the record is
|
|
77
|
+
// its own. A second call from the same launch (codex's
|
|
78
|
+
// `relaunchIntoSamePane`) rewrites the same launch's record.
|
|
79
|
+
(0, session_starting_state_1.markSessionStarting)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
69
80
|
const before = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
70
81
|
(0, agent_event_state_1.beginAgentEventGeneration)(target.worktreeId, target.cliToolId, target.instanceId, at);
|
|
71
82
|
const after = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
|
|
@@ -50,8 +50,8 @@ const opencode_executable_1 = require("../../lib/cli-tools/opencode-executable")
|
|
|
50
50
|
exports.MAX_OUTPUT_SIZE = 10 * 1024 * 1024;
|
|
51
51
|
/** Maximum output size stored in DB (100KB) */
|
|
52
52
|
exports.MAX_STORED_OUTPUT_SIZE = 100 * 1024;
|
|
53
|
-
/** Execution timeout in milliseconds (
|
|
54
|
-
exports.EXECUTION_TIMEOUT_MS =
|
|
53
|
+
/** Execution timeout in milliseconds (30 minutes, Issue #3107; was 15) */
|
|
54
|
+
exports.EXECUTION_TIMEOUT_MS = 30 * 60 * 1000;
|
|
55
55
|
/** Maximum message length sent to claude -p */
|
|
56
56
|
exports.MAX_MESSAGE_LENGTH = 10000;
|
|
57
57
|
/** Allowed CLI tool identifiers for scheduled execution [DR2-002] derived from CLI_TOOL_IDS */
|