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,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Migration v55: fold worktree IDs that ran away back onto their directory name
|
|
4
|
+
* (Issue #1658).
|
|
5
|
+
*
|
|
6
|
+
* ## What went wrong
|
|
7
|
+
*
|
|
8
|
+
* `syncWorktreesToDB` resolved "which ID does this path already own?" against
|
|
9
|
+
* `worktrees.repository_path`, but identity lives in `worktrees.path` — that is
|
|
10
|
+
* the `NOT NULL UNIQUE` column, one row per directory for the whole table.
|
|
11
|
+
* `repository_path` only records which scan root last upserted the row, and when
|
|
12
|
+
* the *same* git repository is registered under two scan roots (a repository and
|
|
13
|
+
* one of its own linked worktrees, both listed in `WORKTREE_REPOS`),
|
|
14
|
+
* `git worktree list` returns the identical path set from either one. The column
|
|
15
|
+
* then ping-pongs, the per-repository lookup came up empty on whichever pass did
|
|
16
|
+
* not write it last, and the row's ID was re-derived — against a taken set
|
|
17
|
+
* containing its own current ID and every ID it had already been renamed away
|
|
18
|
+
* from. `deriveWorktreeId` answered by walking one rung further up the digest
|
|
19
|
+
* ladder, so every sync appended another 8 hex digits:
|
|
20
|
+
*
|
|
21
|
+
* commandagent-bon0-run
|
|
22
|
+
* commandagent-bon0-run-2f4530fe
|
|
23
|
+
* commandagent-bon0-run-2f4530fe1cf1f9f8
|
|
24
|
+
* commandagent-bon0-run-2f4530fe1cf1f9f85d499f80
|
|
25
|
+
* …
|
|
26
|
+
*
|
|
27
|
+
* Production reached 81 characters, at which point the tmux session name derived
|
|
28
|
+
* from the ID no longer matched the running session and the UI lost it.
|
|
29
|
+
*
|
|
30
|
+
* ## Why a migration, and not just the fix
|
|
31
|
+
*
|
|
32
|
+
* The fix stops the growth; it does not undo it, because it works by *keeping*
|
|
33
|
+
* whatever ID a path already has. Left alone, those five rows would stay
|
|
34
|
+
* permanently on their inflated IDs and the abandoned rungs would stay reserved
|
|
35
|
+
* forever (the minter counts aliases as taken). This migration is the one moment
|
|
36
|
+
* they are collapsed.
|
|
37
|
+
*
|
|
38
|
+
* ## The rules
|
|
39
|
+
*
|
|
40
|
+
* - A row is compacted only when re-deriving its ID — with the path's **own**
|
|
41
|
+
* history excluded from the taken set, which is precisely what was missing —
|
|
42
|
+
* yields something *shorter*. Nothing else moves; a row whose short ID is
|
|
43
|
+
* genuinely taken by another directory keeps what it has.
|
|
44
|
+
* - Another row's ID and another row's alias are never taken. Live worktrees beat
|
|
45
|
+
* aliases at resolution, so handing out an ID somebody else still answers to
|
|
46
|
+
* would silently redirect their bookmarks (the same rule v54 follows).
|
|
47
|
+
* - The ID a row is leaving becomes an alias, via
|
|
48
|
+
* {@link renameWorktreeIdPreservingChildren} — that is what keeps the URLs,
|
|
49
|
+
* open tabs and `commandmate send <id>` lines that were minted during the
|
|
50
|
+
* churn answering.
|
|
51
|
+
* - The **intermediate rungs** are deleted. Every one of them points at the same
|
|
52
|
+
* worktree as the rung above it, and none survived longer than the second it
|
|
53
|
+
* took the next sync to replace it (the production alias rows are ~1s apart);
|
|
54
|
+
* keeping them would reserve those IDs for good. Aliases that are not
|
|
55
|
+
* ladder-shaped — `commandagent-develop-develop`, `commandagent-develop-
|
|
56
|
+
* detached-1c64d87f`, anything from the branch-derived era — are genuine former
|
|
57
|
+
* names and are kept. {@link isDerivedWorktreeId} is what tells them apart.
|
|
58
|
+
*
|
|
59
|
+
* No temporary-ID staging (unlike v54): a destination is only ever chosen from
|
|
60
|
+
* IDs no live row holds, so `renameWorktreeIdPreservingChildren` can never reach
|
|
61
|
+
* its merge-and-delete collision branch.
|
|
62
|
+
*/
|
|
63
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
64
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
65
|
+
};
|
|
66
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
+
exports.v55_migrations = void 0;
|
|
68
|
+
exports.planWorktreeIdCompaction = planWorktreeIdCompaction;
|
|
69
|
+
const path_1 = __importDefault(require("path"));
|
|
70
|
+
const worktree_id_1 = require("../../../lib/git/worktree-id");
|
|
71
|
+
const worktree_id_rename_1 = require("./worktree-id-rename");
|
|
72
|
+
/**
|
|
73
|
+
* Decide which rows collapse, and which of their aliases go with them.
|
|
74
|
+
*
|
|
75
|
+
* Exported for the unit tests: the rules (self-history exclusion, "shorter
|
|
76
|
+
* only", ladder-vs-genuine alias) are the interesting part and are a pure
|
|
77
|
+
* function of the rows plus the aliases.
|
|
78
|
+
*
|
|
79
|
+
* @param rows - Every worktree row, `id` and `path`
|
|
80
|
+
* @param aliases - Every alias row
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
function planWorktreeIdCompaction(rows, aliases) {
|
|
84
|
+
const aliasesByTarget = new Map();
|
|
85
|
+
for (const alias of aliases) {
|
|
86
|
+
const list = aliasesByTarget.get(alias.worktreeId);
|
|
87
|
+
if (list)
|
|
88
|
+
list.push(alias.oldId);
|
|
89
|
+
else
|
|
90
|
+
aliasesByTarget.set(alias.worktreeId, [alias.oldId]);
|
|
91
|
+
}
|
|
92
|
+
const reserved = new Set([...rows.map((row) => row.id), ...aliases.map((a) => a.oldId)]);
|
|
93
|
+
const assigned = new Set();
|
|
94
|
+
const renames = [];
|
|
95
|
+
const droppedAliasIds = [];
|
|
96
|
+
for (const row of rows) {
|
|
97
|
+
const resolvedPath = path_1.default.resolve(row.path);
|
|
98
|
+
const ownAliasIds = aliasesByTarget.get(row.id) ?? [];
|
|
99
|
+
// The row's own history cannot block the row: its current ID and every ID it
|
|
100
|
+
// already answers to are exactly the rungs it is climbing away from.
|
|
101
|
+
const taken = new Set([...reserved, ...assigned]);
|
|
102
|
+
taken.delete(row.id);
|
|
103
|
+
for (const ownAliasId of ownAliasIds)
|
|
104
|
+
taken.delete(ownAliasId);
|
|
105
|
+
const newId = (0, worktree_id_1.deriveWorktreeId)(resolvedPath, taken);
|
|
106
|
+
// Only ever collapse. A longer or equal answer means the short forms are
|
|
107
|
+
// genuinely spoken for by other directories, and moving would buy nothing.
|
|
108
|
+
if (newId.length >= row.id.length) {
|
|
109
|
+
assigned.add(row.id);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
assigned.add(newId);
|
|
113
|
+
renames.push({ oldId: row.id, newId });
|
|
114
|
+
for (const ownAliasId of ownAliasIds) {
|
|
115
|
+
// Strictly longer than the ID we are landing on, and of a shape only this
|
|
116
|
+
// path's own derivation produces: an abandoned rung, nothing else.
|
|
117
|
+
if (ownAliasId.length > newId.length && (0, worktree_id_1.isDerivedWorktreeId)(ownAliasId, resolvedPath)) {
|
|
118
|
+
droppedAliasIds.push(ownAliasId);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { renames, droppedAliasIds };
|
|
123
|
+
}
|
|
124
|
+
exports.v55_migrations = [
|
|
125
|
+
{
|
|
126
|
+
version: 55,
|
|
127
|
+
name: 'compact-churned-worktree-ids',
|
|
128
|
+
up: (db) => {
|
|
129
|
+
const rows = db
|
|
130
|
+
.prepare('SELECT id, path FROM worktrees ORDER BY id')
|
|
131
|
+
.all();
|
|
132
|
+
if (rows.length === 0) {
|
|
133
|
+
console.log('No worktrees to compact');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const aliasTableExists = db
|
|
137
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'worktree_aliases'")
|
|
138
|
+
.get() !== undefined;
|
|
139
|
+
const aliases = aliasTableExists
|
|
140
|
+
? db
|
|
141
|
+
.prepare('SELECT old_id, worktree_id FROM worktree_aliases ORDER BY old_id')
|
|
142
|
+
.all().map((row) => ({ oldId: row.old_id, worktreeId: row.worktree_id }))
|
|
143
|
+
: [];
|
|
144
|
+
const { renames, droppedAliasIds } = planWorktreeIdCompaction(rows, aliases);
|
|
145
|
+
if (renames.length === 0) {
|
|
146
|
+
console.log(`No churned worktree IDs to compact (${rows.length} row(s) checked)`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Drop the abandoned rungs before the rename, so the ID being vacated is
|
|
150
|
+
// the only historical name this worktree is left with besides its genuine
|
|
151
|
+
// former names.
|
|
152
|
+
if (aliasTableExists && droppedAliasIds.length > 0) {
|
|
153
|
+
const deleteAlias = db.prepare('DELETE FROM worktree_aliases WHERE old_id = ?');
|
|
154
|
+
for (const aliasId of droppedAliasIds)
|
|
155
|
+
deleteAlias.run(aliasId);
|
|
156
|
+
}
|
|
157
|
+
// One timestamp for every alias this migration writes, so the rows read as
|
|
158
|
+
// a single event (same reasoning as v54).
|
|
159
|
+
const now = Date.now();
|
|
160
|
+
for (const rename of renames) {
|
|
161
|
+
(0, worktree_id_rename_1.renameWorktreeIdPreservingChildren)(db, rename.oldId, rename.newId, now);
|
|
162
|
+
console.log(`Compacted worktree ${rename.oldId} -> ${rename.newId}`);
|
|
163
|
+
}
|
|
164
|
+
console.log(`Compacted ${renames.length} of ${rows.length} worktree ID(s); ` +
|
|
165
|
+
`dropped ${droppedAliasIds.length} intermediate alias(es)`);
|
|
166
|
+
},
|
|
167
|
+
down: (db) => {
|
|
168
|
+
// The inverse is well defined even though the intermediate rungs are gone:
|
|
169
|
+
// the ID each row was compacted *from* was recorded as an alias by the
|
|
170
|
+
// rename, and it is the longest ladder-shaped alias the row still has (all
|
|
171
|
+
// the shorter rungs were deleted on the way forward). Genuine former names
|
|
172
|
+
// are not ladder-shaped, so they are never mistaken for it.
|
|
173
|
+
const aliasTableExists = db
|
|
174
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'worktree_aliases'")
|
|
175
|
+
.get() !== undefined;
|
|
176
|
+
if (!aliasTableExists) {
|
|
177
|
+
console.log('No worktree_aliases table: nothing to roll back');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const rows = db
|
|
181
|
+
.prepare('SELECT id, path FROM worktrees ORDER BY id')
|
|
182
|
+
.all();
|
|
183
|
+
const deleteAlias = db.prepare('DELETE FROM worktree_aliases WHERE old_id = ?');
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
let restored = 0;
|
|
186
|
+
for (const row of rows) {
|
|
187
|
+
const resolvedPath = path_1.default.resolve(row.path);
|
|
188
|
+
const candidates = db
|
|
189
|
+
.prepare('SELECT old_id FROM worktree_aliases WHERE worktree_id = ?')
|
|
190
|
+
.all(row.id)
|
|
191
|
+
.map((alias) => alias.old_id)
|
|
192
|
+
.filter((oldId) => oldId.length > row.id.length && (0, worktree_id_1.isDerivedWorktreeId)(oldId, resolvedPath))
|
|
193
|
+
.sort((a, b) => b.length - a.length || a.localeCompare(b));
|
|
194
|
+
const previousId = candidates[0];
|
|
195
|
+
if (!previousId)
|
|
196
|
+
continue;
|
|
197
|
+
deleteAlias.run(previousId);
|
|
198
|
+
(0, worktree_id_rename_1.renameWorktreeIdPreservingChildren)(db, row.id, previousId, now);
|
|
199
|
+
// The forward ID is now the historical one; the rollback should not
|
|
200
|
+
// leave it redirecting back to the ID it just undid.
|
|
201
|
+
deleteAlias.run(row.id);
|
|
202
|
+
restored++;
|
|
203
|
+
}
|
|
204
|
+
console.log(`Rolled back ${restored} worktree ID compaction(s)`);
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
];
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Live-schema introspection for "which tables reference a worktree".
|
|
4
|
+
*
|
|
5
|
+
* Lives under `migrations/` rather than next to `worktree-db.ts` because the
|
|
6
|
+
* dependency has to point this way: migration v52 sweeps orphans with the same
|
|
7
|
+
* enumeration the runtime uses, and a migration that imports `worktree-db.ts`
|
|
8
|
+
* inherits every mock of it — `vi.mock('@/lib/db/worktree-db')` in an unrelated
|
|
9
|
+
* suite made `runMigrations` throw `No "getDeletableWorktreeChildTables" export
|
|
10
|
+
* is defined` (measured across 5 tests). Schema introspection is the more
|
|
11
|
+
* foundational of the two, so it is what the other side imports.
|
|
12
|
+
*
|
|
13
|
+
* Issue #1621.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.getWorktreeChildTables = getWorktreeChildTables;
|
|
17
|
+
exports.getWriteGuardedTables = getWriteGuardedTables;
|
|
18
|
+
exports.getDeletableWorktreeChildTables = getDeletableWorktreeChildTables;
|
|
19
|
+
/** Conventional name of the column holding a worktree reference. */
|
|
20
|
+
const WORKTREE_REFERENCE_COLUMN = 'worktree_id';
|
|
21
|
+
/**
|
|
22
|
+
* Discover every table that references a worktree, along with the referencing
|
|
23
|
+
* column. Derived dynamically from the live schema so it never drifts out of
|
|
24
|
+
* sync with future migrations that add child tables.
|
|
25
|
+
*
|
|
26
|
+
* Two sources are unioned:
|
|
27
|
+
*
|
|
28
|
+
* 1. a `worktree_id` column, **whether or not** the table declares a foreign key
|
|
29
|
+
* 2. a declared foreign key to `worktrees(id)`, whatever the column is named
|
|
30
|
+
*
|
|
31
|
+
* Source 1 is what Issue #1621 adds. FK metadata alone (all this did before)
|
|
32
|
+
* silently skipped `tasks` (#1548), `verification_runs` (#1544) and
|
|
33
|
+
* `skill_operations` (#1428): all three carry a `worktree_id` but declare no
|
|
34
|
+
* constraint, so a rename left them pointing at an ID that no longer exists and
|
|
35
|
+
* a delete left them behind as orphans — no CASCADE fires without a FK.
|
|
36
|
+
*
|
|
37
|
+
* Source 2 is kept so a future table whose FK column is *not* named
|
|
38
|
+
* `worktree_id` keeps being followed; dropping it would be a regression for
|
|
39
|
+
* every table #1151 already handled.
|
|
40
|
+
*
|
|
41
|
+
* Issue #1151, #1621.
|
|
42
|
+
*/
|
|
43
|
+
function getWorktreeChildTables(db) {
|
|
44
|
+
const tables = db
|
|
45
|
+
.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'")
|
|
46
|
+
.all();
|
|
47
|
+
const children = [];
|
|
48
|
+
const seen = new Set();
|
|
49
|
+
const add = (table, column) => {
|
|
50
|
+
// JSON encoding keeps the pair unambiguous whatever the identifiers contain.
|
|
51
|
+
const key = JSON.stringify([table, column]);
|
|
52
|
+
if (seen.has(key))
|
|
53
|
+
return;
|
|
54
|
+
seen.add(key);
|
|
55
|
+
children.push({ table, column });
|
|
56
|
+
};
|
|
57
|
+
for (const { name: tableName } of tables) {
|
|
58
|
+
if (tableName === 'worktrees')
|
|
59
|
+
continue;
|
|
60
|
+
// PRAGMA identifiers cannot be bound; `tableName` comes from sqlite_master,
|
|
61
|
+
// not user input, so string interpolation here is safe.
|
|
62
|
+
const columns = db.prepare(`PRAGMA table_info("${tableName}")`).all();
|
|
63
|
+
if (columns.some((column) => column.name === WORKTREE_REFERENCE_COLUMN)) {
|
|
64
|
+
add(tableName, WORKTREE_REFERENCE_COLUMN);
|
|
65
|
+
}
|
|
66
|
+
const fks = db.prepare(`PRAGMA foreign_key_list("${tableName}")`).all();
|
|
67
|
+
for (const fk of fks) {
|
|
68
|
+
if (fk.table === 'worktrees' && (fk.to === 'id' || fk.to === null)) {
|
|
69
|
+
add(tableName, fk.from);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return children;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Tables the schema itself refuses to let us rewrite, per statement kind.
|
|
77
|
+
*
|
|
78
|
+
* An append-only ledger enforces itself with a `BEFORE UPDATE` / `BEFORE DELETE`
|
|
79
|
+
* trigger that calls `RAISE(ABORT, ...)`; `skill_operations` declares both
|
|
80
|
+
* (#1234, migrations v44/v48). Such a table carries a `worktree_id` yet is
|
|
81
|
+
* deliberately *not* owned by its worktree's lifetime: `querySkillOperationAudit`
|
|
82
|
+
* reads it across every worktree for the dashboard feed, exactly like v51 keeps
|
|
83
|
+
* `task_events` alive after its task is gone. Sweeping it is not cleanup, it is
|
|
84
|
+
* destroying audit history — and it does not even fail safely: the trigger
|
|
85
|
+
* aborts the statement, which rolls back the whole enclosing transaction, so a
|
|
86
|
+
* blind sweep breaks worktree deletion outright (measured: `deleteWorktreesByIds`
|
|
87
|
+
* threw `skill_operations is append-only` and the worktree row survived; the
|
|
88
|
+
* same sweep inside migration v52 fails startup).
|
|
89
|
+
*
|
|
90
|
+
* Detected from trigger SQL rather than by table name so a future ledger is
|
|
91
|
+
* protected the moment it declares its guard (Issue #1621).
|
|
92
|
+
*/
|
|
93
|
+
function getWriteGuardedTables(db) {
|
|
94
|
+
const triggers = db
|
|
95
|
+
.prepare("SELECT tbl_name, sql FROM sqlite_master WHERE type = 'trigger'")
|
|
96
|
+
.all();
|
|
97
|
+
const noUpdate = new Set();
|
|
98
|
+
const noDelete = new Set();
|
|
99
|
+
for (const trigger of triggers) {
|
|
100
|
+
if (!trigger.sql)
|
|
101
|
+
continue;
|
|
102
|
+
if (!/\bRAISE\s*\(\s*ABORT/i.test(trigger.sql))
|
|
103
|
+
continue;
|
|
104
|
+
if (/\bBEFORE\s+UPDATE\b/i.test(trigger.sql))
|
|
105
|
+
noUpdate.add(trigger.tbl_name);
|
|
106
|
+
if (/\bBEFORE\s+DELETE\b/i.test(trigger.sql))
|
|
107
|
+
noDelete.add(trigger.tbl_name);
|
|
108
|
+
}
|
|
109
|
+
return { noUpdate, noDelete };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Child tables whose rows a worktree actually owns — everything
|
|
113
|
+
* getWorktreeChildTables reports, minus the append-only ledgers that outlive it.
|
|
114
|
+
* This is the set a delete or an orphan sweep may touch (Issue #1621).
|
|
115
|
+
*/
|
|
116
|
+
function getDeletableWorktreeChildTables(db) {
|
|
117
|
+
const { noDelete } = getWriteGuardedTables(db);
|
|
118
|
+
return getWorktreeChildTables(db).filter(({ table }) => !noDelete.has(table));
|
|
119
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Moving a worktree's primary key without losing anything hanging off it.
|
|
4
|
+
*
|
|
5
|
+
* Lives under `migrations/` for the same reason `worktree-child-tables.ts` does,
|
|
6
|
+
* and it is not a stylistic choice: the Phase 4 renumbering (#1645) needs this
|
|
7
|
+
* logic, and a migration that imports `worktree-db.ts` inherits every
|
|
8
|
+
* `vi.mock('@/lib/db/worktree-db')` in the suite — four suites do exactly that
|
|
9
|
+
* today, and it is what made `runMigrations` throw
|
|
10
|
+
* `No "getDeletableWorktreeChildTables" export is defined` before v52 was moved.
|
|
11
|
+
* The same reasoning applies to `worktree-alias-db.ts`, so the alias INSERT is
|
|
12
|
+
* written here and `recordWorktreeAlias` delegates to it rather than the other
|
|
13
|
+
* way round.
|
|
14
|
+
*
|
|
15
|
+
* Issue #1151 (preserve children across a rename), #1621 (FK-less tables,
|
|
16
|
+
* aliases), #1645 (bulk renumbering).
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.recordWorktreeAliasRow = recordWorktreeAliasRow;
|
|
20
|
+
exports.deleteWorktreeChildRows = deleteWorktreeChildRows;
|
|
21
|
+
exports.renameWorktreeIdPreservingChildren = renameWorktreeIdPreservingChildren;
|
|
22
|
+
const worktree_child_tables_1 = require("./worktree-child-tables");
|
|
23
|
+
/** Whether `worktree_aliases` exists in this database. */
|
|
24
|
+
function hasAliasTable(db) {
|
|
25
|
+
const row = db
|
|
26
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'worktree_aliases'")
|
|
27
|
+
.get();
|
|
28
|
+
return row !== undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Record that `oldId` used to name the worktree now known as `worktreeId`.
|
|
32
|
+
*
|
|
33
|
+
* The implementation behind `recordWorktreeAlias` (`worktree-alias-db.ts`),
|
|
34
|
+
* kept here so migrations can reach it without importing that module. See that
|
|
35
|
+
* function's doc comment for the rules; in short:
|
|
36
|
+
*
|
|
37
|
+
* - a self-alias is dropped (it would resolve to itself);
|
|
38
|
+
* - an alias whose `old_id` equals the destination is deleted, because that ID
|
|
39
|
+
* names a live worktree again and the live row must win;
|
|
40
|
+
* - re-recording an existing `old_id` re-points it, so A→B→C resolves A→C in
|
|
41
|
+
* one hop rather than a chain.
|
|
42
|
+
*
|
|
43
|
+
* @param db - Database instance (caller supplies the transaction, if any)
|
|
44
|
+
* @param oldId - The ID that is being retired
|
|
45
|
+
* @param worktreeId - The ID it should resolve to from now on
|
|
46
|
+
* @param now - Timestamp in epoch milliseconds
|
|
47
|
+
*/
|
|
48
|
+
function recordWorktreeAliasRow(db, oldId, worktreeId, now) {
|
|
49
|
+
if (!oldId || !worktreeId || oldId === worktreeId)
|
|
50
|
+
return;
|
|
51
|
+
if (!hasAliasTable(db))
|
|
52
|
+
return;
|
|
53
|
+
// The destination ID now names a live worktree; any alias claiming it as a
|
|
54
|
+
// historical name is stale and would only confuse resolution.
|
|
55
|
+
db.prepare('DELETE FROM worktree_aliases WHERE old_id = ?').run(worktreeId);
|
|
56
|
+
db.prepare(`INSERT INTO worktree_aliases (old_id, worktree_id, created_at)
|
|
57
|
+
VALUES (?, ?, ?)
|
|
58
|
+
ON CONFLICT(old_id) DO UPDATE SET
|
|
59
|
+
worktree_id = excluded.worktree_id,
|
|
60
|
+
created_at = excluded.created_at`).run(oldId, worktreeId, now);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Delete every child row pointing at any of `worktreeIds`.
|
|
64
|
+
*
|
|
65
|
+
* Deliberately covers *all* deletable child tables, not just the FK-less ones:
|
|
66
|
+
* doing so makes deletion correct even when `PRAGMA foreign_keys` is off, and
|
|
67
|
+
* the extra statements against CASCADE tables remove rows that would have been
|
|
68
|
+
* removed anyway. Append-only ledgers are skipped (see getWriteGuardedTables).
|
|
69
|
+
* Must run before the parent row is deleted (Issue #1621).
|
|
70
|
+
*/
|
|
71
|
+
function deleteWorktreeChildRows(db, worktreeIds, children = (0, worktree_child_tables_1.getWorktreeChildTables)(db)) {
|
|
72
|
+
if (worktreeIds.length === 0)
|
|
73
|
+
return;
|
|
74
|
+
const { noDelete } = (0, worktree_child_tables_1.getWriteGuardedTables)(db);
|
|
75
|
+
const placeholders = worktreeIds.map(() => '?').join(',');
|
|
76
|
+
for (const { table, column } of children) {
|
|
77
|
+
if (noDelete.has(table))
|
|
78
|
+
continue;
|
|
79
|
+
db.prepare(`DELETE FROM "${table}" WHERE "${column}" IN (${placeholders})`).run(...worktreeIds);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Rename a worktree row's primary key from `oldId` to `newId`, re-pointing every
|
|
84
|
+
* child table's foreign key so no CASCADE deletion occurs. This is what makes a
|
|
85
|
+
* same-directory branch switch preserve chat history and all related data
|
|
86
|
+
* instead of destroying it (Issue #1151).
|
|
87
|
+
*
|
|
88
|
+
* "Every child table" means every table carrying a worktree reference, not just
|
|
89
|
+
* the ones that declare a foreign key: `tasks`, `verification_runs` and
|
|
90
|
+
* `skill_operations` do not, and used to be left addressing an ID that no
|
|
91
|
+
* longer resolves (Issue #1621).
|
|
92
|
+
*
|
|
93
|
+
* Append-only ledgers are the one exception, and the schema states it itself —
|
|
94
|
+
* `skill_operations` aborts any UPDATE (#1234). An immutable audit row records
|
|
95
|
+
* what happened under the identity in force at the time, and rewriting it is
|
|
96
|
+
* precisely what its trigger exists to prevent; attempting it does not fail
|
|
97
|
+
* quietly either, it aborts the enclosing transaction and takes the rename with
|
|
98
|
+
* it (measured). See getWriteGuardedTables.
|
|
99
|
+
*
|
|
100
|
+
* Must be called inside a transaction. `PRAGMA defer_foreign_keys` defers FK
|
|
101
|
+
* enforcement to COMMIT, letting us repoint the parent PK and its children in
|
|
102
|
+
* any order without needing `ON UPDATE CASCADE` on every constraint.
|
|
103
|
+
*
|
|
104
|
+
* @param db - Database instance
|
|
105
|
+
* @param oldId - Current primary key
|
|
106
|
+
* @param newId - Primary key it should have
|
|
107
|
+
* @param now - Timestamp recorded on the alias row (epoch milliseconds)
|
|
108
|
+
*/
|
|
109
|
+
function renameWorktreeIdPreservingChildren(db, oldId, newId, now = Date.now()) {
|
|
110
|
+
if (oldId === newId)
|
|
111
|
+
return;
|
|
112
|
+
const oldExists = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(oldId);
|
|
113
|
+
if (!oldExists)
|
|
114
|
+
return;
|
|
115
|
+
// Defer FK checks until COMMIT so the parent PK and child FKs can be updated
|
|
116
|
+
// independently. Resets automatically at the end of the transaction.
|
|
117
|
+
db.pragma('defer_foreign_keys = ON');
|
|
118
|
+
const newExists = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(newId);
|
|
119
|
+
const { noUpdate } = (0, worktree_child_tables_1.getWriteGuardedTables)(db);
|
|
120
|
+
const allChildren = (0, worktree_child_tables_1.getWorktreeChildTables)(db);
|
|
121
|
+
const children = allChildren.filter(({ table }) => !noUpdate.has(table));
|
|
122
|
+
if (newExists) {
|
|
123
|
+
// Collision guard. `path` is UNIQUE so two rows for the same directory
|
|
124
|
+
// should never coexist, but if the DB is already inconsistent keep the
|
|
125
|
+
// destination row's data and fold in the source's non-conflicting children.
|
|
126
|
+
for (const { table, column } of children) {
|
|
127
|
+
db.prepare(`UPDATE OR IGNORE "${table}" SET "${column}" = ? WHERE "${column}" = ?`).run(newId, oldId);
|
|
128
|
+
}
|
|
129
|
+
// Conflicting leftovers are dropped explicitly rather than left to CASCADE:
|
|
130
|
+
// tables without a foreign key never cascade, so relying on the parent
|
|
131
|
+
// delete alone would strand their rows on a dead ID (#1621).
|
|
132
|
+
deleteWorktreeChildRows(db, [oldId], allChildren);
|
|
133
|
+
db.prepare('DELETE FROM worktrees WHERE id = ?').run(oldId);
|
|
134
|
+
recordWorktreeAliasRow(db, oldId, newId, now);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Normal rename: move the parent PK, then repoint all child rows.
|
|
138
|
+
db.prepare('UPDATE worktrees SET id = ? WHERE id = ?').run(newId, oldId);
|
|
139
|
+
for (const { table, column } of children) {
|
|
140
|
+
db.prepare(`UPDATE "${table}" SET "${column}" = ? WHERE "${column}" = ?`).run(newId, oldId);
|
|
141
|
+
}
|
|
142
|
+
// The rename is what retires `oldId`, so this is the one place that knows an
|
|
143
|
+
// alias is needed. Recording it here (rather than at each call site) means
|
|
144
|
+
// every path that moves an ID — sync, the #1645 bulk migration, a future
|
|
145
|
+
// directory move — keeps old URLs and old `commandmate send <id>` lines
|
|
146
|
+
// answering, without any of them having to remember to.
|
|
147
|
+
//
|
|
148
|
+
// Runs AFTER the child sweep on purpose: `worktree_aliases` carries a
|
|
149
|
+
// `worktree_id`, so the loop above has already re-pointed the aliases this
|
|
150
|
+
// worktree accumulated earlier. A→B→C therefore leaves A→C and B→C, never a
|
|
151
|
+
// chain that resolution would have to walk.
|
|
152
|
+
recordWorktreeAliasRow(db, oldId, newId, now);
|
|
153
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Historical worktree IDs and the worktree they now resolve to (Issue #1621,
|
|
4
|
+
* Phase 2; table created by migration v53).
|
|
5
|
+
*
|
|
6
|
+
* A worktree ID leaks out of the database the moment it is minted: into URLs
|
|
7
|
+
* the user bookmarks, into tabs they leave open, into `commandmate send <id>`
|
|
8
|
+
* lines in someone's script. #1644 stops the ID from moving on its own, but IDs
|
|
9
|
+
* written under the old branch-derived scheme still have to be renumbered
|
|
10
|
+
* (#1645), and a directory can still be moved. Recording the old ID is what
|
|
11
|
+
* keeps every one of those references answering instead of 404ing.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately free of any dependency on the request/singleton layer: every
|
|
14
|
+
* function takes the `db` it should act on. The route-boundary wrapper that
|
|
15
|
+
* reaches for the singleton lives in `@/lib/git/git-route-worktree`.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.recordWorktreeAlias = recordWorktreeAlias;
|
|
19
|
+
exports.resolveWorktreeIdWithAlias = resolveWorktreeIdWithAlias;
|
|
20
|
+
exports.getWorktreeAliases = getWorktreeAliases;
|
|
21
|
+
exports.getAllWorktreeAliases = getAllWorktreeAliases;
|
|
22
|
+
exports.getAliasedWorktreeIds = getAliasedWorktreeIds;
|
|
23
|
+
const worktree_id_rename_1 = require("./migrations/worktree-id-rename");
|
|
24
|
+
/**
|
|
25
|
+
* Whether `worktree_aliases` exists in this database.
|
|
26
|
+
*
|
|
27
|
+
* A database opened by `getDbInstance` is always migrated, but tests hand
|
|
28
|
+
* hand-built connections around and the CLI can point at an older file. Callers
|
|
29
|
+
* on the request path must degrade to "no alias" rather than throw, so the
|
|
30
|
+
* lookups below check first.
|
|
31
|
+
*/
|
|
32
|
+
function hasAliasTable(db) {
|
|
33
|
+
const row = db
|
|
34
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'worktree_aliases'")
|
|
35
|
+
.get();
|
|
36
|
+
return row !== undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Record that `oldId` used to name the worktree now known as `worktreeId`.
|
|
40
|
+
*
|
|
41
|
+
* Idempotent, and safe to call from inside the rename transaction:
|
|
42
|
+
*
|
|
43
|
+
* - a self-alias (`oldId === worktreeId`) is dropped — it would resolve to
|
|
44
|
+
* itself and shadow nothing useful;
|
|
45
|
+
* - an alias whose `old_id` equals the *destination* is deleted, because that
|
|
46
|
+
* ID is a live worktree again and the live row must win;
|
|
47
|
+
* - re-recording an existing `old_id` re-points it (`ON CONFLICT DO UPDATE`),
|
|
48
|
+
* so an ID renamed A→B→C resolves A→C in one hop rather than a chain.
|
|
49
|
+
*
|
|
50
|
+
* @param db - Database instance (caller supplies the transaction, if any)
|
|
51
|
+
* @param oldId - The ID that is being retired
|
|
52
|
+
* @param worktreeId - The ID it should resolve to from now on
|
|
53
|
+
* @param now - Timestamp in epoch milliseconds
|
|
54
|
+
*/
|
|
55
|
+
function recordWorktreeAlias(db, oldId, worktreeId, now = Date.now()) {
|
|
56
|
+
// The statements live in `migrations/worktree-id-rename.ts`: the rename that
|
|
57
|
+
// records the alias has to be callable from a migration, and a migration that
|
|
58
|
+
// imports a `@/lib/db/*` module inherits every `vi.mock` of it in the suite
|
|
59
|
+
// (Issue #1621, #1645). This function stays the public entry point.
|
|
60
|
+
(0, worktree_id_rename_1.recordWorktreeAliasRow)(db, oldId, worktreeId, now);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve an ID that may be historical to the ID that is current.
|
|
64
|
+
*
|
|
65
|
+
* Live worktrees win over aliases, always. An ID can be both — a worktree
|
|
66
|
+
* created at a directory whose basename matches an ID some other worktree used
|
|
67
|
+
* to have — and in that case the thing that exists now is the answer.
|
|
68
|
+
*
|
|
69
|
+
* @param db - Database instance
|
|
70
|
+
* @param id - A worktree ID as supplied by a URL, a CLI argument, …
|
|
71
|
+
* @returns The current worktree ID, or `null` when nothing resolves
|
|
72
|
+
*/
|
|
73
|
+
function resolveWorktreeIdWithAlias(db, id) {
|
|
74
|
+
if (!id)
|
|
75
|
+
return null;
|
|
76
|
+
const live = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(id);
|
|
77
|
+
if (live)
|
|
78
|
+
return id;
|
|
79
|
+
if (!hasAliasTable(db))
|
|
80
|
+
return null;
|
|
81
|
+
const row = db
|
|
82
|
+
.prepare('SELECT worktree_id FROM worktree_aliases WHERE old_id = ?')
|
|
83
|
+
.get(id);
|
|
84
|
+
if (!row)
|
|
85
|
+
return null;
|
|
86
|
+
// An alias pointing at a worktree that is gone is not a redirect, it is a
|
|
87
|
+
// dangling row (only reachable if foreign keys were off when it was deleted).
|
|
88
|
+
const target = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(row.worktree_id);
|
|
89
|
+
return target ? row.worktree_id : null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Every historical ID recorded for one worktree, newest first.
|
|
93
|
+
*
|
|
94
|
+
* @param db - Database instance
|
|
95
|
+
* @param worktreeId - Current worktree ID
|
|
96
|
+
*/
|
|
97
|
+
function getWorktreeAliases(db, worktreeId) {
|
|
98
|
+
if (!hasAliasTable(db))
|
|
99
|
+
return [];
|
|
100
|
+
const rows = db
|
|
101
|
+
.prepare(`SELECT old_id, worktree_id, created_at
|
|
102
|
+
FROM worktree_aliases
|
|
103
|
+
WHERE worktree_id = ?
|
|
104
|
+
ORDER BY created_at DESC, old_id ASC`)
|
|
105
|
+
.all(worktreeId);
|
|
106
|
+
return rows.map((row) => ({
|
|
107
|
+
oldId: row.old_id,
|
|
108
|
+
worktreeId: row.worktree_id,
|
|
109
|
+
createdAt: row.created_at,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Every alias in the database, oldest first.
|
|
114
|
+
*
|
|
115
|
+
* Feeds the startup session reconciliation (Issue #1621 Phase 3/4): each row is
|
|
116
|
+
* an ID that used to name a worktree, so `mcbd-<cli>-<old_id>` is exactly the
|
|
117
|
+
* tmux session name a still-running agent may be sitting under. Ordering by
|
|
118
|
+
* `created_at` makes the pass deterministic; the rename itself is
|
|
119
|
+
* order-independent because it runs in two stages.
|
|
120
|
+
*
|
|
121
|
+
* Returns `[]` rather than throwing when the table has not been created yet, so
|
|
122
|
+
* a caller on an older database degrades to "nothing to reconcile".
|
|
123
|
+
*
|
|
124
|
+
* @param db - Database instance
|
|
125
|
+
*/
|
|
126
|
+
function getAllWorktreeAliases(db) {
|
|
127
|
+
if (!hasAliasTable(db))
|
|
128
|
+
return [];
|
|
129
|
+
const rows = db
|
|
130
|
+
.prepare(`SELECT old_id, worktree_id, created_at
|
|
131
|
+
FROM worktree_aliases
|
|
132
|
+
ORDER BY created_at ASC, old_id ASC`)
|
|
133
|
+
.all();
|
|
134
|
+
return rows.map((row) => ({
|
|
135
|
+
oldId: row.old_id,
|
|
136
|
+
worktreeId: row.worktree_id,
|
|
137
|
+
createdAt: row.created_at,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Every ID that is currently answerable as an alias.
|
|
142
|
+
*
|
|
143
|
+
* Feeds `deriveWorktreeId`'s taken set: a brand-new worktree must not be minted
|
|
144
|
+
* an ID that an alias already redirects somewhere else, or the redirect would
|
|
145
|
+
* be shadowed and one of the two references would start pointing at the wrong
|
|
146
|
+
* worktree (Issue #1621).
|
|
147
|
+
*
|
|
148
|
+
* @param db - Database instance
|
|
149
|
+
*/
|
|
150
|
+
function getAliasedWorktreeIds(db) {
|
|
151
|
+
if (!hasAliasTable(db))
|
|
152
|
+
return [];
|
|
153
|
+
const rows = db.prepare('SELECT old_id FROM worktree_aliases').all();
|
|
154
|
+
return rows.map((row) => row.old_id);
|
|
155
|
+
}
|