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
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Version Checker Module
|
|
4
|
+
* Issue #257: Version update notification feature
|
|
5
|
+
*
|
|
6
|
+
* Checks GitHub Releases API for newer versions of CommandMate.
|
|
7
|
+
* Uses globalThis cache pattern (auto-yes-manager.ts reference) for
|
|
8
|
+
* hot-reload persistence.
|
|
9
|
+
*
|
|
10
|
+
* Security:
|
|
11
|
+
* - [SEC-001] GITHUB_API_URL is hardcoded (SSRF prevention, OWASP A10:2021)
|
|
12
|
+
* - [SEC-SF-001] Response validation (validateReleaseUrl, sanitizeReleaseName)
|
|
13
|
+
* - [SEC-SF-002] User-Agent header for GitHub API compliance (OWASP A07:2021)
|
|
14
|
+
*
|
|
15
|
+
* @module version-checker
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.GITHUB_RELEASE_URL_PREFIX = exports.GITHUB_API_URL = void 0;
|
|
19
|
+
exports.isNewerVersion = isNewerVersion;
|
|
20
|
+
exports.getClientVersion = getClientVersion;
|
|
21
|
+
exports.getServerVersion = getServerVersion;
|
|
22
|
+
exports.getCurrentVersion = getCurrentVersion;
|
|
23
|
+
exports.validateReleaseUrl = validateReleaseUrl;
|
|
24
|
+
exports.sanitizeReleaseName = sanitizeReleaseName;
|
|
25
|
+
exports.checkForUpdate = checkForUpdate;
|
|
26
|
+
exports.resetCacheForTesting = resetCacheForTesting;
|
|
27
|
+
const fs_1 = require("fs");
|
|
28
|
+
const path_1 = require("path");
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Constants
|
|
31
|
+
// =============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* [SEC-001] SSRF Prevention: GitHub API URL is a hardcoded constant.
|
|
34
|
+
* This value MUST NOT be derived from environment variables, config files,
|
|
35
|
+
* or user input. Changing this value requires security review.
|
|
36
|
+
* OWASP A10:2021 - Server-Side Request Forgery
|
|
37
|
+
*/
|
|
38
|
+
exports.GITHUB_API_URL = 'https://api.github.com/repos/Kewton/CommandMate/releases/latest';
|
|
39
|
+
/**
|
|
40
|
+
* [SEC-SF-001] GitHub Releases URL allowed prefix for validation.
|
|
41
|
+
* Used to verify html_url from API responses.
|
|
42
|
+
* Imported from github-links.ts (Issue #264 DRY) and re-exported for backward compatibility.
|
|
43
|
+
*/
|
|
44
|
+
const github_links_1 = require("../config/github-links");
|
|
45
|
+
Object.defineProperty(exports, "GITHUB_RELEASE_URL_PREFIX", { enumerable: true, get: function () { return github_links_1.GITHUB_RELEASE_URL_PREFIX; } });
|
|
46
|
+
/** Semver pattern: optional v-prefix followed by major.minor.patch */
|
|
47
|
+
const SEMVER_PATTERN = /^v?\d+\.\d+\.\d+$/;
|
|
48
|
+
/** [SEC-SF-001] Release name allowed characters pattern */
|
|
49
|
+
const RELEASE_NAME_PATTERN = /^[a-zA-Z0-9.\-\s_v]+$/;
|
|
50
|
+
/** Maximum allowed release name length */
|
|
51
|
+
const RELEASE_NAME_MAX_LENGTH = 128;
|
|
52
|
+
/** Cache TTL: 1 hour (matches GitHub API unauthenticated rate limit of 60 req/h) */
|
|
53
|
+
const CACHE_TTL_MS = 60 * 60 * 1000;
|
|
54
|
+
/** Fetch timeout: 5 seconds */
|
|
55
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
56
|
+
/**
|
|
57
|
+
* npm package name. [Issue #1359] Used to verify that a package.json resolved at
|
|
58
|
+
* runtime is CommandMate's own manifest and not an unrelated project's — a guard
|
|
59
|
+
* against an unexpected process.cwd() (e.g. a dev run started from a user's
|
|
60
|
+
* project directory) leaking a foreign version.
|
|
61
|
+
*/
|
|
62
|
+
const PACKAGE_NAME = 'commandmate';
|
|
63
|
+
const cache = globalThis.__versionCheckCache ??
|
|
64
|
+
(globalThis.__versionCheckCache = {
|
|
65
|
+
result: null,
|
|
66
|
+
fetchedAt: 0,
|
|
67
|
+
rateLimitResetAt: null,
|
|
68
|
+
});
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// Public Functions
|
|
71
|
+
// =============================================================================
|
|
72
|
+
/**
|
|
73
|
+
* Compare two semver version strings.
|
|
74
|
+
* [SF-003] Includes built-in validation - returns false for invalid formats.
|
|
75
|
+
*
|
|
76
|
+
* @param current - Current version (e.g., "0.2.3", "v0.2.3")
|
|
77
|
+
* @param latest - Latest version (e.g., "0.3.0", "v0.3.0")
|
|
78
|
+
* @returns true if latest is newer than current, false for invalid formats
|
|
79
|
+
*/
|
|
80
|
+
function isNewerVersion(current, latest) {
|
|
81
|
+
// [SF-003] Defensive validation: reject invalid formats immediately
|
|
82
|
+
if (!SEMVER_PATTERN.test(current) || !SEMVER_PATTERN.test(latest)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const parse = (v) => v.replace(/^v/, '').split('.').map(Number);
|
|
86
|
+
const [cMajor, cMinor, cPatch] = parse(current);
|
|
87
|
+
const [lMajor, lMinor, lPatch] = parse(latest);
|
|
88
|
+
if (lMajor !== cMajor)
|
|
89
|
+
return lMajor > cMajor;
|
|
90
|
+
if (lMinor !== cMinor)
|
|
91
|
+
return lMinor > cMinor;
|
|
92
|
+
return lPatch > cPatch;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Read CommandMate's version from the installed package.json at runtime.
|
|
96
|
+
*
|
|
97
|
+
* [Issue #1359] `NEXT_PUBLIC_APP_VERSION` is baked into the bundle at
|
|
98
|
+
* `next build` time, so it reflects "the version present when the client bundle
|
|
99
|
+
* was last built", not the version of the server code actually running. Reading
|
|
100
|
+
* package.json on each call reflects the real installed version, which is what
|
|
101
|
+
* the update-check API must report as `currentVersion`.
|
|
102
|
+
*
|
|
103
|
+
* The server is spawned with cwd = package root (start.ts), so
|
|
104
|
+
* `process.cwd()/package.json` is the installed manifest. We verify
|
|
105
|
+
* `name === 'commandmate'` so an unexpected cwd can never leak an unrelated
|
|
106
|
+
* project's version; on any mismatch or read failure the caller falls back to
|
|
107
|
+
* the baked value.
|
|
108
|
+
*
|
|
109
|
+
* @returns Runtime version string, or null when unreadable / not CommandMate's package.json
|
|
110
|
+
*/
|
|
111
|
+
function readRuntimeServerVersion() {
|
|
112
|
+
try {
|
|
113
|
+
const raw = (0, fs_1.readFileSync)((0, path_1.join)(process.cwd(), 'package.json'), 'utf-8');
|
|
114
|
+
const parsed = JSON.parse(raw);
|
|
115
|
+
if (parsed.name === PACKAGE_NAME &&
|
|
116
|
+
typeof parsed.version === 'string' &&
|
|
117
|
+
parsed.version.length > 0) {
|
|
118
|
+
return parsed.version;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Unreadable / malformed package.json: fall back to the baked value.
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the client bundle version (baked at build time).
|
|
129
|
+
* [CONS-002] `NEXT_PUBLIC_APP_VERSION` is injected by next.config.js from
|
|
130
|
+
* package.json at `next build` time. This is the correct value to describe
|
|
131
|
+
* "the version of the bundle this page was served from" and is intentionally
|
|
132
|
+
* left build-time baked (Issue #1359).
|
|
133
|
+
*
|
|
134
|
+
* @returns Client bundle version string (e.g., "0.2.3"), or "0.0.0" as fallback
|
|
135
|
+
*/
|
|
136
|
+
function getClientVersion() {
|
|
137
|
+
return process.env.NEXT_PUBLIC_APP_VERSION ?? '0.0.0';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the server's actually-running version, resolved at runtime.
|
|
141
|
+
* [Issue #1359] Prefers the installed package.json (runtime truth) over the
|
|
142
|
+
* build-time baked `NEXT_PUBLIC_APP_VERSION`, so update-check reports the version
|
|
143
|
+
* of the server code that is really running. Separating this from
|
|
144
|
+
* getClientVersion() is the basis for version-mismatch detection (#1338/#1356).
|
|
145
|
+
*
|
|
146
|
+
* Resolution order:
|
|
147
|
+
* 1. Runtime package.json (name === "commandmate")
|
|
148
|
+
* 2. Baked NEXT_PUBLIC_APP_VERSION
|
|
149
|
+
* 3. "0.0.0"
|
|
150
|
+
*
|
|
151
|
+
* @returns Server runtime version string (e.g., "0.2.3"), or "0.0.0" as fallback
|
|
152
|
+
*/
|
|
153
|
+
function getServerVersion() {
|
|
154
|
+
return readRuntimeServerVersion() ?? getClientVersion();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get the current application version (server runtime version).
|
|
158
|
+
* Retained for backward compatibility; delegates to getServerVersion().
|
|
159
|
+
*
|
|
160
|
+
* @returns Current version string (e.g., "0.2.3"), or "0.0.0" as fallback
|
|
161
|
+
*/
|
|
162
|
+
function getCurrentVersion() {
|
|
163
|
+
return getServerVersion();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Validate that a URL is a legitimate GitHub Releases URL.
|
|
167
|
+
* [SEC-SF-001] OWASP A03:2021 - Prevents injection via DNS pollution/MITM.
|
|
168
|
+
*
|
|
169
|
+
* @param url - URL to validate
|
|
170
|
+
* @returns Validated URL, or null if invalid
|
|
171
|
+
*/
|
|
172
|
+
function validateReleaseUrl(url) {
|
|
173
|
+
if (!url.startsWith(github_links_1.GITHUB_RELEASE_URL_PREFIX)) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return url;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Sanitize a release name to safe character set.
|
|
180
|
+
* [SEC-SF-001] Restricts to alphanumeric, dots, hyphens, spaces, underscores, v-prefix.
|
|
181
|
+
*
|
|
182
|
+
* @param name - Release name to sanitize
|
|
183
|
+
* @param tagName - Fallback value (semver-validated tag_name)
|
|
184
|
+
* @returns Sanitized name, or tagName if the name is invalid
|
|
185
|
+
*/
|
|
186
|
+
function sanitizeReleaseName(name, tagName) {
|
|
187
|
+
if (RELEASE_NAME_PATTERN.test(name) && name.length <= RELEASE_NAME_MAX_LENGTH) {
|
|
188
|
+
return name;
|
|
189
|
+
}
|
|
190
|
+
// Fallback to tag_name (already validated by SEMVER_PATTERN)
|
|
191
|
+
return tagName;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check GitHub Releases for newer versions.
|
|
195
|
+
* Uses in-memory cache (globalThis.__versionCheckCache) with 1-hour TTL.
|
|
196
|
+
* Silently fails on network errors, timeouts, or API issues.
|
|
197
|
+
*
|
|
198
|
+
* [SF-002] Multiple calls within the same process are safe: the globalThis cache
|
|
199
|
+
* (1-hour TTL) ensures that only the first call triggers a network request.
|
|
200
|
+
* Subsequent calls within the TTL window return the cached result without
|
|
201
|
+
* network overhead. The cache is stored in globalThis.__versionCheckCache
|
|
202
|
+
* and automatically invalidated after CACHE_TTL_MS (1 hour).
|
|
203
|
+
*
|
|
204
|
+
* @returns Update check result, or null on failure
|
|
205
|
+
*/
|
|
206
|
+
async function checkForUpdate() {
|
|
207
|
+
try {
|
|
208
|
+
// Check cache validity
|
|
209
|
+
if (isCacheValid()) {
|
|
210
|
+
return cache.result;
|
|
211
|
+
}
|
|
212
|
+
// Check rate limit
|
|
213
|
+
if (isRateLimited()) {
|
|
214
|
+
return cache.result;
|
|
215
|
+
}
|
|
216
|
+
const response = await fetch(exports.GITHUB_API_URL, {
|
|
217
|
+
headers: {
|
|
218
|
+
'Accept': 'application/vnd.github+json',
|
|
219
|
+
'User-Agent': `CommandMate/${getCurrentVersion()}`, // [SEC-SF-002]
|
|
220
|
+
},
|
|
221
|
+
cache: 'no-store', // Issue #278: Prevent Next.js Data Cache from caching GitHub API responses
|
|
222
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
223
|
+
});
|
|
224
|
+
// Handle rate limit (403)
|
|
225
|
+
if (response.status === 403) {
|
|
226
|
+
handleRateLimit(response);
|
|
227
|
+
return cache.result;
|
|
228
|
+
}
|
|
229
|
+
if (!response.ok) {
|
|
230
|
+
return cache.result;
|
|
231
|
+
}
|
|
232
|
+
const data = (await response.json());
|
|
233
|
+
const currentVersion = getCurrentVersion();
|
|
234
|
+
const latestVersion = data.tag_name.replace(/^v/, '');
|
|
235
|
+
const hasUpdate = isNewerVersion(currentVersion, data.tag_name);
|
|
236
|
+
const result = {
|
|
237
|
+
hasUpdate,
|
|
238
|
+
currentVersion,
|
|
239
|
+
latestVersion,
|
|
240
|
+
releaseUrl: validateReleaseUrl(data.html_url),
|
|
241
|
+
releaseName: sanitizeReleaseName(data.name, data.tag_name),
|
|
242
|
+
publishedAt: data.published_at,
|
|
243
|
+
};
|
|
244
|
+
// Update cache
|
|
245
|
+
cache.result = result;
|
|
246
|
+
cache.fetchedAt = Date.now();
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Silent failure: network errors, timeouts, parse errors
|
|
251
|
+
return cache.result;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Reset cache for testing purposes only.
|
|
256
|
+
* @internal
|
|
257
|
+
*/
|
|
258
|
+
function resetCacheForTesting() {
|
|
259
|
+
cache.result = null;
|
|
260
|
+
cache.fetchedAt = 0;
|
|
261
|
+
cache.rateLimitResetAt = null;
|
|
262
|
+
}
|
|
263
|
+
// =============================================================================
|
|
264
|
+
// Internal Functions
|
|
265
|
+
// =============================================================================
|
|
266
|
+
/** Check if cache is valid (within TTL) */
|
|
267
|
+
function isCacheValid() {
|
|
268
|
+
return cache.result !== null && (Date.now() - cache.fetchedAt) < CACHE_TTL_MS;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Check if currently rate-limited.
|
|
272
|
+
* [C-001] Simplified rate limit handling: uses rateLimitResetAt from 403 response.
|
|
273
|
+
*/
|
|
274
|
+
function isRateLimited() {
|
|
275
|
+
if (!cache.rateLimitResetAt)
|
|
276
|
+
return false;
|
|
277
|
+
if (Date.now() >= cache.rateLimitResetAt) {
|
|
278
|
+
cache.rateLimitResetAt = null;
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Handle 403 rate limit response.
|
|
285
|
+
* Extracts X-RateLimit-Reset header for precise retry timing,
|
|
286
|
+
* or falls back to CACHE_TTL_MS extension.
|
|
287
|
+
*/
|
|
288
|
+
function handleRateLimit(response) {
|
|
289
|
+
const resetTimestamp = response.headers.get('X-RateLimit-Reset');
|
|
290
|
+
if (resetTimestamp) {
|
|
291
|
+
cache.rateLimitResetAt = parseInt(resetTimestamp, 10) * 1000;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
// Reset time unknown: retry after 1 hour
|
|
295
|
+
cache.rateLimitResetAt = Date.now() + CACHE_TTL_MS;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
@@ -25,6 +25,8 @@ const tmux_control_mode_metrics_1 = require("./tmux/tmux-control-mode-metrics");
|
|
|
25
25
|
const control_mode_tmux_transport_1 = require("./tmux/control-mode-tmux-transport");
|
|
26
26
|
const tmux_control_mode_flags_1 = require("./tmux/tmux-control-mode-flags");
|
|
27
27
|
const cache_1 = require("./external-apps/cache");
|
|
28
|
+
const version_checker_1 = require("../lib/version-checker");
|
|
29
|
+
const types_2 = require("../lib/realtime/types");
|
|
28
30
|
const logger_1 = require("../lib/logger");
|
|
29
31
|
const logger = (0, logger_1.createLogger)('ws-server');
|
|
30
32
|
// Global state
|
|
@@ -373,6 +375,9 @@ function handleMessage(ws, message) {
|
|
|
373
375
|
return;
|
|
374
376
|
handleBroadcast(message.worktreeId, message.data);
|
|
375
377
|
break;
|
|
378
|
+
case types_2.CLIENT_VERSION_MESSAGE_TYPE:
|
|
379
|
+
handleClientVersion(ws, message);
|
|
380
|
+
break;
|
|
376
381
|
case 'terminal_subscribe':
|
|
377
382
|
void handleTerminalSubscribe(ws, message);
|
|
378
383
|
break;
|
|
@@ -389,6 +394,37 @@ function handleMessage(ws, message) {
|
|
|
389
394
|
logger.warn('message:unknown-type');
|
|
390
395
|
}
|
|
391
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* Handle a client-version hello (#1338/#1356).
|
|
399
|
+
*
|
|
400
|
+
* The client announces its baked bundle version on every (re)connect. If the
|
|
401
|
+
* server's actually-running version (runtime package.json, resolved by
|
|
402
|
+
* getServerVersion) has drifted from it, reply with a version_mismatch event so
|
|
403
|
+
* the tab can surface a reload nudge. Stays silent when the versions match or
|
|
404
|
+
* either side is an unknown/fallback version (受入条件: 誤検知しない).
|
|
405
|
+
*/
|
|
406
|
+
function handleClientVersion(ws, message) {
|
|
407
|
+
const clientVersion = typeof message.version === 'string' ? message.version : '';
|
|
408
|
+
if (!clientVersion)
|
|
409
|
+
return;
|
|
410
|
+
const serverVersion = (0, version_checker_1.getServerVersion)();
|
|
411
|
+
if (!(0, types_2.isVersionMismatch)(serverVersion, clientVersion))
|
|
412
|
+
return;
|
|
413
|
+
if (ws.readyState !== ws_1.WebSocket.OPEN)
|
|
414
|
+
return;
|
|
415
|
+
try {
|
|
416
|
+
ws.send(JSON.stringify({
|
|
417
|
+
type: types_2.VERSION_MISMATCH_EVENT_TYPE,
|
|
418
|
+
serverVersion,
|
|
419
|
+
clientVersion,
|
|
420
|
+
}));
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
logger.error('version:notify-failed', {
|
|
424
|
+
error: error instanceof Error ? error.message : String(error),
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
392
428
|
/**
|
|
393
429
|
* Subscribe client to a worktree room
|
|
394
430
|
*/
|
|
@@ -758,6 +794,7 @@ function closeWebSocket() {
|
|
|
758
794
|
}
|
|
759
795
|
exports.__internal = {
|
|
760
796
|
handleMessage,
|
|
797
|
+
handleClientVersion,
|
|
761
798
|
handleProxyUpgrade,
|
|
762
799
|
handleTerminalSubscribe,
|
|
763
800
|
handleTerminalInput,
|
package/package.json
CHANGED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=2464,exports.ids=[2464],exports.modules={1102:(a,b,c)=>{c.d(b,{m_:()=>g});var d=c(21124),e=c(38301);let f={top:"bottom-full left-1/2 -translate-x-1/2 mb-2",right:"left-full top-1/2 -translate-y-1/2 ml-2",bottom:"top-full left-1/2 -translate-x-1/2 mt-2",left:"right-full top-1/2 -translate-y-1/2 mr-2"};function g({content:a,placement:b="right",delay:c=100,children:g}){let[h,i]=(0,e.useState)(!1),j=(0,e.useRef)(null),k=(0,e.useCallback)(()=>{null!==j.current&&(clearTimeout(j.current),j.current=null)},[]),l=(0,e.useCallback)(()=>{k(),j.current=setTimeout(()=>{i(!0),j.current=null},c)},[c,k]),m=(0,e.useCallback)(()=>{k(),i(!1)},[k]),n=f[b];return(0,d.jsxs)("span",{"data-testid":"tooltip-wrapper",className:"relative inline-flex",tabIndex:-1,onMouseEnter:l,onMouseLeave:m,children:[g,h&&(0,d.jsx)("span",{role:"tooltip","aria-hidden":"true",className:`absolute z-40 whitespace-nowrap px-2 py-1 text-xs font-medium rounded bg-foreground text-background shadow-lg pointer-events-none ${n}`,children:a})]})}},4267:(a,b,c)=>{c.d(b,{fJ:()=>d}),c(17252);let d=["claude","codex","gemini","opencode","copilot","antigravity"]},8509:(a,b,c)=>{c.d(b,{g:()=>h});var d=c(21124);c(38301);var e=c(20481),f=c(5772),g=c(12480);function h(){let{size:a,setSize:b,isMobile:c}=(0,f.Ps)(),h=(0,e.c)("common");if(c)return null;let i=h("displaySize.ariaLabel");return(0,d.jsxs)("div",{className:"flex items-center",children:[(0,d.jsx)("label",{htmlFor:"pc-display-size",className:"sr-only",children:i}),(0,d.jsx)("select",{id:"pc-display-size","data-testid":"pc-display-size-select","aria-label":i,value:a,onChange:a=>{let c=a.target.value;(0,g.fM)(c)&&b(c)},className:"text-sm bg-transparent text-foreground border border-input rounded-md px-2 py-1 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:g.Uf.map(a=>(0,d.jsx)("option",{value:a,children:h(`displaySize.${a}`)},a))})]})}},17252:(a,b,c)=>{c.d(b,{Ab:()=>e,NL:()=>q,O6:()=>n,XH:()=>d,f_:()=>l,hR:()=>j,lu:()=>o,n6:()=>h,oo:()=>k,pQ:()=>f,sw:()=>m,vz:()=>p});let d=["claude","codex","gemini","vibe-local","opencode","copilot","antigravity"],e=10,f=50,g=/^[a-zA-Z0-9_-]+$/;function h(a){return"string"==typeof a&&a.length>0&&a.length<=64&&g.test(a)}let i={claude:"Claude",codex:"Codex",gemini:"Gemini","vibe-local":"Vibe Local",opencode:"OpenCode",copilot:"Copilot",antigravity:"Antigravity"};function j(a){return d.includes(a)}function k(a){return i[a]??a}function l(a,b="Assistant"){return a&&j(a)?k(a):b}function m(a){let b=a.alias;return"string"==typeof b&&b.trim().length>0?b:k(a.cliTool)}function n(a,b,c){let d=a.find(a=>a.id===b);return d?m(d):k(c)}function o(a){return a.map((a,b)=>({id:a,cliTool:a,alias:k(a),order:b}))}let p=128,q=2097152},42464:(a,b,c)=>{c.d(b,{GV:()=>a0});var d=c(21124),e=c(38301),f=c.n(e),g=c(42378),h=c(3991),i=c.n(h),j=c(52761);let k=(0,e.forwardRef)(function({href:a,onClick:b,target:c,...e},f){let h=(0,g.usePathname)(),k=(0,j.Hq)();return(0,d.jsx)(i(),{ref:f,href:a,target:c,onClick:d=>{var e;b?.(d),d.defaultPrevented||0!==(e=d).button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||void 0!==c&&"_self"!==c||/^([a-z][a-z0-9+.-]*:)?\/\//i.test(a)||/^(mailto:|tel:)/i.test(a)||(d.preventDefault(),a!==h&&k.push(a))},...e})});var l=c(20481),m=c(15917),n=c(88285),o=c(97950),p=c(8509),q=c(45523),r=c(70175),s=c(60988);function t(){let{theme:a,setTheme:b}=(0,q.D)(),[c,f]=(0,e.useState)(!1);if(!c)return(0,d.jsx)("div",{"data-testid":"theme-toggle-placeholder",className:"w-8 h-8","aria-hidden":"true"});let g="dark"===a;return(0,d.jsx)("button",{"data-testid":"theme-toggle",onClick:()=>b(g?"light":"dark"),className:"p-1.5 rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors focus:outline-none focus:ring-2 focus:ring-ring","aria-label":g?"Switch to light mode":"Switch to dark mode",title:g?"Switch to light mode":"Switch to dark mode",children:g?(0,d.jsx)(r.A,{className:"w-5 h-5","data-testid":"theme-icon-sun"}):(0,d.jsx)(s.A,{className:"w-5 h-5","data-testid":"theme-icon-moon"})})}var u=c(40695);function v(){let{status:a}=(0,u.xM)(),b=(0,l.c)("common");if("connected"===a)return null;let c="connecting"===a,e=b(c?"connection.reconnecting":"connection.offline");return(0,d.jsxs)("span",{"data-testid":"connection-status-indicator",role:"status","aria-live":"polite",title:b(c?"connection.reconnectingTooltip":"connection.offlineTooltip"),className:"hidden sm:inline-flex items-center gap-1.5 rounded-full border border-border bg-surface px-2 py-0.5 text-xs text-muted-foreground",children:[(0,d.jsx)("span",{"aria-hidden":"true",className:["w-1.5 h-1.5 rounded-full",c?"bg-warning motion-safe:animate-pulse":"bg-muted-foreground"].join(" ")}),e]})}var w=c(85647),x=c(64632);let y=[{labelKey:"nav.home",href:"/",isActive:a=>"/"===a},{labelKey:"nav.chat",href:"/chat",isActive:a=>a.startsWith("/chat")},{labelKey:"nav.sessions",href:"/sessions",isActive:a=>a.startsWith("/sessions")},{labelKey:"nav.repositoriesShort",href:"/repositories",isActive:a=>a.startsWith("/repositories")},{labelKey:"nav.reviewReport",href:"/review",isActive:a=>a.startsWith("/review")},{labelKey:"nav.more",href:"/more",isActive:a=>a.startsWith("/more")}];function z({title:a="CommandMate"}){let b=(0,g.usePathname)(),c=(0,l.c)("commandPalette"),e=(0,l.c)("common"),{setOpen:h}=(0,x.C)(),[i,j]=f().useState(null);return(0,d.jsx)("header",{className:"sticky top-0 z-50 border-b border-border bg-background supports-[backdrop-filter]:bg-background/80 backdrop-blur-md",children:(0,d.jsx)("div",{className:"container-custom",children:(0,d.jsxs)("div",{className:"flex items-center justify-between h-16",children:[(0,d.jsx)("div",{className:"flex items-center space-x-4",children:(0,d.jsxs)(k,{href:"/",className:"flex items-center space-x-2 hover:opacity-80 transition-opacity",children:[(0,d.jsx)("div",{className:"w-8 h-8 bg-accent-600 rounded-lg flex items-center justify-center",children:(0,d.jsx)(m.A,{size:20,strokeWidth:2,className:"text-white","aria-hidden":"true"})}),(0,d.jsx)("h1",{className:"text-xl font-bold text-foreground",children:a})]})}),(0,d.jsxs)("nav",{className:"flex items-center space-x-6",role:"navigation",children:[y.map(a=>{let c=a.isActive(b);return(0,d.jsx)(k,{href:a.href,"aria-current":c?"page":void 0,className:`relative py-1 text-sm font-medium transition-colors after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:rounded-full after:bg-accent-600 dark:after:bg-accent-400 after:origin-center motion-safe:after:transition-transform after:duration-200 after:ease-[var(--motion-ease-out)] ${c?"text-accent-600 dark:text-accent-400 after:scale-x-100":"text-muted-foreground hover:text-foreground after:scale-x-0"}`,children:e(a.labelKey)},a.href)}),(0,d.jsxs)("button",{type:"button","data-testid":"header-command-palette-trigger",onClick:()=>h(!0),"aria-label":c("mobileTrigger"),className:"hidden md:inline-flex items-center gap-2 rounded-md border border-border bg-surface px-2.5 py-1.5 text-sm text-muted-foreground hover:bg-surface-2 transition-colors",children:[(0,d.jsx)(n.A,{size:16,strokeWidth:2,"aria-hidden":"true",className:"shrink-0"}),(0,d.jsx)("span",{children:c("searchAction")}),i&&(0,d.jsxs)("span",{className:"flex items-center gap-0.5",children:[(0,d.jsx)(w.u,{children:i}),(0,d.jsx)(w.u,{children:"K"})]})]}),(0,d.jsx)(v,{}),(0,d.jsx)(p.g,{}),(0,d.jsx)(t,{}),(0,d.jsxs)("a",{href:"https://github.com/kewton/MyCodeBranchDesk",target:"_blank",rel:"noopener noreferrer",className:"text-sm font-medium text-muted-foreground hover:text-foreground transition-colors flex items-center space-x-1",children:[(0,d.jsx)(o.A,{size:20,strokeWidth:2,"aria-hidden":"true"}),(0,d.jsx)("span",{children:"GitHub"})]})]})]})})})}var A=c(81092),B=c(90076);let C={showSidebar:!0,showGlobalNav:!0,showLocalNav:!1,autoCollapseSidebar:!1},D=[{prefix:"/worktrees/",config:{showGlobalNav:!1,showLocalNav:!0}},{prefix:"/sessions",config:{autoCollapseSidebar:!0}}];var E=c(5772),F=c(65828),G=c(10366),H=c(99615),I=c(22023),J=c(47817),K=c(23312),L=c.n(K),M=c(67016),N=c(22317);let O=(0,e.memo)(function({status:a,label:b}){return(0,d.jsx)(N.m,{"data-testid":"status-indicator",status:a,label:b,size:"lg"})});function P({id:a,branch:b,isVisible:c,anchorRef:f}){let[g,h]=(0,e.useState)({top:-9999,left:-9999});return"undefined"!=typeof document&&c?L().createPortal((0,d.jsxs)("div",{id:a,role:"tooltip",className:" fixed z-[9999] px-3 py-2 rounded-md shadow-lg bg-sidebar text-xs text-sidebar-foreground border border-sidebar-border pointer-events-none max-w-sm transition-opacity duration-150 ",style:{top:g.top,left:g.left},children:[(0,d.jsx)("p",{className:"font-medium text-sidebar-foreground whitespace-nowrap",children:b.name}),(0,d.jsx)("p",{className:"text-sidebar-muted whitespace-nowrap",children:b.repositoryName}),(0,d.jsxs)("p",{className:"text-sidebar-muted whitespace-nowrap",children:["Status: ",b.status]}),b.worktreePath&&(0,d.jsx)("p",{className:"text-sidebar-muted truncate",children:b.worktreePath}),b.description&&(0,d.jsx)("p",{className:"text-sidebar-muted mt-1 border-t border-sidebar-border pt-1 whitespace-pre-wrap break-words",children:b.description})]}),document.body):null}let Q=0,R=(0,e.memo)(function({branch:a,isSelected:b,onClick:c,showRepositoryName:f=!0}){let g=(0,l.c)("common"),h=`tooltip-${a.id}`,i=(0,e.useRef)(null),[j,k]=(0,e.useState)(!1),m=(0,e.useRef)(null),n=(0,e.useCallback)(()=>{null!==m.current&&(clearTimeout(m.current),m.current=null)},[]);(0,e.useEffect)(()=>()=>n(),[n]);let o=j&&!b;return(0,e.useEffect)(()=>{b&&k(!1)},[b]),(0,e.useEffect)(()=>{if(!j)return;let a=()=>k(!1);return document.addEventListener("click",a),()=>document.removeEventListener("click",a)},[j]),(0,d.jsxs)("button",{ref:i,"data-testid":"branch-list-item",onClick:()=>{n(),Q=Date.now()+400,k(!1),c()},onMouseEnter:()=>{n(),Date.now()>=Q&&(m.current=setTimeout(()=>{k(!0)},150))},onMouseLeave:()=>{n(),k(!1)},onFocus:a=>{n(),a.target.matches(":focus-visible")&&(m.current=setTimeout(()=>{k(!0)},150))},onBlur:()=>{n(),k(!1)},"aria-current":b?"true":void 0,"aria-describedby":o?h:void 0,"aria-label":f?void 0:`${a.name} - ${a.repositoryName}`,className:`
|
|
2
|
-
group relative w-full px-4 py-3 flex flex-col gap-1
|
|
3
|
-
hover:bg-sidebar-hover transition-colors
|
|
4
|
-
focus:outline-none focus:ring-2 focus:ring-inset focus:ring-ring
|
|
5
|
-
${b?"bg-sidebar-hover border-l-2 border-accent-500":"border-l-2 border-transparent"}
|
|
6
|
-
`,children:[(0,d.jsxs)("div",{className:"flex items-center gap-3 w-full",children:[a.cliStatus&&Object.keys(a.cliStatus).length>0&&(0,d.jsx)("div",{className:"flex items-center justify-center flex-shrink-0 w-4","aria-label":g("branchItem.cliToolStatus"),children:(0,d.jsx)(O,{status:(0,M.A7)(a.cliStatus),label:(0,M.dw)(a.cliStatus,a.cliStatusLabels)})}),(0,d.jsxs)("div",{className:"flex-1 min-w-0 text-left",children:[(0,d.jsx)("p",{className:"text-sm font-medium text-sidebar-foreground truncate",children:a.name}),f&&(0,d.jsx)("p",{className:"text-xs text-sidebar-muted truncate",children:a.repositoryName})]}),a.hasUnread&&(0,d.jsx)("span",{"data-testid":"unread-indicator",className:"w-2 h-2 rounded-full bg-accent-500 flex-shrink-0","aria-label":g("branchItem.hasUnread")})]}),a.description&&(0,d.jsx)("div",{"data-testid":"branch-description",className:"pl-6 pr-2 mt-1 text-left",children:(0,d.jsx)("p",{className:"text-xs text-sidebar-muted line-clamp-2",children:a.description})}),(0,d.jsx)(P,{id:h,branch:a,isVisible:o,anchorRef:i})]})});var S=c(1102);let T=(0,e.memo)(function({sortKey:a,sortDirection:b,onSortKeyChange:c,onSortDirectionChange:f,options:g,defaultDirections:h,compact:i,tooltip:j,iconClassName:k="w-3 h-3"}){let m=(0,l.c)("common"),[n,o]=(0,e.useState)(!1),p=(0,e.useRef)(null);(0,e.useEffect)(()=>{function a(a){p.current&&!p.current.contains(a.target)&&o(!1)}if(n)return document.addEventListener("mousedown",a),()=>document.removeEventListener("mousedown",a)},[n]),(0,e.useEffect)(()=>{function a(a){"Escape"===a.key&&o(!1)}if(n)return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[n]);let q=(0,e.useCallback)(()=>{o(a=>!a)},[]),r=(0,e.useCallback)(d=>{d===a?f("asc"===b?"desc":"asc"):(c(d),f(h?.[d]??"asc")),o(!1)},[a,b,c,f,h]),s=(0,e.useCallback)(()=>{f("asc"===b?"desc":"asc")},[b,f]),t=g.find(b=>b.key===a)?.label||"Sort",u=(0,d.jsxs)("button",{type:"button",onClick:q,"aria-expanded":n,"aria-haspopup":"listbox","aria-label":`Sort by ${t}`,className:" flex items-center gap-1 px-2 py-1 rounded text-xs text-sidebar-muted hover:text-sidebar-foreground hover:bg-sidebar-hover focus:outline-none focus:ring-2 focus:ring-ring transition-colors ",children:[(0,d.jsx)(U,{className:k}),(0,d.jsx)("span",{className:i?"hidden":"hidden sm:inline",children:t})]});return(0,d.jsxs)("div",{ref:p,className:"relative","data-testid":"sort-selector-base",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[j?(0,d.jsx)(S.m_,{content:j,placement:"bottom",children:u}):u,(0,d.jsx)("button",{type:"button",onClick:s,"aria-label":"asc"===b?"Sort ascending":"Sort descending",className:" p-1 rounded text-sidebar-muted hover:text-sidebar-foreground hover:bg-sidebar-hover focus:outline-none focus:ring-2 focus:ring-ring transition-colors ",children:"asc"===b?(0,d.jsx)(V,{className:k}):(0,d.jsx)(W,{className:k})})]}),n&&(0,d.jsx)("div",{role:"listbox","aria-label":m("sort.options"),className:" absolute right-0 top-full mt-1 z-50 min-w-[140px] py-1 rounded-md shadow-lg bg-sidebar border border-sidebar-border ",children:g.map(c=>(0,d.jsxs)("button",{type:"button",role:"option","aria-selected":a===c.key,onClick:()=>r(c.key),className:`
|
|
7
|
-
w-full px-3 py-2 text-left text-sm
|
|
8
|
-
flex items-center justify-between
|
|
9
|
-
hover:bg-sidebar-hover transition-colors
|
|
10
|
-
${a===c.key?"text-accent-700 dark:text-accent-400":"text-sidebar-muted"}
|
|
11
|
-
`,children:[(0,d.jsx)("span",{children:c.label}),a===c.key&&(0,d.jsx)("span",{className:"text-xs",children:"asc"===b?"ASC":"DESC"})]},c.key))})]})});function U({className:a}){return(0,d.jsx)("svg",{className:a,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"})})}function V({className:a}){return(0,d.jsx)("svg",{className:a,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 15l7-7 7 7"})})}function W({className:a}){return(0,d.jsx)("svg",{className:a,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})}let X=[{key:"updatedAt",labelKey:"sort.updatedAt"},{key:"repositoryName",labelKey:"sort.repositoryName"},{key:"branchName",labelKey:"sort.branchName"},{key:"status",labelKey:"sort.status"}],Y={updatedAt:"desc"},Z=(0,e.memo)(function(){let{sortKey:a,sortDirection:b,setSortKey:c,setSortDirection:f}=(0,A.VF)(),g=(0,l.c)("common"),h=(0,e.useMemo)(()=>X.map(({key:a,labelKey:b})=>({key:a,label:g(b)})),[g]);return(0,d.jsx)(T,{sortKey:a,sortDirection:b,onSortKeyChange:c,onSortDirectionChange:f,options:h,defaultDirections:Y,compact:!0,tooltip:g("tooltips.sort"),iconClassName:"w-4 h-4"})});var $=c(73451),_=c(81497),aa=c(55992);let ab=["en","ja"],ac={en:"English",ja:"日本語"};function ad(){return{currentLocale:(0,aa.Ym)(),switchLocale:a=>{if(ab.includes(a)){let b="https:"===window.location.protocol;document.cookie=`locale=${a};path=/;max-age=31536000;SameSite=Lax${b?";Secure":""}`,localStorage.setItem("locale",a),window.location.reload()}}}}function ae(){let{currentLocale:a,switchLocale:b}=ad(),c=(0,l.c)("common");return(0,d.jsx)("select",{value:a,onChange:a=>b(a.target.value),"data-testid":"locale-switcher","aria-label":c("language"),className:" w-full px-3 py-2 rounded-md bg-sidebar text-sidebar-foreground border border-sidebar-border focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent text-sm ",children:ab.map(a=>(0,d.jsx)("option",{value:a,children:ac[a]},a))})}var af=c(84342);function ag(){let a=(0,l.c)("auth"),b=(0,af.H)(),[c,f]=(0,e.useState)(!1);if(!b)return null;async function g(){f(!0);try{await fetch("/api/auth/logout",{method:"POST"}),window.location.href="/login"}catch{window.location.href="/login"}}return(0,d.jsx)("button",{type:"button",onClick:g,disabled:c,"data-testid":"logout-button",className:" w-full px-3 py-2 text-sm text-left rounded-md text-muted-foreground hover:text-foreground hover:bg-muted focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50 transition-colors ",children:c?"...":a("logout.button")})}var ah=c(63474),ai=c(78352),aj=c(32482);let ak="w-4 h-4",al=0,am=null;function an(){return am??[]}let ao=(0,e.memo)(function(){let a=(0,j.Hq)(),{worktrees:b,repositories:c,selectedWorktreeId:f,selectWorktree:g,refreshWorktrees:h}=(0,J.$f)(),{closeMobileDrawer:k,sortKey:m,sortDirection:n,viewMode:o,setViewMode:p}=(0,A.VF)(),q=(0,l.c)("common"),[r,s]=(0,e.useState)(""),u=(0,e.useRef)(null),[v,w]=(0,e.useState)(()=>({})),[x,y]=(0,e.useState)(an),z=(0,e.useRef)(!1);(0,e.useEffect)(()=>{z.current||(z.current=!0,fetch("/api/sidebar/group-order").then(a=>a.json()).then(a=>{a.success&&Array.isArray(a.order)&&(y(a.order),am=a.order)}).catch(()=>{}))},[]);let B=(0,e.useMemo)(()=>(0,aj.UZ)(c),[c]),C=(0,e.useMemo)(()=>(0,aj.s6)(b,B),[b,B]),D=(0,e.useMemo)(()=>C.map(M.XK),[C]),E=(0,e.useDeferredValue)(D),I=(0,e.useRef)(null),K=(0,e.useRef)(null);(0,e.useEffect)(()=>()=>{null!==K.current&&clearTimeout(K.current)},[]);let L=(0,e.useMemo)(()=>{let a=I.current;return!a||Date.now()>=a.expiresAt?E:a.items},[E]),N=(0,e.useRef)(L);(0,e.useLayoutEffect)(()=>{N.current=L});let O=(0,e.useCallback)(()=>{null!==K.current&&(clearTimeout(K.current),K.current=null);let a=I.current;if(a&&Date.now()<a.expiresAt){I.current={...a,expiresAt:1/0};return}I.current={items:N.current,expiresAt:1/0}},[]),P=(0,e.useCallback)(()=>{I.current&&(I.current={...I.current,expiresAt:Date.now()+1e3},null!==K.current&&clearTimeout(K.current),K.current=setTimeout(()=>{I.current=null},1e3))},[]),{sortedItems:Q,groupedItems:T}=function(a){let{items:b,sortKey:c,sortDirection:d,viewMode:f,filterText:g}=a,h=(0,e.useMemo)(()=>{if(!g)return b;let a=g.toLowerCase();return b.filter(b=>b.name.toLowerCase().includes(a)||b.repositoryName.toLowerCase().includes(a))},[b,g]);return{sortedItems:(0,e.useMemo)(()=>(0,aj.Xn)(h,c,d),[h,c,d]),groupedItems:(0,e.useMemo)(()=>"grouped"===f?(0,aj._s)(h,c,d):[],[h,c,d,f])}}({items:L,sortKey:m,sortDirection:n,viewMode:o,filterText:r}),U=(0,e.useMemo)(()=>{if("grouped"!==o||!T)return null;if(r.trim()||0===x.length)return T;let a=new Map(x.map((a,b)=>[a,b]));return[...T].sort((b,c)=>{let d=a.has(b.repositoryName)?a.get(b.repositoryName):1/0,e=a.has(c.repositoryName)?a.get(c.repositoryName):1/0;return d===e?b.repositoryName.localeCompare(c.repositoryName):d-e})},[o,T,x,r]),V="grouped"===o?U:null;(0,e.useEffect)(()=>{},[v]);let W=(0,e.useCallback)(a=>{w(b=>({...b,[a]:!b[a]}))},[]),X=(0,e.useCallback)(()=>{var a;al=Number.isFinite(a=u.current?.scrollTop??0)&&a>0?a:0},[]),Y=Q.length>0||(V?.length??0)>0;(0,e.useEffect)(()=>{let a=u.current;if(!a)return;let b=window.requestAnimationFrame(()=>{a.scrollTop=al});return()=>{window.cancelAnimationFrame(b)}},[Y,o]);let _=(0,e.useCallback)(b=>{X(),g(b),a.push(`/worktrees/${b}`),k()},[X,g,a,k]),aa=(0,G.FR)((0,G.MS)(G.AN,{activationConstraint:{distance:8}})),ab=(0,e.useCallback)(a=>{let{active:b,over:c}=a;if(!c||b.id===c.id||!V)return;let d=V.map(a=>a.repositoryName),e=d.indexOf(String(b.id)),f=d.indexOf(String(c.id));if(-1===e||-1===f)return;let g=(0,H.be)(d,e,f);y(g),am=g,fetch("/api/sidebar/group-order",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({order:g})}).catch(()=>{y(d),am=d})},[V]),ac="flat"===o?0===Q.length:(V?.length??0)===0;return(0,d.jsxs)("nav",{"data-testid":"sidebar","aria-label":q("sidebar.branchNavigation"),className:"h-full flex flex-col bg-sidebar text-sidebar-foreground",role:"navigation",children:[(0,d.jsx)("div",{"data-testid":"sidebar-header",className:"flex-shrink-0 px-4 py-4 border-b border-sidebar-border",children:(0,d.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-y-2",children:[(0,d.jsx)("h2",{className:"min-w-0 truncate text-lg font-semibold text-sidebar-foreground",children:q("sidebar.branches")}),(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[(0,d.jsx)(ar,{viewMode:o,onToggle:p}),(0,d.jsx)(Z,{}),(0,d.jsx)(ax,{refreshWorktrees:h}),(0,d.jsx)(S.m_,{content:q("tooltips.repositories"),placement:"bottom",children:(0,d.jsx)(i(),{href:"/repositories","aria-label":q("nav.repositories"),className:"p-1 rounded-md text-sidebar-muted hover:text-sidebar-foreground hover:bg-sidebar-hover focus:outline-none focus:ring-2 focus:ring-ring transition-colors inline-flex items-center",children:(0,d.jsx)(F.A,{className:ak,"aria-hidden":"true"})})})]})]})}),(0,d.jsx)("div",{className:"flex-shrink-0 px-4 py-3 border-b border-sidebar-border",children:(0,d.jsx)($.pd,{type:"text",placeholder:q("sidebar.searchBranches"),value:r,onChange:a=>s(a.target.value),className:"bg-background shadow-none"})}),(0,d.jsx)("div",{ref:u,"data-testid":"branch-list",onScroll:X,onMouseEnter:O,onMouseLeave:P,className:"flex-1 overflow-y-auto overflow-x-hidden",children:ac?(0,d.jsx)("div",{className:"px-4 py-8 text-center text-sidebar-muted",children:q(r?"sidebar.noBranchesFound":"sidebar.noBranchesAvailable")}):"grouped"===o&&V?(0,d.jsx)(G.Mp,{sensors:aa,collisionDetection:G.fp,onDragEnd:ab,children:(0,d.jsx)(H.gB,{items:V.map(a=>a.repositoryName),strategy:H._G,children:V.map(a=>{let b=!v[a.repositoryName]||!!r.trim();return(0,d.jsx)(ap,{group:a,isExpanded:b,selectedWorktreeId:f,onToggle:()=>W(a.repositoryName),onBranchClick:_,isDragDisabled:!!r.trim()},a.repositoryName)})})}):Q.map(a=>(0,d.jsx)(R,{branch:a,isSelected:a.id===f,onClick:()=>_(a.id)},a.id))}),(0,d.jsxs)("div",{className:"flex-shrink-0 px-4 py-3 border-t border-sidebar-border space-y-2",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("div",{className:"flex-1",children:(0,d.jsx)(ae,{})}),(0,d.jsx)(t,{})]}),(0,d.jsx)(ag,{})]})]})});function ap({group:a,isExpanded:b,selectedWorktreeId:c,onToggle:e,onBranchClick:f,isDragDisabled:g}){let{attributes:h,listeners:i,setNodeRef:j,setActivatorNodeRef:k,transform:l,transition:m,isDragging:n}=(0,H.gl)({id:a.repositoryName,disabled:g}),o={transform:I.Ks.Transform.toString(l),transition:m,opacity:n?.5:1};return(0,d.jsxs)("div",{ref:j,style:o,className:"w-full min-w-0",children:[(0,d.jsx)(aq,{repositoryName:a.repositoryName,branchCount:a.branches.length,isExpanded:b,onClick:e,dragHandleRef:k,dragHandleListeners:g?void 0:i,dragHandleAttributes:g?void 0:h}),b&&a.branches.map(a=>(0,d.jsx)(R,{branch:a,isSelected:a.id===c,onClick:()=>f(a.id),showRepositoryName:!1},a.id))]})}function aq({repositoryName:a,branchCount:b,isExpanded:c,onClick:e,dragHandleRef:f,dragHandleListeners:g,dragHandleAttributes:h}){let i=(0,l.c)("common");return(0,d.jsxs)("div",{className:"flex items-center w-full",children:[g&&(0,d.jsx)("div",{ref:f,...g,...h,"aria-label":i("sidebar.dragToReorderGroup"),className:" flex-shrink-0 flex items-center justify-center w-6 h-full pl-2 cursor-grab active:cursor-grabbing text-sidebar-muted hover:text-sidebar-foreground transition-colors ",children:(0,d.jsx)(av,{})}),(0,d.jsxs)("button",{"data-testid":"group-header",type:"button",onClick:e,"aria-expanded":c,className:" flex-1 min-w-0 flex items-center gap-2 px-2 py-2 text-xs font-semibold text-sidebar-muted uppercase tracking-wider focus:outline-none focus:ring-2 focus:ring-inset focus:ring-ring transition-colors ",children:[(0,d.jsx)(as,{isExpanded:c}),(0,d.jsx)(at,{color:(0,aj.LV)(a)}),(0,d.jsx)(_.nR,{content:a,className:"flex-1 min-w-0 text-left truncate",children:a}),(0,d.jsx)("span",{className:"text-sidebar-muted font-normal tabular-nums pr-2",children:b})]})]})}function ar({viewMode:a,onToggle:b}){let c=(0,l.c)("common");return(0,d.jsx)(S.m_,{content:c("tooltips.viewMode"),placement:"bottom",children:(0,d.jsx)("button",{"data-testid":"view-mode-toggle",type:"button",onClick:()=>{b("grouped"===a?"flat":"grouped")},"aria-label":c("grouped"===a?"sidebar.switchToFlatView":"sidebar.switchToGroupedView"),className:" p-1 rounded-md text-sidebar-muted hover:text-sidebar-foreground hover:bg-sidebar-hover focus:outline-none focus:ring-2 focus:ring-ring transition-colors ",children:"grouped"===a?(0,d.jsx)(au,{className:ak}):(0,d.jsx)(at,{className:ak})})})}function as({isExpanded:a}){return(0,d.jsx)("svg",{className:`w-3 h-3 flex-shrink-0 transition-transform ${a?"rotate-90":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"})})}function at({className:a="w-3.5 h-3.5",color:b}){return(0,d.jsx)("svg",{className:`${a} flex-shrink-0`,viewBox:"0 0 24 24",fill:b??"none",stroke:b?"none":"currentColor",strokeWidth:2*!b,"aria-hidden":"true",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"})})}function au({className:a="w-3 h-3"}){return(0,d.jsx)("svg",{className:a,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 6h16M4 12h16M4 18h16"})})}function av(){return(0,d.jsxs)("svg",{className:"w-3 h-3",fill:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"9",cy:"5",r:"1.5"}),(0,d.jsx)("circle",{cx:"15",cy:"5",r:"1.5"}),(0,d.jsx)("circle",{cx:"9",cy:"12",r:"1.5"}),(0,d.jsx)("circle",{cx:"15",cy:"12",r:"1.5"}),(0,d.jsx)("circle",{cx:"9",cy:"19",r:"1.5"}),(0,d.jsx)("circle",{cx:"15",cy:"19",r:"1.5"})]})}function aw({className:a=""}){return(0,d.jsx)("svg",{className:`${ak} ${a}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L4 4m16 16l-1.64-1.64A9 9 0 014.51 15"})})}let ax=(0,e.memo)(function({refreshWorktrees:a}){let[b,c]=(0,e.useState)(!1),f=(0,e.useRef)(!1),{showToast:g,toasts:h,removeToast:i}=(0,ah.dj)(),j=(0,l.c)("common"),k=(0,e.useCallback)(async()=>{if(!f.current){f.current=!0,c(!0);try{let b=await ai.Rx.sync();await a(),g(j("syncSuccess",{count:b.worktreeCount}),"success",3e3)}catch(a){a instanceof ai.hD&&401===a.status?g(j("syncAuthError"),"error",5e3):g(j("syncError"),"error",5e3)}finally{f.current=!1,c(!1)}}},[a,g,j]);return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(S.m_,{content:j("tooltips.sync"),placement:"bottom",children:(0,d.jsx)("button",{type:"button",onClick:k,disabled:b,"aria-label":j("syncButtonLabel"),className:"p-1 rounded-md text-sidebar-muted hover:text-sidebar-foreground hover:bg-sidebar-hover focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:(0,d.jsx)(aw,{className:b?"animate-spin":""})})}),(0,d.jsx)(ah.N9,{toasts:h,onClose:i})]})});var ay=c(78733),az=c(44688),aA=c(75903),aB=c(59268),aC=c(38882);let aD=[{labelKey:"nav.home",href:"/",isActive:a=>"/"===a,icon:(0,d.jsx)(ay.A,{size:20,"aria-hidden":"true"})},{labelKey:"nav.chat",href:"/chat",isActive:a=>a.startsWith("/chat"),icon:(0,d.jsx)(az.A,{size:20,"aria-hidden":"true"})},{labelKey:"nav.sessions",href:"/sessions",isActive:a=>a.startsWith("/sessions"),icon:(0,d.jsx)(aA.A,{size:20,"aria-hidden":"true"})},{labelKey:"nav.review",href:"/review",isActive:a=>a.startsWith("/review"),icon:(0,d.jsx)(aB.A,{size:20,"aria-hidden":"true"})},{labelKey:"nav.more",href:"/more",isActive:a=>a.startsWith("/more"),icon:(0,d.jsx)(aC.A,{size:20,"aria-hidden":"true"})}];function aE(){let a=(0,g.usePathname)(),{setOpen:b}=(0,x.C)(),c=(0,l.c)("commandPalette"),e=(0,l.c)("common");return(0,d.jsx)("nav",{"data-testid":"global-mobile-nav",className:"fixed bottom-0 left-0 right-0 z-50 border-t border-border bg-background supports-[backdrop-filter]:bg-background/80 backdrop-blur-md pb-safe",children:(0,d.jsxs)("div",{className:"flex items-center justify-around h-14",children:[aD.map(b=>{let c=b.isActive(a);return(0,d.jsxs)(k,{href:b.href,className:`flex flex-col items-center justify-center flex-1 h-full text-xs transition-colors ${c?"text-accent-600 dark:text-accent-400":"text-muted-foreground hover:text-foreground"}`,children:[b.icon,(0,d.jsx)("span",{className:"mt-1 whitespace-nowrap",children:e(b.labelKey)})]},b.href)}),(0,d.jsxs)("button",{type:"button","data-testid":"mobile-command-palette-trigger",onClick:()=>b(!0),"aria-label":c("mobileTrigger"),className:"flex flex-col items-center justify-center flex-1 h-full text-xs text-muted-foreground hover:text-foreground transition-colors",children:[(0,d.jsx)(n.A,{size:20,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"mt-1 whitespace-nowrap",children:c("mobileLabel")})]})]})})}var aF=c(67565),aG=c(50987),aH=c(34487),aI=c(25345),aJ=c(96558),aK=c(75692),aL=c(57898),aM=c(35595),aN=c(11010),aO=c(89184),aP=c(63157),aQ=c(12480);let aR=[{key:"home",href:"/"},{key:"chat",href:"/chat"},{key:"sessions",href:"/sessions"},{key:"repositories",href:"/repositories"},{key:"review",href:"/review"},{key:"more",href:"/more"}],aS={home:ay.A,chat:az.A,sessions:aA.A,repositories:aG.A,review:aB.A,more:aC.A};function aT(a){return a.isWaitingForResponse?"waiting":a.isProcessing?"running":a.isSessionRunning?"ready":"idle"}let aU=(0,aM.cn)("flex cursor-pointer items-center gap-2 rounded-md px-2 py-2 text-sm","text-foreground","data-[selected=true]:bg-accent-500/15 data-[selected=true]:text-accent-700","dark:data-[selected=true]:text-accent-300"),aV="shrink-0 text-muted-foreground";function aW(){let{open:a,setOpen:b}=(0,x.C)(),{setOpen:c}=(0,aO.K)(),f=(0,g.useRouter)(),h=(0,l.c)("commandPalette"),i=(0,l.c)("common"),{theme:j,setTheme:k}=(0,q.D)(),{setSize:m,isMobile:p}=(0,E.Ps)(),{currentLocale:t,switchLocale:u}=ad(),v=(0,aP.rC)(),{toasts:y,showToast:z,removeToast:A}=(0,ah.dj)(),[B,C]=(0,e.useState)(!1),[D,F]=(0,e.useState)(""),[G,H]=(0,e.useState)([]),I=(0,e.useRef)(null);(0,e.useRef)(null),(0,e.useRef)(a);let J=(0,e.useCallback)((a,c)=>{c&&H(a=>(function(a,b){let c=a.filter(a=>a.kind!==b.kind||a.id!==b.id),d=[b,...c].slice(0,8);try{localStorage.setItem("cm.palette.recents",JSON.stringify(d))}catch{}return d})(a,c)),b(!1),a()},[b]),L=(0,e.useCallback)(async()=>{try{await ai.Rx.sync(),await v?.refresh?.(),z(h("actions.syncSuccess"),"success")}catch{z(h("actions.syncError"),"error")}},[v,z,h]),M="dark"===j,O=""===D.trim(),P=v?.error??null,Q=v?.isLoading??!1,R=P?[]:v?.worktrees??[],S=R.length>0,T=!P&&Q&&0===R.length,U=[...R].sort((a,b)=>{let c=+!!a.isSessionRunning,d=+!!b.isSessionRunning;if(c!==d)return d-c;let e=a.updatedAt?new Date(a.updatedAt).getTime():0;return(b.updatedAt?new Date(b.updatedAt).getTime():0)-e}),V=O?U.slice(0,8):U,W=[{id:"theme",label:M?h("actions.toLight"):h("actions.toDark"),icon:M?r.A:s.A,run:()=>k(M?"light":"dark")},...p?[]:aQ.Uf.map(a=>({id:`displaysize:${a}`,label:`${h("actions.displaySizePrefix")}: ${i(`displaySize.${a}`)}`,icon:aH.A,run:()=>m(a)})),{id:"sync",label:h("actions.syncRepositories"),icon:aI.A,run:()=>{L()}},{id:"locale",label:h("actions.switchLanguage"),icon:aJ.A,run:()=>u("ja"===t?"en":"ja")},{id:"github",label:h("actions.openGitHub"),icon:o.A,run:()=>window.open("https://github.com/kewton/MyCodeBranchDesk","_blank","noopener,noreferrer")},{id:"keyboardShortcuts",label:h("actions.keyboardShortcuts"),icon:aK.A,run:()=>c(!0)}],X=O?G.map(a=>{if("nav"===a.kind){let b=aR.find(b=>b.key===a.id);if(!b)return null;let c=aS[b.key],e=i(`nav.${b.key}`);return{id:`nav-${b.key}`,value:`recent nav ${b.key}`,node:(0,d.jsxs)(d.Fragment,{children:[c&&(0,d.jsx)(c,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:e})]}),onSelect:()=>J(()=>f.push(b.href),{kind:"nav",id:b.key})}}if("worktree"===a.kind){let b=R.find(b=>b.id===a.id);if(!b)return null;let c=b.repositoryDisplayName||b.repositoryName||"",e=b.branch||b.name;return{id:`worktree-${b.id}`,value:`recent worktree ${b.id}`,node:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(aL.A,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:e}),c&&(0,d.jsx)("span",{className:"ml-auto truncate pl-2 text-xs text-muted-foreground",children:c}),(0,d.jsx)(N.m,{status:aT(b),size:"sm",className:c?"ml-2":"ml-auto"})]}),onSelect:()=>J(()=>f.push(`/worktrees/${b.id}`),{kind:"worktree",id:b.id})}}let b=W.find(b=>b.id===a.id);if(!b)return null;let c=b.icon;return{id:`action-${b.id}`,value:`recent action ${b.id}`,node:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(c,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:b.label})]}),onSelect:()=>J(b.run,{kind:"action",id:b.id})}}).filter(a=>null!==a):[];return B?(0,K.createPortal)((0,d.jsxs)(d.Fragment,{children:[a&&(0,d.jsxs)("div",{className:"fixed inset-0 overflow-y-auto",style:{zIndex:aN.M.MODAL},"data-testid":"command-palette",children:[(0,d.jsx)("div",{"data-state":"open","aria-hidden":"true",className:"fixed inset-0 bg-black/40 backdrop-blur-sm transition-opacity data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-200",onClick:()=>b(!1)}),(0,d.jsx)("div",{className:"relative flex min-h-full items-start justify-center p-4 pt-[15vh]",children:(0,d.jsx)("div",{"data-state":"open","data-testid":"command-palette-panel",className:(0,aM.cn)("relative w-full max-w-lg overflow-hidden rounded-xl bg-surface/95 shadow-2xl ring-1 ring-border backdrop-blur-xl","data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:duration-200"),children:(0,d.jsxs)(aF.uB,{label:h("title"),className:(0,aM.cn)("flex flex-col","[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pb-1 [&_[cmdk-group-heading]]:pt-2","[&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground"),children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 border-b border-border px-3",children:[(0,d.jsx)(n.A,{size:16,strokeWidth:2,"aria-hidden":"true",className:"shrink-0 text-muted-foreground"}),(0,d.jsx)(aF.uB.Input,{ref:I,value:D,onValueChange:F,placeholder:h("placeholder"),"data-testid":"command-palette-input",className:"flex-1 bg-transparent py-3 text-sm text-foreground outline-none placeholder:text-muted-foreground"})]}),(0,d.jsxs)(aF.uB.List,{className:"max-h-[min(60vh,360px)] overflow-y-auto p-2",children:[(0,d.jsx)(aF.uB.Empty,{"data-testid":"command-palette-empty",className:"py-6 text-center text-sm text-muted-foreground",children:h("empty")}),T&&(0,d.jsx)(aF.uB.Loading,{"data-testid":"command-palette-loading",className:"py-6 text-center text-sm text-muted-foreground",children:h("loading")}),X.length>0&&(0,d.jsx)(aF.uB.Group,{heading:h("groups.recent"),children:X.map(a=>(0,d.jsx)(aF.uB.Item,{value:a.value,onSelect:a.onSelect,className:aU,children:a.node},a.id))}),(0,d.jsx)(aF.uB.Group,{heading:h("groups.navigation"),children:aR.map(a=>{let b=i(`nav.${a.key}`),c=aS[a.key];return(0,d.jsxs)(aF.uB.Item,{value:`nav ${b} ${a.href}`,onSelect:()=>J(()=>f.push(a.href),{kind:"nav",id:a.key}),className:aU,children:[c&&(0,d.jsx)(c,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:b})]},a.key)})}),S&&(0,d.jsx)(aF.uB.Group,{heading:h("groups.worktrees"),children:V.map(a=>{let b=a.repositoryDisplayName||a.repositoryName||"",c=a.branch||a.name;return(0,d.jsxs)(aF.uB.Item,{value:`worktree ${b} ${c} ${a.name} ${a.id}`,onSelect:()=>J(()=>f.push(`/worktrees/${a.id}`),{kind:"worktree",id:a.id}),className:aU,children:[(0,d.jsx)(aL.A,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:c}),b&&(0,d.jsx)("span",{className:"ml-auto truncate pl-2 text-xs text-muted-foreground",children:b}),(0,d.jsx)(N.m,{status:aT(a),size:"sm",className:b?"ml-2":"ml-auto"})]},a.id)})}),(0,d.jsx)(aF.uB.Group,{heading:h("groups.actions"),children:W.map(a=>{let b=a.icon;return(0,d.jsxs)(aF.uB.Item,{value:`action ${a.id} ${a.label}`,onSelect:()=>J(a.run,{kind:"action",id:a.id}),className:aU,children:[(0,d.jsx)(b,{size:16,className:aV,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"truncate",children:a.label})]},a.id)})})]}),(0,d.jsxs)("div",{className:"flex items-center gap-3 border-t border-border bg-surface-2 px-3 py-2 text-[11px] text-muted-foreground",children:[(0,d.jsxs)("span",{className:"flex items-center gap-1",children:[(0,d.jsx)(w.u,{children:"↑"}),(0,d.jsx)(w.u,{children:"↓"}),h("footer.navigate")]}),(0,d.jsxs)("span",{className:"flex items-center gap-1",children:[(0,d.jsx)(w.u,{children:"↵"}),h("footer.select")]}),(0,d.jsxs)("span",{className:"flex items-center gap-1",children:[(0,d.jsx)(w.u,{children:"esc"}),h("footer.close")]})]})]})})})]}),(0,d.jsx)(ah.N9,{toasts:y,onClose:A})]}),document.body):null}var aX=c(98033);let aY=["global","terminal","composer"],aZ=[{id:"commandPalette",keys:["MOD","K"],scope:"global"},{id:"keyboardHelp",keys:["?"],scope:"global"},{id:"closeOverlay",keys:["Esc"],scope:"global"},{id:"navigateList",keys:["↑","↓"],scope:"global"},{id:"terminalSearch",keys:["MOD","F"],scope:"terminal"},{id:"sendMessage",keys:["↵"],scope:"composer"},{id:"composerNewline",keys:["Shift","↵"],scope:"composer"}];function a$(){let{open:a,setOpen:b}=(0,aO.K)(),{open:c}=(0,x.C)(),f=(0,l.c)("keyboardShortcuts"),[g,h]=(0,e.useState)(!1);(0,e.useRef)(a),(0,e.useRef)(c);let i=function(a=aZ){return aY.map(b=>({scope:b,shortcuts:a.filter(a=>a.scope===b)})).filter(a=>a.shortcuts.length>0)}();return(0,d.jsx)(aX.a,{isOpen:a,onClose:()=>b(!1),title:f("title"),size:"md",children:(0,d.jsx)("div",{"data-testid":"keyboard-shortcuts-overlay",className:"space-y-6",children:i.map(({scope:a,shortcuts:b})=>(0,d.jsxs)("section",{"data-testid":`keyboard-shortcuts-scope-${a}`,children:[(0,d.jsx)("h4",{className:"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:f(`scopes.${a}`)}),(0,d.jsx)("ul",{className:"divide-y divide-border",children:b.map(a=>(0,d.jsxs)("li",{"data-testid":`keyboard-shortcut-${a.id}`,className:"flex items-center justify-between gap-4 py-2",children:[(0,d.jsx)("span",{className:"text-sm text-foreground",children:f(`shortcuts.${a.id}`)}),(0,d.jsx)("span",{className:"flex flex-shrink-0 items-center gap-1",children:a.keys.map((a,b)=>(0,d.jsx)(w.u,{children:"MOD"===a?g?"⌘":"Ctrl":a},b))})]},a.id))})]},a))})})}let a_="transform transition-transform duration-300 ease-out",a0=(0,e.memo)(function({children:a}){let{isOpen:b,isMobileDrawerOpen:c,closeMobileDrawer:f,width:h,setWidth:i}=(0,A.VF)(),j=(0,B.a)(),{showSidebar:k,showGlobalNav:l}=function(){var a=(0,g.usePathname)();for(let b of D)if(a.startsWith(b.prefix))return{...C,...b.config};return{...C}}(),{factor:m}=(0,E.Ps)(),n=Math.round(160*m),o=Math.round(480*m),p=Math.round(Math.min(o,Math.max(n,h*m))),q=(0,e.useRef)(null),r=(0,e.useRef)(null),s=(0,e.useCallback)(a=>{i(Math.round(a/m))},[i,m]);return j?(0,d.jsxs)("div",{"data-testid":"app-shell",className:"h-screen flex flex-col",children:[c&&(0,d.jsx)("div",{"data-testid":"drawer-overlay",className:"fixed inset-0 bg-black/50 z-40",onClick:f,"aria-hidden":"true"}),k&&(0,d.jsx)("aside",{"data-testid":"sidebar-container",className:`
|
|
12
|
-
fixed left-0 top-0 h-full w-72 z-50
|
|
13
|
-
${a_}
|
|
14
|
-
${c?"translate-x-0":"-translate-x-full"}
|
|
15
|
-
`,role:"complementary",children:(0,d.jsx)(ao,{})}),(0,d.jsx)("main",{className:`flex-1 min-h-0 overflow-hidden ${l?"pb-14":""}`,role:"main","data-view-transition":"content",children:a}),l&&(0,d.jsx)(aE,{}),(0,d.jsx)(aW,{}),(0,d.jsx)(a$,{})]}):(0,d.jsxs)("div",{"data-testid":"app-shell",className:"h-screen flex flex-col",children:[l&&(0,d.jsx)(z,{}),(0,d.jsxs)("div",{className:"flex flex-1 min-h-0",children:[k&&(0,d.jsxs)("aside",{ref:q,"data-testid":"sidebar-container",className:`
|
|
16
|
-
fixed left-0
|
|
17
|
-
${l?"top-16 h-[calc(100vh-4rem)]":"top-0 h-full"}
|
|
18
|
-
border-r border-border
|
|
19
|
-
${a_}
|
|
20
|
-
${b?"translate-x-0":"-translate-x-full"}
|
|
21
|
-
`,style:{width:`${p}px`,zIndex:aN.M.SIDEBAR},role:"complementary","aria-hidden":!b,children:[(0,d.jsx)(ao,{}),(0,d.jsx)(a1,{currentWidth:p,minWidth:n,maxWidth:o,sidebarRef:q,mainRef:r,onWidthChange:s})]}),(0,d.jsx)("main",{ref:r,className:"flex-1 min-w-0 h-full overflow-hidden transition-[padding] duration-300 ease-out",style:{paddingLeft:k&&b?`${p}px`:0},role:"main","data-view-transition":"content",children:a})]}),(0,d.jsx)(aW,{}),(0,d.jsx)(a$,{})]})});function a1({currentWidth:a,minWidth:b,maxWidth:c,sidebarRef:e,mainRef:f,onWidthChange:g}){return(0,d.jsx)("div",{"data-testid":"sidebar-resize-handle","aria-hidden":"true",onMouseDown:d=>{d.preventDefault();let h=d.clientX,i=a;f.current&&(f.current.style.transition="none");let j=d=>{i=Math.max(b,Math.min(c,a+(d.clientX-h))),e.current&&(e.current.style.width=`${i}px`),f.current&&(f.current.style.paddingLeft=`${i}px`)},k=()=>{document.body.style.cursor="",document.body.style.userSelect="",f.current&&(f.current.style.transition=""),document.removeEventListener("mousemove",j),document.removeEventListener("mouseup",k),g(i)};document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("mousemove",j),document.addEventListener("mouseup",k)},className:"absolute top-0 right-0 w-1 h-full cursor-col-resize hover:bg-accent-500/40 transition-colors"})}},63474:(a,b,c)=>{c.d(b,{N9:()=>r,dj:()=>s});var d=c(21124),e=c(38301),f=c(20481),g=c(75219),h=c(91292),i=c(16945),j=c(71117),k=c(47089),l=c(11010),m=c(58970),n=c(6074);let o=3e3;function p({type:a,iconColor:b}){let c=`h-5 w-5 ${b}`;switch(a){case"success":return(0,d.jsx)(g.A,{className:c,"data-testid":"toast-icon-success"});case"error":return(0,d.jsx)(h.A,{className:c,"data-testid":"toast-icon-error"});case"warning":return(0,d.jsx)(i.A,{className:c,"data-testid":"toast-icon-warning"});default:return(0,d.jsx)(j.A,{className:c,"data-testid":"toast-icon-info"})}}function q({id:a,message:b,type:c,onClose:g,duration:h=o}){let i=(0,f.c)("common"),j=(0,e.useRef)(null),l=function(a){switch(a){case"success":return{bgColor:"bg-success-subtle",borderColor:"border-success-border",textColor:"text-success-foreground",iconColor:"text-success-foreground"};case"error":return{bgColor:"bg-danger-subtle",borderColor:"border-danger-border",textColor:"text-danger-foreground",iconColor:"text-danger-foreground"};case"warning":return{bgColor:"bg-warning-subtle",borderColor:"border-warning-border",textColor:"text-warning-foreground",iconColor:"text-warning-foreground"};default:return{bgColor:"bg-info-subtle",borderColor:"border-info-border",textColor:"text-info-foreground",iconColor:"text-info-foreground"}}}(c),[q,r]=(0,e.useState)(!0),{shouldRender:s,isExiting:t}=(0,n.O)(q,m.Ys);(0,e.useRef)(g).current=g;let u=(0,e.useCallback)(()=>{j.current&&clearTimeout(j.current),r(!1)},[]);return(0,d.jsxs)("div",{"data-testid":`toast-${a}`,role:"alert",className:`
|
|
22
|
-
${l.bgColor}
|
|
23
|
-
${l.borderColor}
|
|
24
|
-
${l.textColor}
|
|
25
|
-
border rounded-lg shadow-lg p-4 min-w-[300px] max-w-[400px]
|
|
26
|
-
flex items-start gap-3
|
|
27
|
-
${t?"animate-out fade-out-0 slide-out-to-right-full duration-200 fill-mode-forwards pointer-events-none":"animate-slide-in"}
|
|
28
|
-
`,children:[(0,d.jsx)(p,{type:c,iconColor:l.iconColor}),(0,d.jsx)("p",{className:"flex-1 text-sm font-medium",children:b}),(0,d.jsx)("button",{"data-testid":"toast-close-button",onClick:u,"aria-label":i("closeNotification"),className:`
|
|
29
|
-
${l.textColor}
|
|
30
|
-
hover:opacity-70
|
|
31
|
-
focus:outline-none focus:ring-2 focus:ring-offset-2
|
|
32
|
-
transition-opacity
|
|
33
|
-
`,children:(0,d.jsx)(k.A,{className:"h-4 w-4"})})]})}function r({toasts:a,onClose:b}){return(0,d.jsx)("div",{"data-testid":"toast-container","aria-live":"polite",className:"fixed bottom-4 right-4 flex flex-col gap-2",style:{zIndex:l.M.TOAST},children:a.map(a=>(0,d.jsx)(q,{id:a.id,message:a.message,type:a.type,onClose:b,duration:a.duration},a.id))})}function s(){let[a,b]=(0,e.useState)([]),c=(0,e.useRef)(0),d=(0,e.useCallback)((a,d="info",e=o)=>{let f=`toast-${++c.current}-${Date.now()}`,g={id:f,message:a,type:d,duration:e};return b(a=>[...a,g]),f},[]);return{toasts:a,showToast:d,removeToast:(0,e.useCallback)(a=>{b(b=>b.filter(b=>b.id!==a))},[]),clearToasts:(0,e.useCallback)(()=>{b([])},[])}}},67016:(a,b,c)=>{c.d(b,{A7:()=>g,XK:()=>i,dw:()=>h,kA:()=>f});var d=c(17252),e=c(4267);function f(a){return a?a.isWaitingForResponse?"waiting":a.isProcessing?"running":a.isRunning?"ready":"idle":"idle"}function g(a){if(!a)return"idle";let b=Object.values(a).filter(a=>void 0!==a);return 0===b.length?"idle":b.includes("waiting")?"waiting":b.includes("running")?"running":b.includes("generating")?"generating":b.includes("ready")?"ready":"idle"}function h(a,b){return a?Object.entries(a).map(([a,c])=>`${b?.[a]??(0,d.f_)(a,a)}: ${c??"idle"}`).join(", "):""}function i(a){let b=f(void 0!==a.isSessionRunning?{isRunning:a.isSessionRunning??!1,isWaitingForResponse:a.isWaitingForResponse??!1,isProcessing:a.isProcessing??!1}:void 0),c=!!a.lastAssistantMessageAt&&(!a.lastViewedAt||new Date(a.lastAssistantMessageAt)>new Date(a.lastViewedAt)),{cliStatus:g,cliStatusLabels:h}=function(a){let b={},c={},g=a.sessionStatusByInstance;if(!g){for(let g of a.selectedAgents??e.fJ)b[g]=f(a.sessionStatusByCli?.[g]),c[g]=(0,d.oo)(g);return{cliStatus:b,cliStatusLabels:c}}let h=a.agentInstances&&a.agentInstances.length>0?a.agentInstances:(0,d.lu)(a.selectedAgents??e.fJ),i=new Set;for(let a of h)i.add(a.id),b[a.id]=f(g[a.id]),c[a.id]=(0,d.sw)(a);for(let[a,e]of Object.entries(g)){if(i.has(a))continue;let g=f(e);"idle"!==g&&(b[a]=g,c[a]=function(a){let b=d.XH.find(b=>a.startsWith(`${b}-`));if(b){let c=a.slice(b.length+1);return`${(0,d.oo)(b)} ${c}`}return(0,d.f_)(a,a)}(a))}return{cliStatus:b,cliStatusLabels:c}}(a);return{id:a.id,name:a.name,repositoryName:a.repositoryDisplayName??a.repositoryName,status:b,hasUnread:c,lastActivity:a.updatedAt,description:a.description,cliStatus:g,cliStatusLabels:h,worktreePath:a.path}}},81497:(a,b,c)=>{c.d(b,{nR:()=>g});var d=c(21124),e=c(38301),f=c(23312);function g({content:a,delay:b=200,className:c,children:g,metadata:h}){let i=(0,e.useRef)(null),j=(0,e.useRef)(null),[k,l]=(0,e.useState)(!1),[m,n]=(0,e.useState)({top:-9999,left:-9999}),o=(0,e.useCallback)(()=>{null!==j.current&&(clearTimeout(j.current),j.current=null)},[]),p=(0,e.useCallback)(()=>{let a=i.current;a&&(a.scrollWidth>a.clientWidth||h)&&(o(),j.current=setTimeout(()=>{let b=a.getBoundingClientRect(),c=b.left;n({top:b.bottom+4,left:Math.min(b.left,c)}),l(!0),j.current=null},b))},[o,b,h]),q=(0,e.useCallback)(()=>{o(),l(!1)},[o]);return(0,d.jsxs)("span",{ref:i,className:c,onMouseEnter:p,onMouseLeave:q,children:[g??a,k&&"undefined"!=typeof document&&(0,f.createPortal)((0,d.jsxs)("span",{role:"tooltip","aria-hidden":"true",className:"fixed z-[9999] max-w-md px-2 py-1 text-xs font-medium rounded bg-foreground text-background shadow-lg pointer-events-none",style:{top:m.top,left:m.left},children:[(0,d.jsx)("span",{className:"block break-all",children:a}),h&&(0,d.jsx)("span",{className:"mt-0.5 block whitespace-pre-line font-normal text-background/70",children:h})]}),document.body)]})}}};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=6791,exports.ids=[6791],exports.modules={10406:(a,b,c)=>{c.d(b,{$G:()=>s,Ir:()=>n,RS:()=>v,Uj:()=>k,Ux:()=>r,Yg:()=>o,_D:()=>p,bM:()=>x,fD:()=>z,k5:()=>y,l$:()=>t,lS:()=>u,r:()=>l,tw:()=>w,vB:()=>j});var d=c(55511),e=c(33873),f=c.n(e),g=c(7956);function h(a){return{id:a.id,name:a.name,displayName:a.display_name||void 0,path:a.path,enabled:1===a.enabled,visible:1===a.visible,cloneUrl:a.clone_url||void 0,normalizedCloneUrl:a.normalized_clone_url||void 0,cloneSource:a.clone_source,isEnvManaged:1===a.is_env_managed,createdAt:new Date(a.created_at),updatedAt:new Date(a.updated_at)}}function i(a){return{id:a.id,cloneUrl:a.clone_url,normalizedCloneUrl:a.normalized_clone_url,targetPath:a.target_path,repositoryId:a.repository_id||void 0,status:a.status,pid:a.pid||void 0,progress:a.progress,errorCategory:a.error_category||void 0,errorCode:a.error_code||void 0,errorMessage:a.error_message||void 0,startedAt:a.started_at?new Date(a.started_at):void 0,completedAt:a.completed_at?new Date(a.completed_at):void 0,createdAt:new Date(a.created_at)}}function j(a,b){let c=(0,d.randomUUID)(),e=Date.now();return a.prepare(`
|
|
2
|
-
INSERT INTO repositories (
|
|
3
|
-
id, name, path, enabled, visible, clone_url, normalized_clone_url,
|
|
4
|
-
clone_source, is_env_managed, created_at, updated_at
|
|
5
|
-
)
|
|
6
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
7
|
-
`).run(c,b.name,b.path,+(!1!==b.enabled),+(!1!==b.visible),b.cloneUrl||null,b.normalizedCloneUrl||null,b.cloneSource,+!!b.isEnvManaged,e,e),{id:c,name:b.name,path:b.path,enabled:!1!==b.enabled,visible:!1!==b.visible,cloneUrl:b.cloneUrl,normalizedCloneUrl:b.normalizedCloneUrl,cloneSource:b.cloneSource,isEnvManaged:b.isEnvManaged||!1,createdAt:new Date(e),updatedAt:new Date(e)}}function k(a,b){let c=a.prepare(`
|
|
8
|
-
SELECT * FROM repositories
|
|
9
|
-
WHERE normalized_clone_url = ?
|
|
10
|
-
`).get(b);return c?h(c):null}function l(a,b){let c=a.prepare(`
|
|
11
|
-
SELECT * FROM repositories
|
|
12
|
-
WHERE id = ?
|
|
13
|
-
`).get(b);return c?h(c):null}function m(a,b){let c=a.prepare(`
|
|
14
|
-
SELECT * FROM repositories
|
|
15
|
-
WHERE path = ?
|
|
16
|
-
`).get(b);return c?h(c):null}function n(a,b,c){let d=Date.now(),e=["updated_at = ?"],f=[d];void 0!==c.name&&(e.push("name = ?"),f.push(c.name)),void 0!==c.displayName&&(e.push("display_name = ?"),f.push(c.displayName||null)),void 0!==c.enabled&&(e.push("enabled = ?"),f.push(+!!c.enabled)),void 0!==c.visible&&(e.push("visible = ?"),f.push(+!!c.visible)),void 0!==c.cloneUrl&&(e.push("clone_url = ?"),f.push(c.cloneUrl||null)),void 0!==c.normalizedCloneUrl&&(e.push("normalized_clone_url = ?"),f.push(c.normalizedCloneUrl||null)),f.push(b),a.prepare(`
|
|
17
|
-
UPDATE repositories
|
|
18
|
-
SET ${e.join(", ")}
|
|
19
|
-
WHERE id = ?
|
|
20
|
-
`).run(...f)}function o(a){return a.prepare(`
|
|
21
|
-
SELECT * FROM repositories
|
|
22
|
-
ORDER BY name ASC
|
|
23
|
-
`).all().map(h)}function p(a){return a.prepare(`
|
|
24
|
-
SELECT r.*,
|
|
25
|
-
(SELECT COUNT(*) FROM worktrees w WHERE w.repository_path = r.path) AS worktree_count
|
|
26
|
-
FROM repositories r
|
|
27
|
-
ORDER BY r.name ASC
|
|
28
|
-
`).all().map(a=>({...h(a),worktreeCount:Number(a.worktree_count)||0}))}function q(a){return f().resolve(a)}function r(a){if(!a||"string"!=typeof a)return{valid:!1,error:"repositoryPath is required"};if(a.includes("\0"))return{valid:!1,error:"Invalid repository path"};let b=q(a);return(0,g.fW)(b)?{valid:!1,error:"Invalid repository path"}:{valid:!0,resolvedPath:b}}function s(a,b){for(let c of b){let b=q(c);m(a,b)||j(a,{name:f().basename(b),path:b,cloneSource:"local",isEnvManaged:!0,enabled:!0})}let c=function(a,b){let c=a.prepare("SELECT path FROM repositories WHERE enabled = 0").all().map(a=>a.path);return b.filter(a=>!c.includes(q(a)))}(a,b),d=b.filter(a=>!c.includes(a));return{filteredPaths:c,excludedPaths:d,excludedCount:d.length}}function t(a,b){let c=q(b),d=m(a,c);if(d)n(a,d.id,{enabled:!1});else{if(a.prepare("SELECT COUNT(*) as count FROM repositories WHERE enabled = 0").get().count>=1e3)throw Error("Disabled repository limit exceeded");j(a,{name:f().basename(c),path:c,cloneSource:"local",isEnvManaged:!1,enabled:!1})}}function u(a){return a.prepare("SELECT * FROM repositories WHERE enabled = 0 ORDER BY name ASC").all().map(h)}function v(a,b){let c=m(a,q(b));return c?(n(a,c.id,{enabled:!0}),{...c,enabled:!0}):null}function w(a,b){let c=(0,d.randomUUID)(),e=Date.now();return a.prepare(`
|
|
29
|
-
INSERT INTO clone_jobs (
|
|
30
|
-
id, clone_url, normalized_clone_url, target_path,
|
|
31
|
-
status, progress, created_at
|
|
32
|
-
)
|
|
33
|
-
VALUES (?, ?, ?, ?, 'pending', 0, ?)
|
|
34
|
-
`).run(c,b.cloneUrl,b.normalizedCloneUrl,b.targetPath,e),{id:c,cloneUrl:b.cloneUrl,normalizedCloneUrl:b.normalizedCloneUrl,targetPath:b.targetPath,status:"pending",progress:0,createdAt:new Date(e)}}function x(a,b){let c=a.prepare(`
|
|
35
|
-
SELECT * FROM clone_jobs
|
|
36
|
-
WHERE id = ?
|
|
37
|
-
`).get(b);return c?i(c):null}function y(a,b,c){let d=[],e=[];void 0!==c.status&&(d.push("status = ?"),e.push(c.status)),void 0!==c.pid&&(d.push("pid = ?"),e.push(c.pid)),void 0!==c.progress&&(d.push("progress = ?"),e.push(c.progress)),void 0!==c.repositoryId&&(d.push("repository_id = ?"),e.push(c.repositoryId)),void 0!==c.errorCategory&&(d.push("error_category = ?"),e.push(c.errorCategory)),void 0!==c.errorCode&&(d.push("error_code = ?"),e.push(c.errorCode)),void 0!==c.errorMessage&&(d.push("error_message = ?"),e.push(c.errorMessage)),void 0!==c.startedAt&&(d.push("started_at = ?"),e.push(c.startedAt.getTime())),void 0!==c.completedAt&&(d.push("completed_at = ?"),e.push(c.completedAt.getTime())),0!==d.length&&(e.push(b),a.prepare(`
|
|
38
|
-
UPDATE clone_jobs
|
|
39
|
-
SET ${d.join(", ")}
|
|
40
|
-
WHERE id = ?
|
|
41
|
-
`).run(...e))}function z(a,b){let c=a.prepare(`
|
|
42
|
-
SELECT * FROM clone_jobs
|
|
43
|
-
WHERE normalized_clone_url = ?
|
|
44
|
-
AND status IN ('pending', 'running')
|
|
45
|
-
ORDER BY created_at DESC
|
|
46
|
-
LIMIT 1
|
|
47
|
-
`).get(b);return c?i(c):null}},56791:(a,b,c)=>{c.d(b,{AC:()=>d.AC,ug:()=>d.ug,KG:()=>d.KG,cD:()=>d.cD,Jj:()=>d.Jj,YX:()=>d.YX,G4:()=>d.G4,hL:()=>d.hL,qp:()=>d.qp,To:()=>d.To,oH:()=>d.oH,py:()=>d.py,yy:()=>d.yy,pE:()=>d.pE,z2:()=>d.z2,cP:()=>d.cP,DF:()=>d.DF,lA:()=>d.lA,Qp:()=>d.Qp,th:()=>d.th,oZ:()=>d.oZ,ZP:()=>d.ZP,Ys:()=>d.Ys,vg:()=>d.vg,Rm:()=>d.Rm,BN:()=>d.BN,m0:()=>d.m0,Tk:()=>d.Tk,iT:()=>d.iT,gp:()=>d.gp,yE:()=>d.yE,BE:()=>d.BE,qK:()=>d.qK,p4:()=>d.p4,r8:()=>d.r8,of:()=>d.of,DN:()=>d.DN,pZ:()=>d.pZ,kA:()=>d.kA,VL:()=>d.VL,CF:()=>d.CF,NV:()=>d.NV,ce:()=>d.ce,y1:()=>d.y1,Nr:()=>d.Nr,ob:()=>d.ob,fr:()=>d.fr,Ui:()=>d.Ui,P9:()=>d.P9,eN:()=>d.eN,vi:()=>d.vi,uJ:()=>d.uJ,yT:()=>d.yT,PL:()=>d.PL,jp:()=>d.jp,nQ:()=>d.nQ,yb:()=>d.yb,GA:()=>d.GA,Cs:()=>d.Cs,xR:()=>d.xR,az:()=>d.az,nZ:()=>d.nZ,PP:()=>d.PP,Dx:()=>d.Dx,O:()=>d.O,EU:()=>d.EU,HZ:()=>d.HZ,UY:()=>d.UY,cw:()=>d.cw,jJ:()=>d.jJ,DC:()=>d.DC,gb:()=>d.gb,yB:()=>d.yB,uy:()=>d.uy,s:()=>d.s,iu:()=>d.iu,hq:()=>d.hq,z1:()=>d.z1,bl:()=>d.bl,jA:()=>d.jA,ZL:()=>d.ZL});var d=c(25537);c(88807),c(36395),c(20416),c(10406),c(29021),c(33873),c(21820),c(7956),(0,c(72626).h)("db-migration-path")}};
|