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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Manages Claude CLI sessions within tmux for each worktree
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.CLAUDE_PROMPT_POLL_INTERVAL = exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_POST_PROMPT_DELAY = exports.CLAUDE_INIT_POLL_INTERVAL = exports.CLAUDE_INIT_TIMEOUT = void 0;
|
|
7
|
+
exports.CLAUDE_PROMPT_POLL_INTERVAL = exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_PROMPT_WAIT_TIMEOUT = exports.CLAUDE_TRUST_DIALOG_EXITED = exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK = exports.CLAUDE_POST_PROMPT_DELAY = exports.CLAUDE_INIT_POLL_INTERVAL = exports.CLAUDE_INIT_TIMEOUT = void 0;
|
|
8
8
|
exports.clearCachedClaudePath = clearCachedClaudePath;
|
|
9
9
|
exports.isSessionHealthy = isSessionHealthy;
|
|
10
10
|
exports.getSessionName = getSessionName;
|
|
@@ -36,6 +36,7 @@ const cmate_cli_tool_parser_1 = require("../../lib/cmate-cli-tool-parser");
|
|
|
36
36
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
37
37
|
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
38
38
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
39
|
+
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
39
40
|
const logger = (0, logger_1.createLogger)('claude-session');
|
|
40
41
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
41
42
|
// ----- Helper Functions -----
|
|
@@ -130,6 +131,122 @@ exports.CLAUDE_INIT_POLL_INTERVAL = 300;
|
|
|
130
131
|
* @see Issue #152 - First message not being sent after session start
|
|
131
132
|
*/
|
|
132
133
|
exports.CLAUDE_POST_PROMPT_DELAY = 500;
|
|
134
|
+
/**
|
|
135
|
+
* Polls (of CLAUDE_INIT_POLL_INTERVAL) a still-open trust dialog is given to
|
|
136
|
+
* close after being answered before it is answered again (Issue #3078). The
|
|
137
|
+
* measured close is ~950 ms (Issue #1637), so 10 polls = 3 s is not a race.
|
|
138
|
+
*/
|
|
139
|
+
const TRUST_DIALOG_REANSWER_POLLS = 10;
|
|
140
|
+
/** Upper bound on trust dialog answers per session start (Issue #3078). */
|
|
141
|
+
const TRUST_DIALOG_MAX_ANSWERS = 3;
|
|
142
|
+
/**
|
|
143
|
+
* Polls a cursor move is given to show up on screen before the next one is
|
|
144
|
+
* sent (Issue #3089). 3 polls = ~900 ms: a TUI that is not taking keys yet
|
|
145
|
+
* swallows the move, and the next one goes in once the screen still shows the
|
|
146
|
+
* cursor off `Yes`.
|
|
147
|
+
*/
|
|
148
|
+
const TRUST_DIALOG_MOVE_SETTLE_POLLS = 3;
|
|
149
|
+
/**
|
|
150
|
+
* Upper bound on single cursor moves per session start (Issue #3089). 20 moves
|
|
151
|
+
* at TRUST_DIALOG_MOVE_SETTLE_POLLS apart is ~18 s of a TUI that will not move its
|
|
152
|
+
* cursor; past that the start fails without ever pressing Enter.
|
|
153
|
+
*/
|
|
154
|
+
const TRUST_DIALOG_MAX_MOVES = 20;
|
|
155
|
+
/** Reported when the cursor never reached `Yes` (Issue #3089). A fixed string, never captured output. */
|
|
156
|
+
exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK = 'trust dialog: cursor did not reach "Yes, I trust this folder"';
|
|
157
|
+
/** Reported when Claude Code quit from the trust dialog (Issue #3089). A fixed string, never captured output. */
|
|
158
|
+
exports.CLAUDE_TRUST_DIALOG_EXITED = 'trust dialog: Claude Code exited to the shell';
|
|
159
|
+
/**
|
|
160
|
+
* One poll's answer to the folder-trust dialog (Issue #201 / #3078 / #3089).
|
|
161
|
+
*
|
|
162
|
+
* Enter confirms whichever option the cursor is on, and since 2.1.259 that is
|
|
163
|
+
* `No, exit` by default (which quits Claude Code). So Enter is sent only when
|
|
164
|
+
* THIS screen shows the cursor on `Yes, I trust this folder`. Otherwise one
|
|
165
|
+
* move key goes in, and the screen is read again on a later poll: sending
|
|
166
|
+
* `Down Enter` together lost the `Down` to a TUI that was not taking keys yet
|
|
167
|
+
* and confirmed `No, exit` (Issue #3089). Both are bounded: Enter is repeated
|
|
168
|
+
* TRUST_DIALOG_REANSWER_POLLS apart up to TRUST_DIALOG_MAX_ANSWERS times for a
|
|
169
|
+
* dialog that outlives it, and a cursor that has not reached Yes after
|
|
170
|
+
* TRUST_DIALOG_MAX_MOVES moves fails the start without Enter.
|
|
171
|
+
*
|
|
172
|
+
* @param sessionName - tmux session name
|
|
173
|
+
* @param dialogScreen - ANSI-stripped pane output when the dialog is open, else null
|
|
174
|
+
* @param state - Mutated in place
|
|
175
|
+
* @throws {SessionStartFailedError} When the move budget is spent
|
|
176
|
+
*/
|
|
177
|
+
async function answerTrustDialog(sessionName, dialogScreen, state) {
|
|
178
|
+
if (state.pollsSinceAnswer !== null)
|
|
179
|
+
state.pollsSinceAnswer++;
|
|
180
|
+
if (state.pollsSinceMove !== null)
|
|
181
|
+
state.pollsSinceMove++;
|
|
182
|
+
if (dialogScreen === null)
|
|
183
|
+
return;
|
|
184
|
+
if (!state.seen) {
|
|
185
|
+
state.seen = true;
|
|
186
|
+
state.shellTellsExit = await paneCommandIsAgent(sessionName);
|
|
187
|
+
}
|
|
188
|
+
const keys = (0, cli_patterns_1.resolveClaudeTrustDialogKeys)(dialogScreen);
|
|
189
|
+
if (keys === null)
|
|
190
|
+
return;
|
|
191
|
+
if (keys.length === 1) {
|
|
192
|
+
// Cursor on Yes, on this very screen: the Issue #201 Enter.
|
|
193
|
+
const due = state.pollsSinceAnswer === null ||
|
|
194
|
+
(state.pollsSinceAnswer >= TRUST_DIALOG_REANSWER_POLLS && state.answers < TRUST_DIALOG_MAX_ANSWERS);
|
|
195
|
+
if (!due)
|
|
196
|
+
return;
|
|
197
|
+
try {
|
|
198
|
+
await (0, tmux_1.sendKeys)(sessionName, '', true);
|
|
199
|
+
state.pollsSinceAnswer = 0;
|
|
200
|
+
state.answers++;
|
|
201
|
+
logger.info('trust-dialog-detected', { keys: 'Enter', attempt: state.answers });
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Left unhandled so a later poll answers the dialog again
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Cursor off Yes: one move, then look again before anything else.
|
|
209
|
+
if (state.pollsSinceMove !== null && state.pollsSinceMove < TRUST_DIALOG_MOVE_SETTLE_POLLS)
|
|
210
|
+
return;
|
|
211
|
+
if (state.moves >= TRUST_DIALOG_MAX_MOVES) {
|
|
212
|
+
throw new session_start_error_1.SessionStartFailedError('Claude Code', sessionName, exports.CLAUDE_TRUST_DIALOG_CURSOR_STUCK);
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, [keys[0]]);
|
|
216
|
+
state.pollsSinceMove = 0;
|
|
217
|
+
state.moves++;
|
|
218
|
+
logger.info('trust-dialog-cursor-move', { key: keys[0], attempt: state.moves });
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Left unhandled so a later poll moves the cursor again
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Whether the pane's foreground process is a shell again (Issue #3089). A
|
|
226
|
+
* pane tmux cannot describe is not called exited; the start budget still
|
|
227
|
+
* bounds that case. Only asked when {@link TrustDialogState.shellTellsExit}.
|
|
228
|
+
*
|
|
229
|
+
* @param sessionName - tmux session name
|
|
230
|
+
*/
|
|
231
|
+
async function hasReturnedToShell(sessionName) {
|
|
232
|
+
const command = await readPaneCommand(sessionName);
|
|
233
|
+
return command !== null && (0, cli_patterns_1.isShellPaneCommand)(command);
|
|
234
|
+
}
|
|
235
|
+
/** Whether the pane's foreground command is known and is not a shell (Issue #3089). */
|
|
236
|
+
async function paneCommandIsAgent(sessionName) {
|
|
237
|
+
const command = await readPaneCommand(sessionName);
|
|
238
|
+
return command !== null && !(0, cli_patterns_1.isShellPaneCommand)(command);
|
|
239
|
+
}
|
|
240
|
+
/** `#{pane_current_command}`, or null when it cannot be read. */
|
|
241
|
+
async function readPaneCommand(sessionName) {
|
|
242
|
+
try {
|
|
243
|
+
const command = await (0, tmux_1.getPaneCurrentCommand)(sessionName);
|
|
244
|
+
return typeof command === 'string' ? command : null;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
133
250
|
/**
|
|
134
251
|
* Prompt wait timeout before message send (milliseconds)
|
|
135
252
|
*
|
|
@@ -313,6 +430,11 @@ function findSessionErrorPattern(cleanOutput) {
|
|
|
313
430
|
* reading as a zsh prompt. What changed is that six other tools can now be
|
|
314
431
|
* asked the same question; see `lib/cli-tools/liveness-spec`.
|
|
315
432
|
*
|
|
433
|
+
* Issue #3191: a `user@host …` prompt of 40 characters or more is now read as
|
|
434
|
+
* the shell too (claude's spec takes `SHELL_PROMPT_LINE_PATTERNS`), so a claude
|
|
435
|
+
* that was `/exit`ed into a long zsh / bash prompt is reported unhealthy and
|
|
436
|
+
* relaunched instead of timing out the next send.
|
|
437
|
+
*
|
|
316
438
|
* @param sessionName - tmux session name
|
|
317
439
|
* @returns HealthCheckResult with healthy status and optional reason
|
|
318
440
|
*/
|
|
@@ -558,14 +680,15 @@ async function startClaudeSession(options) {
|
|
|
558
680
|
// and the operator's `~/.claude/settings.json` (measured on 2.1.278).
|
|
559
681
|
const launchCommand = model === undefined ? baseLaunchCommand : `${baseLaunchCommand} --model ${(0, hook_settings_generator_1.shellQuote)(model)}`;
|
|
560
682
|
// Start Claude CLI in interactive mode using dynamically resolved path
|
|
561
|
-
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
683
|
+
await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
|
|
562
684
|
// Wait for Claude to initialize with dynamic detection (OCP-001)
|
|
563
685
|
// Use constants instead of hardcoded values
|
|
564
686
|
const maxWaitTime = exports.CLAUDE_INIT_TIMEOUT;
|
|
565
687
|
const pollInterval = exports.CLAUDE_INIT_POLL_INTERVAL;
|
|
566
688
|
const startTime = Date.now();
|
|
567
689
|
let initialized = false;
|
|
568
|
-
|
|
690
|
+
// Issue #3078 / #3089: the trust dialog's progress this start.
|
|
691
|
+
const trust = { pollsSinceAnswer: null, pollsSinceMove: null, answers: 0, moves: 0, seen: false, shellTellsExit: false };
|
|
569
692
|
while (Date.now() - startTime < maxWaitTime) {
|
|
570
693
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
571
694
|
// SF-001: Use getCleanPaneOutput helper (DRY)
|
|
@@ -579,28 +702,27 @@ async function startClaudeSession(options) {
|
|
|
579
702
|
if (cleanOutput === null) {
|
|
580
703
|
continue;
|
|
581
704
|
}
|
|
705
|
+
// Issue #201 / #3078 / #3089: answer the folder-trust dialog. Checked
|
|
706
|
+
// BEFORE the prompt: the dialog's cursor row (`❯ No, exit`) wears the
|
|
707
|
+
// prompt glyph, so an open dialog is never read as a ready prompt.
|
|
708
|
+
const trustDialogOpen = (0, cli_patterns_1.isClaudeTrustDialogOpen)(cleanOutput);
|
|
709
|
+
await answerTrustDialog(sessionName, trustDialogOpen ? cleanOutput : null, trust);
|
|
582
710
|
// Claude is ready when we see the prompt (DRY-001)
|
|
583
711
|
// Use CLAUDE_PROMPT_PATTERN from cli-patterns.ts for consistency
|
|
584
712
|
// Note: CLAUDE_SEPARATOR_PATTERN was removed from initialization check (Issue #187, P1-1)
|
|
585
|
-
if (cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
|
|
713
|
+
if (!trustDialogOpen && cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
|
|
586
714
|
// Wait for stability after prompt detection (CONS-007, DOC-001)
|
|
587
715
|
await new Promise((resolve) => setTimeout(resolve, exports.CLAUDE_POST_PROMPT_DELAY));
|
|
588
716
|
logger.info('claude-initialized-in');
|
|
589
717
|
initialized = true;
|
|
590
718
|
break;
|
|
591
719
|
}
|
|
592
|
-
// Issue #
|
|
593
|
-
//
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
logger.info('trust-dialog-detected');
|
|
599
|
-
}
|
|
600
|
-
catch {
|
|
601
|
-
// Left unhandled so the next poll answers the dialog again
|
|
602
|
-
}
|
|
603
|
-
// Continue polling to wait for prompt detection
|
|
720
|
+
// Issue #3089: the dialog is gone and no prompt came up. If the pane is
|
|
721
|
+
// back at its shell, Claude Code quit (an Enter that landed on
|
|
722
|
+
// `No, exit`); nothing will ever draw a prompt, so fail now instead of
|
|
723
|
+
// spending the rest of the budget (and answering the shell).
|
|
724
|
+
if (!trustDialogOpen && trust.shellTellsExit && (await hasReturnedToShell(sessionName))) {
|
|
725
|
+
throw new session_start_error_1.SessionStartFailedError('Claude Code', sessionName, exports.CLAUDE_TRUST_DIALOG_EXITED);
|
|
604
726
|
}
|
|
605
727
|
// Issue #1637: fail fast on a start that cannot succeed. The budget is
|
|
606
728
|
// 60s of patience for a *slow* start; a session already showing a
|
|
@@ -55,6 +55,7 @@ const db_1 = require("../../lib/db");
|
|
|
55
55
|
// when this instance was last handed a prompt.
|
|
56
56
|
const chat_db_1 = require("../../lib/db/chat-db");
|
|
57
57
|
const unclassified_frame_tracker_1 = require("../../lib/detection/unclassified-frame-tracker");
|
|
58
|
+
const session_starting_state_1 = require("../../lib/session/session-starting-state");
|
|
58
59
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
59
60
|
const upstream_faults_1 = require("../../lib/detection/upstream-faults");
|
|
60
61
|
const opencode_pane_obstruction_1 = require("../../lib/detection/opencode-pane-obstruction");
|
|
@@ -608,7 +609,8 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId, resolut
|
|
|
608
609
|
// surface is actually being watched at, which is exactly the property the
|
|
609
610
|
// terminal snapshot already has. Gated on the merged verdict (`'running'`, not
|
|
610
611
|
// the tmux-session-exists `isRunning`) so an idle pane reads no transcript.
|
|
611
|
-
|
|
612
|
+
// Issue #3179: not during a launch — there is no turn to publish yet.
|
|
613
|
+
if (payload.isRunning && payload.sessionStatus === 'running' && payload.startingSince == null) {
|
|
612
614
|
// Issue #2248 made this an `await`, and it buys less than it looks like: the
|
|
613
615
|
// expensive half — the transcript read and the broadcast — is detached
|
|
614
616
|
// inside, so what is waited for is a worktree row and a Map lookup. What it
|
|
@@ -750,6 +752,10 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
750
752
|
(0, status_evidence_1.forgetLastKnownStatus)((0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
|
|
751
753
|
return {
|
|
752
754
|
isRunning: false,
|
|
755
|
+
// Issue #3179: `beginAgentSession` runs before the pane is created, so a
|
|
756
|
+
// launch can be in progress with no tmux session yet. Read-only here —
|
|
757
|
+
// there is no frame to judge a dialog on.
|
|
758
|
+
startingSince: (0, session_starting_state_1.getSessionStartingSince)(worktreeId, cliToolId, instanceId),
|
|
753
759
|
sessionName,
|
|
754
760
|
content: '',
|
|
755
761
|
lineCount: 0,
|
|
@@ -828,7 +834,17 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
828
834
|
const compositeKey = (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
829
835
|
const lastServerResponseTimestamp = (0, auto_yes_manager_1.getLastServerResponseTimestamp)(compositeKey);
|
|
830
836
|
const lastOutputTimestamp = lastServerResponseTimestamp ? new Date(lastServerResponseTimestamp) : undefined;
|
|
831
|
-
const
|
|
837
|
+
const rawStatusResult = (0, status_detector_1.detectSessionStatus)(output, cliToolId, lastOutputTimestamp);
|
|
838
|
+
// Issue #3179: a launch in progress. The frame is a shell prompt and the
|
|
839
|
+
// launch line, or a dialog the launch is about to answer, and none of the
|
|
840
|
+
// flags below may be read off it: the floor verdict raised the Navigate pad,
|
|
841
|
+
// the trust dialog raised the selection list / prompt sheet. A dialog that
|
|
842
|
+
// outstays the launch's own answer releases the record (a login, an unknown
|
|
843
|
+
// dialog), and from then on this is the ordinary verdict again.
|
|
844
|
+
const startingSince = (0, session_starting_state_1.observeSessionStartingFrame)(worktreeId, cliToolId, instanceId, rawStatusResult.status === 'waiting' || rawStatusResult.hasActivePrompt);
|
|
845
|
+
const statusResult = startingSince === null
|
|
846
|
+
? rawStatusResult
|
|
847
|
+
: (0, session_starting_state_1.startingStatusResult)(rawStatusResult);
|
|
832
848
|
// Issue #1912: every `running` reason that means "the agent is producing
|
|
833
849
|
// output", not just `thinking_indicator`. opencode answers
|
|
834
850
|
// `opencode_processing_indicator` for its `esc interrupt` footer, which is
|
|
@@ -946,7 +962,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
946
962
|
// the guard cannot disagree about whether a prompt is open. What they are
|
|
947
963
|
// still allowed to differ on is what to DO about it — see `blocksSend`, which
|
|
948
964
|
// bounds the structured layer's veto over sends and leaves this flag alone.
|
|
949
|
-
|
|
965
|
+
// Issue #3179: not while a launch is in progress. The scraper half is already
|
|
966
|
+
// neutralised above; this also drops a structured wait the launch inherited.
|
|
967
|
+
const isPromptWaiting = startingSince === null && promptResolution.waiting;
|
|
950
968
|
// Issue #1726: the agent's own account of what it asked. It contributes only
|
|
951
969
|
// where some other layer has already established that a dialog is on screen —
|
|
952
970
|
// this record decides no status of its own, because Claude emits nothing at
|
|
@@ -1033,13 +1051,15 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1033
1051
|
// instead of by coincidence.)
|
|
1034
1052
|
patterns: decisionOptions !== null ? promptWaiting.patterns : null,
|
|
1035
1053
|
};
|
|
1036
|
-
const promptData =
|
|
1037
|
-
?
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
:
|
|
1054
|
+
const promptData = startingSince !== null
|
|
1055
|
+
? null
|
|
1056
|
+
: scraperPromptWaiting
|
|
1057
|
+
? correctedPromptData ??
|
|
1058
|
+
scraperPromptData ??
|
|
1059
|
+
(structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts) : null)
|
|
1060
|
+
: structuredFacts
|
|
1061
|
+
? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts)
|
|
1062
|
+
: null;
|
|
1043
1063
|
// Issue #2870: whether `/prompt-response` would answer the prompt published
|
|
1044
1064
|
// above, read by the SAME function it re-verifies with. In #2868 `promptData`
|
|
1045
1065
|
// came off the generic parser alone, the route refused it, and the UI's Send
|
|
@@ -1111,7 +1131,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1111
1131
|
// and the 60 seconds — start afresh if the frame is still unreadable once the
|
|
1112
1132
|
// decision is gone (answered, expired, or the source dropped).
|
|
1113
1133
|
const answerableOverAgentApi = (0, structured_prompt_1.hasApiAnswerableDecision)(eventSource.capabilities.eventIdentity, structuredEvents.pendingDecisions ?? []);
|
|
1114
|
-
|
|
1134
|
+
// Issue #3179: a launch in progress is not a detection failure — its frame is
|
|
1135
|
+
// the shell and the launch line — so no row, and the run starts afresh after.
|
|
1136
|
+
const unclassifiedVerdict = (0, unclassified_frame_tracker_1.observeUnclassifiedFrame)(compositeKey, merged.isUnclassifiedActive && !answerableOverAgentApi && startingSince === null);
|
|
1115
1137
|
if (unclassifiedVerdict.shouldRecord) {
|
|
1116
1138
|
recordUnclassifiedFrame(db, {
|
|
1117
1139
|
worktreeId,
|
|
@@ -1197,29 +1219,34 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1197
1219
|
// `sessionStatus` it sat next to one poll earlier. Observed before it is read
|
|
1198
1220
|
// so a positive poll reports itself, which is what keeps the field from
|
|
1199
1221
|
// looking stale on a healthy session.
|
|
1222
|
+
// Issue #3179: the structured layer cannot override a launch in progress
|
|
1223
|
+
// either — a `waiting` it inherited would put the answer sheet back.
|
|
1224
|
+
const published = startingSince === null
|
|
1225
|
+
? merged
|
|
1226
|
+
: { ...merged, status: 'running', reason: status_detector_1.STATUS_REASON.STARTING, thinking: false };
|
|
1200
1227
|
(0, status_evidence_1.observeStatusEvidence)(compositeKey, {
|
|
1201
|
-
status:
|
|
1202
|
-
reason:
|
|
1203
|
-
evidence:
|
|
1228
|
+
status: published.status,
|
|
1229
|
+
reason: published.reason,
|
|
1230
|
+
evidence: published.evidence,
|
|
1204
1231
|
});
|
|
1205
1232
|
const lastKnown = (0, status_evidence_1.getLastKnownStatus)(compositeKey);
|
|
1206
1233
|
return {
|
|
1207
1234
|
isRunning: true,
|
|
1208
1235
|
sessionName,
|
|
1209
1236
|
cliToolId,
|
|
1210
|
-
sessionStatus:
|
|
1211
|
-
sessionStatusReason:
|
|
1237
|
+
sessionStatus: published.status,
|
|
1238
|
+
sessionStatusReason: published.reason,
|
|
1212
1239
|
content: newContent,
|
|
1213
1240
|
fullOutput: output,
|
|
1214
1241
|
realtimeSnippet,
|
|
1215
1242
|
lineCount: totalLines,
|
|
1216
1243
|
lastCapturedLine,
|
|
1217
1244
|
isComplete: isPromptWaiting,
|
|
1218
|
-
isGenerating:
|
|
1219
|
-
thinking:
|
|
1245
|
+
isGenerating: published.thinking,
|
|
1246
|
+
thinking: published.thinking,
|
|
1220
1247
|
// Issue #2607: named after the tool actually running. A fixed "Claude" was
|
|
1221
1248
|
// published for every agent, and `capture --json` readers took it at its word.
|
|
1222
|
-
thinkingMessage:
|
|
1249
|
+
thinkingMessage: published.thinking ? `${(0, types_2.getCliToolDisplayName)(cliToolId)} is thinking...` : null,
|
|
1223
1250
|
isPromptWaiting,
|
|
1224
1251
|
promptData,
|
|
1225
1252
|
...(promptAnswerable !== undefined ? { promptAnswerable } : {}),
|
|
@@ -1235,11 +1262,12 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
1235
1262
|
isSelectionListActive,
|
|
1236
1263
|
isPagerActive,
|
|
1237
1264
|
isDismissablePanelActive,
|
|
1238
|
-
isUnclassifiedActive: merged.isUnclassifiedActive,
|
|
1265
|
+
isUnclassifiedActive: startingSince === null && merged.isUnclassifiedActive,
|
|
1266
|
+
startingSince,
|
|
1239
1267
|
// Issue #1926: the same fact `isUnclassifiedActive` carries, named the way
|
|
1240
1268
|
// §4 D1 names it. Published from the merged verdict so the two cannot
|
|
1241
1269
|
// disagree on the wire.
|
|
1242
|
-
statusEvidence:
|
|
1270
|
+
statusEvidence: published.evidence,
|
|
1243
1271
|
lastKnownStatus: lastKnown?.status ?? null,
|
|
1244
1272
|
lastKnownStatusAt: lastKnown?.at ?? null,
|
|
1245
1273
|
lastServerResponseTimestamp,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Keep the launch line off the pane (Issue #3180).
|
|
4
|
+
*
|
|
5
|
+
* Every `startSession` types its launch line into the pane's login shell —
|
|
6
|
+
* `CM_HOOK_URL='…' CM_PERMISSION_HOOK_URL='…' CM_PORT='3000' 'agy'` — and the
|
|
7
|
+
* shell echoes it. A tool that repaints the whole screen hides the echo once it
|
|
8
|
+
* draws; agy and codex draw inline, so the line, with its internal URL, port
|
|
9
|
+
* and worktree ID, stayed in the scrollback for the life of the session.
|
|
10
|
+
*
|
|
11
|
+
* `clear` runs in the same shell, before the agent, so the echo is wiped before
|
|
12
|
+
* the agent paints. The shell stays the agent's parent exactly as before, which
|
|
13
|
+
* is what keeps exit detection (`judgeToolLiveness`, `relaunchIfToolExited`)
|
|
14
|
+
* unchanged: when the agent quits, the pane falls back to the same shell prompt.
|
|
15
|
+
*
|
|
16
|
+
* `clear` alone only empties the visible screen. tmux 3.4+ defaults to
|
|
17
|
+
* `scroll-on-clear on`, which moves what `clear` wiped INTO the scrollback, and
|
|
18
|
+
* CommandMate's capture reads the scrollback: in the 2026-10-04 UAT (tmux 3.5a)
|
|
19
|
+
* codex, antigravity, Command Code and gemini still had the launch line twice in
|
|
20
|
+
* `tmux capture-pane -p -J -S -` (two `CM_HOOK_URL` hits), and it surfaced in the
|
|
21
|
+
* UI terminal and in codex's trust-dialog sheet. So `printf '\033[3J'` follows
|
|
22
|
+
* `clear`: ESC [3J (Erase Saved Lines) drops the scrollback, the echo included.
|
|
23
|
+
* `tmux clear-history` would also work but depends on the pane having a tmux
|
|
24
|
+
* binary and `TMUX` set, so it is not used. `printf` is a builtin in zsh, bash,
|
|
25
|
+
* dash and fish, and each reads `\033` in the format as octal ESC; the single
|
|
26
|
+
* quotes keep the backslash for printf in all of them.
|
|
27
|
+
*
|
|
28
|
+
* Joined with `;`, not `&&`, and with `clear`'s stderr dropped: a pane whose
|
|
29
|
+
* `clear` is missing or fails (unknown `TERM`, no ncurses), or whose `printf`
|
|
30
|
+
* fails, must still start the agent — a launch line left on screen is a
|
|
31
|
+
* cosmetic leak, a session that never starts is not — and must not print the
|
|
32
|
+
* failure in the line's place.
|
|
33
|
+
*
|
|
34
|
+
* Applied at the `sendKeys` call site, AFTER any flags a tool appends
|
|
35
|
+
* (`--model`, `-s <id>`, Command Code's launch flags): `buildAgentLaunchCommandLine`
|
|
36
|
+
* stays `NAME='value' … command`, and an appended flag lands on the agent, not
|
|
37
|
+
* on `clear`.
|
|
38
|
+
*
|
|
39
|
+
* Deliberately not in a module the session suites mock wholesale
|
|
40
|
+
* (`agent-session-lifecycle`, `tmux`), so those suites see the real prefix.
|
|
41
|
+
*
|
|
42
|
+
* @module lib/session/launch-screen
|
|
43
|
+
*/
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.LAUNCH_SCREEN_CLEAR_PREFIX = void 0;
|
|
46
|
+
exports.withLaunchScreenCleared = withLaunchScreenCleared;
|
|
47
|
+
/** The prefix every launch line is typed with. */
|
|
48
|
+
exports.LAUNCH_SCREEN_CLEAR_PREFIX = "clear 2>/dev/null; printf '\\033[3J'; ";
|
|
49
|
+
/**
|
|
50
|
+
* The line to type into the pane: clear the screen and the scrollback, then launch.
|
|
51
|
+
*
|
|
52
|
+
* @param launchCommand - The rendered launch line, flags included
|
|
53
|
+
* @returns `clear 2>/dev/null; printf '\033[3J'; <launchCommand>`
|
|
54
|
+
*/
|
|
55
|
+
function withLaunchScreenCleared(launchCommand) {
|
|
56
|
+
return `${exports.LAUNCH_SCREEN_CLEAR_PREFIX}${launchCommand}`;
|
|
57
|
+
}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.SessionStartUnavailableError = exports.SessionStartFailedError = exports.SessionStartTimeoutError = exports.SESSION_START_UNAVAILABLE_CODE = exports.SESSION_START_FAILED_CODE = exports.SESSION_STARTING_CODE = void 0;
|
|
33
|
+
exports.buildSessionExitedToShellMessage = buildSessionExitedToShellMessage;
|
|
33
34
|
exports.isSessionStartTimeoutError = isSessionStartTimeoutError;
|
|
34
35
|
exports.isSafeSessionStartError = isSafeSessionStartError;
|
|
35
36
|
exports.isSessionStartUnavailableError = isSessionStartUnavailableError;
|
|
@@ -81,6 +82,25 @@ class SessionStartTimeoutError extends Error {
|
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
exports.SessionStartTimeoutError = SessionStartTimeoutError;
|
|
85
|
+
/**
|
|
86
|
+
* The message for a start timeout whose pane is back at a shell (Issue #3093).
|
|
87
|
+
*
|
|
88
|
+
* {@link SessionStartTimeoutError} says "the process is still running, so this
|
|
89
|
+
* is a slow start … nothing needs repairing" — true for a slow cold start, and
|
|
90
|
+
* exactly wrong when the agent quit during startup (e.g. a trust dialog that
|
|
91
|
+
* was answered with "No, exit"): the reader was told to wait for a process that
|
|
92
|
+
* no longer exists. Built from the tool's display name and the session name
|
|
93
|
+
* only, for the same SEC-SF-002 reason as the classes in this module.
|
|
94
|
+
*
|
|
95
|
+
* @param toolName - Display name of the CLI tool (e.g. `Claude Code`)
|
|
96
|
+
* @param sessionName - tmux session whose pane is back at a shell
|
|
97
|
+
*/
|
|
98
|
+
function buildSessionExitedToShellMessage(toolName, sessionName) {
|
|
99
|
+
return (`${toolName} exited before reaching its input prompt: the tmux session '${sessionName}' ` +
|
|
100
|
+
'is back at a shell, so this is not a slow start and waiting will not help. The message ' +
|
|
101
|
+
'was not delivered. Run `commandmate capture <worktree-id>` to see why it exited (for ' +
|
|
102
|
+
'example a startup dialog answered with exit, or a missing login), fix that, then send again.');
|
|
103
|
+
}
|
|
84
104
|
/**
|
|
85
105
|
* The CLI tool printed an error that startup cannot recover from.
|
|
86
106
|
*
|