commandmate 0.19.0 → 0.21.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 +259 -238
- package/.next/app-path-routes-manifest.json +28 -26
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +18 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +5 -3
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route.js +1 -1
- package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +2 -2
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js +2 -2
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route.js +2 -2
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route.js +1 -1
- package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +2 -2
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +3 -3
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +2 -2
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +2 -2
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +6 -6
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/skills/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +4 -4
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/apple-icon.png/route.js +1 -1
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/icon.png/route.js +1 -1
- package/.next/server/app/icon.png/route.js.nft.json +1 -1
- package/.next/server/app/icon1.png/route.js +1 -1
- package/.next/server/app/icon1.png/route.js.nft.json +1 -1
- package/.next/server/app/icon2.png/route.js +1 -1
- package/.next/server/app/icon2.png/route.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +8 -8
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +28 -26
- package/.next/server/chunks/1029.js +1 -0
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1503.js +1 -1
- package/.next/server/chunks/1598.js +4 -0
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2546.js +1 -0
- package/.next/server/chunks/2710.js +2 -2
- package/.next/server/chunks/28.js +2 -2
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3451.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/365.js +1 -0
- package/.next/server/chunks/3736.js +1 -1
- package/.next/server/chunks/3753.js +33 -20
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/406.js +5 -5
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/{1185.js → 5048.js} +1 -1
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5737.js +1 -1
- package/.next/server/chunks/5959.js +10 -3
- package/.next/server/chunks/{5381.js → 5998.js} +2 -2
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +5 -5
- package/.next/server/chunks/6283.js +1 -1
- package/.next/server/chunks/6401.js +1 -0
- package/.next/server/chunks/641.js +1 -0
- package/.next/server/chunks/848.js +1 -0
- package/.next/server/chunks/8536.js +1 -0
- package/.next/server/chunks/8543.js +1 -0
- package/.next/server/chunks/8584.js +1 -1
- package/.next/server/chunks/8807.js +157 -143
- package/.next/server/chunks/8856.js +2 -2
- package/.next/server/chunks/9058.js +1 -0
- package/.next/server/chunks/9067.js +1 -0
- package/.next/server/chunks/9123.js +1 -1
- package/.next/server/chunks/9360.js +2 -0
- 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/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{8562-6e2ab32452f4fa5b.js → 2053-52d3c82014e1cd54.js} +1 -1
- package/.next/static/chunks/2751-9ef0f4b450bd4ef0.js +1 -0
- package/.next/static/chunks/{6488-2c412c29258637b6.js → 6488-b5e707dfdd33d633.js} +1 -1
- package/.next/static/chunks/744-fa8c0ae444c8338c.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/skills/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/templates/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-be21650964d61b1d.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-b73ac6531829c698.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.ts +347 -0
- package/.next/types/routes.d.ts +5 -2
- package/.next/types/validator.ts +27 -0
- package/README.md +10 -1
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +4 -3
- package/dist/cli/commands/capture.d.ts +1 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +112 -2
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +9 -3
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +34 -8
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +6 -5
- package/dist/cli/commands/skill-format.d.ts +7 -1
- package/dist/cli/commands/skill-format.d.ts.map +1 -1
- package/dist/cli/commands/skill-format.js +67 -0
- package/dist/cli/commands/skill.d.ts +2 -0
- package/dist/cli/commands/skill.d.ts.map +1 -1
- package/dist/cli/commands/skill.js +149 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +53 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +66 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +3 -2
- package/dist/cli/config/agent-target-options.d.ts +46 -0
- package/dist/cli/config/agent-target-options.d.ts.map +1 -0
- package/dist/cli/config/agent-target-options.js +54 -0
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +72 -17
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +3 -0
- package/dist/cli/types/api-responses.d.ts +174 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +31 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +4 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +43 -5
- package/dist/cli/utils/npm-runner.d.ts +24 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +51 -1
- package/dist/cli/utils/pid-manager.d.ts +12 -2
- package/dist/cli/utils/pid-manager.d.ts.map +1 -1
- package/dist/cli/utils/pid-manager.js +76 -13
- package/dist/cli/utils/verify-runner.d.ts +9 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +28 -2
- package/dist/config/history-display-config.d.ts +61 -0
- package/dist/config/history-display-config.d.ts.map +1 -0
- package/dist/config/history-display-config.js +62 -0
- package/dist/server/server.js +107 -14
- package/dist/server/src/lib/auto-yes-poller.js +49 -0
- package/dist/server/src/lib/auto-yes-state.js +64 -0
- package/dist/server/src/lib/db/chat-db.js +75 -1
- package/dist/server/src/lib/db/db-repository.js +66 -2
- package/dist/server/src/lib/db/db.js +13 -3
- package/dist/server/src/lib/db/migrations/index.js +6 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v53-worktree-aliases.js +53 -0
- package/dist/server/src/lib/db/migrations/v54-worktree-id-path-derived.js +204 -0
- package/dist/server/src/lib/db/migrations/v55-compact-churned-worktree-ids.js +207 -0
- package/dist/server/src/lib/db/migrations/worktree-id-rename.js +153 -0
- package/dist/server/src/lib/db/worktree-alias-db.js +155 -0
- package/dist/server/src/lib/db/worktree-db.js +53 -71
- package/dist/server/src/lib/detection/cli-patterns.js +86 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +10 -1
- package/dist/server/src/lib/git/worktree-id.js +145 -0
- package/dist/server/src/lib/git/worktree-redirect.js +155 -0
- package/dist/server/src/lib/git/worktrees.js +173 -27
- package/dist/server/src/lib/logger.js +13 -1
- package/dist/server/src/lib/polling/auto-yes-manager.js +3 -1
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +54 -0
- package/dist/server/src/lib/polling/prompt-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-checker.js +53 -13
- package/dist/server/src/lib/polling/response-dedup.js +22 -0
- package/dist/server/src/lib/polling/response-poller-core.js +107 -0
- package/dist/server/src/lib/polling/response-poller.js +4 -1
- package/dist/server/src/lib/response-extractor.js +22 -2
- package/dist/server/src/lib/session/claude-session.js +117 -35
- package/dist/server/src/lib/session/current-output-builder.js +16 -1
- package/dist/server/src/lib/session/session-start-error.js +125 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +603 -0
- package/dist/server/src/lib/skills/install-apply.js +63 -23
- package/dist/server/src/lib/skills/operation-audit.js +5 -6
- package/dist/server/src/lib/skills/startup-reconcile.js +26 -5
- package/dist/server/src/lib/skills/updater.js +830 -0
- package/dist/server/src/lib/tasks/contract-parser.js +17 -1
- package/dist/server/src/lib/tasks/task-state-machine.js +23 -1
- package/dist/server/src/lib/tmux/control-mode-tmux-transport.js +7 -0
- package/dist/server/src/lib/tmux/read-mode.js +22 -2
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +33 -0
- package/dist/server/src/lib/tmux/tmux-control-client.js +12 -0
- package/dist/server/src/lib/tmux/tmux-control-registry.js +55 -11
- package/dist/server/src/lib/tmux/tmux.js +61 -0
- package/dist/server/src/lib/ws-server.js +104 -1
- package/package.json +1 -1
- package/.next/server/chunks/1117.js +0 -1
- package/.next/server/chunks/1356.js +0 -4
- package/.next/server/chunks/1692.js +0 -1
- package/.next/server/chunks/3042.js +0 -1
- package/.next/server/chunks/4018.js +0 -1
- package/.next/server/chunks/4390.js +0 -1
- package/.next/server/chunks/4440.js +0 -2
- package/.next/server/chunks/4548.js +0 -1
- package/.next/server/chunks/5793.js +0 -1
- package/.next/server/chunks/8681.js +0 -1
- package/.next/static/chunks/2751-7fabd91275b14ca3.js +0 -1
- package/.next/static/chunks/744-d5e47fe16e7b9e06.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +0 -1
- package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-6008b904225ebb25.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6e09d25cd3b56f9.js +0 -1
- /package/.next/static/{-E7I667pJDTBamyG8M_Z- → _AR-TSCnEog5nL9JjjCna}/_buildManifest.js +0 -0
- /package/.next/static/{-E7I667pJDTBamyG8M_Z- → _AR-TSCnEog5nL9JjjCna}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Historical worktree IDs and the worktree they now resolve to (Issue #1621,
|
|
4
|
+
* Phase 2; table created by migration v53).
|
|
5
|
+
*
|
|
6
|
+
* A worktree ID leaks out of the database the moment it is minted: into URLs
|
|
7
|
+
* the user bookmarks, into tabs they leave open, into `commandmate send <id>`
|
|
8
|
+
* lines in someone's script. #1644 stops the ID from moving on its own, but IDs
|
|
9
|
+
* written under the old branch-derived scheme still have to be renumbered
|
|
10
|
+
* (#1645), and a directory can still be moved. Recording the old ID is what
|
|
11
|
+
* keeps every one of those references answering instead of 404ing.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately free of any dependency on the request/singleton layer: every
|
|
14
|
+
* function takes the `db` it should act on. The route-boundary wrapper that
|
|
15
|
+
* reaches for the singleton lives in `@/lib/git/git-route-worktree`.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.recordWorktreeAlias = recordWorktreeAlias;
|
|
19
|
+
exports.resolveWorktreeIdWithAlias = resolveWorktreeIdWithAlias;
|
|
20
|
+
exports.getWorktreeAliases = getWorktreeAliases;
|
|
21
|
+
exports.getAllWorktreeAliases = getAllWorktreeAliases;
|
|
22
|
+
exports.getAliasedWorktreeIds = getAliasedWorktreeIds;
|
|
23
|
+
const worktree_id_rename_1 = require("./migrations/worktree-id-rename");
|
|
24
|
+
/**
|
|
25
|
+
* Whether `worktree_aliases` exists in this database.
|
|
26
|
+
*
|
|
27
|
+
* A database opened by `getDbInstance` is always migrated, but tests hand
|
|
28
|
+
* hand-built connections around and the CLI can point at an older file. Callers
|
|
29
|
+
* on the request path must degrade to "no alias" rather than throw, so the
|
|
30
|
+
* lookups below check first.
|
|
31
|
+
*/
|
|
32
|
+
function hasAliasTable(db) {
|
|
33
|
+
const row = db
|
|
34
|
+
.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'worktree_aliases'")
|
|
35
|
+
.get();
|
|
36
|
+
return row !== undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Record that `oldId` used to name the worktree now known as `worktreeId`.
|
|
40
|
+
*
|
|
41
|
+
* Idempotent, and safe to call from inside the rename transaction:
|
|
42
|
+
*
|
|
43
|
+
* - a self-alias (`oldId === worktreeId`) is dropped — it would resolve to
|
|
44
|
+
* itself and shadow nothing useful;
|
|
45
|
+
* - an alias whose `old_id` equals the *destination* is deleted, because that
|
|
46
|
+
* ID is a live worktree again and the live row must win;
|
|
47
|
+
* - re-recording an existing `old_id` re-points it (`ON CONFLICT DO UPDATE`),
|
|
48
|
+
* so an ID renamed A→B→C resolves A→C in one hop rather than a chain.
|
|
49
|
+
*
|
|
50
|
+
* @param db - Database instance (caller supplies the transaction, if any)
|
|
51
|
+
* @param oldId - The ID that is being retired
|
|
52
|
+
* @param worktreeId - The ID it should resolve to from now on
|
|
53
|
+
* @param now - Timestamp in epoch milliseconds
|
|
54
|
+
*/
|
|
55
|
+
function recordWorktreeAlias(db, oldId, worktreeId, now = Date.now()) {
|
|
56
|
+
// The statements live in `migrations/worktree-id-rename.ts`: the rename that
|
|
57
|
+
// records the alias has to be callable from a migration, and a migration that
|
|
58
|
+
// imports a `@/lib/db/*` module inherits every `vi.mock` of it in the suite
|
|
59
|
+
// (Issue #1621, #1645). This function stays the public entry point.
|
|
60
|
+
(0, worktree_id_rename_1.recordWorktreeAliasRow)(db, oldId, worktreeId, now);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve an ID that may be historical to the ID that is current.
|
|
64
|
+
*
|
|
65
|
+
* Live worktrees win over aliases, always. An ID can be both — a worktree
|
|
66
|
+
* created at a directory whose basename matches an ID some other worktree used
|
|
67
|
+
* to have — and in that case the thing that exists now is the answer.
|
|
68
|
+
*
|
|
69
|
+
* @param db - Database instance
|
|
70
|
+
* @param id - A worktree ID as supplied by a URL, a CLI argument, …
|
|
71
|
+
* @returns The current worktree ID, or `null` when nothing resolves
|
|
72
|
+
*/
|
|
73
|
+
function resolveWorktreeIdWithAlias(db, id) {
|
|
74
|
+
if (!id)
|
|
75
|
+
return null;
|
|
76
|
+
const live = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(id);
|
|
77
|
+
if (live)
|
|
78
|
+
return id;
|
|
79
|
+
if (!hasAliasTable(db))
|
|
80
|
+
return null;
|
|
81
|
+
const row = db
|
|
82
|
+
.prepare('SELECT worktree_id FROM worktree_aliases WHERE old_id = ?')
|
|
83
|
+
.get(id);
|
|
84
|
+
if (!row)
|
|
85
|
+
return null;
|
|
86
|
+
// An alias pointing at a worktree that is gone is not a redirect, it is a
|
|
87
|
+
// dangling row (only reachable if foreign keys were off when it was deleted).
|
|
88
|
+
const target = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(row.worktree_id);
|
|
89
|
+
return target ? row.worktree_id : null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Every historical ID recorded for one worktree, newest first.
|
|
93
|
+
*
|
|
94
|
+
* @param db - Database instance
|
|
95
|
+
* @param worktreeId - Current worktree ID
|
|
96
|
+
*/
|
|
97
|
+
function getWorktreeAliases(db, worktreeId) {
|
|
98
|
+
if (!hasAliasTable(db))
|
|
99
|
+
return [];
|
|
100
|
+
const rows = db
|
|
101
|
+
.prepare(`SELECT old_id, worktree_id, created_at
|
|
102
|
+
FROM worktree_aliases
|
|
103
|
+
WHERE worktree_id = ?
|
|
104
|
+
ORDER BY created_at DESC, old_id ASC`)
|
|
105
|
+
.all(worktreeId);
|
|
106
|
+
return rows.map((row) => ({
|
|
107
|
+
oldId: row.old_id,
|
|
108
|
+
worktreeId: row.worktree_id,
|
|
109
|
+
createdAt: row.created_at,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Every alias in the database, oldest first.
|
|
114
|
+
*
|
|
115
|
+
* Feeds the startup session reconciliation (Issue #1621 Phase 3/4): each row is
|
|
116
|
+
* an ID that used to name a worktree, so `mcbd-<cli>-<old_id>` is exactly the
|
|
117
|
+
* tmux session name a still-running agent may be sitting under. Ordering by
|
|
118
|
+
* `created_at` makes the pass deterministic; the rename itself is
|
|
119
|
+
* order-independent because it runs in two stages.
|
|
120
|
+
*
|
|
121
|
+
* Returns `[]` rather than throwing when the table has not been created yet, so
|
|
122
|
+
* a caller on an older database degrades to "nothing to reconcile".
|
|
123
|
+
*
|
|
124
|
+
* @param db - Database instance
|
|
125
|
+
*/
|
|
126
|
+
function getAllWorktreeAliases(db) {
|
|
127
|
+
if (!hasAliasTable(db))
|
|
128
|
+
return [];
|
|
129
|
+
const rows = db
|
|
130
|
+
.prepare(`SELECT old_id, worktree_id, created_at
|
|
131
|
+
FROM worktree_aliases
|
|
132
|
+
ORDER BY created_at ASC, old_id ASC`)
|
|
133
|
+
.all();
|
|
134
|
+
return rows.map((row) => ({
|
|
135
|
+
oldId: row.old_id,
|
|
136
|
+
worktreeId: row.worktree_id,
|
|
137
|
+
createdAt: row.created_at,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Every ID that is currently answerable as an alias.
|
|
142
|
+
*
|
|
143
|
+
* Feeds `deriveWorktreeId`'s taken set: a brand-new worktree must not be minted
|
|
144
|
+
* an ID that an alias already redirects somewhere else, or the redirect would
|
|
145
|
+
* be shadowed and one of the two references would start pointing at the wrong
|
|
146
|
+
* worktree (Issue #1621).
|
|
147
|
+
*
|
|
148
|
+
* @param db - Database instance
|
|
149
|
+
*/
|
|
150
|
+
function getAliasedWorktreeIds(db) {
|
|
151
|
+
if (!hasAliasTable(db))
|
|
152
|
+
return [];
|
|
153
|
+
const rows = db.prepare('SELECT old_id FROM worktree_aliases').all();
|
|
154
|
+
return rows.map((row) => row.old_id);
|
|
155
|
+
}
|
|
@@ -23,12 +23,14 @@ exports.updateVibeLocalContextWindow = updateVibeLocalContextWindow;
|
|
|
23
23
|
exports.saveInitialBranch = saveInitialBranch;
|
|
24
24
|
exports.getInitialBranch = getInitialBranch;
|
|
25
25
|
exports.getWorktreeIdsByRepository = getWorktreeIdsByRepository;
|
|
26
|
+
exports.getAllWorktreeIds = getAllWorktreeIds;
|
|
27
|
+
exports.getAllWorktreePathIds = getAllWorktreePathIds;
|
|
26
28
|
exports.getWorktreesByRepository = getWorktreesByRepository;
|
|
27
29
|
exports.deleteRepositoryWorktrees = deleteRepositoryWorktrees;
|
|
28
30
|
exports.deleteWorktreesByIds = deleteWorktreesByIds;
|
|
29
31
|
const selected_agents_validator_1 = require("../../lib/selected-agents-validator");
|
|
30
32
|
const chat_db_1 = require("./chat-db");
|
|
31
|
-
const
|
|
33
|
+
const worktree_id_rename_1 = require("./migrations/worktree-id-rename");
|
|
32
34
|
/**
|
|
33
35
|
* Get latest user message per CLI tool for multiple worktrees (batch query)
|
|
34
36
|
* Optimized to avoid N+1 query problem
|
|
@@ -269,80 +271,20 @@ function upsertWorktree(db, worktree) {
|
|
|
269
271
|
});
|
|
270
272
|
run();
|
|
271
273
|
}
|
|
272
|
-
/**
|
|
273
|
-
* Delete every child row pointing at any of `worktreeIds`.
|
|
274
|
-
*
|
|
275
|
-
* Deliberately covers *all* deletable child tables, not just the FK-less ones:
|
|
276
|
-
* doing so makes deletion correct even when `PRAGMA foreign_keys` is off, and
|
|
277
|
-
* the extra statements against CASCADE tables remove rows that would have been
|
|
278
|
-
* removed anyway. Append-only ledgers are skipped (see getWriteGuardedTables).
|
|
279
|
-
* Must run before the parent row is deleted (Issue #1621).
|
|
280
|
-
*/
|
|
281
|
-
function deleteWorktreeChildRows(db, worktreeIds, children = (0, worktree_child_tables_1.getWorktreeChildTables)(db)) {
|
|
282
|
-
if (worktreeIds.length === 0)
|
|
283
|
-
return;
|
|
284
|
-
const { noDelete } = (0, worktree_child_tables_1.getWriteGuardedTables)(db);
|
|
285
|
-
const placeholders = worktreeIds.map(() => '?').join(',');
|
|
286
|
-
for (const { table, column } of children) {
|
|
287
|
-
if (noDelete.has(table))
|
|
288
|
-
continue;
|
|
289
|
-
db.prepare(`DELETE FROM "${table}" WHERE "${column}" IN (${placeholders})`).run(...worktreeIds);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
274
|
/**
|
|
293
275
|
* Rename a worktree row's primary key from `oldId` to `newId`, re-pointing every
|
|
294
|
-
* child table's foreign key so no CASCADE deletion occurs
|
|
295
|
-
* same-directory branch switch preserve chat history and all related data
|
|
296
|
-
* instead of destroying it (Issue #1151).
|
|
276
|
+
* child table's foreign key so no CASCADE deletion occurs (Issue #1151, #1621).
|
|
297
277
|
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
*
|
|
278
|
+
* The implementation lives in `migrations/worktree-id-rename.ts` because the
|
|
279
|
+
* Phase 4 renumbering (#1645) needs it from inside a migration, and a migration
|
|
280
|
+
* that imports THIS module inherits every `vi.mock('@/lib/db/worktree-db')` in
|
|
281
|
+
* the suite (measured — see that module's header). This wrapper keeps the
|
|
282
|
+
* public API and its import path unchanged.
|
|
302
283
|
*
|
|
303
|
-
*
|
|
304
|
-
* `skill_operations` aborts any UPDATE (#1234). An immutable audit row records
|
|
305
|
-
* what happened under the identity in force at the time, and rewriting it is
|
|
306
|
-
* precisely what its trigger exists to prevent; attempting it does not fail
|
|
307
|
-
* quietly either, it aborts the enclosing transaction and takes the rename with
|
|
308
|
-
* it (measured). See getWriteGuardedTables.
|
|
309
|
-
*
|
|
310
|
-
* Must be called inside a transaction. `PRAGMA defer_foreign_keys` defers FK
|
|
311
|
-
* enforcement to COMMIT, letting us repoint the parent PK and its children in
|
|
312
|
-
* any order without needing `ON UPDATE CASCADE` on every constraint.
|
|
284
|
+
* Must be called inside a transaction.
|
|
313
285
|
*/
|
|
314
286
|
function migrateWorktreeIdPreservingChildren(db, oldId, newId) {
|
|
315
|
-
|
|
316
|
-
return;
|
|
317
|
-
const oldExists = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(oldId);
|
|
318
|
-
if (!oldExists)
|
|
319
|
-
return;
|
|
320
|
-
// Defer FK checks until COMMIT so the parent PK and child FKs can be updated
|
|
321
|
-
// independently. Resets automatically at the end of the transaction.
|
|
322
|
-
db.pragma('defer_foreign_keys = ON');
|
|
323
|
-
const newExists = db.prepare('SELECT 1 FROM worktrees WHERE id = ?').get(newId);
|
|
324
|
-
const { noUpdate } = (0, worktree_child_tables_1.getWriteGuardedTables)(db);
|
|
325
|
-
const allChildren = (0, worktree_child_tables_1.getWorktreeChildTables)(db);
|
|
326
|
-
const children = allChildren.filter(({ table }) => !noUpdate.has(table));
|
|
327
|
-
if (newExists) {
|
|
328
|
-
// Collision guard. `path` is UNIQUE so two rows for the same directory
|
|
329
|
-
// should never coexist, but if the DB is already inconsistent keep the
|
|
330
|
-
// destination row's data and fold in the source's non-conflicting children.
|
|
331
|
-
for (const { table, column } of children) {
|
|
332
|
-
db.prepare(`UPDATE OR IGNORE "${table}" SET "${column}" = ? WHERE "${column}" = ?`).run(newId, oldId);
|
|
333
|
-
}
|
|
334
|
-
// Conflicting leftovers are dropped explicitly rather than left to CASCADE:
|
|
335
|
-
// tables without a foreign key never cascade, so relying on the parent
|
|
336
|
-
// delete alone would strand their rows on a dead ID (#1621).
|
|
337
|
-
deleteWorktreeChildRows(db, [oldId], allChildren);
|
|
338
|
-
db.prepare('DELETE FROM worktrees WHERE id = ?').run(oldId);
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
|
-
// Normal rename: move the parent PK, then repoint all child rows.
|
|
342
|
-
db.prepare('UPDATE worktrees SET id = ? WHERE id = ?').run(newId, oldId);
|
|
343
|
-
for (const { table, column } of children) {
|
|
344
|
-
db.prepare(`UPDATE "${table}" SET "${column}" = ? WHERE "${column}" = ?`).run(newId, oldId);
|
|
345
|
-
}
|
|
287
|
+
(0, worktree_id_rename_1.renameWorktreeIdPreservingChildren)(db, oldId, newId);
|
|
346
288
|
}
|
|
347
289
|
/**
|
|
348
290
|
* Update worktree description
|
|
@@ -516,6 +458,46 @@ function getWorktreeIdsByRepository(db, repositoryPath) {
|
|
|
516
458
|
const rows = stmt.all(repositoryPath);
|
|
517
459
|
return rows.map(r => r.id);
|
|
518
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* Every worktree ID currently stored, across all repositories.
|
|
463
|
+
*
|
|
464
|
+
* Issue #1621: `deriveWorktreeId` mints an ID from a directory's basename, and
|
|
465
|
+
* two repositories can easily hold same-named directories (`.../a/main`,
|
|
466
|
+
* `.../b/main`). The ID is the global primary key of `worktrees`, so the
|
|
467
|
+
* "already taken" set the derivation consults has to be global too;
|
|
468
|
+
* {@link getWorktreeIdsByRepository} would silently allow a cross-repository
|
|
469
|
+
* collision, which then surfaces as a UNIQUE(path) failure on upsert.
|
|
470
|
+
*
|
|
471
|
+
* @param db - Database instance
|
|
472
|
+
* @returns Every `worktrees.id` value
|
|
473
|
+
*/
|
|
474
|
+
function getAllWorktreeIds(db) {
|
|
475
|
+
const rows = db.prepare('SELECT id FROM worktrees').all();
|
|
476
|
+
return rows.map(row => row.id);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Every worktree row's `(id, path)` pair, across all repositories.
|
|
480
|
+
*
|
|
481
|
+
* The global counterpart of {@link getWorktreesByRepository}, and the difference
|
|
482
|
+
* matters (Issue #1658): `path` is the identity of a worktree — the column is
|
|
483
|
+
* `NOT NULL UNIQUE` — whereas `repository_path` merely records which scan root
|
|
484
|
+
* last upserted the row. When the *same* git repository is registered under two
|
|
485
|
+
* scan roots (a repo and one of its own linked worktrees, both in
|
|
486
|
+
* `WORKTREE_REPOS`), `git worktree list` returns the identical path set from
|
|
487
|
+
* either one, and `repository_path` ping-pongs between them on every sync.
|
|
488
|
+
* Looking an existing ID up per repository then misses the row half the time and
|
|
489
|
+
* re-derives its ID, which appends another 8 hex digits — forever.
|
|
490
|
+
*
|
|
491
|
+
* Resolving "which ID does this path already own?" must therefore be global.
|
|
492
|
+
* Pruning stays per-repository ({@link getWorktreesByRepository}): that question
|
|
493
|
+
* really is scoped to one scan root.
|
|
494
|
+
*
|
|
495
|
+
* @param db - Database instance
|
|
496
|
+
* @returns `{ id, path }` for every worktree row
|
|
497
|
+
*/
|
|
498
|
+
function getAllWorktreePathIds(db) {
|
|
499
|
+
return db.prepare('SELECT id, path FROM worktrees').all();
|
|
500
|
+
}
|
|
519
501
|
/**
|
|
520
502
|
* Get all worktree rows (id + path) for a given repository path.
|
|
521
503
|
*
|
|
@@ -553,7 +535,7 @@ function deleteRepositoryWorktrees(db, repositoryPath) {
|
|
|
553
535
|
.all(repositoryPath)
|
|
554
536
|
.map((row) => row.id)
|
|
555
537
|
.filter((id) => id !== null);
|
|
556
|
-
deleteWorktreeChildRows(db, ids);
|
|
538
|
+
(0, worktree_id_rename_1.deleteWorktreeChildRows)(db, ids);
|
|
557
539
|
return db
|
|
558
540
|
.prepare('DELETE FROM worktrees WHERE repository_path = ?')
|
|
559
541
|
.run(repositoryPath).changes;
|
|
@@ -578,7 +560,7 @@ function deleteWorktreesByIds(db, worktreeIds) {
|
|
|
578
560
|
}
|
|
579
561
|
const placeholders = worktreeIds.map(() => '?').join(',');
|
|
580
562
|
const run = db.transaction(() => {
|
|
581
|
-
deleteWorktreeChildRows(db, worktreeIds);
|
|
563
|
+
(0, worktree_id_rename_1.deleteWorktreeChildRows)(db, worktreeIds);
|
|
582
564
|
return db
|
|
583
565
|
.prepare(`DELETE FROM worktrees WHERE id IN (${placeholders})`)
|
|
584
566
|
.run(...worktreeIds).changes;
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Shared between response-poller.ts and API routes
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
7
|
+
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
8
|
+
exports.isCodexTurnActive = isCodexTurnActive;
|
|
8
9
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
9
10
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
10
11
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
@@ -14,6 +15,7 @@ exports.stripBoxDrawing = stripBoxDrawing;
|
|
|
14
15
|
exports.buildDetectPromptOptions = buildDetectPromptOptions;
|
|
15
16
|
const logger_1 = require("../../lib/logger");
|
|
16
17
|
const ansi_1 = require("./ansi");
|
|
18
|
+
const thinking_constants_1 = require("../../config/thinking-constants");
|
|
17
19
|
const logger = (0, logger_1.createLogger)('cli-patterns');
|
|
18
20
|
/**
|
|
19
21
|
* Claude CLI spinner characters (expanded set)
|
|
@@ -56,11 +58,93 @@ exports.CLAUDE_THINKING_PATTERN = new RegExp(`[${exports.CLAUDE_SPINNER_CHARS.jo
|
|
|
56
58
|
*/
|
|
57
59
|
exports.CLAUDE_INTERRUPT_HINT_PATTERN = /esc to interrupt/;
|
|
58
60
|
/**
|
|
59
|
-
* Codex
|
|
61
|
+
* Codex activity-marker pattern
|
|
60
62
|
* Matches activity indicators like "• Planning", "• Searching", etc.
|
|
61
63
|
* T1.1: Extended to include "Ran" and "Deciding"
|
|
64
|
+
*
|
|
65
|
+
* Issue #1671: these are *transcript records*, not a liveness signal. Codex is
|
|
66
|
+
* inline-rendered (no alternate screen), so every "• Ran <cmd>" / "• Running
|
|
67
|
+
* <cmd>" step it ever printed stays in the pane scrollback forever — measured on
|
|
68
|
+
* a live `mcbd-codex-*` pane: 396 "• Ran" and 11 "• Running" rows, all of them
|
|
69
|
+
* from finished steps. Matching this pattern against a fixed tail window
|
|
70
|
+
* therefore answers "did a step happen recently", not "is Codex working now".
|
|
71
|
+
* Use {@link isCodexTurnActive} for the latter.
|
|
62
72
|
*/
|
|
63
73
|
exports.CODEX_THINKING_PATTERN = /•\s*(Planning|Searching|Exploring|Running|Thinking|Working|Reading|Writing|Analyzing|Ran|Deciding)/m;
|
|
74
|
+
/**
|
|
75
|
+
* Codex live status-line hint (Issue #1671)
|
|
76
|
+
*
|
|
77
|
+
* While a turn is in flight Codex pins a status row directly above the composer:
|
|
78
|
+
*
|
|
79
|
+
* • Working (13s • esc to interrupt) · 1 background terminal running · /ps to view
|
|
80
|
+
*
|
|
81
|
+
* It is repainted in place every tick and erased the moment the turn ends, so —
|
|
82
|
+
* unlike the "• Ran"/"• Running" step records — it never lingers in scrollback.
|
|
83
|
+
* Measured on a 11,000-line capture of an idle Codex pane: zero occurrences of
|
|
84
|
+
* "esc to interrupt", against 396 lingering "• Ran" rows. That makes it the one
|
|
85
|
+
* unambiguous "Codex is still generating" token, mirroring Claude's
|
|
86
|
+
* {@link CLAUDE_INTERRUPT_HINT_PATTERN}.
|
|
87
|
+
*/
|
|
88
|
+
exports.CODEX_INTERRUPT_HINT_PATTERN = /esc to interrupt/;
|
|
89
|
+
/**
|
|
90
|
+
* How far above the last content row Codex's composer ("› …") may sit.
|
|
91
|
+
*
|
|
92
|
+
* Codex pins the composer and the status bar to the bottom of the pane, so the
|
|
93
|
+
* composer lands 2-3 rows above the last non-blank row in every observed frame.
|
|
94
|
+
* The small allowance keeps the search from walking up into the transcript and
|
|
95
|
+
* latching onto the echoed user message, which uses the same "› " marker.
|
|
96
|
+
*/
|
|
97
|
+
const CODEX_COMPOSER_SEARCH_ROWS = 8;
|
|
98
|
+
/**
|
|
99
|
+
* Decide whether a Codex turn is still in flight (Issue #1671).
|
|
100
|
+
*
|
|
101
|
+
* Completion detection used to answer this with {@link CODEX_THINKING_PATTERN}
|
|
102
|
+
* over a fixed 20-row tail. Because "• Ran <cmd>" is a *past-tense record* that
|
|
103
|
+
* never leaves the transcript, a turn that ended with a short final message kept
|
|
104
|
+
* that record inside the tail window and was reported as "still thinking"
|
|
105
|
+
* forever — so its reply was never saved, while a turn whose final message
|
|
106
|
+
* happened to be longer than 20 rows pushed the record out of the window and was
|
|
107
|
+
* saved. Whether a reply reached Message History depended on how long it was.
|
|
108
|
+
*
|
|
109
|
+
* Two signals, both measured against live codex-cli 0.146.0 captures:
|
|
110
|
+
*
|
|
111
|
+
* 1. The live status line ({@link CODEX_INTERRUPT_HINT_PATTERN}) anywhere in the
|
|
112
|
+
* tail window. Present in every generating frame from 1s onwards, absent from
|
|
113
|
+
* every idle frame.
|
|
114
|
+
* 2. An activity marker in the rows immediately above the composer — the band
|
|
115
|
+
* Codex reserves for that status line. Version-agnostic backstop for a Codex
|
|
116
|
+
* build whose status row drops the "esc to interrupt" wording; deliberately
|
|
117
|
+
* narrow (THINKING_TAIL_LINE_COUNT rows, matching the window status-detector
|
|
118
|
+
* already uses) so records further up the transcript cannot reach it.
|
|
119
|
+
*
|
|
120
|
+
* When no composer can be located the frame is not a normal Codex layout (an
|
|
121
|
+
* overlay is up, or the pane is mid-redraw), so signal 2 falls back to the whole
|
|
122
|
+
* tail window — the pre-#1671 behaviour, which errs towards "still active".
|
|
123
|
+
*
|
|
124
|
+
* @param lines - Captured pane lines with trailing blank rows already trimmed
|
|
125
|
+
* @param tailLineCount - Size of the tail window completion detection looks at
|
|
126
|
+
* @returns True while Codex is still generating
|
|
127
|
+
*/
|
|
128
|
+
function isCodexTurnActive(lines, tailLineCount) {
|
|
129
|
+
const tailWindow = (0, ansi_1.stripAnsi)(lines.slice(Math.max(0, lines.length - tailLineCount)).join('\n'));
|
|
130
|
+
// 1. Live status line — unambiguous, never survives the end of a turn.
|
|
131
|
+
if (exports.CODEX_INTERRUPT_HINT_PATTERN.test(tailWindow))
|
|
132
|
+
return true;
|
|
133
|
+
// 2. Activity marker in the status-line band directly above the composer.
|
|
134
|
+
// Searched bottom-up so the composer wins over the echoed user message.
|
|
135
|
+
let composerIndex = -1;
|
|
136
|
+
for (let i = lines.length - 1; i >= Math.max(0, lines.length - CODEX_COMPOSER_SEARCH_ROWS); i--) {
|
|
137
|
+
if (exports.CODEX_PROMPT_PATTERN.test((0, ansi_1.stripAnsi)(lines[i]))) {
|
|
138
|
+
composerIndex = i;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (composerIndex < 0)
|
|
143
|
+
return exports.CODEX_THINKING_PATTERN.test(tailWindow);
|
|
144
|
+
const bandStart = Math.max(0, composerIndex - thinking_constants_1.THINKING_TAIL_LINE_COUNT + 1);
|
|
145
|
+
const band = (0, ansi_1.stripAnsi)(lines.slice(bandStart, composerIndex + 1).join('\n'));
|
|
146
|
+
return exports.CODEX_THINKING_PATTERN.test(band);
|
|
147
|
+
}
|
|
64
148
|
/**
|
|
65
149
|
* Claude prompt pattern (waiting for input)
|
|
66
150
|
* Supports both legacy '>' and new '❯' (U+276F) prompt characters
|
|
@@ -783,7 +783,16 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
|
|
|
783
783
|
// Layer 5 [SEC-001]: Enhanced question line validation for requireDefaultIndicator=false.
|
|
784
784
|
// When requireDefault is false, apply stricter validation to prevent false positives
|
|
785
785
|
// from normal numbered lists (e.g., "Recommendations:\n1. Add tests\n2. Update docs").
|
|
786
|
-
|
|
786
|
+
//
|
|
787
|
+
// [Issue #1676] Frames where a ❯/●/› default indicator was actually collected are
|
|
788
|
+
// exempt from Layer 5: the cursor existence check (Layer 2 semantics) is the same
|
|
789
|
+
// false-positive defense that requireDefaultIndicator=true tools (codex/gemini)
|
|
790
|
+
// rely on without any question-line validation. This lets declarative permission
|
|
791
|
+
// dialogs with no question line ("Claude in Chrome wants to run JavaScript on …"
|
|
792
|
+
// + ❯ 1. Allow / 2. … / 3. Deny) and imperative AskUserQuestion headers
|
|
793
|
+
// (「実装方針を選んでください」) be detected. Indicator-less frames (#193 capture
|
|
794
|
+
// artifacts) still go through SEC-001a/b unchanged.
|
|
795
|
+
if (!requireDefault && !hasDefaultIndicator) {
|
|
787
796
|
// SEC-001a: No question line found (questionEndIndex === -1) - reject.
|
|
788
797
|
// Prevents generic question fallback from triggering Auto-Yes
|
|
789
798
|
// on plain numbered lists that happen to be consecutive from 1.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Minting a worktree ID from its directory — the pure half of Issue #1621.
|
|
4
|
+
*
|
|
5
|
+
* Split out of `worktrees.ts` for one reason: a **migration** has to mint IDs
|
|
6
|
+
* (the Phase 4 renumbering in #1645), and `worktrees.ts` imports `@/lib/db`,
|
|
7
|
+
* which re-exports `db-migrations` — importing it from a migration closes a
|
|
8
|
+
* cycle. It also drags every `vi.mock('@/lib/git/worktrees')` in the suite into
|
|
9
|
+
* `runMigrations`, which is exactly how v52 was made to throw before it was
|
|
10
|
+
* moved (see `migrations/worktree-child-tables.ts`).
|
|
11
|
+
*
|
|
12
|
+
* This module imports nothing but `crypto` and `path`, so it is safe from both
|
|
13
|
+
* directions.
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.FALLBACK_ID_BASE = void 0;
|
|
20
|
+
exports.sanitizeIdSegment = sanitizeIdSegment;
|
|
21
|
+
exports.deriveWorktreeId = deriveWorktreeId;
|
|
22
|
+
exports.isDerivedWorktreeId = isDerivedWorktreeId;
|
|
23
|
+
const crypto_1 = require("crypto");
|
|
24
|
+
const path_1 = __importDefault(require("path"));
|
|
25
|
+
/**
|
|
26
|
+
* Lower-case, URL- and shell-safe slug of one identifier segment.
|
|
27
|
+
*
|
|
28
|
+
* Kept byte-identical to the rule the branch-derived `generateWorktreeId` has
|
|
29
|
+
* always used so the path-derived scheme produces IDs from the same alphabet:
|
|
30
|
+
* lower-case, `[^a-z0-9-]` collapsed to `-`, runs of `-` compressed, edges
|
|
31
|
+
* trimmed. The result always satisfies `isValidWorktreeId`.
|
|
32
|
+
*/
|
|
33
|
+
function sanitizeIdSegment(str) {
|
|
34
|
+
return str
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^a-z0-9-]/g, '-') // Replace non-alphanumeric (except hyphen) with hyphen
|
|
37
|
+
.replace(/-+/g, '-') // Replace consecutive hyphens with single hyphen
|
|
38
|
+
.replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Base used when a directory name sanitizes to the empty string (`/`, `///`,
|
|
42
|
+
* a name made entirely of separators…). Without it the ID would be `''`, which
|
|
43
|
+
* `isValidWorktreeId` rejects and SQLite would happily store.
|
|
44
|
+
*/
|
|
45
|
+
exports.FALLBACK_ID_BASE = 'worktree';
|
|
46
|
+
/**
|
|
47
|
+
* Mint the ID for a worktree that has never been registered before.
|
|
48
|
+
*
|
|
49
|
+
* The ID is a function of the **directory**, never of the branch, and — this is
|
|
50
|
+
* the part that actually buys stability — it is computed **once**, at first
|
|
51
|
+
* registration. `syncWorktreesToDB` looks an existing row up by path and keeps
|
|
52
|
+
* whatever ID that row already carries, so this function is only reached for a
|
|
53
|
+
* genuinely new path. A worktree's ID therefore survives every branch switch,
|
|
54
|
+
* every detached-HEAD commit, and any future change to the rule below.
|
|
55
|
+
*
|
|
56
|
+
* Rule (Issue #1621):
|
|
57
|
+
*
|
|
58
|
+
* id = sanitize(basename(resolvedPath))
|
|
59
|
+
* on collision only: `${id}-${sha256(resolvedPath).slice(0, 8)}`
|
|
60
|
+
*
|
|
61
|
+
* `takenIds` must contain every ID that is already spoken for — worktree rows
|
|
62
|
+
* across *all* repositories (the ID is a global primary key, not a per-repo one)
|
|
63
|
+
* plus historical IDs still resolvable as aliases, so a fresh worktree can never
|
|
64
|
+
* shadow an old ID that redirects somewhere else.
|
|
65
|
+
*
|
|
66
|
+
* Deterministic: same `(resolvedPath, takenIds)` always yields the same ID.
|
|
67
|
+
*
|
|
68
|
+
* @param resolvedPath - Absolute, `path.resolve()`d worktree directory
|
|
69
|
+
* @param takenIds - IDs that are unavailable
|
|
70
|
+
* @returns A URL-safe ID satisfying `isValidWorktreeId`
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* deriveWorktreeId('/repos/commandmate-issue-1644', []) // => 'commandmate-issue-1644'
|
|
75
|
+
* deriveWorktreeId('/b/main', ['main']) // => 'main-3f2a91cc'
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
function deriveWorktreeId(resolvedPath, takenIds = []) {
|
|
79
|
+
const taken = takenIds instanceof Set ? takenIds : new Set(takenIds);
|
|
80
|
+
const base = sanitizeIdSegment(path_1.default.basename(resolvedPath)) || exports.FALLBACK_ID_BASE;
|
|
81
|
+
if (!taken.has(base)) {
|
|
82
|
+
return base;
|
|
83
|
+
}
|
|
84
|
+
// Collision. Disambiguate with a digest of the path itself (not a counter):
|
|
85
|
+
// the result stays a pure function of the directory, so re-deriving the same
|
|
86
|
+
// path against the same set never produces a second, different ID.
|
|
87
|
+
const digest = (0, crypto_1.createHash)('sha256').update(resolvedPath).digest('hex');
|
|
88
|
+
for (let length = 8; length <= digest.length; length += 8) {
|
|
89
|
+
const candidate = `${base}-${digest.slice(0, length)}`;
|
|
90
|
+
if (!taken.has(candidate)) {
|
|
91
|
+
return candidate;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Unreachable short of a full SHA-256 collision on two different paths with
|
|
95
|
+
// the same basename; kept so the function is total rather than returning a
|
|
96
|
+
// duplicate ID and violating the worktrees PK.
|
|
97
|
+
for (let ordinal = 2;; ordinal++) {
|
|
98
|
+
const candidate = `${base}-${digest}-${ordinal}`;
|
|
99
|
+
if (!taken.has(candidate)) {
|
|
100
|
+
return candidate;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Whether `id` is one that {@link deriveWorktreeId} could have minted for
|
|
106
|
+
* `resolvedPath` — i.e. the basename, or the basename followed by a prefix of
|
|
107
|
+
* the path's SHA-256 in 8-hex steps.
|
|
108
|
+
*
|
|
109
|
+
* The inverse of the derivation, and it exists to tell two kinds of retired ID
|
|
110
|
+
* apart (Issue #1658). When the same directory was re-derived over and over, it
|
|
111
|
+
* left a ladder of aliases — `foo`, `foo-2f4530fe`, `foo-2f4530fe1cf1f9f8`, … —
|
|
112
|
+
* every rung pointing at the same worktree, none of them ever handed out for
|
|
113
|
+
* longer than the second it took the next sync to replace it. Those are safe to
|
|
114
|
+
* discard, and must be, because the minter treats an alias as taken and the
|
|
115
|
+
* ladder would otherwise reserve those IDs forever. An ID like
|
|
116
|
+
* `commandagent-develop-develop` — a genuine former name, from the
|
|
117
|
+
* branch-derived scheme — is not of this shape and is kept.
|
|
118
|
+
*
|
|
119
|
+
* Note this is a statement about *shape*, not about history: an ID that happens
|
|
120
|
+
* to match is one this path would produce today.
|
|
121
|
+
*
|
|
122
|
+
* @param id - Candidate ID
|
|
123
|
+
* @param resolvedPath - Absolute, `path.resolve()`d worktree directory
|
|
124
|
+
*/
|
|
125
|
+
function isDerivedWorktreeId(id, resolvedPath) {
|
|
126
|
+
if (!id)
|
|
127
|
+
return false;
|
|
128
|
+
const base = sanitizeIdSegment(path_1.default.basename(resolvedPath)) || exports.FALLBACK_ID_BASE;
|
|
129
|
+
if (id === base)
|
|
130
|
+
return true;
|
|
131
|
+
if (!id.startsWith(`${base}-`))
|
|
132
|
+
return false;
|
|
133
|
+
const suffix = id.slice(base.length + 1);
|
|
134
|
+
const digest = (0, crypto_1.createHash)('sha256').update(resolvedPath).digest('hex');
|
|
135
|
+
// The collision ladder: 8 hex digits at a time, always a prefix of the digest.
|
|
136
|
+
if (suffix.length > 0 &&
|
|
137
|
+
suffix.length % 8 === 0 &&
|
|
138
|
+
suffix.length <= digest.length &&
|
|
139
|
+
digest.startsWith(suffix)) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
// The exhausted-digest tail (`<digest>-<ordinal>`), unreachable short of a
|
|
143
|
+
// SHA-256 collision but part of the function's range all the same.
|
|
144
|
+
return /^-[0-9]+$/.test(suffix.slice(digest.length)) && suffix.startsWith(digest);
|
|
145
|
+
}
|