commandmate 0.29.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +468 -417
- package/.next/app-path-routes-manifest.json +30 -23
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +25 -8
- package/.next/server/app/_not-found/page.js.nft.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 +2 -0
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agents/versions/route.js +1 -0
- package/.next/server/app/api/agents/versions/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +18 -18
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +19 -19
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.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 +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 +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 +1 -7
- 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 +1 -7
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +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 +2 -2
- 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 +7 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.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 +7 -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/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.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/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.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 +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 -0
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route.js +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidebar/group-order/route.js +1 -7
- 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 +2 -2
- 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 +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 +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 +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 +2 -2
- 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 +2 -2
- 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/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.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 +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 +1 -0
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/{start-polling → cli-reference}/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.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 +2 -2
- 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 -2
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +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 +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 +2 -2
- 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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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/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 +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 +2 -2
- 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 +3 -3
- 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 +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 +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 +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 +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 +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 +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 +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- 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 -7
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.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 +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 +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.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 +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 +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 +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -0
- 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 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.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 +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 +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 +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.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.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +12 -12
- 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 +3 -3
- 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 +30 -23
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1191.js +1 -1
- package/.next/server/chunks/1341.js +1 -0
- package/.next/server/chunks/1501.js +5 -0
- package/.next/server/chunks/1886.js +3 -4
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -0
- package/.next/server/chunks/2739.js +1 -0
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/2827.js +29 -0
- package/.next/server/chunks/3123.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3707.js +15 -0
- package/.next/server/chunks/3722.js +25 -1
- package/.next/server/chunks/3869.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4325.js +1 -0
- package/.next/server/chunks/4390.js +1 -0
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +6 -0
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5120.js +1 -0
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6337.js +1 -1
- package/.next/server/chunks/663.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6894.js +8 -0
- package/.next/server/chunks/7366.js +5 -0
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7824.js +1 -1
- package/.next/server/chunks/7836.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8118.js +1 -0
- package/.next/server/chunks/8356.js +1 -1
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/880.js +3 -3
- package/.next/server/chunks/8800.js +3 -0
- package/.next/server/chunks/8807.js +1 -1
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/9627.js +71 -43
- package/.next/server/chunks/9696.js +3 -0
- package/.next/server/chunks/9798.js +1 -1
- 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 +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/7K0XXFu_ty4wRSkl4X21E/_buildManifest.js +1 -0
- package/.next/static/chunks/{2053-c0e931eb4391baa1.js → 2053-3f299a7a2c7d6767.js} +1 -1
- package/.next/static/chunks/{3968-8d8ca15657748bfb.js → 3916-0e929d089282dc5d.js} +1 -1
- package/.next/static/chunks/3922.9c1ec01fff819c88.js +1 -0
- package/.next/static/chunks/5229-6c89475b61bd2c8b.js +1 -0
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +1 -0
- package/.next/static/chunks/6381-28d0e95620aa018e.js +1 -0
- package/.next/static/chunks/8019-f8e73c1fb5f6f0d3.js +1 -0
- package/.next/static/chunks/{1188-8567ee5ecfef02ee.js → 8593-fa0eb2802e0ce68a.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/templates/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/chat/{page-231df45127e876c2.js → page-9aa2011410895b0d.js} +1 -1
- package/.next/static/chunks/app/login/{page-03659dded846ef1d.js → page-af7241bb4c4a8e59.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/more/page-333bba1c8bbc9c11.js +1 -0
- package/.next/static/chunks/app/{page-0305431f43195431.js → page-214f7ffa13a0cf10.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/repositories/{page-ae8fa55749976f79.js → page-4951cac905e50224.js} +1 -1
- package/.next/static/chunks/app/review/page-a0899b2d285318c3.js +1 -0
- package/.next/static/chunks/app/sessions/page-fb36145ec732092a.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-aaf0bcb1dfb558b9.js → page-9099e26b60442873.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-dafc486410e839b7.js → page-182e32368696d824.js} +1 -1
- package/.next/static/chunks/app/skills/{page-9e3c91da31514893.js → page-d3fdc88239ebe0ab.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-90f96977c741bbf8.js → page-f3361237420719b4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-d48b95ed554bcd13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-2631bc5c4b0a9fb8.js +1 -0
- package/.next/static/chunks/{webpack-7e79064bfce988d7.js → webpack-9f75198882fdaf08.js} +1 -1
- package/.next/static/css/61e10d4b1b11b193.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/agents/update/route.ts +347 -0
- package/.next/types/app/api/agents/versions/route.ts +347 -0
- package/.next/types/app/api/settings/default-agents/route.ts +347 -0
- package/.next/types/app/api/settings/default-surface-mode/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/{start-polling → cli-reference}/route.ts +3 -3
- package/.next/types/app/api/worktrees/[id]/verify/config/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.ts +347 -0
- package/.next/types/app/api/worktrees/apply-default-agents/route.ts +347 -0
- package/.next/types/routes.d.ts +9 -2
- package/.next/types/validator.ts +72 -9
- package/dist/cli/commands/agents.d.ts +35 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +212 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +18 -0
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +111 -0
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +11 -0
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +30 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +58 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +8 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/preflight.d.ts.map +1 -1
- package/dist/cli/utils/preflight.js +6 -0
- package/dist/config/system-directories.d.ts +101 -0
- package/dist/config/system-directories.d.ts.map +1 -0
- package/dist/config/system-directories.js +211 -0
- package/dist/lib/cli-tools/types.d.ts +15 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +92 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -0
- package/dist/lib/detection/status-reason.js +94 -0
- package/dist/lib/updates/agent-updater.d.ts +247 -0
- package/dist/lib/updates/agent-updater.d.ts.map +1 -0
- package/dist/lib/updates/agent-updater.js +373 -0
- package/dist/lib/updates/agent-versions.d.ts +77 -0
- package/dist/lib/updates/agent-versions.d.ts.map +1 -0
- package/dist/lib/updates/agent-versions.js +138 -0
- package/dist/lib/updates/codex-version.d.ts +184 -0
- package/dist/lib/updates/codex-version.d.ts.map +1 -0
- package/dist/lib/updates/codex-version.js +215 -0
- package/dist/lib/verification/verify-config.d.ts +202 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -0
- package/dist/lib/verification/verify-config.js +429 -0
- package/dist/lib/verification/verify-draft.d.ts +182 -0
- package/dist/lib/verification/verify-draft.d.ts.map +1 -0
- package/dist/lib/verification/verify-draft.js +570 -0
- package/dist/server/server.js +58 -0
- package/dist/server/src/cli/types/api-responses.js +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +15 -1
- package/dist/server/src/config/codex-update-dialog-config.js +154 -0
- package/dist/server/src/config/default-agents.js +138 -0
- package/dist/server/src/lib/claude-output.js +1 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +36 -12
- package/dist/server/src/lib/cli-tools/base.js +131 -0
- package/dist/server/src/lib/cli-tools/codex.js +350 -100
- package/dist/server/src/lib/cli-tools/copilot.js +34 -10
- package/dist/server/src/lib/cli-tools/gemini.js +34 -10
- package/dist/server/src/lib/cli-tools/liveness-spec.js +214 -0
- package/dist/server/src/lib/cli-tools/opencode.js +72 -19
- package/dist/server/src/lib/cli-tools/session-liveness.js +64 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +30 -10
- package/dist/server/src/lib/db/app-settings-db.js +202 -0
- package/dist/server/src/lib/db/chat-db.js +120 -7
- package/dist/server/src/lib/db/worktree-db.js +178 -3
- package/dist/server/src/lib/detection/status-detector.js +3 -2
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +233 -0
- package/dist/server/src/lib/detection/version-probes.js +290 -0
- package/dist/server/src/lib/env.js +122 -0
- package/dist/server/src/lib/git/worktrees.js +164 -0
- package/dist/server/src/lib/history/transcript-tail.js +80 -0
- package/dist/server/src/lib/history/user-turn-recorder.js +247 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +85 -1
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +519 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +7 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +407 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +654 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +518 -0
- package/dist/server/src/lib/hooks/sources/codex/history.js +576 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +448 -0
- package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +3 -0
- package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +10 -28
- package/dist/server/src/lib/hooks/sources/turn-body.js +118 -0
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -4
- package/dist/server/src/lib/polling/response-checker.js +44 -3
- package/dist/server/src/lib/polling/response-dedup.js +2 -4
- package/dist/server/src/lib/polling/response-poller-core.js +191 -29
- package/dist/server/src/lib/polling/structured-history-gate.js +147 -16
- package/dist/server/src/lib/push/push-sender.js +21 -1
- package/dist/server/src/lib/push/waiting-push-notifier.js +126 -8
- package/dist/server/src/lib/realtime/publisher-registry.js +171 -0
- package/dist/server/src/lib/realtime/terminal-broadcast.js +14 -1
- package/dist/server/src/lib/realtime/types.js +96 -1
- package/dist/server/src/lib/repo-config/agents-config.js +298 -0
- package/dist/server/src/lib/selected-agents-validator.js +93 -23
- package/dist/server/src/lib/session/claude-session.js +39 -108
- package/dist/server/src/lib/session/current-output-builder.js +263 -4
- package/dist/server/src/lib/session/send-user-message.js +90 -2
- package/dist/server/src/lib/tmux/tmux.js +29 -0
- package/dist/server/src/lib/tui-accumulator.js +2 -8
- package/dist/server/src/lib/updates/agent-updater.js +373 -0
- package/dist/server/src/lib/updates/agent-versions.js +138 -0
- package/dist/server/src/lib/updates/codex-version.js +215 -0
- package/dist/server/src/lib/updates/index.js +42 -0
- package/dist/server/src/lib/verification/gate-runner.js +298 -37
- package/dist/server/src/lib/verification/machine-lock.js +11 -0
- package/dist/server/src/lib/verification/run-verdict-vocabulary.js +151 -0
- package/dist/server/src/lib/verification/verify-config.js +33 -0
- package/dist/server/src/lib/ws-server.js +143 -6
- package/dist/server/src/types/agent-transcript.js +241 -5
- package/dist/server/src/types/sidebar.js +40 -9
- package/dist/server/src/types/ui-state.js +24 -1
- package/dist/types/cli-tool-contracts.d.ts +119 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/package.json +1 -1
- package/public/sw.js +15 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +0 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +0 -1
- package/.next/server/chunks/1601.js +0 -7
- package/.next/server/chunks/1714.js +0 -7
- package/.next/server/chunks/221.js +0 -19
- package/.next/server/chunks/222.js +0 -1
- package/.next/server/chunks/2366.js +0 -1
- package/.next/server/chunks/2759.js +0 -8
- package/.next/server/chunks/3558.js +0 -1
- package/.next/server/chunks/4689.js +0 -25
- package/.next/server/chunks/5089.js +0 -1
- package/.next/server/chunks/6274.js +0 -14
- package/.next/server/chunks/9067.js +0 -1
- package/.next/server/chunks/9373.js +0 -9
- package/.next/server/chunks/9508.js +0 -1
- package/.next/static/Dvfs4ZThl5vBhJGP-ZQuJ/_buildManifest.js +0 -1
- package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +0 -1
- package/.next/static/chunks/3922.0d2e64daf9f187da.js +0 -1
- package/.next/static/chunks/5229-580b581fce5aeb52.js +0 -1
- package/.next/static/chunks/6381-9a929249196a0e77.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +0 -1
- package/.next/static/chunks/app/sessions/page-4d5382b257077c14.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-817378dd7c580774.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +0 -1
- package/.next/static/css/6266bde3bce465a2.css +0 -1
- /package/.next/static/{Dvfs4ZThl5vBhJGP-ZQuJ → 7K0XXFu_ty4wRSkl4X21E}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "Did the TOOL exit and leave a bare shell behind?" — the shared rule
|
|
4
|
+
* (Issue #2070).
|
|
5
|
+
*
|
|
6
|
+
* A tmux session outlives the process it was created for more often than the
|
|
7
|
+
* code used to admit. codex's own update dialog replaces codex with `npm
|
|
8
|
+
* install` and exits; `Ctrl+C` twice quits it; a crash does the same thing
|
|
9
|
+
* without asking. In each case `has-session` keeps answering yes, so `isRunning`
|
|
10
|
+
* stayed true, the sidebar kept its dot, and the next `send` sat in
|
|
11
|
+
* `waitForPrompt` until it timed out — recoverable only by killing the session
|
|
12
|
+
* by hand.
|
|
13
|
+
*
|
|
14
|
+
* CommandMate already had the answer to this, written for claude and reachable
|
|
15
|
+
* from exactly one `cliToolId === 'claude'` branch (`isSessionHealthy`). What
|
|
16
|
+
* was claude-specific about it was not the rule but the two patterns it was
|
|
17
|
+
* spelled in terms of. This module is that rule with the patterns lifted out
|
|
18
|
+
* into {@link ToolLivenessSpec}; `lib/cli-tools/liveness-spec` is where each
|
|
19
|
+
* tool fills them in.
|
|
20
|
+
*
|
|
21
|
+
* Pure and synchronous on purpose: no tmux, no capture, nothing to mock. The
|
|
22
|
+
* probe that feeds it a frame is `probeSessionLiveness` in
|
|
23
|
+
* `lib/cli-tools/session-liveness`, which is where the tmux round trip belongs
|
|
24
|
+
* (§4 D4 keeps `src/lib/detection/**` off the transport).
|
|
25
|
+
*
|
|
26
|
+
* @module lib/detection/tool-liveness
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.FATAL_PATTERN_TAIL_LINES = exports.SHELL_PROMPT_LINE_PATTERNS = exports.MAX_SHELL_PROMPT_LENGTH = exports.SHELL_PROMPT_ENDINGS = void 0;
|
|
30
|
+
exports.findFatalPattern = findFatalPattern;
|
|
31
|
+
exports.findShellPromptTail = findShellPromptTail;
|
|
32
|
+
exports.judgeToolLiveness = judgeToolLiveness;
|
|
33
|
+
const ansi_1 = require("./ansi");
|
|
34
|
+
/**
|
|
35
|
+
* Trailing characters that make a short last row a shell prompt.
|
|
36
|
+
*
|
|
37
|
+
* `$` bash/sh, `%` zsh, `#` root. Verbatim the list `claude-session.ts` has
|
|
38
|
+
* carried as its private `SHELL_PROMPT_ENDINGS` since the health check was
|
|
39
|
+
* written — moved, not redesigned.
|
|
40
|
+
*/
|
|
41
|
+
exports.SHELL_PROMPT_ENDINGS = ['$', '%', '#'];
|
|
42
|
+
/**
|
|
43
|
+
* Longest a last row may be and still be read as a shell prompt by the endings
|
|
44
|
+
* rule alone.
|
|
45
|
+
*
|
|
46
|
+
* claude's number, kept as claude's default (`MAX_SHELL_PROMPT_LENGTH`, "40 is
|
|
47
|
+
* an empirical threshold with safety margin"). Issue #2070 measured why it
|
|
48
|
+
* cannot be the whole rule: the zsh default prompt of the machine the Issue was
|
|
49
|
+
* reproduced on renders as `maenokota@MAENOnoMac-Studio work-codex %` — forty
|
|
50
|
+
* characters exactly, i.e. one past this gate — so a codex session that had
|
|
51
|
+
* genuinely fallen back to the shell read as alive. See
|
|
52
|
+
* {@link SHELL_PROMPT_LINE_PATTERNS}.
|
|
53
|
+
*/
|
|
54
|
+
exports.MAX_SHELL_PROMPT_LENGTH = 40;
|
|
55
|
+
/**
|
|
56
|
+
* Whole-line forms that positively identify a shell prompt, independent of
|
|
57
|
+
* length (Issue #2070).
|
|
58
|
+
*
|
|
59
|
+
* Checked BEFORE the length gate, so a long-but-real prompt is still a prompt.
|
|
60
|
+
* Both are anchored at both ends and require a `user@host` head, which is what
|
|
61
|
+
* keeps them off TUI content: an agent's transcript row that happens to end in
|
|
62
|
+
* `$` does not begin with `name@host`.
|
|
63
|
+
*
|
|
64
|
+
* Deliberately NOT extended to the bare `❯` / `>` prompts starship, pure and
|
|
65
|
+
* agnoster draw. Those glyphs are the composer of claude, copilot and gemini —
|
|
66
|
+
* `COPILOT_PROMPT_PATTERN` matching a starship prompt is a measured hazard
|
|
67
|
+
* (#1907) — so a rule that read them as "shell" would relaunch a tool into its
|
|
68
|
+
* own live pane. The cost is a false NEGATIVE on those prompts (the exit is not
|
|
69
|
+
* noticed), which is the direction this rule is allowed to be wrong in.
|
|
70
|
+
*/
|
|
71
|
+
exports.SHELL_PROMPT_LINE_PATTERNS = [
|
|
72
|
+
// zsh / bash defaults: `user@host dir %`, `user@host:~/dir$`
|
|
73
|
+
/^[\w.-]+@[\w.-]+[\s:].*[$%#]$/,
|
|
74
|
+
// RHEL-style bash: `[user@host dir]$`
|
|
75
|
+
/^\[[\w.-]+@[\w.-]+[^\]]*\][$#]$/,
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* How many content rows from the bottom a fatal-pattern search may read.
|
|
79
|
+
*
|
|
80
|
+
* claude's `HEALTH_CHECK_ERROR_TAIL_LINES`, unchanged: an error that has already
|
|
81
|
+
* scrolled up describes a session that recovered, and must not condemn it.
|
|
82
|
+
*/
|
|
83
|
+
exports.FATAL_PATTERN_TAIL_LINES = 10;
|
|
84
|
+
/** `cleanOutput` split into rows, blank ones dropped. */
|
|
85
|
+
function contentRows(cleanTrimmedOutput) {
|
|
86
|
+
return cleanTrimmedOutput.split('\n').filter((line) => line.trim() !== '');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The fatal pattern visible in the tail of `cleanOutput`, or null.
|
|
90
|
+
*
|
|
91
|
+
* Only the last {@link FATAL_PATTERN_TAIL_LINES} content rows are searched.
|
|
92
|
+
* Exported because claude's launch loop applies the same judgement while it is
|
|
93
|
+
* still waiting for the prompt (Issue #1637) — a session already showing
|
|
94
|
+
* "Claude Code cannot be launched inside another Claude Code session" must not
|
|
95
|
+
* burn the whole 60 s budget before saying so.
|
|
96
|
+
*
|
|
97
|
+
* @param cleanOutput - ANSI-stripped pane output
|
|
98
|
+
* @param spec - The tool's liveness declaration
|
|
99
|
+
* @returns The matched pattern (or regex source) for the log, or null
|
|
100
|
+
*/
|
|
101
|
+
function findFatalPattern(cleanOutput, spec) {
|
|
102
|
+
const tailText = contentRows(cleanOutput.trim())
|
|
103
|
+
.slice(-exports.FATAL_PATTERN_TAIL_LINES)
|
|
104
|
+
.join('\n');
|
|
105
|
+
for (const pattern of spec.fatalPatterns) {
|
|
106
|
+
if (tailText.includes(pattern))
|
|
107
|
+
return pattern;
|
|
108
|
+
}
|
|
109
|
+
for (const regex of spec.fatalRegexPatterns) {
|
|
110
|
+
if (regex.test(tailText))
|
|
111
|
+
return regex.source;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Whether `line` ends in one of `endings`, applying claude's own exclusion.
|
|
117
|
+
*
|
|
118
|
+
* `Context left until auto-compact: 7%` ends in `%` and is not a prompt; the
|
|
119
|
+
* `\d+%$` carve-out is the one claude has always had, and it is kept here
|
|
120
|
+
* character for character because claude's verdicts must not move (Issue #2070
|
|
121
|
+
* 受入条件).
|
|
122
|
+
*/
|
|
123
|
+
function endsWithShellPromptChar(line, endings) {
|
|
124
|
+
return endings.some((ending) => {
|
|
125
|
+
if (!line.endsWith(ending))
|
|
126
|
+
return false;
|
|
127
|
+
if (ending === '%' && /\d+%$/.test(line))
|
|
128
|
+
return false;
|
|
129
|
+
return true;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The bottom row of `cleanOutput`, when it reads as a shell prompt.
|
|
134
|
+
*
|
|
135
|
+
* Steps 4-6 of {@link judgeToolLiveness}, lifted out verbatim so there is one
|
|
136
|
+
* definition of "this pane is a bare shell" rather than two. Note what is NOT
|
|
137
|
+
* here: the alive-pattern window of step 2. That is the difference between the
|
|
138
|
+
* two questions, and it is why this is exported (Issue #2068).
|
|
139
|
+
*
|
|
140
|
+
* `judgeToolLiveness` asks **"is the tool gone?"** and answers conservatively —
|
|
141
|
+
* any alive pattern anywhere in the bottom window vetoes the exit, because a
|
|
142
|
+
* relaunch hangs off its verdict. That veto is right for the general case and
|
|
143
|
+
* wrong for exactly one measured frame: the pane codex leaves behind after its
|
|
144
|
+
* own `1. Update now`. codex-cli 0.149.1 exits into `npm install -g
|
|
145
|
+
* @openai/codex`, which prints three rows and returns to the shell — so the
|
|
146
|
+
* dead `› 1. Update now` option row is still SEVEN content rows above the live
|
|
147
|
+
* shell prompt, inside `LIVENESS_ALIVE_TAIL_LINES`, and `CODEX_PROMPT_PATTERN`
|
|
148
|
+
* reads it as codex still drawing the pane (measured 2026-08-31, private tmux
|
|
149
|
+
* socket, 200x1000, isolated `CODEX_HOME`).
|
|
150
|
+
*
|
|
151
|
+
* `CodexTool.waitForReady` therefore asks this narrower question instead, and
|
|
152
|
+
* only about a pane it has just watched answer the update dialog — where the
|
|
153
|
+
* scrollback above the prompt is known to be spent and position is the whole
|
|
154
|
+
* story, exactly as it is for every other codex classifier since Issue #892.
|
|
155
|
+
* Widening `judgeToolLiveness` itself to agree would be a change to the shared
|
|
156
|
+
* rule every tool is judged by, and it is not made here.
|
|
157
|
+
*
|
|
158
|
+
* @param cleanOutput - ANSI-stripped pane output
|
|
159
|
+
* @param spec - The tool's liveness declaration
|
|
160
|
+
* @returns The prompt row and how it was recognised, or null
|
|
161
|
+
*/
|
|
162
|
+
function findShellPromptTail(cleanOutput, spec) {
|
|
163
|
+
const rows = contentRows(cleanOutput.trim());
|
|
164
|
+
const lastLine = rows[rows.length - 1]?.trim() ?? '';
|
|
165
|
+
if (!/\d+%$/.test(lastLine) && spec.shellPromptPatterns.some((p) => p.test(lastLine))) {
|
|
166
|
+
return { line: lastLine, via: 'pattern' };
|
|
167
|
+
}
|
|
168
|
+
// The length gate is a NEGATIVE result, not a fall-through: a row this long is
|
|
169
|
+
// not a prompt, and the endings rule below must not get to claim it.
|
|
170
|
+
if (lastLine.length >= spec.maxShellPromptLength) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
if (endsWithShellPromptChar(lastLine, spec.shellPromptEndings)) {
|
|
174
|
+
return { line: lastLine, via: 'ending' };
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Decide whether the tool this spec describes is still drawing the pane.
|
|
180
|
+
*
|
|
181
|
+
* The rule, in the order the branches run — which is claude's order, because
|
|
182
|
+
* claude's spec must produce claude's historical answers:
|
|
183
|
+
*
|
|
184
|
+
* 1. **nothing on the pane** → exited only if the spec says an unreadable
|
|
185
|
+
* frame counts (claude alone; see {@link ToolLivenessSpec.unreadableIsExited});
|
|
186
|
+
* 2. **an alive pattern matches the bottom window** → alive. This is the
|
|
187
|
+
* tool's prompt-ready rule and its busy/dialog chrome, and it is checked
|
|
188
|
+
* against a WINDOW rather than the frame for every tool but claude: a tool's
|
|
189
|
+
* chrome does not vanish when it quits, it scrolls up;
|
|
190
|
+
* 3. **a fatal pattern in the tail** → exited;
|
|
191
|
+
* 4. **the last row positively reads as a shell prompt** → exited;
|
|
192
|
+
* 5. **the last row is too long to be a prompt** → alive;
|
|
193
|
+
* 6. **the last row ends in `$` / `%` / `#`** → exited;
|
|
194
|
+
* 7. otherwise **alive** — the honest answer when nothing said either way.
|
|
195
|
+
*
|
|
196
|
+
* Steps 4-6 are the positive half of the verdict and they are not optional.
|
|
197
|
+
* A frame that merely fails step 2 (a tool mid-launch, a screen nobody has
|
|
198
|
+
* measured) must come out ALIVE, because Issue #2070 puts a relaunch behind
|
|
199
|
+
* this answer and a relaunch into a live pane types the launch command into the
|
|
200
|
+
* agent's composer.
|
|
201
|
+
*
|
|
202
|
+
* @param rawOutput - Pane capture, ANSI intact (stripped here)
|
|
203
|
+
* @param spec - The tool's liveness declaration
|
|
204
|
+
* @returns Whether the tool is there, and — when it is not — why not
|
|
205
|
+
*/
|
|
206
|
+
function judgeToolLiveness(rawOutput, spec) {
|
|
207
|
+
const trimmed = (0, ansi_1.stripAnsi)(rawOutput).trim();
|
|
208
|
+
if (trimmed === '') {
|
|
209
|
+
return spec.unreadableIsExited
|
|
210
|
+
? { alive: false, reason: 'empty output' }
|
|
211
|
+
: { alive: true };
|
|
212
|
+
}
|
|
213
|
+
const rows = contentRows(trimmed);
|
|
214
|
+
const aliveWindow = spec.aliveTailLines === null ? trimmed : rows.slice(-spec.aliveTailLines).join('\n');
|
|
215
|
+
if (spec.alivePatterns.some((pattern) => pattern.test(aliveWindow))) {
|
|
216
|
+
return { alive: true };
|
|
217
|
+
}
|
|
218
|
+
const fatal = findFatalPattern(trimmed, spec);
|
|
219
|
+
if (fatal !== null) {
|
|
220
|
+
return { alive: false, reason: `error pattern: ${fatal}` };
|
|
221
|
+
}
|
|
222
|
+
// Steps 4-6, via the predicate they were lifted into (Issue #2068). The two
|
|
223
|
+
// reason strings are unchanged, and so is the verdict for every frame: a
|
|
224
|
+
// `null` here is the old "too long" and "nothing matched" branches, which both
|
|
225
|
+
// came out alive.
|
|
226
|
+
const shellTail = findShellPromptTail(trimmed, spec);
|
|
227
|
+
if (shellTail !== null) {
|
|
228
|
+
return shellTail.via === 'pattern'
|
|
229
|
+
? { alive: false, reason: `shell prompt detected: ${shellTail.line}` }
|
|
230
|
+
: { alive: false, reason: `shell prompt ending detected: ${shellTail.line}` };
|
|
231
|
+
}
|
|
232
|
+
return { alive: true };
|
|
233
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `DETECTOR_VERSION_PROBES` — are the detector's rules still describing the CLI
|
|
4
|
+
* that is installed? (Issue #1929, 方針書 §4 D2 / §7 / §10.11 / §13.2 S17)
|
|
5
|
+
*
|
|
6
|
+
* Every rule in `src/lib/detection/tools/` was read off a capture of one build
|
|
7
|
+
* of one CLI. `tools/verified-against.ts` records which build. This module reads
|
|
8
|
+
* the other half of the comparison — the version that is installed right now —
|
|
9
|
+
* so `capture --json` and `commandmate status` can say "these rules were
|
|
10
|
+
* measured against copilot 1.0.80 and you are running 1.2.0" instead of leaving
|
|
11
|
+
* a reader to guess whether a misdetection is a bug or a version skew.
|
|
12
|
+
*
|
|
13
|
+
* ## The cost rules, and why they are not optional
|
|
14
|
+
*
|
|
15
|
+
* `capture --json` and `GET /current-output` are the **5-second polling path** —
|
|
16
|
+
* the monitor skills run them with no iteration cap. A probe table that spawns
|
|
17
|
+
* six children cannot sit on that path, so (DR3-013):
|
|
18
|
+
*
|
|
19
|
+
* - probes run **once per process**, concurrent first callers share the same
|
|
20
|
+
* in-flight promise, and the result is cached;
|
|
21
|
+
* - {@link getDetectorStalenessSnapshot} **never awaits a child process**. It
|
|
22
|
+
* answers from the cache or answers `undefined` and starts the probe in the
|
|
23
|
+
* background. `undefined` means "not known yet", never "nothing is stale":
|
|
24
|
+
* the hint is additive, so a poll that lands cold simply shows nothing and
|
|
25
|
+
* the next one shows the banner;
|
|
26
|
+
* - {@link getDetectorFreshness} is the awaiting form, for the two callers that
|
|
27
|
+
* genuinely want the answer (`commandmate status`, `check:detector-freshness`)
|
|
28
|
+
* and are operator-initiated one-offs.
|
|
29
|
+
*
|
|
30
|
+
* ## The execution rules (DR4-010 / §10.11)
|
|
31
|
+
*
|
|
32
|
+
* `PATH` is untrusted input: the server's `PATH` comes from the shell that
|
|
33
|
+
* started it, and a repo-local `node_modules/.bin` on it would let opening a
|
|
34
|
+
* worktree decide which binary a cold probe runs. So every `execFile` probe
|
|
35
|
+
* resolves its command to an **absolute path** through
|
|
36
|
+
* {@link findExecutableOnPath} first and **skips entirely** — spawning nothing —
|
|
37
|
+
* when that resolves to nothing; children run with `sanitizeEnvForChildProcess()`
|
|
38
|
+
* so no probe ever sees CommandMate's auth token or DB path; and both `timeout`
|
|
39
|
+
* and `maxBuffer` are explicit.
|
|
40
|
+
*
|
|
41
|
+
* ## copilot is delegated, and must stay delegated (S17)
|
|
42
|
+
*
|
|
43
|
+
* The design policy's first draft probed `gh copilot -- --version`. It cannot be
|
|
44
|
+
* used: `copilot` is not a gh extension but a preview command built into gh
|
|
45
|
+
* 2.86.0, and gh's own help says that when `PATH` has no copilot it
|
|
46
|
+
* **downloads** the CLI into `~/.local/share/gh/copilot`. A version hint that
|
|
47
|
+
* installs software is not a version hint. #1907 measured this and built
|
|
48
|
+
* {@link resolveCopilotExecutable}; #1913 wired it into the catalog's
|
|
49
|
+
* `VERSION_PROBES` as `kind: 'delegated'`; this table reuses the same shape.
|
|
50
|
+
*
|
|
51
|
+
* Delegating is not an exception to DR4-010 (1) — it satisfies it more strongly
|
|
52
|
+
* than an `execFile` row could, because `CopilotTool.isInstalled()` and
|
|
53
|
+
* `startSession()` decide what to launch from **the same function's same return
|
|
54
|
+
* value**, so probe and launch cannot disagree.
|
|
55
|
+
*
|
|
56
|
+
* ## What "probes must not modify the environment" can actually mean (measured)
|
|
57
|
+
*
|
|
58
|
+
* DR4-010 (5) says a probe must not change the environment ("installation,
|
|
59
|
+
* download, or config-file generation"). Measured on 2026-08-23 (macOS
|
|
60
|
+
* darwin 25.6.0) by running each `--version` under a **disposable** `HOME` /
|
|
61
|
+
* `XDG_DATA_HOME` / `XDG_CONFIG_HOME` and listing what appeared:
|
|
62
|
+
*
|
|
63
|
+
* | probe | version | warm ms | wrote into a pristine HOME |
|
|
64
|
+
* |----------------------|-----------|---------|------------------------------------------|
|
|
65
|
+
* | `claude --version` | 2.1.240 | 199 | nothing |
|
|
66
|
+
* | `agy --version` | 1.1.18 | 176 | nothing |
|
|
67
|
+
* | `codex --version` | 0.148.0 | 172 | `~/.codex/tmp/arg0` |
|
|
68
|
+
* | `opencode --version` | 1.18.21 | 404 | `~/.config/opencode`, `~/.cache/opencode`, `~/.local/{state,share}/opencode` |
|
|
69
|
+
* | `copilot --version` | 1.0.80 | 436 | `~/Library/Caches/copilot` |
|
|
70
|
+
* | `gemini --version` | 0.55.1 | 929 | `~/.gemini/projects.json.<uuid>.tmp` ×2 (leaked, not cleaned up) |
|
|
71
|
+
*
|
|
72
|
+
* So the literal reading of (5) is satisfied by **two** of the six probes, and
|
|
73
|
+
* four of the rows the policy already approved fail it. The rule that the D2
|
|
74
|
+
* premise actually rests on is the narrower one #1979 was defending: a probe
|
|
75
|
+
* must not **install or download software, or change which binary would be
|
|
76
|
+
* launched**. Every row above satisfies that; none of them fetches anything.
|
|
77
|
+
* The gemini row is the weakest — it leaks two temp files into a `~/.gemini`
|
|
78
|
+
* that does not exist yet — and it is kept because it is the same class of
|
|
79
|
+
* side effect as codex/opencode/copilot, which are already in the table, and
|
|
80
|
+
* because dropping gemini would leave the one tool with **no** measured
|
|
81
|
+
* detector rules also with no way to notice that.
|
|
82
|
+
*
|
|
83
|
+
* `~/.config/gh` and `~/.local/share/gh` were checksummed before and after the
|
|
84
|
+
* whole measurement and neither changed (`~/.local/share/gh` still does not
|
|
85
|
+
* exist), which is the receipt #1979 asked for.
|
|
86
|
+
*
|
|
87
|
+
* ## Why this module imports nothing through `@/`
|
|
88
|
+
*
|
|
89
|
+
* `commandmate status` is one of the two exposure surfaces §4 D2 names, and
|
|
90
|
+
* `tsconfig.cli.json` compiles the CLI with `"paths": {}`. See the same
|
|
91
|
+
* constraint spelled out in `src/cli/types/api-responses.ts`.
|
|
92
|
+
*
|
|
93
|
+
* @module lib/detection/version-probes
|
|
94
|
+
*/
|
|
95
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
96
|
+
exports.DETECTOR_VERSION_PROBES = exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS = void 0;
|
|
97
|
+
exports.parseCliVersion = parseCliVersion;
|
|
98
|
+
exports.parseVerifiedAgainstVersion = parseVerifiedAgainstVersion;
|
|
99
|
+
exports.compareCliVersions = compareCliVersions;
|
|
100
|
+
exports.runDetectorVersionProbe = runDetectorVersionProbe;
|
|
101
|
+
exports.getDetectorFreshness = getDetectorFreshness;
|
|
102
|
+
exports.toDetectorStaleness = toDetectorStaleness;
|
|
103
|
+
exports.getDetectorStalenessSnapshot = getDetectorStalenessSnapshot;
|
|
104
|
+
exports.clearDetectorVersionProbeCache = clearDetectorVersionProbeCache;
|
|
105
|
+
const child_process_1 = require("child_process");
|
|
106
|
+
const copilot_executable_1 = require("../cli-tools/copilot-executable");
|
|
107
|
+
const env_sanitizer_1 = require("../security/env-sanitizer");
|
|
108
|
+
const verified_against_1 = require("./tools/verified-against");
|
|
109
|
+
/** Budget for one `<cli> --version`. Matches the catalog probe and copilot-executable. */
|
|
110
|
+
exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS = 5000;
|
|
111
|
+
/**
|
|
112
|
+
* Cap on `--version` output kept in memory (DR4-010 (4)).
|
|
113
|
+
*
|
|
114
|
+
* `execFile` defaults to 1MB. A `--version` that answers with a megabyte is
|
|
115
|
+
* already misbehaving, so the buffer is sized to a version banner and the child
|
|
116
|
+
* is killed past it; the over-long answer is discarded rather than parsed.
|
|
117
|
+
*/
|
|
118
|
+
const DETECTOR_VERSION_PROBE_MAX_BUFFER_BYTES = 64 * 1024;
|
|
119
|
+
/** Extracts a `major.minor.patch` triple from arbitrary `--version` output. */
|
|
120
|
+
const VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/;
|
|
121
|
+
/** Extract a normalized `major.minor.patch` version from `--version` output. */
|
|
122
|
+
function parseCliVersion(output) {
|
|
123
|
+
const match = VERSION_REGEX.exec(output);
|
|
124
|
+
return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A `verifiedAgainst` stamp written as a minor-series wildcard: `0.4.x`.
|
|
128
|
+
*
|
|
129
|
+
* Only ever applied to the stamp, never to a probe's own output — one side of
|
|
130
|
+
* this comparison is a string a human typed into a tool module, the other is
|
|
131
|
+
* what a binary printed about itself, and only the first is allowed to be vague.
|
|
132
|
+
*/
|
|
133
|
+
const VERIFIED_AGAINST_WILDCARD_REGEX = /^(\d+)\.(\d+)\.(?:x|\*)$/i;
|
|
134
|
+
/**
|
|
135
|
+
* The comparable form of a `verifiedAgainst` stamp, or null when there is none.
|
|
136
|
+
*
|
|
137
|
+
* `'unmeasured'` is null — a tool nobody has captured frames for cannot be
|
|
138
|
+
* fresh or stale. `'0.4.x'` becomes `0.4.0`: antigravity's stamp is a minor
|
|
139
|
+
* series rather than a build (Issue #995 measured a range), and reading it as
|
|
140
|
+
* "no version" would silently exempt the one tool whose rules are furthest
|
|
141
|
+
* behind. Widening to `.0` is the safe direction — it can only ever call a
|
|
142
|
+
* newer install stale, never call a stale one current.
|
|
143
|
+
*/
|
|
144
|
+
function parseVerifiedAgainstVersion(stamp) {
|
|
145
|
+
const wildcard = VERIFIED_AGAINST_WILDCARD_REGEX.exec(stamp);
|
|
146
|
+
if (wildcard)
|
|
147
|
+
return `${wildcard[1]}.${wildcard[2]}.0`;
|
|
148
|
+
return parseCliVersion(stamp);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Compare two `major.minor.patch` versions numerically.
|
|
152
|
+
* @returns 1 if a > b, -1 if a < b, 0 if equal.
|
|
153
|
+
*/
|
|
154
|
+
function compareCliVersions(a, b) {
|
|
155
|
+
const pa = a.split('.').map((n) => Number(n) || 0);
|
|
156
|
+
const pb = b.split('.').map((n) => Number(n) || 0);
|
|
157
|
+
for (let i = 0; i < 3; i++) {
|
|
158
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
159
|
+
if (diff !== 0)
|
|
160
|
+
return diff > 0 ? 1 : -1;
|
|
161
|
+
}
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Detector staleness probes: tool id → how to read its installed version.
|
|
166
|
+
*
|
|
167
|
+
* Deliberately the same shape as `VERSION_PROBES` in `slash-command-catalog.ts`
|
|
168
|
+
* (§4 D2: 「`VERSION_PROBES` と同型」), and deliberately a separate table: the
|
|
169
|
+
* catalog's question is "is the bundled slash-command list behind?" and this
|
|
170
|
+
* one's is "were these detection rules read off the build that is installed?".
|
|
171
|
+
* They happen to agree today; nothing requires them to.
|
|
172
|
+
*
|
|
173
|
+
* The binary for antigravity is `agy` — tool id and executable name differ
|
|
174
|
+
* (DR2-023). `gemini`'s row is `gemini --version`, measured for this Issue (the
|
|
175
|
+
* policy left it unconfirmed); its `verifiedAgainst` is `unmeasured`, so it is
|
|
176
|
+
* reported as "installed, rules never measured" rather than compared.
|
|
177
|
+
* `vibe-local` has no row: it is not an external CLI.
|
|
178
|
+
*/
|
|
179
|
+
exports.DETECTOR_VERSION_PROBES = {
|
|
180
|
+
claude: { kind: 'execFile', command: 'claude', args: ['--version'] },
|
|
181
|
+
codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
|
|
182
|
+
antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
|
|
183
|
+
opencode: { kind: 'execFile', command: 'opencode', args: ['--version'] },
|
|
184
|
+
gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
|
|
185
|
+
copilot: {
|
|
186
|
+
kind: 'delegated',
|
|
187
|
+
probe: async () => (await (0, copilot_executable_1.resolveCopilotExecutable)())?.version ?? null,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
let freshnessCache = null;
|
|
191
|
+
let freshnessInFlight = null;
|
|
192
|
+
/**
|
|
193
|
+
* Run one probe. Resolves null on any failure, and **without spawning anything**
|
|
194
|
+
* when the command does not resolve to an absolute path (DR4-010 (2)).
|
|
195
|
+
*/
|
|
196
|
+
function runDetectorVersionProbe(probe) {
|
|
197
|
+
if (probe.kind === 'delegated') {
|
|
198
|
+
return probe.probe().catch(() => null);
|
|
199
|
+
}
|
|
200
|
+
const executable = (0, copilot_executable_1.findExecutableOnPath)(probe.command);
|
|
201
|
+
// Skip, do not fall back to the bare name: handing an unresolved command to
|
|
202
|
+
// execFile is exactly the PATH-decides-the-binary case DR4-010 removes.
|
|
203
|
+
if (!executable)
|
|
204
|
+
return Promise.resolve(null);
|
|
205
|
+
return new Promise((resolve) => {
|
|
206
|
+
(0, child_process_1.execFile)(executable, [...probe.args], {
|
|
207
|
+
timeout: exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS,
|
|
208
|
+
maxBuffer: DETECTOR_VERSION_PROBE_MAX_BUFFER_BYTES,
|
|
209
|
+
env: (0, env_sanitizer_1.sanitizeEnvForChildProcess)(),
|
|
210
|
+
}, (error, stdout, stderr) => {
|
|
211
|
+
if (error) {
|
|
212
|
+
resolve(null);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
resolve(parseCliVersion(`${stdout ?? ''}\n${stderr ?? ''}`));
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
async function computeDetectorFreshness() {
|
|
220
|
+
const tools = Object.keys(exports.DETECTOR_VERSION_PROBES).sort();
|
|
221
|
+
return Promise.all(tools.map(async (tool) => {
|
|
222
|
+
const verifiedAgainst = verified_against_1.DETECTOR_VERIFIED_AGAINST[tool]?.version ?? 'unmeasured';
|
|
223
|
+
const installed = await runDetectorVersionProbe(exports.DETECTOR_VERSION_PROBES[tool]);
|
|
224
|
+
const baseline = parseVerifiedAgainstVersion(verifiedAgainst);
|
|
225
|
+
return {
|
|
226
|
+
tool,
|
|
227
|
+
installed,
|
|
228
|
+
verifiedAgainst,
|
|
229
|
+
stale: installed !== null && baseline !== null && compareCliVersions(installed, baseline) > 0,
|
|
230
|
+
};
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* The full freshness report, computed once per process and cached. Concurrent
|
|
235
|
+
* first callers share one probe.
|
|
236
|
+
*
|
|
237
|
+
* **This awaits child processes — never call it from a request path.** Use
|
|
238
|
+
* {@link getDetectorStalenessSnapshot} there. Kept for `commandmate status`,
|
|
239
|
+
* `npm run check:detector-freshness` and tests, and as the single implementation
|
|
240
|
+
* both entry points share.
|
|
241
|
+
*/
|
|
242
|
+
async function getDetectorFreshness() {
|
|
243
|
+
if (freshnessCache !== null)
|
|
244
|
+
return freshnessCache;
|
|
245
|
+
if (freshnessInFlight)
|
|
246
|
+
return freshnessInFlight;
|
|
247
|
+
freshnessInFlight = computeDetectorFreshness();
|
|
248
|
+
try {
|
|
249
|
+
freshnessCache = await freshnessInFlight;
|
|
250
|
+
return freshnessCache;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
freshnessInFlight = null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** Reduce a report to the wire shape: stale tools only. */
|
|
257
|
+
function toDetectorStaleness(rows) {
|
|
258
|
+
const staleness = {};
|
|
259
|
+
for (const row of rows) {
|
|
260
|
+
if (!row.stale || row.installed === null)
|
|
261
|
+
continue;
|
|
262
|
+
staleness[row.tool] = { installed: row.installed, verifiedAgainst: row.verifiedAgainst };
|
|
263
|
+
}
|
|
264
|
+
return staleness;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* The staleness this process already knows, or `undefined` plus a background
|
|
268
|
+
* probe when it knows nothing yet. **Never awaits a child process** (§4 D2,
|
|
269
|
+
* DR3-013 (a)(b)(c)).
|
|
270
|
+
*
|
|
271
|
+
* `undefined` is "not known yet", not "nothing is stale" — see the module doc.
|
|
272
|
+
* The returned object is `{}` once the cache is warm and nothing is stale, which
|
|
273
|
+
* is how a caller tells the two apart.
|
|
274
|
+
*/
|
|
275
|
+
function getDetectorStalenessSnapshot() {
|
|
276
|
+
if (freshnessCache !== null)
|
|
277
|
+
return toDetectorStaleness(freshnessCache);
|
|
278
|
+
// Fire and forget. No in-flight check here on purpose: getDetectorFreshness
|
|
279
|
+
// owns that slot and hands a concurrent caller the promise that is already
|
|
280
|
+
// running, so a second guard would be a copy of an invariant that lives one
|
|
281
|
+
// function down — and a copy is what goes stale. It swallows its own failures,
|
|
282
|
+
// so nothing here needs the result.
|
|
283
|
+
void getDetectorFreshness().catch(() => []);
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
/** Clear the process-level probe cache (tests, and any future cache-control wiring). */
|
|
287
|
+
function clearDetectorVersionProbeCache() {
|
|
288
|
+
freshnessCache = null;
|
|
289
|
+
freshnessInFlight = null;
|
|
290
|
+
}
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Issue #135: DB path resolution fix
|
|
10
10
|
* Uses getDefaultDbPath() from db-path-resolver.ts for consistent DB path handling
|
|
11
|
+
*
|
|
12
|
+
* Issue #2132: startup self-check for ".env exists but nothing was loaded"
|
|
13
|
+
* See {@link runDotenvSelfCheck}.
|
|
11
14
|
*/
|
|
12
15
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
16
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -17,12 +20,17 @@ exports.ENV_MAPPING = void 0;
|
|
|
17
20
|
exports.resetWarnedKeys = resetWarnedKeys;
|
|
18
21
|
exports.getEnvWithFallback = getEnvWithFallback;
|
|
19
22
|
exports.getEnvByKey = getEnvByKey;
|
|
23
|
+
exports.parseDotenvKeys = parseDotenvKeys;
|
|
24
|
+
exports.inspectDotenvLoad = inspectDotenvLoad;
|
|
25
|
+
exports.formatDotenvReportLines = formatDotenvReportLines;
|
|
26
|
+
exports.runDotenvSelfCheck = runDotenvSelfCheck;
|
|
20
27
|
exports.resetDatabasePathWarning = resetDatabasePathWarning;
|
|
21
28
|
exports.getDatabasePathWithDeprecationWarning = getDatabasePathWithDeprecationWarning;
|
|
22
29
|
exports.getLogConfig = getLogConfig;
|
|
23
30
|
exports.getServerPort = getServerPort;
|
|
24
31
|
exports.getEnv = getEnv;
|
|
25
32
|
exports.validateEnv = validateEnv;
|
|
33
|
+
const fs_1 = __importDefault(require("fs"));
|
|
26
34
|
const path_1 = __importDefault(require("path"));
|
|
27
35
|
const db_path_resolver_1 = require("./db/db-path-resolver");
|
|
28
36
|
// ============================================================
|
|
@@ -84,6 +92,120 @@ function getEnvWithFallback(newKey, oldKey) {
|
|
|
84
92
|
function getEnvByKey(key) {
|
|
85
93
|
return getEnvWithFallback(key, exports.ENV_MAPPING[key]);
|
|
86
94
|
}
|
|
95
|
+
/** `KEY`, `export KEY`, ` KEY ` — the assignment forms a `.env` line can take. */
|
|
96
|
+
const DOTENV_ASSIGNMENT = /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/;
|
|
97
|
+
/**
|
|
98
|
+
* The variable names a `.env` file declares, in file order, without duplicates.
|
|
99
|
+
*
|
|
100
|
+
* Values are never returned. `CM_VAPID_PRIVATE_KEY` lives in this file, and the
|
|
101
|
+
* only reason to parse it here is to count how many of its NAMES arrived.
|
|
102
|
+
*/
|
|
103
|
+
function parseDotenvKeys(contents) {
|
|
104
|
+
const keys = [];
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
for (const line of contents.split(/\r?\n/)) {
|
|
107
|
+
const match = DOTENV_ASSIGNMENT.exec(line);
|
|
108
|
+
if (!match)
|
|
109
|
+
continue;
|
|
110
|
+
const key = match[1];
|
|
111
|
+
if (seen.has(key))
|
|
112
|
+
continue;
|
|
113
|
+
seen.add(key);
|
|
114
|
+
keys.push(key);
|
|
115
|
+
}
|
|
116
|
+
return keys;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compare the `.env` on disk against the environment this process actually got.
|
|
120
|
+
*
|
|
121
|
+
* @returns `null` when there is nothing to compare — no `.env`, an unreadable
|
|
122
|
+
* one, or one that declares no variables. None of those is a fault worth a
|
|
123
|
+
* line of startup output.
|
|
124
|
+
*/
|
|
125
|
+
function inspectDotenvLoad(options = {}) {
|
|
126
|
+
const { cwd = process.cwd(), env = process.env } = options;
|
|
127
|
+
const envPath = path_1.default.join(cwd, '.env');
|
|
128
|
+
let contents;
|
|
129
|
+
try {
|
|
130
|
+
if (!fs_1.default.existsSync(envPath))
|
|
131
|
+
return null;
|
|
132
|
+
contents = fs_1.default.readFileSync(envPath, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Unreadable is a permissions question, not a loading question.
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const declaredKeys = parseDotenvKeys(contents);
|
|
139
|
+
if (declaredKeys.length === 0)
|
|
140
|
+
return null;
|
|
141
|
+
const presentKeys = declaredKeys.filter((key) => env[key] !== undefined);
|
|
142
|
+
return {
|
|
143
|
+
envPath,
|
|
144
|
+
declaredKeys,
|
|
145
|
+
presentKeys,
|
|
146
|
+
loadFailed: presentKeys.length === 0,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** How many key names the report is willing to print before it says "and N more". */
|
|
150
|
+
const DOTENV_REPORT_KEY_LIMIT = 8;
|
|
151
|
+
/**
|
|
152
|
+
* The lines {@link runDotenvSelfCheck} prints — empty when the load worked.
|
|
153
|
+
*
|
|
154
|
+
* Exported so the wording is pinned by a test rather than by a screenshot.
|
|
155
|
+
*/
|
|
156
|
+
function formatDotenvReportLines(inspection) {
|
|
157
|
+
if (!inspection.loadFailed)
|
|
158
|
+
return [];
|
|
159
|
+
const shown = inspection.declaredKeys.slice(0, DOTENV_REPORT_KEY_LIMIT);
|
|
160
|
+
const omitted = inspection.declaredKeys.length - shown.length;
|
|
161
|
+
const names = omitted > 0 ? `${shown.join(', ')}, and ${omitted} more` : shown.join(', ');
|
|
162
|
+
return [
|
|
163
|
+
`[env] ${inspection.envPath} declares ${inspection.declaredKeys.length} variable(s) `
|
|
164
|
+
+ 'and NOT ONE of them is set in this process: '
|
|
165
|
+
+ `${names}.`,
|
|
166
|
+
'[env] The server is running on defaults. Web Push, the database path and the '
|
|
167
|
+
+ 'worktree root are all configured through those variables, so this is very '
|
|
168
|
+
+ 'unlikely to be what you wanted.',
|
|
169
|
+
'[env] Most likely cause (Issue #2132): the server was started by hand after '
|
|
170
|
+
+ '`source scripts/load-env.sh` from a shell that is not bash. That script now '
|
|
171
|
+
+ 'refuses instead of exporting nothing, so re-run it and read what it says.',
|
|
172
|
+
'[env] Supported restart, no rebuild: ./scripts/restart-nobuild.sh '
|
|
173
|
+
+ '(or ./scripts/start.sh --daemon)',
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Report, in one place at startup, that `.env` exists and none of it arrived.
|
|
178
|
+
*
|
|
179
|
+
* Same contract as `runVapidSelfCheck` in `lib/push/vapid.ts`, deliberately:
|
|
180
|
+
* fail-open, never throws, never blocks `listen`, and a healthy install prints
|
|
181
|
+
* NOTHING — which is what makes the presence of a line meaningful.
|
|
182
|
+
*
|
|
183
|
+
* It exists because the failure it names is invisible from inside the process.
|
|
184
|
+
* Every consumer of these variables has a defensible default, so a server that
|
|
185
|
+
* received none of them starts, listens, and answers requests; what it does not
|
|
186
|
+
* do is send a single push notification, and it may open a different database
|
|
187
|
+
* than the one the operator believes they are looking at. During the Epic #2002
|
|
188
|
+
* device UAT the only signal was the VAPID warning, and reading it as "push is
|
|
189
|
+
* broken" rather than "the environment is empty" cost two UAT rounds.
|
|
190
|
+
*
|
|
191
|
+
* @returns The inspection, or `null` when there was nothing to check.
|
|
192
|
+
*/
|
|
193
|
+
function runDotenvSelfCheck(options = {}) {
|
|
194
|
+
const { warn = (message) => console.warn(message) } = options;
|
|
195
|
+
try {
|
|
196
|
+
const inspection = inspectDotenvLoad(options);
|
|
197
|
+
if (!inspection)
|
|
198
|
+
return null;
|
|
199
|
+
for (const line of formatDotenvReportLines(inspection)) {
|
|
200
|
+
warn(line);
|
|
201
|
+
}
|
|
202
|
+
return inspection;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// A diagnostic must never be the reason a server fails to start.
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
87
209
|
// ============================================================
|
|
88
210
|
// [Issue #135] DATABASE_PATH Deprecation Support
|
|
89
211
|
// ============================================================
|