commandmate 0.10.3 → 0.11.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 +155 -155
- package/.next/app-path-routes-manifest.json +30 -30
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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 +3 -3
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +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 +3 -2
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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_client-reference-manifest.js +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_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/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -47
- 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 -47
- 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/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +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/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 +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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 +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +2 -2
- 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 +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -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]/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]/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]/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/chat/page.js +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +1 -1
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/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_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +30 -30
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1117.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/233.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3270.js +1 -1
- package/.next/server/chunks/3480.js +2 -2
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/406.js +47 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/5381.js +1 -47
- package/.next/server/chunks/5959.js +2 -2
- package/.next/server/chunks/646.js +33 -0
- package/.next/server/chunks/8681.js +1 -0
- package/.next/server/chunks/8807.js +305 -300
- package/.next/server/chunks/9067.js +1 -1
- package/.next/server/chunks/9355.js +1 -1
- package/.next/server/chunks/9687.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/4560-2bf9cb6504cc4425.js +1 -0
- package/.next/static/chunks/7347-7ee39e14be89e508.js +1 -0
- package/.next/static/chunks/app/chat/page-5d20240f98c07cee.js +1 -0
- package/.next/static/chunks/app/layout-fe5857360dfba2b9.js +1 -0
- package/.next/static/chunks/app/more/page-af1d2af13ea901d2.js +1 -0
- package/.next/static/chunks/app/page-3bbe737ec910d1fb.js +1 -0
- package/.next/static/chunks/app/repositories/page-ace9134ac165a6de.js +1 -0
- package/.next/static/chunks/app/review/page-331b80f4f58582bc.js +1 -0
- package/.next/static/chunks/app/sessions/page-d694149a7e8649b6.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-1c311aaa0950db1e.js +1 -0
- package/.next/static/css/d7e2e8d1b8d69d36.css +1 -0
- package/.next/trace +10 -10
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +27 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +19 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +178 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/index.d.ts +13 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/agent-instances.d.ts +1 -1
- package/dist/cli/utils/agent-instances.d.ts.map +1 -1
- package/dist/cli/utils/agent-instances.js +8 -1
- package/dist/cli/utils/api-client.d.ts +36 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +82 -0
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +44 -9
- package/dist/cli/utils/npx-runner.d.ts +88 -0
- package/dist/cli/utils/npx-runner.d.ts.map +1 -0
- package/dist/cli/utils/npx-runner.js +165 -0
- package/dist/cli/utils/package-info.d.ts +17 -0
- package/dist/cli/utils/package-info.d.ts.map +1 -0
- package/dist/cli/utils/package-info.js +31 -0
- package/dist/cli/utils/pid-manager.d.ts +65 -9
- package/dist/cli/utils/pid-manager.d.ts.map +1 -1
- package/dist/cli/utils/pid-manager.js +81 -21
- package/dist/cli/utils/process-inspector.d.ts +27 -0
- package/dist/cli/utils/process-inspector.d.ts.map +1 -0
- package/dist/cli/utils/process-inspector.js +37 -0
- package/dist/lib/app-update/update-lock.d.ts +39 -0
- package/dist/lib/app-update/update-lock.d.ts.map +1 -0
- package/dist/lib/app-update/update-lock.js +116 -0
- package/dist/server/src/config/github-links.js +22 -0
- package/dist/server/src/lib/db/db-instance.js +22 -3
- package/dist/server/src/lib/db/db-repository.js +107 -19
- package/dist/server/src/lib/db/db.js +3 -2
- package/dist/server/src/lib/db/memo-db.js +32 -1
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +11 -1
- package/dist/server/src/lib/db/migrations/v43-remove-cm-root-dir-ghost-repository.js +126 -0
- package/dist/server/src/lib/git/worktrees.js +90 -0
- package/dist/server/src/lib/job-executor.js +8 -2
- package/dist/server/src/lib/realtime/types.js +76 -0
- package/dist/server/src/lib/schedule-manager.js +9 -1
- package/dist/server/src/lib/version-checker.js +297 -0
- package/dist/server/src/lib/ws-server.js +37 -0
- package/package.json +1 -1
- package/.next/server/chunks/2464.js +0 -33
- package/.next/server/chunks/6791.js +0 -47
- package/.next/static/chunks/7347-4a031aecf4664a6d.js +0 -1
- package/.next/static/chunks/8954-ce15ee4d0423f1b1.js +0 -1
- package/.next/static/chunks/app/chat/page-dee86bdf87516e40.js +0 -1
- package/.next/static/chunks/app/layout-d02f4691a4eff86b.js +0 -1
- package/.next/static/chunks/app/more/page-39ec8b5f27cf52e7.js +0 -1
- package/.next/static/chunks/app/page-ebf1db9826b4065d.js +0 -1
- package/.next/static/chunks/app/repositories/page-2be54cae5fcc1f7a.js +0 -1
- package/.next/static/chunks/app/review/page-ac4efe6857a0f3bf.js +0 -1
- package/.next/static/chunks/app/sessions/page-dc545a3d45374187.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-9eb2f37809919531.js +0 -1
- package/.next/static/css/eabd34bf2ab147a4.css +0 -1
- /package/.next/static/{Ndx_NzkoP54cD0UCmjUlu → 8yp8SRJ9h3Uj75SpHLYpl}/_buildManifest.js +0 -0
- /package/.next/static/{Ndx_NzkoP54cD0UCmjUlu → 8yp8SRJ9h3Uj75SpHLYpl}/_ssgManifest.js +0 -0
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.removeAgentInstance = exports.addAgentInstance = exports.setAgentInstances = exports.countAgentInstances = exports.getAgentInstance = exports.getAgentInstances = exports.deleteSessionState = exports.clearInProgressMessageId = exports.setInProgressMessageId = exports.updateSessionState = exports.getSessionState = exports.getMessagesByDateRange = exports.ACTIVE_FILTER = exports.markPendingPromptsAsAnswered = exports.updatePromptData = exports.getMessageById = exports.recomputeLastUserMessage = exports.clearLastUserMessage = exports.updateLastUserMessage = exports.deleteMessagesByInstance = exports.deleteMessagesByCliTool = exports.deleteMessageById = exports.deleteAllMessages = exports.getLastMessage = exports.getLastUserMessage = exports.getMessages = exports.updateMessageContent = exports.createMessage = exports.getLastAssistantMessageAt = exports.deleteWorktreesByIds = exports.deleteRepositoryWorktrees = exports.migrateWorktreeIdPreservingChildren = exports.getWorktreesByRepository = exports.getWorktreeIdsByRepository = exports.getInitialBranch = exports.saveInitialBranch = exports.updateVibeLocalContextWindow = exports.updateVibeLocalModel = exports.updateSelectedAgents = exports.updateCliToolId = exports.updateStatus = exports.updateFavorite = exports.updateLastViewedAt = exports.updateWorktreeLink = exports.updateWorktreeDescription = exports.upsertWorktree = exports.getWorktreeById = exports.getRepositories = exports.getWorktrees = exports.initDatabase = void 0;
|
|
14
|
-
exports.
|
|
15
|
-
exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = void 0;
|
|
14
|
+
exports.getAssistantExecutionById = exports.updateAssistantExecution = exports.createAssistantExecution = exports.archiveAssistantMessagesFrom = exports.archiveAllAssistantMessages = exports.getAssistantMessageById = exports.getAssistantMessages = exports.updateAssistantMessageStatus = exports.createAssistantMessage = exports.updateAssistantConversation = exports.createAssistantConversation = exports.getAssistantConversationByRepositoryAndCliTool = exports.getAssistantConversationById = exports.updateDailyReportContent = exports.saveDailyReport = exports.getDailyReport = exports.recoverStuckSendingTimers = exports.clearTimerHistory = exports.cleanupOldTimers = exports.getPendingTimerCountByWorktree = exports.cancelTimersByWorktree = exports.cancelTimer = exports.updateTimerStatus = exports.getPendingTimers = exports.getTimerById = exports.getTimersByWorktree = exports.createTimer = exports.WORKTREE_TODO_STATUSES = exports.isWorktreeTodoStatus = exports.reorderWorktreeTodos = exports.deleteWorktreeTodo = exports.updateWorktreeTodo = exports.createWorktreeTodo = exports.getWorktreeTodoById = exports.getTodosByWorktreeId = exports.deleteTodo = exports.updateTodo = exports.createTodo = exports.getTodoById = exports.getAllTodos = exports.getTodosByRepositoryId = exports.MemoDbError = exports.reorderMemos = exports.deleteMemo = exports.updateMemo = exports.createMemo = exports.getMemoById = exports.getMemosByWorktreeId = exports.InvalidAgentInstanceError = exports.AgentInstanceLimitError = void 0;
|
|
15
|
+
exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = exports.getLatestAssistantExecutionByConversation = void 0;
|
|
16
16
|
// init-db
|
|
17
17
|
var init_db_1 = require("./init-db");
|
|
18
18
|
Object.defineProperty(exports, "initDatabase", { enumerable: true, get: function () { return init_db_1.initDatabase; } });
|
|
@@ -83,6 +83,7 @@ Object.defineProperty(exports, "createMemo", { enumerable: true, get: function (
|
|
|
83
83
|
Object.defineProperty(exports, "updateMemo", { enumerable: true, get: function () { return memo_db_1.updateMemo; } });
|
|
84
84
|
Object.defineProperty(exports, "deleteMemo", { enumerable: true, get: function () { return memo_db_1.deleteMemo; } });
|
|
85
85
|
Object.defineProperty(exports, "reorderMemos", { enumerable: true, get: function () { return memo_db_1.reorderMemos; } });
|
|
86
|
+
Object.defineProperty(exports, "MemoDbError", { enumerable: true, get: function () { return memo_db_1.MemoDbError; } });
|
|
86
87
|
// todo-db (repository-scoped Home ToDo widget)
|
|
87
88
|
var todo_db_1 = require("./todo-db");
|
|
88
89
|
Object.defineProperty(exports, "getTodosByRepositoryId", { enumerable: true, get: function () { return todo_db_1.getTodosByRepositoryId; } });
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Issue #479: Extracted from db.ts for single-responsibility separation
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MemoDbError = void 0;
|
|
9
10
|
exports.getMemosByWorktreeId = getMemosByWorktreeId;
|
|
10
11
|
exports.getMemoById = getMemoById;
|
|
11
12
|
exports.createMemo = createMemo;
|
|
@@ -13,6 +14,26 @@ exports.updateMemo = updateMemo;
|
|
|
13
14
|
exports.deleteMemo = deleteMemo;
|
|
14
15
|
exports.reorderMemos = reorderMemos;
|
|
15
16
|
const crypto_1 = require("crypto");
|
|
17
|
+
/**
|
|
18
|
+
* Database error for memo operations.
|
|
19
|
+
*
|
|
20
|
+
* Issue #1351: `createMemo` writes to a table with a
|
|
21
|
+
* `UNIQUE(worktree_id, position)` constraint. Converting the driver's opaque
|
|
22
|
+
* "UNIQUE constraint failed" message into a typed, coded error lets API callers
|
|
23
|
+
* map the collision to an explicit 409 instead of a generic 500. Mirrors
|
|
24
|
+
* `ExternalAppDbError` in `src/lib/external-apps/db.ts`.
|
|
25
|
+
*/
|
|
26
|
+
class MemoDbError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
cause;
|
|
29
|
+
constructor(message, code, cause) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.code = code;
|
|
32
|
+
this.cause = cause;
|
|
33
|
+
this.name = 'MemoDbError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.MemoDbError = MemoDbError;
|
|
16
37
|
/**
|
|
17
38
|
* Map database row to WorktreeMemo model
|
|
18
39
|
*/
|
|
@@ -73,7 +94,17 @@ function createMemo(db, worktreeId, options) {
|
|
|
73
94
|
INSERT INTO worktree_memos (id, worktree_id, title, content, position, created_at, updated_at)
|
|
74
95
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
75
96
|
`);
|
|
76
|
-
|
|
97
|
+
try {
|
|
98
|
+
stmt.run(id, worktreeId, title, content, options.position, now, now);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// UNIQUE(worktree_id, position) violation -> typed DUPLICATE error (Issue #1351).
|
|
102
|
+
// Other failures (e.g. FOREIGN KEY) are re-thrown unchanged.
|
|
103
|
+
if (error instanceof Error && error.message.includes('UNIQUE constraint')) {
|
|
104
|
+
throw new MemoDbError(`Memo position ${options.position} is already in use for worktree "${worktreeId}"`, 'DUPLICATE_POSITION', error);
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
77
108
|
return {
|
|
78
109
|
id,
|
|
79
110
|
worktreeId,
|
|
@@ -26,6 +26,7 @@ const v39_worktree_todo_detail_1 = require("./v39-worktree-todo-detail");
|
|
|
26
26
|
const v40_timer_error_1 = require("./v40-timer-error");
|
|
27
27
|
const v41_push_subscriptions_1 = require("./v41-push-subscriptions");
|
|
28
28
|
const v42_push_subscription_locale_1 = require("./v42-push-subscription-locale");
|
|
29
|
+
const v43_remove_cm_root_dir_ghost_repository_1 = require("./v43-remove-cm-root-dir-ghost-repository");
|
|
29
30
|
/**
|
|
30
31
|
* Complete ordered list of all migrations.
|
|
31
32
|
* Used internally by the barrel file (db-migrations.ts); NOT exported from the barrel (DR2-004).
|
|
@@ -55,4 +56,5 @@ exports.migrations = [
|
|
|
55
56
|
...v40_timer_error_1.v40_migrations,
|
|
56
57
|
...v41_push_subscriptions_1.v41_migrations,
|
|
57
58
|
...v42_push_subscription_locale_1.v42_migrations,
|
|
59
|
+
...v43_remove_cm_root_dir_ghost_repository_1.v43_migrations,
|
|
58
60
|
];
|
|
@@ -17,7 +17,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
17
17
|
* Current schema version
|
|
18
18
|
* Increment this when adding new migrations
|
|
19
19
|
*/
|
|
20
|
-
exports.CURRENT_SCHEMA_VERSION =
|
|
20
|
+
exports.CURRENT_SCHEMA_VERSION = 43;
|
|
21
21
|
/**
|
|
22
22
|
* Get current schema version from database
|
|
23
23
|
*/
|
|
@@ -56,6 +56,16 @@ function runMigrations(db, migrations) {
|
|
|
56
56
|
// Get current version
|
|
57
57
|
const currentVersion = getCurrentVersion(db);
|
|
58
58
|
console.log(`Current schema version: ${currentVersion}`);
|
|
59
|
+
// Issue #1353: refuse a database written by a newer build.
|
|
60
|
+
// Migrations only move forward, so this build has no definition for the
|
|
61
|
+
// schema it is looking at: queries still written against renamed/dropped
|
|
62
|
+
// columns would fail at runtime, long after startup reported success.
|
|
63
|
+
// The check sits after the version read but before any migration writes.
|
|
64
|
+
if (currentVersion > exports.CURRENT_SCHEMA_VERSION) {
|
|
65
|
+
throw new Error(`This database (schema v${currentVersion}) was created by a newer version of CommandMate ` +
|
|
66
|
+
`(this build supports up to v${exports.CURRENT_SCHEMA_VERSION}). ` +
|
|
67
|
+
`Please update: commandmate update`);
|
|
68
|
+
}
|
|
59
69
|
// Find pending migrations
|
|
60
70
|
const pendingMigrations = migrations.filter(migration => migration.version > currentVersion);
|
|
61
71
|
if (pendingMigrations.length === 0) {
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Migration v43: delete the CM_ROOT_DIR ghost repository row (Issue #1339).
|
|
4
|
+
*
|
|
5
|
+
* Before #1328, `getRepositoryPaths()` returned CM_ROOT_DIR as if it were a
|
|
6
|
+
* single repository path, and the sync route handed it to
|
|
7
|
+
* `ensureEnvRepositoriesRegistered()`, which wrote it to `repositories` with
|
|
8
|
+
* `is_env_managed = 1`. But CM_ROOT_DIR is the *container* of repositories, not
|
|
9
|
+
* a repository: `git worktree list` run there returns nothing, so no `worktrees`
|
|
10
|
+
* row was ever created for it. The result is a repository row with no worktrees
|
|
11
|
+
* under it — visible in the repository management screen, absent from the
|
|
12
|
+
* sidebar (which is driven by `worktrees`), and impossible for the user to tell
|
|
13
|
+
* apart from a real entry.
|
|
14
|
+
*
|
|
15
|
+
* #1328 removed the discovery that created these rows but deliberately left the
|
|
16
|
+
* existing rows alone. This migration is that clean-up.
|
|
17
|
+
*
|
|
18
|
+
* SCOPE: only the `is_env_managed = 1` row whose path is exactly CM_ROOT_DIR.
|
|
19
|
+
* The `is_env_managed = 0` ghosts written by `disableRepository()` are a
|
|
20
|
+
* different defect (#1346) and are not touched here.
|
|
21
|
+
*
|
|
22
|
+
* The three guards below exist because deleting a *legitimate* env-managed row
|
|
23
|
+
* is not a harmless mistake: `ensureEnvRepositoriesRegistered()` recreates a
|
|
24
|
+
* missing row with `enabled: true` (db-repository.ts:469), so a wrong delete
|
|
25
|
+
* silently re-enables a repository the user had switched off, and drops their
|
|
26
|
+
* `visible` / `display_name` alongside it. Every guard fails toward keeping the
|
|
27
|
+
* row.
|
|
28
|
+
*
|
|
29
|
+
* Backward compatibility: a DB with no ghost row (the normal case for anyone who
|
|
30
|
+
* never ran a pre-#1328 build) matches nothing and the migration is a no-op.
|
|
31
|
+
*/
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.v43_migrations = void 0;
|
|
37
|
+
const path_1 = __importDefault(require("path"));
|
|
38
|
+
/**
|
|
39
|
+
* The configured CM_ROOT_DIR, resolved the same way the ghost row's path was
|
|
40
|
+
* written: `path.resolve()` over the raw env value (`resolveRepositoryPath()`).
|
|
41
|
+
*
|
|
42
|
+
* Deliberately NOT `getEnv()`: that falls back to `process.cwd()` when
|
|
43
|
+
* CM_ROOT_DIR is unset (env.ts:218), which would aim this DELETE at whatever
|
|
44
|
+
* directory the server happened to start in — quite plausibly a real repository.
|
|
45
|
+
* An unset CM_ROOT_DIR must mean "skip", never "target cwd".
|
|
46
|
+
*
|
|
47
|
+
* Read straight from process.env rather than through env.ts so the migration
|
|
48
|
+
* stays frozen: it must keep deleting exactly what the pre-#1328 code wrote,
|
|
49
|
+
* whatever env.ts grows into later.
|
|
50
|
+
*
|
|
51
|
+
* @returns Resolved CM_ROOT_DIR, or null when it is not configured
|
|
52
|
+
*/
|
|
53
|
+
function getConfiguredRootDir() {
|
|
54
|
+
// MCBD_ROOT_DIR is the pre-#76 name and still supported (env.ts ENV_MAPPING).
|
|
55
|
+
const raw = process.env.CM_ROOT_DIR ?? process.env.MCBD_ROOT_DIR;
|
|
56
|
+
if (!raw || !raw.trim()) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return path_1.default.resolve(raw.trim());
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* WORKTREE_REPOS entries, resolved. These are the *legitimate* `is_env_managed`
|
|
63
|
+
* rows: post-#1328 `getRepositoryPaths()` returns this list and nothing else.
|
|
64
|
+
*
|
|
65
|
+
* Parsed inline, mirroring `getRepositoryPaths()` (git/worktrees.ts:144), rather
|
|
66
|
+
* than imported: worktrees.ts pulls in `@/lib/db`, whose barrel re-exports this
|
|
67
|
+
* very migration list.
|
|
68
|
+
*
|
|
69
|
+
* @returns Resolved WORKTREE_REPOS paths (empty when unset)
|
|
70
|
+
*/
|
|
71
|
+
function getWorktreeRepoPaths() {
|
|
72
|
+
const raw = process.env.WORKTREE_REPOS;
|
|
73
|
+
if (!raw || !raw.trim()) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return raw
|
|
77
|
+
.split(',')
|
|
78
|
+
.map((p) => p.trim())
|
|
79
|
+
.filter((p) => p.length > 0)
|
|
80
|
+
.map((p) => path_1.default.resolve(p));
|
|
81
|
+
}
|
|
82
|
+
exports.v43_migrations = [
|
|
83
|
+
{
|
|
84
|
+
version: 43,
|
|
85
|
+
name: 'remove-cm-root-dir-ghost-repository',
|
|
86
|
+
up: (db) => {
|
|
87
|
+
// Guard 1: no CM_ROOT_DIR, no target. See getConfiguredRootDir().
|
|
88
|
+
const rootDir = getConfiguredRootDir();
|
|
89
|
+
if (!rootDir) {
|
|
90
|
+
console.log('Migration 43: CM_ROOT_DIR is not set; no ghost row to remove');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Guard 2: CM_ROOT_DIR may legitimately also be listed in WORKTREE_REPOS,
|
|
94
|
+
// which makes its is_env_managed row real and its absence self-healing at
|
|
95
|
+
// enabled=true. Never delete a row the env still asks for.
|
|
96
|
+
if (getWorktreeRepoPaths().includes(rootDir)) {
|
|
97
|
+
console.log(`Migration 43: ${rootDir} is a WORKTREE_REPOS entry; keeping its repository row`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Guard 3 (the NOT EXISTS): a row with worktrees under it is not a ghost,
|
|
101
|
+
// whatever the env says. This is the condition the issue names, and it is
|
|
102
|
+
// what makes the delete provably lossless — nothing references the row.
|
|
103
|
+
const result = db
|
|
104
|
+
.prepare(`DELETE FROM repositories
|
|
105
|
+
WHERE path = ?
|
|
106
|
+
AND is_env_managed = 1
|
|
107
|
+
AND NOT EXISTS (
|
|
108
|
+
SELECT 1 FROM worktrees WHERE worktrees.repository_path = ?
|
|
109
|
+
)`)
|
|
110
|
+
.run(rootDir, rootDir);
|
|
111
|
+
if (result.changes > 0) {
|
|
112
|
+
console.log(`Migration 43: removed CM_ROOT_DIR ghost repository row (${rootDir})`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(`Migration 43: no ghost repository row at ${rootDir}`);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
down: () => {
|
|
119
|
+
// The deleted row carried no user data — an env-managed ghost with no
|
|
120
|
+
// worktrees, no clone URL, and default flags — and re-inserting it would
|
|
121
|
+
// restore the very defect this migration fixes. No-op rollback (mirrors
|
|
122
|
+
// v35/v40).
|
|
123
|
+
console.log('No rollback for the CM_ROOT_DIR ghost row removal');
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
];
|
|
@@ -13,8 +13,11 @@ exports.getRepositoryPaths = getRepositoryPaths;
|
|
|
13
13
|
exports.scanWorktrees = scanWorktrees;
|
|
14
14
|
exports.scanMultipleRepositories = scanMultipleRepositories;
|
|
15
15
|
exports.syncWorktreesToDB = syncWorktreesToDB;
|
|
16
|
+
exports.repositoryExistsOnDisk = repositoryExistsOnDisk;
|
|
17
|
+
exports.pruneStaleRepositoryWorktrees = pruneStaleRepositoryWorktrees;
|
|
16
18
|
const child_process_1 = require("child_process");
|
|
17
19
|
const util_1 = require("util");
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
21
|
const path_1 = __importDefault(require("path"));
|
|
19
22
|
const db_1 = require("../../lib/db");
|
|
20
23
|
const logger_1 = require("../../lib/logger");
|
|
@@ -293,3 +296,90 @@ function syncWorktreesToDB(db, worktrees) {
|
|
|
293
296
|
}
|
|
294
297
|
return { deletedIds: allDeletedIds, upsertedCount };
|
|
295
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Whether a repository still exists on disk as a git working tree.
|
|
301
|
+
*
|
|
302
|
+
* Returns `false` only when the directory itself is gone OR its `.git` entry is
|
|
303
|
+
* missing (a de-gitified directory). Every other state — including a present
|
|
304
|
+
* directory whose `.git` is intact — is reported as "still there", so a
|
|
305
|
+
* transient git failure (a locked index, a momentarily-unavailable network
|
|
306
|
+
* drive whose mount point is still present, …) never satisfies the prune
|
|
307
|
+
* condition. Issue #1349: fall on the side of NOT pruning whenever the on-disk
|
|
308
|
+
* state is inconclusive.
|
|
309
|
+
*
|
|
310
|
+
* @param repoPath - Canonical repository path (as stored in
|
|
311
|
+
* `worktrees.repository_path`, i.e. already `path.resolve()`d by
|
|
312
|
+
* {@link scanWorktrees}; see #1347)
|
|
313
|
+
* @returns `true` if the repository still looks present on disk
|
|
314
|
+
*/
|
|
315
|
+
function repositoryExistsOnDisk(repoPath) {
|
|
316
|
+
if (!repoPath)
|
|
317
|
+
return false;
|
|
318
|
+
try {
|
|
319
|
+
return fs_1.default.existsSync(repoPath) && fs_1.default.existsSync(path_1.default.join(repoPath, '.git'));
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Inconclusive filesystem read (e.g. EACCES): be conservative and keep rows.
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Prune DB worktree rows for repositories that have vanished from disk.
|
|
328
|
+
*
|
|
329
|
+
* Issue #1349: when a repository directory is deleted or de-gitified,
|
|
330
|
+
* {@link scanWorktrees} returns `[]` (git exit 128), so the repository silently
|
|
331
|
+
* drops out of the scan and {@link syncWorktreesToDB} never reaches its per-repo
|
|
332
|
+
* prune for it — the rows linger as ghost entries in the sidebar. The global
|
|
333
|
+
* early-return in `syncWorktreesToDB` only fires when *every* repository is
|
|
334
|
+
* empty, so a single vanished repository among healthy ones is never cleaned up.
|
|
335
|
+
*
|
|
336
|
+
* This runs as the global-sync reconciliation step: it enumerates every
|
|
337
|
+
* `repository_path` that still owns worktree rows and, for those that produced
|
|
338
|
+
* no worktrees in the current scan, deletes the rows **only when the repository
|
|
339
|
+
* directory (or its `.git`) is genuinely gone** (see
|
|
340
|
+
* {@link repositoryExistsOnDisk}). A repository that still exists but merely
|
|
341
|
+
* errored in git is left untouched, so a transient failure — a network drive
|
|
342
|
+
* blip, a locked repo — never destroys history.
|
|
343
|
+
*
|
|
344
|
+
* Intended for the full-scan endpoint (`POST /api/repositories/sync`) only.
|
|
345
|
+
* Single-repository callers (scan/restore) must NOT run this: they hold no
|
|
346
|
+
* authority over repositories outside their own scan, and running it there would
|
|
347
|
+
* prune repositories that merely weren't part of that request.
|
|
348
|
+
*
|
|
349
|
+
* Row keys stay consistent with #1347: {@link getRepositories} returns the
|
|
350
|
+
* stored (already `path.resolve()`d) `repository_path`, and every subsequent DB
|
|
351
|
+
* and filesystem lookup uses that same canonical value.
|
|
352
|
+
*
|
|
353
|
+
* @param db - Database instance
|
|
354
|
+
* @param liveWorktrees - Worktrees produced by the current scan; their
|
|
355
|
+
* repositories are known-present and therefore skipped
|
|
356
|
+
* @returns IDs of worktrees deleted for vanished repositories
|
|
357
|
+
*/
|
|
358
|
+
function pruneStaleRepositoryWorktrees(db, liveWorktrees) {
|
|
359
|
+
// Repositories that produced at least one worktree this scan are alive by
|
|
360
|
+
// definition (git listed them), so they are never candidates for pruning.
|
|
361
|
+
const liveRepoPaths = new Set(liveWorktrees
|
|
362
|
+
.map(wt => wt.repositoryPath)
|
|
363
|
+
.filter((p) => !!p));
|
|
364
|
+
const deletedIds = [];
|
|
365
|
+
for (const repo of (0, db_1.getRepositories)(db)) {
|
|
366
|
+
const repoPath = repo.path;
|
|
367
|
+
if (!repoPath)
|
|
368
|
+
continue;
|
|
369
|
+
if (liveRepoPaths.has(repoPath))
|
|
370
|
+
continue;
|
|
371
|
+
// Conservative guard: keep rows unless the directory/.git is truly gone.
|
|
372
|
+
if (repositoryExistsOnDisk(repoPath))
|
|
373
|
+
continue;
|
|
374
|
+
const ids = (0, db_1.getWorktreesByRepository)(db, repoPath).map(row => row.id);
|
|
375
|
+
if (ids.length === 0)
|
|
376
|
+
continue;
|
|
377
|
+
const result = (0, db_1.deleteWorktreesByIds)(db, ids);
|
|
378
|
+
deletedIds.push(...ids);
|
|
379
|
+
logger.info('worktree:stale-repo-pruned', {
|
|
380
|
+
repoPath,
|
|
381
|
+
deletedCount: result.deletedCount,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
return deletedIds;
|
|
385
|
+
}
|
|
@@ -136,8 +136,12 @@ async function executeSchedule(state) {
|
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
138
|
state.isExecuting = true;
|
|
139
|
-
|
|
139
|
+
// Issue #1343: createExecutionLog() must stay inside the try so that a DB
|
|
140
|
+
// failure still reaches the finally that resets isExecuting. Otherwise the
|
|
141
|
+
// schedule is skipped by the guard above until the server restarts.
|
|
142
|
+
let logId;
|
|
140
143
|
try {
|
|
144
|
+
logId = createExecutionLog(state.scheduleId, state.worktreeId, state.entry.message);
|
|
141
145
|
const db = getLazyDbInstance();
|
|
142
146
|
const worktree = db.prepare('SELECT path, vibe_local_model FROM worktrees WHERE id = ?').get(state.worktreeId);
|
|
143
147
|
if (!worktree) {
|
|
@@ -153,7 +157,9 @@ async function executeSchedule(state) {
|
|
|
153
157
|
}
|
|
154
158
|
catch (error) {
|
|
155
159
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
156
|
-
|
|
160
|
+
if (logId !== undefined) {
|
|
161
|
+
updateExecutionLog(logId, 'failed', errorMessage, null);
|
|
162
|
+
}
|
|
157
163
|
logger.error('execution:failed', { name: state.entry.name, error: errorMessage });
|
|
158
164
|
}
|
|
159
165
|
finally {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Realtime (WebSocket) message contracts shared by the server broadcasters and
|
|
4
|
+
* the client consumers. Issue #1120.
|
|
5
|
+
*
|
|
6
|
+
* Server broadcasts are double-wrapped by `handleBroadcast` into an envelope:
|
|
7
|
+
* { type: 'broadcast', worktreeId, data: { type: '<realType>', ...payload } }
|
|
8
|
+
* `parseRealtimeEvent` unwraps that envelope and returns the inner payload as
|
|
9
|
+
* the canonical {@link RealtimeEvent}.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.VERSION_MISMATCH_EVENT_TYPE = exports.CLIENT_VERSION_MESSAGE_TYPE = void 0;
|
|
13
|
+
exports.isVersionMismatch = isVersionMismatch;
|
|
14
|
+
exports.parseRealtimeEvent = parseRealtimeEvent;
|
|
15
|
+
/**
|
|
16
|
+
* Client → server hello carrying the client bundle version, sent on every
|
|
17
|
+
* (re)connect so the server can detect a version drift (#1356). Kept as a shared
|
|
18
|
+
* constant so the client sender and the server handler cannot drift apart.
|
|
19
|
+
*/
|
|
20
|
+
exports.CLIENT_VERSION_MESSAGE_TYPE = 'client_version';
|
|
21
|
+
/**
|
|
22
|
+
* Server → client notice that the running server version differs from this
|
|
23
|
+
* tab's bundle version (#1338/#1356). Drives the reload banner.
|
|
24
|
+
*/
|
|
25
|
+
exports.VERSION_MISMATCH_EVENT_TYPE = 'version_mismatch';
|
|
26
|
+
/**
|
|
27
|
+
* Whether the running server version and this tab's bundle version have drifted
|
|
28
|
+
* apart and the user should be nudged to reload (#1338/#1356).
|
|
29
|
+
*
|
|
30
|
+
* Conservative on purpose (受入条件: 版が一致している間は誤検知しない): an empty or
|
|
31
|
+
* `'0.0.0'` fallback on either side means "version unknown" and is never treated
|
|
32
|
+
* as a mismatch, so a server that cannot resolve its own version stays silent.
|
|
33
|
+
*/
|
|
34
|
+
function isVersionMismatch(serverVersion, clientVersion) {
|
|
35
|
+
if (!serverVersion || !clientVersion)
|
|
36
|
+
return false;
|
|
37
|
+
if (serverVersion === '0.0.0' || clientVersion === '0.0.0')
|
|
38
|
+
return false;
|
|
39
|
+
return serverVersion !== clientVersion;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a raw WebSocket frame into the inner realtime event.
|
|
43
|
+
*
|
|
44
|
+
* Handles both the room broadcast envelope ({ type:'broadcast', data:{...} })
|
|
45
|
+
* and (defensively) already-unwrapped frames. Returns null on malformed input
|
|
46
|
+
* or frames without a usable inner `type`.
|
|
47
|
+
*/
|
|
48
|
+
function parseRealtimeEvent(raw) {
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(raw);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (!parsed || typeof parsed !== 'object')
|
|
57
|
+
return null;
|
|
58
|
+
const env = parsed;
|
|
59
|
+
if (env.type === 'broadcast') {
|
|
60
|
+
const inner = env.data;
|
|
61
|
+
if (!inner || typeof inner !== 'object')
|
|
62
|
+
return null;
|
|
63
|
+
const innerObj = inner;
|
|
64
|
+
if (typeof innerObj.type !== 'string')
|
|
65
|
+
return null;
|
|
66
|
+
// Ensure worktreeId is present even if the payload omitted it.
|
|
67
|
+
if (innerObj.worktreeId === undefined && typeof env.worktreeId === 'string') {
|
|
68
|
+
innerObj.worktreeId = env.worktreeId;
|
|
69
|
+
}
|
|
70
|
+
return innerObj;
|
|
71
|
+
}
|
|
72
|
+
if (typeof env.type === 'string') {
|
|
73
|
+
return env;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
@@ -71,7 +71,15 @@ function createScheduleState(worktreeId, scheduleId, entry) {
|
|
|
71
71
|
entry,
|
|
72
72
|
};
|
|
73
73
|
cronJob.schedule(() => {
|
|
74
|
-
|
|
74
|
+
// Issue #1343: executeSchedule() rejects if its own error handling fails
|
|
75
|
+
// (e.g. the DB is still down when writing the 'failed' log). Without this
|
|
76
|
+
// catch the rejection is silently unhandled.
|
|
77
|
+
void (0, job_executor_1.executeSchedule)(state).catch((error) => {
|
|
78
|
+
logger.error('execution:unhandled', {
|
|
79
|
+
name: entry.name,
|
|
80
|
+
error: error instanceof Error ? error.message : String(error),
|
|
81
|
+
});
|
|
82
|
+
});
|
|
75
83
|
});
|
|
76
84
|
return state;
|
|
77
85
|
}
|