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
|
@@ -19,6 +19,9 @@ exports.stopClaudeSession = stopClaudeSession;
|
|
|
19
19
|
exports.restartClaudeSession = restartClaudeSession;
|
|
20
20
|
const tmux_1 = require("../../lib/tmux/tmux");
|
|
21
21
|
const cli_patterns_1 = require("../../lib/detection/cli-patterns");
|
|
22
|
+
const tool_liveness_1 = require("../../lib/detection/tool-liveness");
|
|
23
|
+
const liveness_spec_1 = require("../../lib/cli-tools/liveness-spec");
|
|
24
|
+
const session_liveness_1 = require("../../lib/cli-tools/session-liveness");
|
|
22
25
|
const session_key_sender_1 = require("../../lib/session-key-sender");
|
|
23
26
|
const child_process_1 = require("child_process");
|
|
24
27
|
const util_1 = require("util");
|
|
@@ -45,22 +48,20 @@ function getErrorMessage(error) {
|
|
|
45
48
|
}
|
|
46
49
|
// ----- Shell Prompt Detection Constants -----
|
|
47
50
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* - '
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* (3) The check is combined with error pattern detection for multiple signals
|
|
51
|
+
* Issue #2070: the shell-prompt endings, the 40-character gate and the
|
|
52
|
+
* error-pattern tail this module used to declare privately are now
|
|
53
|
+
* `SHELL_PROMPT_ENDINGS` / `MAX_SHELL_PROMPT_LENGTH` / `FATAL_PATTERN_TAIL_LINES`
|
|
54
|
+
* in `lib/detection/tool-liveness`, and claude's use of them is
|
|
55
|
+
* `resolveLivenessSpec('claude')`.
|
|
56
|
+
*
|
|
57
|
+
* They moved because the rule they describe was never claude-specific — only
|
|
58
|
+
* these values were. A tmux session that outlives its agent looks the same for
|
|
59
|
+
* codex, copilot, opencode and gemini, and every one of them reported `running`
|
|
60
|
+
* for a pane that had fallen back to the shell, because the only check for it
|
|
61
|
+
* sat behind `cliToolId === 'claude'`. The values themselves are unchanged, and
|
|
62
|
+
* `tests/unit/lib/claude-session.test.ts` still pins every verdict this
|
|
63
|
+
* function reaches.
|
|
62
64
|
*/
|
|
63
|
-
const SHELL_PROMPT_ENDINGS = ['$', '%', '#'];
|
|
64
65
|
// ----- Timeout and Polling Constants (OCP-001) -----
|
|
65
66
|
// These constants are exported to allow configuration and testing.
|
|
66
67
|
// Changing these values affects Claude CLI session startup behavior.
|
|
@@ -160,27 +161,12 @@ exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT = 10000;
|
|
|
160
161
|
*/
|
|
161
162
|
exports.CLAUDE_PROMPT_POLL_INTERVAL = 200;
|
|
162
163
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* false positives from Claude CLI output that happens to end with $, %, or #.
|
|
168
|
-
*
|
|
169
|
-
* Used by isSessionHealthy() to distinguish shell prompts from CLI output.
|
|
170
|
-
* 40 is an empirical threshold with safety margin.
|
|
171
|
-
*/
|
|
172
|
-
const MAX_SHELL_PROMPT_LENGTH = 40;
|
|
173
|
-
/**
|
|
174
|
-
* Number of tail lines used for error pattern detection in isSessionHealthy()
|
|
175
|
-
*
|
|
176
|
-
* Error patterns are only searched within the last N lines of pane output,
|
|
177
|
-
* not the entire buffer. This prevents false negatives where historical
|
|
178
|
-
* (already recovered) errors in the scrollback trigger unhealthy detection.
|
|
179
|
-
*
|
|
180
|
-
* 10 lines provides sufficient window to catch recent errors while ignoring
|
|
181
|
-
* historical ones that have scrolled up.
|
|
164
|
+
* Issue #2070: `MAX_SHELL_PROMPT_LENGTH` and `HEALTH_CHECK_ERROR_TAIL_LINES`
|
|
165
|
+
* moved to `lib/detection/tool-liveness` with the rule that reads them. Their
|
|
166
|
+
* values are unchanged and claude reaches them through
|
|
167
|
+
* `resolveLivenessSpec('claude')`.
|
|
182
168
|
*/
|
|
183
|
-
const
|
|
169
|
+
const CLAUDE_LIVENESS_SPEC = (0, liveness_spec_1.resolveLivenessSpec)('claude');
|
|
184
170
|
/**
|
|
185
171
|
* Cached Claude CLI path
|
|
186
172
|
*/
|
|
@@ -294,30 +280,17 @@ async function getCleanPaneOutput(sessionName, lines = 50) {
|
|
|
294
280
|
* already printed "Claude Code cannot be launched inside another Claude Code
|
|
295
281
|
* session" must not sit there burning the whole budget before saying so.
|
|
296
282
|
*
|
|
297
|
-
* Only the last
|
|
298
|
-
*
|
|
283
|
+
* Only the last `FATAL_PATTERN_TAIL_LINES` lines are searched, so a historical
|
|
284
|
+
* error that has scrolled up cannot condemn a session that recovered.
|
|
285
|
+
*
|
|
286
|
+
* Issue #2070: the search itself is `findFatalPattern`, shared with every other
|
|
287
|
+
* tool's liveness probe; claude's patterns ride in its `ToolLivenessSpec`.
|
|
299
288
|
*
|
|
300
289
|
* @param cleanOutput - ANSI-stripped pane output
|
|
301
290
|
* @returns The matched pattern (or regex source) for the log, or null
|
|
302
291
|
*/
|
|
303
292
|
function findSessionErrorPattern(cleanOutput) {
|
|
304
|
-
|
|
305
|
-
.trim()
|
|
306
|
-
.split('\n')
|
|
307
|
-
.filter((line) => line.trim() !== '');
|
|
308
|
-
const tailText = allLines.slice(-HEALTH_CHECK_ERROR_TAIL_LINES).join('\n');
|
|
309
|
-
// MF-001: Check error patterns from cli-patterns.ts (SRP - pattern management centralized)
|
|
310
|
-
for (const pattern of cli_patterns_1.CLAUDE_SESSION_ERROR_PATTERNS) {
|
|
311
|
-
if (tailText.includes(pattern)) {
|
|
312
|
-
return pattern;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
for (const regex of cli_patterns_1.CLAUDE_SESSION_ERROR_REGEX_PATTERNS) {
|
|
316
|
-
if (regex.test(tailText)) {
|
|
317
|
-
return regex.source;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
return null;
|
|
293
|
+
return (0, tool_liveness_1.findFatalPattern)(cleanOutput, CLAUDE_LIVENESS_SPEC);
|
|
321
294
|
}
|
|
322
295
|
/**
|
|
323
296
|
* Verify that Claude CLI is actually running inside a tmux session
|
|
@@ -327,64 +300,22 @@ function findSessionErrorPattern(cleanOutput) {
|
|
|
327
300
|
* Used by worktrees/route.ts and worktrees/[id]/route.ts for
|
|
328
301
|
* health-aware session status with listSessions() batch optimization.
|
|
329
302
|
*
|
|
303
|
+
* Issue #2070: the algorithm moved to `judgeToolLiveness`, which is the same
|
|
304
|
+
* rule read through claude's `ToolLivenessSpec`. Every branch, every reason
|
|
305
|
+
* string and every ordering decision this function used to spell inline is
|
|
306
|
+
* preserved there — the empty-output verdict, the whole-frame
|
|
307
|
+
* `CLAUDE_PROMPT_PATTERN` check BEFORE the error patterns (so a recovered
|
|
308
|
+
* session is not condemned by scrollback), the 40-character gate, and the
|
|
309
|
+
* `\d+%$` carve-out that keeps `Context left until auto-compact: 7%` from
|
|
310
|
+
* reading as a zsh prompt. What changed is that six other tools can now be
|
|
311
|
+
* asked the same question; see `lib/cli-tools/liveness-spec`.
|
|
312
|
+
*
|
|
330
313
|
* @param sessionName - tmux session name
|
|
331
314
|
* @returns HealthCheckResult with healthy status and optional reason
|
|
332
315
|
*/
|
|
333
316
|
async function isSessionHealthy(sessionName) {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
const cleanOutput = await getCleanPaneOutput(sessionName);
|
|
337
|
-
// MF-002: Check shell prompt endings from extensible array (OCP)
|
|
338
|
-
const trimmed = cleanOutput.trim();
|
|
339
|
-
// S2-F010: Empty output judgment (HealthCheckResult format)
|
|
340
|
-
// C-S2-001: Empty output means tmux session exists but Claude CLI has no output.
|
|
341
|
-
// This is treated as unhealthy because a properly running Claude CLI always
|
|
342
|
-
// produces output (prompt, spinner, or response). An empty pane indicates
|
|
343
|
-
// the CLI process has exited or failed to start.
|
|
344
|
-
if (trimmed === '') {
|
|
345
|
-
return { healthy: false, reason: 'empty output' };
|
|
346
|
-
}
|
|
347
|
-
// Active state detection: check for Claude prompt BEFORE error patterns.
|
|
348
|
-
// This prevents false negatives where historical (recovered) errors in
|
|
349
|
-
// the pane scrollback cause a currently-active session to be marked unhealthy.
|
|
350
|
-
if (cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(trimmed)) {
|
|
351
|
-
return { healthy: true };
|
|
352
|
-
}
|
|
353
|
-
// S2-F010: Error pattern detection - limited to tail lines only.
|
|
354
|
-
// Only the last HEALTH_CHECK_ERROR_TAIL_LINES lines are searched, so
|
|
355
|
-
// historical errors that have scrolled up do not trigger false negatives.
|
|
356
|
-
const allLines = trimmed.split('\n').filter(line => line.trim() !== '');
|
|
357
|
-
const errorPattern = findSessionErrorPattern(trimmed);
|
|
358
|
-
if (errorPattern !== null) {
|
|
359
|
-
return { healthy: false, reason: `error pattern: ${errorPattern}` };
|
|
360
|
-
}
|
|
361
|
-
// S2-F002: Extract last line after empty line filtering
|
|
362
|
-
const lastLine = allLines[allLines.length - 1]?.trim() ?? '';
|
|
363
|
-
// F006: Line length check BEFORE SHELL_PROMPT_ENDINGS check (early return)
|
|
364
|
-
if (lastLine.length >= MAX_SHELL_PROMPT_LENGTH) {
|
|
365
|
-
// Long lines are not shell prompts -> treat as healthy (early return)
|
|
366
|
-
return { healthy: true };
|
|
367
|
-
}
|
|
368
|
-
// F003: Individual pattern exclusions for SHELL_PROMPT_ENDINGS
|
|
369
|
-
// NOTE(F003): If new false positive patterns are found in the future,
|
|
370
|
-
// consider refactoring to a structure that associates exclusionPattern
|
|
371
|
-
// with each SHELL_PROMPT_ENDINGS entry. Currently only % needs exclusion (YAGNI).
|
|
372
|
-
if (SHELL_PROMPT_ENDINGS.some(ending => {
|
|
373
|
-
if (!lastLine.endsWith(ending))
|
|
374
|
-
return false;
|
|
375
|
-
// Exclude N% pattern (e.g., "Context left until auto-compact: 7%")
|
|
376
|
-
if (ending === '%' && /\d+%$/.test(lastLine))
|
|
377
|
-
return false;
|
|
378
|
-
return true;
|
|
379
|
-
})) {
|
|
380
|
-
return { healthy: false, reason: `shell prompt ending detected: ${lastLine}` };
|
|
381
|
-
}
|
|
382
|
-
return { healthy: true };
|
|
383
|
-
}
|
|
384
|
-
catch {
|
|
385
|
-
// S3-F001: Catch block also returns HealthCheckResult format
|
|
386
|
-
return { healthy: false, reason: 'capture error' };
|
|
387
|
-
}
|
|
317
|
+
const verdict = await (0, session_liveness_1.probeSessionLiveness)(sessionName, CLAUDE_LIVENESS_SPEC);
|
|
318
|
+
return verdict.alive ? { healthy: true } : { healthy: false, reason: verdict.reason };
|
|
388
319
|
}
|
|
389
320
|
/**
|
|
390
321
|
* Ensure the existing tmux session has a healthy Claude CLI process
|
|
@@ -7,18 +7,55 @@
|
|
|
7
7
|
* over WebSocket (terminal streaming), keeping the pull (HTTP) and push (WS)
|
|
8
8
|
* paths byte-for-byte consistent (DRY).
|
|
9
9
|
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
10
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
44
|
exports.mergeStructuredStatus = mergeStructuredStatus;
|
|
12
45
|
exports.buildCurrentOutput = buildCurrentOutput;
|
|
46
|
+
exports.resetChatTurnProgressState = resetChatTurnProgressState;
|
|
47
|
+
exports.buildChatTurnProgress = buildChatTurnProgress;
|
|
48
|
+
exports.emitChatTurnProgress = emitChatTurnProgress;
|
|
13
49
|
const db_1 = require("../../lib/db");
|
|
14
50
|
const unclassified_frame_tracker_1 = require("../../lib/detection/unclassified-frame-tracker");
|
|
15
51
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
16
52
|
const upstream_faults_1 = require("../../lib/detection/upstream-faults");
|
|
17
53
|
const opencode_pane_obstruction_1 = require("../../lib/detection/opencode-pane-obstruction");
|
|
54
|
+
const types_1 = require("../../lib/realtime/types");
|
|
18
55
|
const models_1 = require("../../types/models");
|
|
19
56
|
const logger_1 = require("../../lib/logger");
|
|
20
57
|
const manager_1 = require("../../lib/cli-tools/manager");
|
|
21
|
-
const
|
|
58
|
+
const types_2 = require("../../lib/cli-tools/types");
|
|
22
59
|
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
23
60
|
const define_source_1 = require("../../lib/hooks/sources/define-source");
|
|
24
61
|
const subscription_1 = require("../../lib/hooks/sources/opencode/subscription");
|
|
@@ -93,6 +130,44 @@ function describePaneObstruction(obstruction) {
|
|
|
93
130
|
`${JSON.stringify(obstruction.matchedText)}), which covers the marker that ends a ` +
|
|
94
131
|
`turn. Press \`${opencode_pane_obstruction_1.OPENCODE_SIDEBAR_RECOVERY_CHORD}\` in the pane to close it.`);
|
|
95
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Push a history row this module just wrote to the worktree room (Issue #2214).
|
|
135
|
+
*
|
|
136
|
+
* Always `'message'`: both callers INSERT a brand-new row, so nothing has been
|
|
137
|
+
* delivered for it before and the client appends rather than replaces.
|
|
138
|
+
*
|
|
139
|
+
* Detached on purpose, and for two reasons that both matter here:
|
|
140
|
+
*
|
|
141
|
+
* - the `ws-server` import stays dynamic, which is the same bargain
|
|
142
|
+
* {@link emitChatTurnProgress} strikes — this module's *other* callers (the
|
|
143
|
+
* `/current-output` route and the terminal push) must not pull the WebSocket
|
|
144
|
+
* server into their graph just by building a payload;
|
|
145
|
+
* - the row is already committed when this runs, so a socket write can never
|
|
146
|
+
* turn a written row into a failed one. The two record functions below are
|
|
147
|
+
* best-effort by contract and their callers are waiting on a payload.
|
|
148
|
+
*
|
|
149
|
+
* #2214 recorded a limitation here — a route bundle holding its own empty copy
|
|
150
|
+
* of `ws-server`'s `rooms` under `next dev` — and added that "production runs
|
|
151
|
+
* one custom-server bundle and is unaffected". **That last clause was wrong.**
|
|
152
|
+
* `npm run dev` and `npm start` run the *same* custom server (`tsx server.ts`
|
|
153
|
+
* vs `node dist/server/server.js`); what differs is only whether Next evaluates
|
|
154
|
+
* a route handler from a dev compilation or from `.next/server`. Either way the
|
|
155
|
+
* route handler's copy of this module and of `ws-server` is not the custom
|
|
156
|
+
* server's, so this push was silent in production too. #2220 bridged it: the
|
|
157
|
+
* `broadcastMessage` below now reaches the socket owner through
|
|
158
|
+
* `lib/realtime/publisher-registry` regardless of which graph called it.
|
|
159
|
+
*/
|
|
160
|
+
function broadcastRecordedRow(worktreeId, message) {
|
|
161
|
+
void Promise.resolve().then(() => __importStar(require('../../lib/ws-server'))).then(({ broadcastMessage }) => {
|
|
162
|
+
broadcastMessage('message', { worktreeId, message });
|
|
163
|
+
})
|
|
164
|
+
.catch((error) => {
|
|
165
|
+
logger.warn('history-row-broadcast-failed', {
|
|
166
|
+
worktreeId,
|
|
167
|
+
error: error instanceof Error ? error.message : String(error),
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
96
171
|
function recordUnclassifiedFrame(db, params) {
|
|
97
172
|
const dwellSeconds = Math.round(params.dwellMs / 1000);
|
|
98
173
|
const statusReason = `${params.sessionStatus}/${params.sessionStatusReason}`;
|
|
@@ -114,7 +189,7 @@ function recordUnclassifiedFrame(db, params) {
|
|
|
114
189
|
sessionStatusReason: statusReason,
|
|
115
190
|
};
|
|
116
191
|
try {
|
|
117
|
-
(0, db_1.createMessage)(db, {
|
|
192
|
+
const message = (0, db_1.createMessage)(db, {
|
|
118
193
|
worktreeId: params.worktreeId,
|
|
119
194
|
role: 'assistant',
|
|
120
195
|
content: question,
|
|
@@ -133,6 +208,10 @@ function recordUnclassifiedFrame(db, params) {
|
|
|
133
208
|
dwellSeconds,
|
|
134
209
|
statusReason,
|
|
135
210
|
});
|
|
211
|
+
// `cliToolId` / `instanceId` are already the explicit values passed above —
|
|
212
|
+
// `createMessage` hands back the caller's own object — so the published row
|
|
213
|
+
// addresses the same instance the column does.
|
|
214
|
+
broadcastRecordedRow(params.worktreeId, message);
|
|
136
215
|
}
|
|
137
216
|
catch (error) {
|
|
138
217
|
logger.warn('unclassified-frame-record-failed', {
|
|
@@ -166,7 +245,7 @@ function recordUnclassifiedFrame(db, params) {
|
|
|
166
245
|
function recordStructuredPrompt(db, params) {
|
|
167
246
|
const record = (0, structured_prompt_1.buildStructuredPromptHistoryRecord)(params.worktreeId, params.facts);
|
|
168
247
|
try {
|
|
169
|
-
(0, db_1.createMessage)(db, {
|
|
248
|
+
const message = (0, db_1.createMessage)(db, {
|
|
170
249
|
worktreeId: params.worktreeId,
|
|
171
250
|
role: 'assistant',
|
|
172
251
|
content: record.question,
|
|
@@ -187,6 +266,7 @@ function recordStructuredPrompt(db, params) {
|
|
|
187
266
|
source: params.state.source,
|
|
188
267
|
toolName: params.state.toolName,
|
|
189
268
|
});
|
|
269
|
+
broadcastRecordedRow(params.worktreeId, message);
|
|
190
270
|
}
|
|
191
271
|
catch (error) {
|
|
192
272
|
logger.warn('structured-prompt-record-failed', {
|
|
@@ -371,6 +451,17 @@ function hookClosedTurn(turn) {
|
|
|
371
451
|
*/
|
|
372
452
|
async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId, resolution) {
|
|
373
453
|
const payload = await buildPayload(db, worktreeId, cliToolId, instanceId);
|
|
454
|
+
// Issue #2199. Fire-and-forget, and placed HERE rather than in the poller for
|
|
455
|
+
// one reason: this is the function both live paths run through. The WebSocket
|
|
456
|
+
// push calls it from `broadcastTerminalSnapshot` on every generating poller
|
|
457
|
+
// tick, and the HTTP `/current-output` poll calls it at the same cadence when
|
|
458
|
+
// the push is down — so the progress frames appear at whatever rate the
|
|
459
|
+
// surface is actually being watched at, which is exactly the property the
|
|
460
|
+
// terminal snapshot already has. Gated on the merged verdict (`'running'`, not
|
|
461
|
+
// the tmux-session-exists `isRunning`) so an idle pane reads no transcript.
|
|
462
|
+
if (payload.isRunning && payload.sessionStatus === 'running') {
|
|
463
|
+
void publishChatTurnProgress(db, worktreeId, cliToolId, instanceId);
|
|
464
|
+
}
|
|
374
465
|
if (!resolution)
|
|
375
466
|
return payload;
|
|
376
467
|
return {
|
|
@@ -573,7 +664,7 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
573
664
|
// value is the pane height, `slice()` starts past the last row, and `content`
|
|
574
665
|
// — the field `commandmate capture <id>` prints — was an empty string.
|
|
575
666
|
// `capturedLineCountIsCursor` states both conditions in one place.
|
|
576
|
-
const lineCountIsCursor = (0,
|
|
667
|
+
const lineCountIsCursor = (0, types_2.capturedLineCountIsCursor)(cliToolId, captureWindowSaturated);
|
|
577
668
|
const newLines = lineCountIsCursor ? lines.slice(Math.max(0, lastCapturedLine)) : lines;
|
|
578
669
|
const newContent = newLines.join('\n');
|
|
579
670
|
const compositeKey = (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
@@ -946,3 +1037,171 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
946
1037
|
composerState: composer.state,
|
|
947
1038
|
};
|
|
948
1039
|
}
|
|
1040
|
+
/**
|
|
1041
|
+
* On `globalThis` for the reason every shared map in this subsystem is (#1736):
|
|
1042
|
+
* under `next dev` the poller's bundle and the opencode subscription's bundle
|
|
1043
|
+
* would each get a private copy, and two producers throttling against two
|
|
1044
|
+
* different maps is no throttle at all.
|
|
1045
|
+
*/
|
|
1046
|
+
const chatTurnProgressState = (globalThis.__chatTurnProgressState ??= new Map());
|
|
1047
|
+
function chatTurnProgressKey(target) {
|
|
1048
|
+
return `${target.worktreeId}:${target.cliToolId}:${target.instanceId ?? target.cliToolId}`;
|
|
1049
|
+
}
|
|
1050
|
+
/** Forget every instance's progress bookkeeping. Test seam. */
|
|
1051
|
+
function resetChatTurnProgressState() {
|
|
1052
|
+
chatTurnProgressState.clear();
|
|
1053
|
+
}
|
|
1054
|
+
/**
|
|
1055
|
+
* Decide whether this instance has a new progress frame, and build it.
|
|
1056
|
+
*
|
|
1057
|
+
* The single generator both tools go through, on the same argument
|
|
1058
|
+
* {@link buildCurrentOutput} makes for the terminal payload: two producers of one
|
|
1059
|
+
* wire shape drift, and the drift is invisible because each of them is
|
|
1060
|
+
* individually correct. Three rules, in this order, and each of them is a way
|
|
1061
|
+
* this feature goes wrong if it is missing:
|
|
1062
|
+
*
|
|
1063
|
+
* 1. **Throttle.** At most one *ask* per {@link CHAT_TURN_PROGRESS_MIN_INTERVAL_MS}
|
|
1064
|
+
* per instance. It gates the ask rather than the send because the source is
|
|
1065
|
+
* the expensive half (see {@link ChatTurnProgressSource}); a gate on the send
|
|
1066
|
+
* alone would re-read a 4 MiB transcript to discover it had not changed.
|
|
1067
|
+
* 2. **No-change suppression.** Same turn, same body → no frame. A reply that
|
|
1068
|
+
* has stopped growing must not keep waking every subscribed browser.
|
|
1069
|
+
* 3. **Monotonic version**, per instance and NOT per turn. A client drops
|
|
1070
|
+
* anything at or below what it has already rendered, and restarting the
|
|
1071
|
+
* counter on a new turn would make the first frame of turn N+1 look stale
|
|
1072
|
+
* against the last frame of turn N.
|
|
1073
|
+
*
|
|
1074
|
+
* The body is bounded by {@link truncateChatTurnProgressBody}, whose cut is
|
|
1075
|
+
* folded into `partial` together with the reader's own — see
|
|
1076
|
+
* {@link ChatTurnProgressEvent.partial} for why one flag answers both.
|
|
1077
|
+
*
|
|
1078
|
+
* Never throws: a source that throws is a turn with nothing to show, not a
|
|
1079
|
+
* broken poll tick.
|
|
1080
|
+
*
|
|
1081
|
+
* @param target - The instance
|
|
1082
|
+
* @param source - Asked only when the throttle allows it
|
|
1083
|
+
* @param now - Epoch ms; injected by the tests
|
|
1084
|
+
* @returns The frame to broadcast, or null when there is nothing new to say
|
|
1085
|
+
*/
|
|
1086
|
+
async function buildChatTurnProgress(target, source, now = Date.now()) {
|
|
1087
|
+
const key = chatTurnProgressKey(target);
|
|
1088
|
+
const state = chatTurnProgressState.get(key) ?? {
|
|
1089
|
+
version: 0,
|
|
1090
|
+
askedAt: Number.NEGATIVE_INFINITY,
|
|
1091
|
+
turnKey: null,
|
|
1092
|
+
body: null,
|
|
1093
|
+
};
|
|
1094
|
+
if (now - state.askedAt < types_1.CHAT_TURN_PROGRESS_MIN_INTERVAL_MS)
|
|
1095
|
+
return null;
|
|
1096
|
+
state.askedAt = now;
|
|
1097
|
+
chatTurnProgressState.set(key, state);
|
|
1098
|
+
let draft;
|
|
1099
|
+
try {
|
|
1100
|
+
draft = await source();
|
|
1101
|
+
}
|
|
1102
|
+
catch {
|
|
1103
|
+
// The readers already promise never to throw; this is the belt for the
|
|
1104
|
+
// dynamic import that reaches them.
|
|
1105
|
+
return null;
|
|
1106
|
+
}
|
|
1107
|
+
if (!draft || draft.body.length === 0)
|
|
1108
|
+
return null;
|
|
1109
|
+
const bounded = (0, types_1.truncateChatTurnProgressBody)(draft.body);
|
|
1110
|
+
if (draft.turnKey === state.turnKey && bounded.body === state.body)
|
|
1111
|
+
return null;
|
|
1112
|
+
state.turnKey = draft.turnKey;
|
|
1113
|
+
state.body = bounded.body;
|
|
1114
|
+
state.version += 1;
|
|
1115
|
+
return {
|
|
1116
|
+
type: types_1.CHAT_TURN_PROGRESS_EVENT_TYPE,
|
|
1117
|
+
worktreeId: target.worktreeId,
|
|
1118
|
+
cliToolId: target.cliToolId,
|
|
1119
|
+
instanceId: target.instanceId ?? target.cliToolId,
|
|
1120
|
+
turnKey: draft.turnKey,
|
|
1121
|
+
body: bounded.body,
|
|
1122
|
+
partial: bounded.truncated || draft.partial === true,
|
|
1123
|
+
version: state.version,
|
|
1124
|
+
done: false,
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
/**
|
|
1128
|
+
* Build a progress frame and push it to the worktree room.
|
|
1129
|
+
*
|
|
1130
|
+
* Subscribers are checked FIRST, before the throttle state is touched and long
|
|
1131
|
+
* before the source is asked, so a session nobody is watching costs one map
|
|
1132
|
+
* lookup per tick — the same bargain `broadcastTerminalSnapshot` strikes, and
|
|
1133
|
+
* the reason a 4 MiB transcript read does not happen for every claude session on
|
|
1134
|
+
* the machine.
|
|
1135
|
+
*
|
|
1136
|
+
* The `ws-server` import is dynamic so this module's *other* callers — the
|
|
1137
|
+
* `/current-output` route and `commandmate capture` — do not pull the WebSocket
|
|
1138
|
+
* server into their graph just by building a payload.
|
|
1139
|
+
*
|
|
1140
|
+
* Never throws; a failed push is a moment of staleness on a surface that has the
|
|
1141
|
+
* settled row coming anyway.
|
|
1142
|
+
*
|
|
1143
|
+
* @returns Whether a frame was broadcast
|
|
1144
|
+
*/
|
|
1145
|
+
async function emitChatTurnProgress(target, source, now = Date.now()) {
|
|
1146
|
+
try {
|
|
1147
|
+
const { broadcast, hasRoomSubscribers } = await Promise.resolve().then(() => __importStar(require('../../lib/ws-server')));
|
|
1148
|
+
if (!hasRoomSubscribers(target.worktreeId))
|
|
1149
|
+
return false;
|
|
1150
|
+
const event = await buildChatTurnProgress(target, source, now);
|
|
1151
|
+
if (!event)
|
|
1152
|
+
return false;
|
|
1153
|
+
broadcast(target.worktreeId, event);
|
|
1154
|
+
return true;
|
|
1155
|
+
}
|
|
1156
|
+
catch (error) {
|
|
1157
|
+
logger.debug('chat-turn-progress-failed', {
|
|
1158
|
+
worktreeId: target.worktreeId,
|
|
1159
|
+
cliToolId: target.cliToolId,
|
|
1160
|
+
instanceId: target.instanceId ?? target.cliToolId,
|
|
1161
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1162
|
+
});
|
|
1163
|
+
return false;
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
/**
|
|
1167
|
+
* Ask the tool that has a transcript for the body of its open turn (Issue #2199).
|
|
1168
|
+
*
|
|
1169
|
+
* claude only, and that is a statement about which tools have a *pull* reader
|
|
1170
|
+
* rather than a list to extend by hand. opencode's body arrives on its own SSE
|
|
1171
|
+
* stream and is published from `sources/opencode/history` at the moment a part
|
|
1172
|
+
* lands — polling for it here would be a second producer of the same frames.
|
|
1173
|
+
* codex and antigravity have neither, and stay on the indicator (#2197 / #2198).
|
|
1174
|
+
*
|
|
1175
|
+
* The reader is imported dynamically so `sources/claude/history` — and through
|
|
1176
|
+
* it `fs/promises`, the session-pointer latch and `user-turn-recorder` — stays
|
|
1177
|
+
* out of the module graph of the `/current-output` route and of `commandmate
|
|
1178
|
+
* capture`, both of which reach this file for a payload and nothing else.
|
|
1179
|
+
*
|
|
1180
|
+
* Never throws: `emitChatTurnProgress` swallows, and so does this.
|
|
1181
|
+
*/
|
|
1182
|
+
async function publishChatTurnProgress(db, worktreeId, cliToolId, instanceId) {
|
|
1183
|
+
if (cliToolId !== 'claude')
|
|
1184
|
+
return;
|
|
1185
|
+
try {
|
|
1186
|
+
// The slug the transcript directory is named after is a function of the
|
|
1187
|
+
// worktree's path, so the row is what makes the file findable at all. Read
|
|
1188
|
+
// before the throttle only because it is a single indexed lookup against a
|
|
1189
|
+
// connection this function was handed; everything expensive is behind the
|
|
1190
|
+
// gate.
|
|
1191
|
+
const { getWorktreeById } = await Promise.resolve().then(() => __importStar(require('../../lib/db/worktree-db')));
|
|
1192
|
+
const worktreePath = getWorktreeById(db, worktreeId)?.path;
|
|
1193
|
+
if (!worktreePath)
|
|
1194
|
+
return;
|
|
1195
|
+
await emitChatTurnProgress({ worktreeId, cliToolId, instanceId }, async () => {
|
|
1196
|
+
const { readClaudeTurnProgress } = await Promise.resolve().then(() => __importStar(require('../../lib/hooks/sources/claude/history')));
|
|
1197
|
+
return readClaudeTurnProgress({ worktreeId, cliToolId, instanceId: instanceId ?? cliToolId }, { worktreePath });
|
|
1198
|
+
});
|
|
1199
|
+
}
|
|
1200
|
+
catch (error) {
|
|
1201
|
+
logger.debug('chat-turn-progress-claude-failed', {
|
|
1202
|
+
worktreeId,
|
|
1203
|
+
instanceId: instanceId ?? cliToolId,
|
|
1204
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1205
|
+
});
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
@@ -14,7 +14,13 @@
|
|
|
14
14
|
* 3. copilot /model command — Issue #576 (copilot only)
|
|
15
15
|
* 4. send to CLI tool — image branch / ICLITool.sendMessage
|
|
16
16
|
* 5. createMessage (role: 'user') — INSERT INTO chat_messages (History source)
|
|
17
|
+
* 5b. broadcastMessage('message') — Issue #2195, push the user row to every
|
|
18
|
+
* open pane (the send that produced it is
|
|
19
|
+
* not necessarily on this device)
|
|
17
20
|
* 6. orphan deletion — remove prior duplicate after persist
|
|
21
|
+
* 6b. broadcastMessage( — Issue #2219, tell every open pane for
|
|
22
|
+
* 'messages_invalidated') this instance to re-read its history:
|
|
23
|
+
* a delete has no row to publish
|
|
18
24
|
* 7. updateLastUserMessage
|
|
19
25
|
* 8. clearInProgressMessageId
|
|
20
26
|
* 9. startPolling — record the assistant response afterwards
|
|
@@ -30,6 +36,8 @@ const manager_1 = require("../../lib/cli-tools/manager");
|
|
|
30
36
|
const types_1 = require("../../lib/cli-tools/types");
|
|
31
37
|
const response_poller_1 = require("../../lib/polling/response-poller");
|
|
32
38
|
const assistant_response_saver_1 = require("../../lib/assistant-response-saver");
|
|
39
|
+
const ws_server_1 = require("../../lib/ws-server");
|
|
40
|
+
const types_2 = require("../../lib/realtime/types");
|
|
33
41
|
const logger_1 = require("../../lib/logger");
|
|
34
42
|
const prompt_waiting_guard_1 = require("../../lib/session/prompt-waiting-guard");
|
|
35
43
|
const opencode_1 = require("../../lib/cli-tools/opencode");
|
|
@@ -47,6 +55,14 @@ function getErrorMessage(error) {
|
|
|
47
55
|
async function sendUserMessage(db, params) {
|
|
48
56
|
const { worktreeId, content, cliToolId, instanceId, absoluteImagePath, copilotModel } = params;
|
|
49
57
|
const messageType = params.messageType ?? 'normal';
|
|
58
|
+
/**
|
|
59
|
+
* The instance this send belongs to, resolved the way `createMessage` and
|
|
60
|
+
* `mapChatMessage` resolve it (Issue #868: the primary instance's id *is* the
|
|
61
|
+
* tool's id). Callers omit `instanceId` for the primary instance — the UI and
|
|
62
|
+
* the send API both do — so every scope decision below has to resolve it
|
|
63
|
+
* first or it is not scoped at all.
|
|
64
|
+
*/
|
|
65
|
+
const resolvedInstanceId = instanceId ?? cliToolId;
|
|
50
66
|
const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
|
|
51
67
|
// Issue #1708: refuse before the first side effect. A prompt dialog does not
|
|
52
68
|
// forward keystrokes to the agent — they accumulate in its own input line — so
|
|
@@ -94,12 +110,31 @@ async function sendUserMessage(db, params) {
|
|
|
94
110
|
logger.error('failed-to-save-pending-assistant-response:', { error: getErrorMessage(error) });
|
|
95
111
|
}
|
|
96
112
|
// 2. Clean up orphaned user messages (Issue #379: duplicate message prevention).
|
|
97
|
-
// If the most recent message for
|
|
113
|
+
// If the most recent message for THIS INSTANCE is a user message with the same
|
|
98
114
|
// content, the assistant never responded and the user is retrying. Remove it
|
|
99
115
|
// (only after the retry message is persisted) to prevent duplicates.
|
|
116
|
+
//
|
|
117
|
+
// Issue #2219: the scope is `resolvedInstanceId`, not the caller's raw
|
|
118
|
+
// `instanceId`. `getMessages` filters on the instance *or* the tool, never
|
|
119
|
+
// both, so passing an omitted `instanceId` through fell back to the tool
|
|
120
|
+
// filter and made this search read the newest row of **every instance of that
|
|
121
|
+
// tool**. A primary-instance re-send whose text matched `claude-2`'s last user
|
|
122
|
+
// row therefore deleted a row belonging to another session — data loss, not a
|
|
123
|
+
// display delay, and invisible because the delete is best-effort and silent.
|
|
124
|
+
//
|
|
125
|
+
// `matchResolvedInstance` is what makes the fix safe rather than merely
|
|
126
|
+
// narrow: a bare `instance_id = ?` would hide every pre-#868 row (they carry
|
|
127
|
+
// NULL and read back as the primary instance), so the orphan they are would
|
|
128
|
+
// survive as a visible duplicate. Same expression as #2196's
|
|
129
|
+
// `findUnkeyedUserMessages`.
|
|
100
130
|
let orphanedMessageIdToDelete = null;
|
|
101
131
|
try {
|
|
102
|
-
const recentMessages = (0, db_1.getMessages)(db, worktreeId, {
|
|
132
|
+
const recentMessages = (0, db_1.getMessages)(db, worktreeId, {
|
|
133
|
+
limit: 1,
|
|
134
|
+
cliToolId,
|
|
135
|
+
instanceId: resolvedInstanceId,
|
|
136
|
+
matchResolvedInstance: true,
|
|
137
|
+
});
|
|
103
138
|
if (recentMessages.length > 0 &&
|
|
104
139
|
recentMessages[0].role === 'user' &&
|
|
105
140
|
recentMessages[0].content === content) {
|
|
@@ -169,6 +204,31 @@ async function sendUserMessage(db, params) {
|
|
|
169
204
|
cliToolId,
|
|
170
205
|
instanceId,
|
|
171
206
|
});
|
|
207
|
+
// 5b. Broadcast the user row (Issue #2195).
|
|
208
|
+
//
|
|
209
|
+
// Every other history writer already does this; this one did not, so a second
|
|
210
|
+
// device (or a second pane on the same device) saw a message it did not send
|
|
211
|
+
// only on its next poll — and #2195 stretches that poll to 15s while a socket
|
|
212
|
+
// is up, which would have made the omission three times as visible.
|
|
213
|
+
//
|
|
214
|
+
// `createMessage` hands back the caller's own object rather than re-reading
|
|
215
|
+
// the row, so `instanceId` here would be `undefined` whenever the caller
|
|
216
|
+
// omitted it. It is resolved to the primary instance (=== cliToolId) exactly
|
|
217
|
+
// as `createMessage` resolves it for the column, so the client's
|
|
218
|
+
// (worktreeId, cliToolId, instanceId) match cannot miss.
|
|
219
|
+
//
|
|
220
|
+
// Wrapped because the message is already sent and already persisted by this
|
|
221
|
+
// point: a socket write that throws must not turn a successful send into a
|
|
222
|
+
// failure the caller reports to the user.
|
|
223
|
+
try {
|
|
224
|
+
(0, ws_server_1.broadcastMessage)('message', {
|
|
225
|
+
worktreeId,
|
|
226
|
+
message: { ...message, cliToolId, instanceId: resolvedInstanceId },
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
logger.warn('user-message-broadcast-failed', { error: getErrorMessage(error) });
|
|
231
|
+
}
|
|
172
232
|
// 6. Remove the prior orphan only after the retry message is persisted.
|
|
173
233
|
// This avoids data loss if send/create fails partway through.
|
|
174
234
|
if (orphanedMessageIdToDelete) {
|
|
@@ -176,6 +236,34 @@ async function sendUserMessage(db, params) {
|
|
|
176
236
|
const deleted = (0, db_1.deleteMessageById)(db, orphanedMessageIdToDelete);
|
|
177
237
|
if (deleted) {
|
|
178
238
|
logger.info('cleaned-up-orphaned-user');
|
|
239
|
+
// 6b. Issue #2219: publish the delete.
|
|
240
|
+
//
|
|
241
|
+
// The `message` frame above told every pane about the row that was
|
|
242
|
+
// added; nothing told them about the row that went away, because the
|
|
243
|
+
// event contract has no shape for a deletion — `message_updated` can
|
|
244
|
+
// only say what a row now looks like. A second device therefore kept
|
|
245
|
+
// showing the old copy next to the new one until its own poll, which
|
|
246
|
+
// #2195 demoted to a 15s fallback while a socket is up.
|
|
247
|
+
//
|
|
248
|
+
// A scope rather than an id: the receiver re-reads its history, so it
|
|
249
|
+
// lands on the settled DB state and a `message` frame that was dropped
|
|
250
|
+
// on the way is repaired by the same round trip. See
|
|
251
|
+
// MESSAGES_INVALIDATED_EVENT_TYPE.
|
|
252
|
+
//
|
|
253
|
+
// Wrapped separately from the delete: the row is already gone by now,
|
|
254
|
+
// and #379's cleanup has always been best-effort — a socket write that
|
|
255
|
+
// throws must not turn a completed send into a reported failure.
|
|
256
|
+
try {
|
|
257
|
+
(0, ws_server_1.broadcastMessage)(types_2.MESSAGES_INVALIDATED_EVENT_TYPE, {
|
|
258
|
+
worktreeId,
|
|
259
|
+
cliToolId,
|
|
260
|
+
instanceId: resolvedInstanceId,
|
|
261
|
+
reason: 'orphan_cleanup',
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
logger.warn('orphan-cleanup-broadcast-failed', { error: getErrorMessage(error) });
|
|
266
|
+
}
|
|
179
267
|
}
|
|
180
268
|
}
|
|
181
269
|
catch (error) {
|