commandmate 0.18.0 → 0.20.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 +230 -223
- package/.next/app-path-routes-manifest.json +32 -32
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +5 -3
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +1 -1
- 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.js +1 -1
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route.js +1 -1
- package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/status/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 +2 -2
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js +2 -2
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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.js +1 -1
- package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
- package/.next/server/app/api/ollama/models/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 +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.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/sidebar/group-order/route.js +2 -2
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +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 +2 -2
- 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 +2 -2
- 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]/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 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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]/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 +6 -6
- 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]/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]/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 +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +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/route.js +2 -2
- 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]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +4 -4
- 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/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.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/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/apple-icon.png/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/icon.png/route.js +1 -1
- package/.next/server/app/icon.png/route.js.nft.json +1 -1
- package/.next/server/app/icon1.png/route.js +1 -1
- package/.next/server/app/icon1.png/route.js.nft.json +1 -1
- package/.next/server/app/icon2.png/route.js +1 -1
- package/.next/server/app/icon2.png/route.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +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 +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +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 +8 -8
- 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 +32 -32
- package/.next/server/chunks/1029.js +1 -0
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1598.js +4 -0
- package/.next/server/chunks/3042.js +1 -1
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3451.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3753.js +23 -23
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/406.js +5 -5
- package/.next/server/chunks/{1185.js → 5048.js} +1 -1
- package/.next/server/chunks/5959.js +3 -3
- package/.next/server/chunks/{5381.js → 5998.js} +2 -2
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +6 -5
- package/.next/server/chunks/6283.js +1 -1
- package/.next/server/chunks/6401.js +1 -0
- package/.next/server/chunks/641.js +1 -0
- package/.next/server/chunks/8536.js +1 -0
- package/.next/server/chunks/8543.js +1 -0
- package/.next/server/chunks/8807.js +397 -378
- package/.next/server/chunks/8856.js +2 -2
- package/.next/server/chunks/9058.js +1 -0
- package/.next/server/chunks/9067.js +1 -0
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- 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/chunks/{6488-109e3825c7249e47.js → 6488-3e7539550c3ef358.js} +1 -1
- package/.next/static/chunks/744-fa8c0ae444c8338c.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/skills/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/templates/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-5bdd550ed6386f57.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-214ee8b97dca856b.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/README.md +10 -1
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +12 -4
- package/dist/cli/commands/capture.d.ts +1 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +115 -4
- package/dist/cli/commands/instances.d.ts +24 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +44 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +9 -3
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +13 -4
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +24 -14
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +66 -0
- package/dist/cli/commands/wait.d.ts +4 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +82 -7
- package/dist/cli/config/agent-target-options.d.ts +46 -0
- package/dist/cli/config/agent-target-options.d.ts.map +1 -0
- package/dist/cli/config/agent-target-options.js +54 -0
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +47 -14
- package/dist/cli/types/index.d.ts +16 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +4 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +43 -5
- package/dist/cli/utils/npm-runner.d.ts +24 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +51 -1
- package/dist/cli/utils/pager.d.ts +28 -0
- package/dist/cli/utils/pager.d.ts.map +1 -0
- package/dist/cli/utils/pager.js +57 -0
- package/dist/cli/utils/pid-manager.d.ts +12 -2
- package/dist/cli/utils/pid-manager.d.ts.map +1 -1
- package/dist/cli/utils/pid-manager.js +76 -13
- package/dist/lib/detection/ansi.d.ts +30 -0
- package/dist/lib/detection/ansi.d.ts.map +1 -0
- package/dist/lib/detection/ansi.js +39 -0
- package/dist/lib/tmux/transcript-squeeze.d.ts +76 -0
- package/dist/lib/tmux/transcript-squeeze.d.ts.map +1 -0
- package/dist/lib/tmux/transcript-squeeze.js +96 -0
- package/dist/server/server.js +125 -14
- package/dist/server/src/config/tmux-pane-config.js +33 -1
- package/dist/server/src/lib/auto-yes-state.js +64 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/copilot.js +2 -2
- package/dist/server/src/lib/cli-tools/gemini.js +2 -2
- package/dist/server/src/lib/cli-tools/opencode.js +2 -2
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
- package/dist/server/src/lib/db/agent-instances-db.js +53 -0
- package/dist/server/src/lib/db/db-repository.js +66 -2
- package/dist/server/src/lib/db/db.js +12 -3
- package/dist/server/src/lib/db/migrations/index.js +8 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v52-orphaned-worktree-children.js +76 -0
- package/dist/server/src/lib/db/migrations/v53-worktree-aliases.js +53 -0
- package/dist/server/src/lib/db/migrations/v54-worktree-id-path-derived.js +204 -0
- package/dist/server/src/lib/db/migrations/v55-compact-churned-worktree-ids.js +207 -0
- package/dist/server/src/lib/db/migrations/worktree-child-tables.js +119 -0
- package/dist/server/src/lib/db/migrations/worktree-id-rename.js +153 -0
- package/dist/server/src/lib/db/worktree-alias-db.js +155 -0
- package/dist/server/src/lib/db/worktree-db.js +82 -77
- package/dist/server/src/lib/detection/cli-patterns.js +109 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +10 -1
- package/dist/server/src/lib/detection/status-detector.js +52 -2
- package/dist/server/src/lib/git/worktree-id.js +145 -0
- package/dist/server/src/lib/git/worktree-redirect.js +155 -0
- package/dist/server/src/lib/git/worktrees.js +173 -27
- package/dist/server/src/lib/logger.js +13 -1
- package/dist/server/src/lib/polling/auto-yes-manager.js +3 -1
- package/dist/server/src/lib/polling/prompt-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-checker.js +53 -13
- package/dist/server/src/lib/polling/response-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-poller-core.js +107 -0
- package/dist/server/src/lib/polling/response-poller.js +4 -1
- package/dist/server/src/lib/response-extractor.js +22 -2
- package/dist/server/src/lib/session/claude-session.js +121 -37
- package/dist/server/src/lib/session/current-output-builder.js +14 -1
- package/dist/server/src/lib/session/session-start-error.js +125 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +603 -0
- package/dist/server/src/lib/tasks/contract-parser.js +17 -1
- package/dist/server/src/lib/tasks/task-state-machine.js +23 -1
- package/dist/server/src/lib/tmux/control-mode-tmux-transport.js +7 -0
- package/dist/server/src/lib/tmux/read-mode-pager.js +161 -0
- package/dist/server/src/lib/tmux/read-mode.js +347 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +33 -0
- package/dist/server/src/lib/tmux/tmux-control-client.js +12 -0
- package/dist/server/src/lib/tmux/tmux-control-registry.js +55 -11
- package/dist/server/src/lib/tmux/tmux.js +104 -5
- package/dist/server/src/lib/ws-server.js +104 -1
- package/package.json +1 -1
- package/.next/server/chunks/1117.js +0 -1
- package/.next/server/chunks/1356.js +0 -4
- package/.next/server/chunks/1692.js +0 -1
- package/.next/server/chunks/4018.js +0 -1
- package/.next/server/chunks/4390.js +0 -1
- package/.next/server/chunks/8681.js +0 -1
- package/.next/static/chunks/744-d5e47fe16e7b9e06.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-12b3c5f32fc6094e.js +0 -1
- /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_buildManifest.js +0 -0
- /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Make everything that is keyed on a worktree ID *outside* the database follow
|
|
4
|
+
* that ID when it moves (Issue #1621, Phase 3).
|
|
5
|
+
*
|
|
6
|
+
* `migrateWorktreeIdPreservingChildren` already moves the rows. What it cannot
|
|
7
|
+
* touch is the state that lives beyond SQLite and is derived from the ID rather
|
|
8
|
+
* than stored:
|
|
9
|
+
*
|
|
10
|
+
* - tmux session names — `mcbd-{cli}-{worktreeId}[-{suffix}]` is a *derived*
|
|
11
|
+
* value (`cli-tools/base.ts`), so the running agent keeps its process but
|
|
12
|
+
* vanishes from the UI, and the app will happily start a **second** agent in
|
|
13
|
+
* the same directory (Issue #1621 (a));
|
|
14
|
+
* - Auto-Yes state, response pollers, control-mode attaches and WebSocket rooms
|
|
15
|
+
* — all keyed by worktree ID in process memory (Issue #1621 (f)).
|
|
16
|
+
*
|
|
17
|
+
* Dropping any one of those produces the same hard-to-diagnose failure: the
|
|
18
|
+
* session is alive, the UI looks fine, and instructions silently stop arriving.
|
|
19
|
+
* So every mover here **transfers** its key rather than invalidating it.
|
|
20
|
+
*
|
|
21
|
+
* Written for the bulk renumbering in Phase 4, but deliberately not specific to
|
|
22
|
+
* it: it takes (oldId, newId) pairs and is equally the right call for a future
|
|
23
|
+
* directory move.
|
|
24
|
+
*
|
|
25
|
+
* ## Why the operation is batched and two-staged
|
|
26
|
+
*
|
|
27
|
+
* A renumbering moves every ID at once, so one worktree's NEW name can be
|
|
28
|
+
* another worktree's OLD name — the design's own example is that
|
|
29
|
+
* `commandmate-main` is the new ID of the directory currently registered as
|
|
30
|
+
* `mycodebranchdesk-main`. Renaming pairwise in any order eventually hits
|
|
31
|
+
* "duplicate session: …" and, worse, an A→B / B→A swap has no valid order at
|
|
32
|
+
* all. Every rename therefore goes through a temporary name first, and the
|
|
33
|
+
* in-memory movers each detach the whole batch before writing any of it.
|
|
34
|
+
*
|
|
35
|
+
* ## Why targets come from the roster, never from `tmux ls | grep`
|
|
36
|
+
*
|
|
37
|
+
* `mcbd-claude-<wt>` is a prefix of `mcbd-claude-<wt>-2`, so anything
|
|
38
|
+
* prefix-based sweeps up a different instance's session (Issue #1156). Targets
|
|
39
|
+
* are built from `agent_instances` × the CLI tool registry and matched by exact
|
|
40
|
+
* string equality against the live session list; the tmux operations themselves
|
|
41
|
+
* go through `exactTarget()`.
|
|
42
|
+
*
|
|
43
|
+
* ## …and why prediction alone is not enough (Issue #1661)
|
|
44
|
+
*
|
|
45
|
+
* Predicting names can only find sessions whose name the prediction happens to
|
|
46
|
+
* reproduce. Anything else is not "skipped" — it is never enumerated, so it
|
|
47
|
+
* cannot be counted, and a pass that left two live sessions stranded reported
|
|
48
|
+
* `skipped: 0, errors: 0`. Two shapes escape prediction, and both are ordinary
|
|
49
|
+
* in a database that has been through a renumbering:
|
|
50
|
+
*
|
|
51
|
+
* - an additional instance (`mcbd-claude-<wt>-2`) whose `agent_instances` row
|
|
52
|
+
* was never written or has since been removed — 45 of 70 worktrees in the
|
|
53
|
+
* production database carry no roster rows at all;
|
|
54
|
+
* - a session whose name embeds an ID *generation* older than the one the
|
|
55
|
+
* rename pair names, because it missed an earlier move.
|
|
56
|
+
*
|
|
57
|
+
* So the live session list is also read the other way round: each live name is
|
|
58
|
+
* attributed to a worktree ID by matching against the **exact set of IDs the
|
|
59
|
+
* database knows** (`worktrees` ∪ `worktree_aliases.old_id` ∪ this pass's
|
|
60
|
+
* pairs), longest ID first. That is set membership, not a prefix sweep: when
|
|
61
|
+
* `<wt>-2` is itself a registered worktree, `mcbd-claude-<wt>-2` resolves to
|
|
62
|
+
* *it* and a rename of `<wt>` leaves it alone — the #1156 misfire, still
|
|
63
|
+
* refused. When `<wt>-2` is not a worktree, the same name resolves to `<wt>`'s
|
|
64
|
+
* second instance and follows the move to `mcbd-claude-<new>-2`, never onto
|
|
65
|
+
* `mcbd-claude-<new>`.
|
|
66
|
+
*
|
|
67
|
+
* Live `mcbd-*` sessions that resolve to nothing at all are reported in
|
|
68
|
+
* `unaccountedSessions` and logged as a warning, because "I could not see it"
|
|
69
|
+
* must never again be rendered as "there was nothing to see".
|
|
70
|
+
*/
|
|
71
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
|
+
exports.__internal = void 0;
|
|
73
|
+
exports.reconcileWorktreeSessions = reconcileWorktreeSessions;
|
|
74
|
+
exports.reconcileWorktreeSessionsFromAliases = reconcileWorktreeSessionsFromAliases;
|
|
75
|
+
const manager_1 = require("../../lib/cli-tools/manager");
|
|
76
|
+
const types_1 = require("../../lib/cli-tools/types");
|
|
77
|
+
const validation_1 = require("../../lib/cli-tools/validation");
|
|
78
|
+
const agent_instances_db_1 = require("../../lib/db/agent-instances-db");
|
|
79
|
+
const worktree_alias_db_1 = require("../../lib/db/worktree-alias-db");
|
|
80
|
+
const path_validator_1 = require("../../lib/security/path-validator");
|
|
81
|
+
const tmux_1 = require("../../lib/tmux/tmux");
|
|
82
|
+
const control_mode_tmux_transport_1 = require("../../lib/tmux/control-mode-tmux-transport");
|
|
83
|
+
const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
|
|
84
|
+
const response_poller_1 = require("../../lib/polling/response-poller");
|
|
85
|
+
const ws_server_1 = require("../../lib/ws-server");
|
|
86
|
+
const logger_1 = require("../../lib/logger");
|
|
87
|
+
const logger = (0, logger_1.createLogger)('worktree-session-reconcile');
|
|
88
|
+
/**
|
|
89
|
+
* Prefix for the intermediate session names used by the two-stage rename.
|
|
90
|
+
*
|
|
91
|
+
* Deliberately NOT `mcbd-`: a name under that prefix would be picked up by the
|
|
92
|
+
* reading-mode key binding's `#{m:mcbd-*,#{session_name}}` guard and by any
|
|
93
|
+
* human scanning `tmux ls` for CommandMate sessions. These names exist for
|
|
94
|
+
* microseconds, but a crash mid-pass leaves one behind and it should read as
|
|
95
|
+
* obviously transient.
|
|
96
|
+
*/
|
|
97
|
+
const TEMP_SESSION_PREFIX = 'cmate-renaming-';
|
|
98
|
+
function emptyResult() {
|
|
99
|
+
return {
|
|
100
|
+
renamedSessions: [],
|
|
101
|
+
skippedSessions: [],
|
|
102
|
+
unaccountedSessions: [],
|
|
103
|
+
planSources: { predicted: 0, discovered: 0 },
|
|
104
|
+
movedAutoYesKeys: [],
|
|
105
|
+
restartedAutoYesPollers: [],
|
|
106
|
+
movedPollerKeys: [],
|
|
107
|
+
movedRooms: [],
|
|
108
|
+
errors: [],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Drop pairs that are no-ops or unsafe, keeping the last mapping for a given
|
|
113
|
+
* source ID.
|
|
114
|
+
*/
|
|
115
|
+
function normalizeRenames(renames) {
|
|
116
|
+
const byOldId = new Map();
|
|
117
|
+
for (const { oldId, newId } of renames) {
|
|
118
|
+
if (!oldId || !newId || oldId === newId)
|
|
119
|
+
continue;
|
|
120
|
+
// The new ID becomes a tmux session-name segment and a URL segment; an ID
|
|
121
|
+
// that fails validation must never reach either.
|
|
122
|
+
if (!(0, path_validator_1.isValidWorktreeId)(oldId) || !(0, path_validator_1.isValidWorktreeId)(newId))
|
|
123
|
+
continue;
|
|
124
|
+
byOldId.set(oldId, newId);
|
|
125
|
+
}
|
|
126
|
+
return Array.from(byOldId, ([oldId, newId]) => ({ oldId, newId }));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Every (cliToolId, instanceId) pair whose session could belong to this worktree.
|
|
130
|
+
*
|
|
131
|
+
* The roster is read for BOTH IDs because the caller may reconcile either side
|
|
132
|
+
* of the DB move: after `migrateWorktreeIdPreservingChildren` the rows sit under
|
|
133
|
+
* `newId`, but a caller reconciling ahead of the move still finds them under
|
|
134
|
+
* `oldId`. The primary instance of every CLI tool is always included — a
|
|
135
|
+
* worktree that predates the roster (#1000) has no `agent_instances` rows at all
|
|
136
|
+
* yet can absolutely have a running `mcbd-claude-<id>` session.
|
|
137
|
+
*/
|
|
138
|
+
function collectInstanceTargets(db, rename) {
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
const targets = [];
|
|
141
|
+
const add = (cliToolId, instanceId) => {
|
|
142
|
+
const key = `${cliToolId}|${instanceId}`;
|
|
143
|
+
if (seen.has(key))
|
|
144
|
+
return;
|
|
145
|
+
seen.add(key);
|
|
146
|
+
targets.push({ cliToolId, instanceId });
|
|
147
|
+
};
|
|
148
|
+
for (const cliToolId of types_1.CLI_TOOL_IDS)
|
|
149
|
+
add(cliToolId, cliToolId);
|
|
150
|
+
for (const worktreeId of [rename.newId, rename.oldId]) {
|
|
151
|
+
let instances;
|
|
152
|
+
try {
|
|
153
|
+
instances = (0, agent_instances_db_1.getAgentInstances)(db, worktreeId);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// No agent_instances table (older database) — the primary instances above
|
|
157
|
+
// already cover the pre-roster shape.
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
for (const instance of instances) {
|
|
161
|
+
if ((0, types_1.isCliToolType)(instance.cliTool))
|
|
162
|
+
add(instance.cliTool, instance.id);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return targets;
|
|
166
|
+
}
|
|
167
|
+
/** Build the (old session name → new session name) plan for one ID move. */
|
|
168
|
+
function planSessionRenames(db, rename, errors) {
|
|
169
|
+
const manager = manager_1.CLIToolManager.getInstance();
|
|
170
|
+
const plans = [];
|
|
171
|
+
for (const { cliToolId, instanceId } of collectInstanceTargets(db, rename)) {
|
|
172
|
+
try {
|
|
173
|
+
const tool = manager.getTool(cliToolId);
|
|
174
|
+
const oldName = tool.getSessionName(rename.oldId, instanceId);
|
|
175
|
+
const newName = tool.getSessionName(rename.newId, instanceId);
|
|
176
|
+
// getSessionName validates already; assert it explicitly so the guarantee
|
|
177
|
+
// is stated where the name is about to be handed to tmux (Issue #1621).
|
|
178
|
+
(0, validation_1.validateSessionName)(newName);
|
|
179
|
+
if (oldName !== newName)
|
|
180
|
+
plans.push({ oldName, newName, rename, source: 'roster' });
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
errors.push(`session name for ${rename.oldId}/${instanceId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return plans;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Every worktree ID this database can vouch for, current or historical.
|
|
190
|
+
*
|
|
191
|
+
* This is the set a live session name is matched against, so its completeness
|
|
192
|
+
* is what keeps the matching exact: an ID that is missing here turns a name
|
|
193
|
+
* that legitimately belongs to a *different* worktree into a suffix of one that
|
|
194
|
+
* is moving. Both tables are read with their own try/catch because tests and
|
|
195
|
+
* the CLI hand around hand-built connections where either may be absent.
|
|
196
|
+
*
|
|
197
|
+
* Queried directly rather than through `worktree-db` / `worktree-alias-db` on
|
|
198
|
+
* purpose: four suites `vi.mock('@/lib/db/worktree-db')`, and importing it here
|
|
199
|
+
* would make this module inherit those mocks (the same trap that moved
|
|
200
|
+
* `renameWorktreeIdPreservingChildren` under `migrations/`).
|
|
201
|
+
*
|
|
202
|
+
* @param db - Database instance
|
|
203
|
+
* @param renames - The pairs this pass is applying (their IDs are known by definition)
|
|
204
|
+
*/
|
|
205
|
+
function collectKnownWorktreeIds(db, renames) {
|
|
206
|
+
const ids = new Set();
|
|
207
|
+
try {
|
|
208
|
+
const rows = db.prepare('SELECT id FROM worktrees').all();
|
|
209
|
+
for (const row of rows)
|
|
210
|
+
if (row.id)
|
|
211
|
+
ids.add(row.id);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// No `worktrees` table — nothing current to attribute against.
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const rows = db.prepare('SELECT old_id FROM worktree_aliases').all();
|
|
218
|
+
for (const row of rows)
|
|
219
|
+
if (row.old_id)
|
|
220
|
+
ids.add(row.old_id);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Older database without `worktree_aliases` (migration v53).
|
|
224
|
+
}
|
|
225
|
+
for (const rename of renames) {
|
|
226
|
+
ids.add(rename.oldId);
|
|
227
|
+
ids.add(rename.newId);
|
|
228
|
+
}
|
|
229
|
+
return ids;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Resolve a live tmux session name to (CLI tool, worktree ID, instance suffix).
|
|
233
|
+
*
|
|
234
|
+
* `mcbd-<cli>-<id>` and `mcbd-<cli>-<id>-<suffix>` are both valid readings of
|
|
235
|
+
* the same string, which is the whole of Issue #1156. The tie is broken by
|
|
236
|
+
* asking the database rather than the string: candidate IDs are tried
|
|
237
|
+
* **longest first**, and only an exact member of `knownIds` is accepted. So
|
|
238
|
+
* `mcbd-claude-alpha-2` resolves to worktree `alpha-2` when that worktree
|
|
239
|
+
* exists, and to `alpha`'s second instance when it does not — and in neither
|
|
240
|
+
* reading does it resolve to plain `alpha`'s primary session.
|
|
241
|
+
*
|
|
242
|
+
* @param name - A live tmux session name
|
|
243
|
+
* @param knownIds - Every worktree ID the database can vouch for
|
|
244
|
+
* @returns The attribution, or `null` when nothing in `knownIds` explains the name
|
|
245
|
+
*/
|
|
246
|
+
function attributeSessionName(name, knownIds) {
|
|
247
|
+
for (const cliToolId of types_1.CLI_TOOL_IDS) {
|
|
248
|
+
const prefix = `mcbd-${cliToolId}-`;
|
|
249
|
+
if (!name.startsWith(prefix))
|
|
250
|
+
continue;
|
|
251
|
+
// No CLI tool id is a prefix of another, so at most one branch is entered
|
|
252
|
+
// and the remainder is unambiguously `<id>[-<suffix>]`.
|
|
253
|
+
const rest = name.slice(prefix.length);
|
|
254
|
+
let candidate = rest;
|
|
255
|
+
for (;;) {
|
|
256
|
+
if (knownIds.has(candidate)) {
|
|
257
|
+
const suffix = candidate.length === rest.length ? undefined : rest.slice(candidate.length + 1);
|
|
258
|
+
return { cliToolId, worktreeId: candidate, suffix: suffix || undefined };
|
|
259
|
+
}
|
|
260
|
+
const cut = candidate.lastIndexOf('-');
|
|
261
|
+
if (cut <= 0)
|
|
262
|
+
return null;
|
|
263
|
+
candidate = candidate.slice(0, cut);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Read the live session list the other way round: attribute each name to a
|
|
270
|
+
* worktree ID and plan a rename when that ID is moving (Issue #1661).
|
|
271
|
+
*
|
|
272
|
+
* This is what covers the sessions prediction structurally cannot see — an
|
|
273
|
+
* instance with no roster row, a name left behind by an earlier move — and it
|
|
274
|
+
* is also the only place that can notice a live `mcbd-*` session nothing
|
|
275
|
+
* explains, which it records in `result.unaccountedSessions`.
|
|
276
|
+
*/
|
|
277
|
+
function discoverSessionRenames(renames, liveNames, knownIds, result) {
|
|
278
|
+
const byOldId = new Map(renames.map((rename) => [rename.oldId, rename]));
|
|
279
|
+
const plans = [];
|
|
280
|
+
for (const name of liveNames) {
|
|
281
|
+
if (!name.startsWith('mcbd-'))
|
|
282
|
+
continue;
|
|
283
|
+
const attributed = attributeSessionName(name, knownIds);
|
|
284
|
+
if (!attributed) {
|
|
285
|
+
result.unaccountedSessions.push(name);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const rename = byOldId.get(attributed.worktreeId);
|
|
289
|
+
if (!rename)
|
|
290
|
+
continue;
|
|
291
|
+
try {
|
|
292
|
+
const tool = manager_1.CLIToolManager.getInstance().getTool(attributed.cliToolId);
|
|
293
|
+
// Rebuilt through getSessionName rather than by string surgery so the
|
|
294
|
+
// suffix convention stays owned by one place (`cli-tools/base.ts`).
|
|
295
|
+
const instanceId = attributed.suffix
|
|
296
|
+
? (0, types_1.buildInstanceId)(attributed.cliToolId, attributed.suffix)
|
|
297
|
+
: attributed.cliToolId;
|
|
298
|
+
const newName = tool.getSessionName(rename.newId, instanceId);
|
|
299
|
+
(0, validation_1.validateSessionName)(newName);
|
|
300
|
+
if (name !== newName)
|
|
301
|
+
plans.push({ oldName: name, newName, rename, source: 'live' });
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
result.errors.push(`attribute session ${name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return plans;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Merge the predicted and discovered plans, keeping one plan per live session.
|
|
311
|
+
*
|
|
312
|
+
* Prediction wins a tie. The two agree wherever both fire; where they disagree
|
|
313
|
+
* the roster is a positive statement that the instance belongs to this worktree
|
|
314
|
+
* ("`codex-3` is an instance of `alpha`"), while attribution is an inference
|
|
315
|
+
* from the name, so the explicit record is the safer of the two to trust.
|
|
316
|
+
*/
|
|
317
|
+
function mergeSessionPlans(predicted, discovered) {
|
|
318
|
+
const byOldName = new Map();
|
|
319
|
+
for (const plan of [...predicted, ...discovered]) {
|
|
320
|
+
if (!byOldName.has(plan.oldName))
|
|
321
|
+
byOldName.set(plan.oldName, plan);
|
|
322
|
+
}
|
|
323
|
+
return Array.from(byOldName.values());
|
|
324
|
+
}
|
|
325
|
+
/** Mint a session name that is free both on the server and within this pass. */
|
|
326
|
+
function allocateTempName(taken, ordinal) {
|
|
327
|
+
let candidate = `${TEMP_SESSION_PREFIX}${ordinal}`;
|
|
328
|
+
let attempt = 0;
|
|
329
|
+
while (taken.has(candidate)) {
|
|
330
|
+
attempt++;
|
|
331
|
+
candidate = `${TEMP_SESSION_PREFIX}${ordinal}-${attempt}`;
|
|
332
|
+
}
|
|
333
|
+
taken.add(candidate);
|
|
334
|
+
return candidate;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Rename the live tmux sessions in two stages so no intermediate state collides.
|
|
338
|
+
*/
|
|
339
|
+
async function renameSessionsTwoStage(plans, live, deps, result) {
|
|
340
|
+
if (plans.length === 0)
|
|
341
|
+
return [];
|
|
342
|
+
// Exact set membership, never a prefix test (Issue #1156). A predicted name
|
|
343
|
+
// that is not live is not a miss — it is a name nothing was ever running
|
|
344
|
+
// under — so it is dropped here rather than counted as skipped; what a pass
|
|
345
|
+
// could not see at all is reported through `unaccountedSessions` instead.
|
|
346
|
+
const runnable = plans.filter((plan) => live.has(plan.oldName));
|
|
347
|
+
const movingNames = new Set(runnable.map((plan) => plan.oldName));
|
|
348
|
+
const actionable = [];
|
|
349
|
+
for (const plan of runnable) {
|
|
350
|
+
// A destination that is occupied by a session this pass is NOT moving
|
|
351
|
+
// belongs to somebody else. Renaming onto it would fail anyway; skipping
|
|
352
|
+
// explicitly keeps the reason in the result instead of in an exception.
|
|
353
|
+
if (live.has(plan.newName) && !movingNames.has(plan.newName)) {
|
|
354
|
+
result.skippedSessions.push({
|
|
355
|
+
oldName: plan.oldName,
|
|
356
|
+
newName: plan.newName,
|
|
357
|
+
reason: 'destination session already exists',
|
|
358
|
+
});
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
actionable.push(plan);
|
|
362
|
+
}
|
|
363
|
+
const taken = new Set([...live, ...actionable.map((plan) => plan.newName)]);
|
|
364
|
+
const staged = [];
|
|
365
|
+
// Stage 1: everything out of the way, into names nothing else can claim.
|
|
366
|
+
for (const [index, plan] of actionable.entries()) {
|
|
367
|
+
const tempName = allocateTempName(taken, index);
|
|
368
|
+
try {
|
|
369
|
+
const renamed = await deps.renameSession(plan.oldName, tempName);
|
|
370
|
+
if (renamed) {
|
|
371
|
+
staged.push({ plan, tempName });
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
// Disappeared between the listing and now (the agent exited).
|
|
375
|
+
result.skippedSessions.push({
|
|
376
|
+
oldName: plan.oldName,
|
|
377
|
+
newName: plan.newName,
|
|
378
|
+
reason: 'session no longer exists',
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
result.errors.push(`stage session ${plan.oldName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Stage 2: into the real names, now guaranteed free.
|
|
387
|
+
const completed = [];
|
|
388
|
+
for (const { plan, tempName } of staged) {
|
|
389
|
+
try {
|
|
390
|
+
await deps.renameSession(tempName, plan.newName);
|
|
391
|
+
result.renamedSessions.push({ oldName: plan.oldName, newName: plan.newName });
|
|
392
|
+
completed.push(plan);
|
|
393
|
+
// The control-mode attach survived the rename; only the registry key is
|
|
394
|
+
// stale. Re-file it so terminal input keeps reaching the session.
|
|
395
|
+
try {
|
|
396
|
+
(0, control_mode_tmux_transport_1.getControlModeTmuxTransport)().renameSession(plan.oldName, plan.newName);
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
result.errors.push(`control-mode rekey ${plan.oldName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
404
|
+
result.errors.push(`rename session ${plan.oldName} -> ${plan.newName}: ${message}`);
|
|
405
|
+
// Put it back under a name a human can find rather than leaving it parked
|
|
406
|
+
// on a temporary one.
|
|
407
|
+
try {
|
|
408
|
+
await deps.renameSession(tempName, plan.oldName);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
result.errors.push(`session left under temporary name ${tempName}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return completed;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Move the in-process state that is keyed on a worktree ID.
|
|
419
|
+
*
|
|
420
|
+
* Runs for every requested pair, not only the ones that had a live tmux
|
|
421
|
+
* session: a WebSocket room or an Auto-Yes state can exist without a session,
|
|
422
|
+
* and leaving either behind is exactly the silent breakage this guards against.
|
|
423
|
+
*/
|
|
424
|
+
function migrateRuntimeState(db, renames, result) {
|
|
425
|
+
// --- Auto-Yes -------------------------------------------------------------
|
|
426
|
+
// Snapshot which pollers are running BEFORE the state moves: startAutoYesPolling
|
|
427
|
+
// refuses to start when the state at its key is not enabled, so the state has
|
|
428
|
+
// to move first, and the "was it running?" answer only exists beforehand.
|
|
429
|
+
const runningAutoYesPollers = new Set((0, auto_yes_manager_1.getAutoYesPollerCompositeKeys)());
|
|
430
|
+
const movedAutoYes = (0, auto_yes_manager_1.migrateAutoYesStateWorktreeIds)(renames);
|
|
431
|
+
result.movedAutoYesKeys = movedAutoYes.map((move) => move.newKey);
|
|
432
|
+
for (const move of movedAutoYes) {
|
|
433
|
+
if (!runningAutoYesPollers.has(move.oldKey))
|
|
434
|
+
continue;
|
|
435
|
+
try {
|
|
436
|
+
// The poller's timer chain captures the worktree ID, so re-keying its map
|
|
437
|
+
// would leave it polling the old session. Stop and restart instead — the
|
|
438
|
+
// Auto-Yes *state* (deadline, stop pattern) is what must survive, and it
|
|
439
|
+
// already has.
|
|
440
|
+
(0, auto_yes_manager_1.stopAutoYesPolling)(move.oldKey);
|
|
441
|
+
const started = (0, auto_yes_manager_1.startAutoYesPolling)(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
442
|
+
if (started.started) {
|
|
443
|
+
result.restartedAutoYesPollers.push(move.newKey);
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
result.errors.push(`auto-yes poller ${move.newKey} not restarted: ${started.reason}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
result.errors.push(`auto-yes poller ${move.newKey}: ${error instanceof Error ? error.message : String(error)}`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// --- Response pollers -----------------------------------------------------
|
|
454
|
+
// The poller key carries the instance but not the CLI tool, so the roster
|
|
455
|
+
// supplies it. Both IDs are consulted for the same reason as the session plan.
|
|
456
|
+
const rosterCliTool = (worktreeId, instanceId) => {
|
|
457
|
+
const target = renames.find((rename) => rename.oldId === worktreeId);
|
|
458
|
+
for (const candidate of [target?.newId, worktreeId]) {
|
|
459
|
+
if (!candidate)
|
|
460
|
+
continue;
|
|
461
|
+
try {
|
|
462
|
+
for (const instance of (0, agent_instances_db_1.getAgentInstances)(db, candidate)) {
|
|
463
|
+
if (instance.id === instanceId && (0, types_1.isCliToolType)(instance.cliTool)) {
|
|
464
|
+
return instance.cliTool;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
// No roster available; fall through to the primary-instance anchor.
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
// The primary instance is anchored by `instanceId === cliToolId` (#868), so
|
|
473
|
+
// an instance id that names a tool IS that tool.
|
|
474
|
+
return (0, types_1.isCliToolType)(instanceId) ? instanceId : null;
|
|
475
|
+
};
|
|
476
|
+
try {
|
|
477
|
+
result.movedPollerKeys = (0, response_poller_1.migrateResponsePollerWorktreeIds)(renames, rosterCliTool).map((move) => move.newKey);
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
result.errors.push(`response pollers: ${error instanceof Error ? error.message : String(error)}`);
|
|
481
|
+
}
|
|
482
|
+
// --- WebSocket rooms ------------------------------------------------------
|
|
483
|
+
try {
|
|
484
|
+
result.movedRooms = (0, ws_server_1.migrateWorktreeRooms)(renames);
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
result.errors.push(`websocket rooms: ${error instanceof Error ? error.message : String(error)}`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
async function reconcileWorktreeSessions(db, renamesOrOldId, newIdOrOptions, maybeOptions) {
|
|
491
|
+
const requested = typeof renamesOrOldId === 'string'
|
|
492
|
+
? [{ oldId: renamesOrOldId, newId: String(newIdOrOptions ?? '') }]
|
|
493
|
+
: renamesOrOldId;
|
|
494
|
+
const options = typeof renamesOrOldId === 'string'
|
|
495
|
+
? maybeOptions
|
|
496
|
+
: newIdOrOptions;
|
|
497
|
+
const result = emptyResult();
|
|
498
|
+
const renames = normalizeRenames(requested);
|
|
499
|
+
if (renames.length === 0)
|
|
500
|
+
return result;
|
|
501
|
+
const deps = {
|
|
502
|
+
listSessions: options?.tmux?.listSessions ?? tmux_1.listSessions,
|
|
503
|
+
renameSession: options?.tmux?.renameSession ?? tmux_1.renameSession,
|
|
504
|
+
};
|
|
505
|
+
// Listed once, up front: both the prediction pass and the attribution pass
|
|
506
|
+
// need it, and it is what makes a startup with nothing stale cost exactly one
|
|
507
|
+
// `tmux list-sessions`.
|
|
508
|
+
let live = null;
|
|
509
|
+
try {
|
|
510
|
+
live = new Set((await deps.listSessions()).map((session) => session.name));
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
result.errors.push(`list tmux sessions: ${error instanceof Error ? error.message : String(error)}`);
|
|
514
|
+
}
|
|
515
|
+
if (live) {
|
|
516
|
+
const knownIds = collectKnownWorktreeIds(db, renames);
|
|
517
|
+
const predicted = renames.flatMap((rename) => planSessionRenames(db, rename, result.errors));
|
|
518
|
+
const discovered = discoverSessionRenames(renames, live, knownIds, result);
|
|
519
|
+
const plans = mergeSessionPlans(predicted, discovered);
|
|
520
|
+
// Counted against the live list, so `predicted` means "predicted AND
|
|
521
|
+
// found", not "names we guessed at".
|
|
522
|
+
for (const plan of plans) {
|
|
523
|
+
if (!live.has(plan.oldName))
|
|
524
|
+
continue;
|
|
525
|
+
if (plan.source === 'roster')
|
|
526
|
+
result.planSources.predicted++;
|
|
527
|
+
else
|
|
528
|
+
result.planSources.discovered++;
|
|
529
|
+
}
|
|
530
|
+
await renameSessionsTwoStage(plans, live, deps, result);
|
|
531
|
+
}
|
|
532
|
+
// Runtime state moves after the sessions: a poller that ticks in between
|
|
533
|
+
// fails one capture against a name that is briefly gone, which is a logged
|
|
534
|
+
// warning and self-heals on the next tick. The reverse order would have the
|
|
535
|
+
// restarted poller address a session that does not exist yet.
|
|
536
|
+
migrateRuntimeState(db, renames, result);
|
|
537
|
+
// A live session nobody could account for is the failure this pass used to
|
|
538
|
+
// report as success (Issue #1661), so it gets its own line at warn level
|
|
539
|
+
// rather than a zero buried in the summary.
|
|
540
|
+
if (result.unaccountedSessions.length > 0) {
|
|
541
|
+
logger.warn('reconcile:unaccounted-sessions', {
|
|
542
|
+
count: result.unaccountedSessions.length,
|
|
543
|
+
sessions: result.unaccountedSessions,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
if (result.renamedSessions.length > 0 ||
|
|
547
|
+
result.errors.length > 0 ||
|
|
548
|
+
result.unaccountedSessions.length > 0) {
|
|
549
|
+
logger.info('reconcile:complete', {
|
|
550
|
+
renames: renames.length,
|
|
551
|
+
predicted: result.planSources.predicted,
|
|
552
|
+
discovered: result.planSources.discovered,
|
|
553
|
+
renamedSessions: result.renamedSessions.length,
|
|
554
|
+
skipped: result.skippedSessions.length,
|
|
555
|
+
unaccounted: result.unaccountedSessions.length,
|
|
556
|
+
errors: result.errors.length,
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
return result;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Reconcile every worktree ID move the database still remembers.
|
|
563
|
+
*
|
|
564
|
+
* Called at startup, after migrations. `worktree_aliases` is the durable record
|
|
565
|
+
* of "this ID used to name that worktree", so it is exactly the list of session
|
|
566
|
+
* names a still-running agent may be sitting under — including the moves the
|
|
567
|
+
* Phase 4 renumbering has just performed, which is what makes the bulk
|
|
568
|
+
* migration safe for a server that was restarted with agents alive.
|
|
569
|
+
*
|
|
570
|
+
* Idempotent and cheap when there is nothing to do: it lists tmux sessions once
|
|
571
|
+
* and intersects, so a startup where no old name is live performs one `tmux
|
|
572
|
+
* list-sessions` and stops. Idempotence survives the attribution pass added in
|
|
573
|
+
* #1661 for the same reason the prediction pass is idempotent — a session that
|
|
574
|
+
* already carries the current ID resolves to the *destination* of its rename
|
|
575
|
+
* pair, which is not a source, so a second run plans nothing.
|
|
576
|
+
*
|
|
577
|
+
* A database with no aliases at all still returns immediately without listing:
|
|
578
|
+
* with no ID on the move there is no session that could be following one.
|
|
579
|
+
*
|
|
580
|
+
* @param db - Database instance
|
|
581
|
+
*/
|
|
582
|
+
async function reconcileWorktreeSessionsFromAliases(db, options) {
|
|
583
|
+
let aliases;
|
|
584
|
+
try {
|
|
585
|
+
aliases = (0, worktree_alias_db_1.getAllWorktreeAliases)(db);
|
|
586
|
+
}
|
|
587
|
+
catch (error) {
|
|
588
|
+
const result = emptyResult();
|
|
589
|
+
result.errors.push(`read worktree aliases: ${error instanceof Error ? error.message : String(error)}`);
|
|
590
|
+
return result;
|
|
591
|
+
}
|
|
592
|
+
return reconcileWorktreeSessions(db, aliases.map((alias) => ({ oldId: alias.oldId, newId: alias.worktreeId })), options);
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* @internal Exported so tests can assert the temp-name convention and pin the
|
|
596
|
+
* live-name attribution rules directly (Issue #1661).
|
|
597
|
+
*/
|
|
598
|
+
exports.__internal = {
|
|
599
|
+
TEMP_SESSION_PREFIX,
|
|
600
|
+
allocateTempName,
|
|
601
|
+
buildCompositeKey: auto_yes_manager_1.buildCompositeKey,
|
|
602
|
+
attributeSessionName,
|
|
603
|
+
};
|
|
@@ -69,7 +69,12 @@ const TOP_LEVEL_KEYS = ['version', 'title', 'goal', 'scope', 'verify', 'autoYes'
|
|
|
69
69
|
const SCOPE_KEYS = ['allow', 'deny'];
|
|
70
70
|
const VERIFY_KEYS = ['gates'];
|
|
71
71
|
const AUTO_YES_KEYS = ['mode', 'allowPromptTypes', 'denyPatterns'];
|
|
72
|
-
const SUCCESS_KEYS = [
|
|
72
|
+
const SUCCESS_KEYS = [
|
|
73
|
+
'requireWorkEvidence',
|
|
74
|
+
'requireScopeClean',
|
|
75
|
+
'requireCommit',
|
|
76
|
+
'autoVerifyOnStop',
|
|
77
|
+
];
|
|
73
78
|
/** Mirrors GATE_ID_PATTERN in verify-config.ts: a contract can only name ids that could exist. */
|
|
74
79
|
const GATE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
75
80
|
class TaskContractError extends Error {
|
|
@@ -276,6 +281,7 @@ function validateSuccess(value, issues) {
|
|
|
276
281
|
const success = {
|
|
277
282
|
requireWorkEvidence: true,
|
|
278
283
|
requireScopeClean: true,
|
|
284
|
+
requireCommit: false,
|
|
279
285
|
autoVerifyOnStop: false,
|
|
280
286
|
};
|
|
281
287
|
if (value === undefined || value === null)
|
|
@@ -348,6 +354,16 @@ function parseTaskContract(raw, sourceLabel) {
|
|
|
348
354
|
if (success.requireScopeClean && scope.allow.length === 0) {
|
|
349
355
|
issues.push('scope.allow: at least one pattern is required while success.requireScopeClean is true');
|
|
350
356
|
}
|
|
357
|
+
// Same discipline, and the same failure it prevents: the commit requirement is
|
|
358
|
+
// judged by the work-evidence gate, and `requireWorkEvidence: false` keeps that
|
|
359
|
+
// gate out of the contract's selection entirely. Accepting the pair would put
|
|
360
|
+
// "必ず commit" in the preamble with nothing behind it — the exact D-4 defect
|
|
361
|
+
// this field exists to close.
|
|
362
|
+
if (success.requireCommit && !success.requireWorkEvidence) {
|
|
363
|
+
issues.push('success.requireCommit: requires success.requireWorkEvidence to be true ' +
|
|
364
|
+
'(the commit requirement is judged by the work-evidence gate, which ' +
|
|
365
|
+
'requireWorkEvidence: false switches off)');
|
|
366
|
+
}
|
|
351
367
|
if (issues.length > 0)
|
|
352
368
|
throw new TaskContractError(issues);
|
|
353
369
|
return { version: 1, title, goal, scope, verify, autoYes, success };
|
|
@@ -54,8 +54,30 @@ function transitionTask(current, event) {
|
|
|
54
54
|
switch (event) {
|
|
55
55
|
case 'message_sent':
|
|
56
56
|
return 'running';
|
|
57
|
+
// Issue #1637: a contract whose very first send never landed is
|
|
58
|
+
// `cancelled`, not `failed`. The row stays — the audit trail is the
|
|
59
|
+
// `task_events` entry recording `send_failed` from `pending`, which
|
|
60
|
+
// says precisely what happened — but the status has to keep the row out
|
|
61
|
+
// of later contract resolution, and `failed` cannot do that.
|
|
62
|
+
//
|
|
63
|
+
// `failed` is deliberately re-openable: VERIFIABLE_TASK_STATUSES
|
|
64
|
+
// (src/lib/db/tasks-db.ts) includes it so an agent that retries after a
|
|
65
|
+
// red gate finds its contract again (#1620). A task nothing was ever
|
|
66
|
+
// sent for has no work to re-judge, yet it is the *most recently
|
|
67
|
+
// updated* verifiable row, so `getVerifiableTask` hands it to any later
|
|
68
|
+
// run that has to discover its own task. In #1623 that is exactly what
|
|
69
|
+
// happened: a send that failed on a cold start left `cbb7fe71`, the
|
|
70
|
+
// re-send created `88280de0` which finished `succeeded` — and
|
|
71
|
+
// `succeeded` is excluded from resolution while the orphan was not, so
|
|
72
|
+
// the orchestrator's `wait --verify` judged the worktree against the
|
|
73
|
+
// orphan's *older* scope snapshot and returned exit 20 for paths the
|
|
74
|
+
// current contract allows.
|
|
75
|
+
//
|
|
76
|
+
// `cancelled` is in neither ACTIVE_TASK_STATUSES nor
|
|
77
|
+
// VERIFIABLE_TASK_STATUSES, so it closes that path at the only point
|
|
78
|
+
// this layer controls: the status the event writes.
|
|
57
79
|
case 'send_failed':
|
|
58
|
-
return '
|
|
80
|
+
return 'cancelled';
|
|
59
81
|
case 'cancel':
|
|
60
82
|
return 'cancelled';
|
|
61
83
|
case 'prompt_detected':
|