commandmate 0.29.0 → 0.29.2
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 +444 -400
- package/.next/app-path-routes-manifest.json +31 -25
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +17 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +2 -0
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agents/versions/route.js +1 -0
- package/.next/server/app/api/agents/versions/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/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 +1 -7
- 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 +1 -7
- 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 +2 -2
- 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/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +7 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/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 +7 -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/remote/pair/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/settings/default-agents/route.js +1 -0
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidebar/group-order/route.js +1 -7
- 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 +2 -2
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
- 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 +1 -1
- 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]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/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 -2
- 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]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/env/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]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/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 +3 -3
- 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]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/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]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -7
- 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 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- 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 +1 -1
- 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/config/route.js +2 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- 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]/cancel/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -0
- 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/apply-default-agents/route.js +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page.js.nft.json +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.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 +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/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.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +2 -2
- package/.next/server/app/skills/page.js.nft.json +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 +12 -12
- 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 +31 -25
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1341.js +1 -0
- package/.next/server/chunks/1501.js +5 -0
- package/.next/server/chunks/1886.js +3 -4
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2198.js +1 -0
- package/.next/server/chunks/221.js +7 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2759.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3558.js +1 -1
- package/.next/server/chunks/3707.js +15 -0
- package/.next/server/chunks/3722.js +25 -1
- package/.next/server/chunks/3869.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4390.js +1 -0
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/7366.js +5 -0
- package/.next/server/chunks/7824.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8118.js +1 -0
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/880.js +3 -3
- package/.next/server/chunks/8800.js +3 -0
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9508.js +1 -1
- package/.next/server/chunks/9627.js +30 -24
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/0YoRrahue4Vchxg1z83IQ/_buildManifest.js +1 -0
- package/.next/static/chunks/1379-af7af9e08f47c979.js +1 -0
- package/.next/static/chunks/{2053-c0e931eb4391baa1.js → 2053-3f299a7a2c7d6767.js} +1 -1
- package/.next/static/chunks/3922.9c1ec01fff819c88.js +1 -0
- package/.next/static/chunks/{3968-8d8ca15657748bfb.js → 4882-388e94fe0a03c2ba.js} +1 -1
- package/.next/static/chunks/5229-b2a81bb8fb5c19e9.js +1 -0
- package/.next/static/chunks/6381-9ba5198c0a6ff197.js +1 -0
- package/.next/static/chunks/8019-f8e73c1fb5f6f0d3.js +1 -0
- package/.next/static/chunks/{1188-8567ee5ecfef02ee.js → 8593-fa0eb2802e0ce68a.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/skills/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/templates/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/todos/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/chat/{page-231df45127e876c2.js → page-9aa2011410895b0d.js} +1 -1
- package/.next/static/chunks/app/login/{page-03659dded846ef1d.js → page-af7241bb4c4a8e59.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/more/page-75d3783da0d49a25.js +1 -0
- package/.next/static/chunks/app/{page-0305431f43195431.js → page-214f7ffa13a0cf10.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/repositories/{page-ae8fa55749976f79.js → page-4951cac905e50224.js} +1 -1
- package/.next/static/chunks/app/review/page-a0899b2d285318c3.js +1 -0
- package/.next/static/chunks/app/sessions/page-fb36145ec732092a.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-aaf0bcb1dfb558b9.js → page-9099e26b60442873.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-dafc486410e839b7.js → page-182e32368696d824.js} +1 -1
- package/.next/static/chunks/app/skills/{page-9e3c91da31514893.js → page-d3fdc88239ebe0ab.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-90f96977c741bbf8.js → page-f3361237420719b4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-1c30fb8d4d6fa6ef.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-ce6279d581d1df95.js +1 -0
- package/.next/static/chunks/{webpack-7e79064bfce988d7.js → webpack-9f75198882fdaf08.js} +1 -1
- package/.next/static/css/b326c8a734e1928e.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/agents/update/route.ts +347 -0
- package/.next/types/app/api/agents/versions/route.ts +347 -0
- package/.next/types/app/api/settings/default-agents/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/config/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.ts +347 -0
- package/.next/types/app/api/worktrees/apply-default-agents/route.ts +347 -0
- package/.next/types/routes.d.ts +7 -1
- package/.next/types/validator.ts +54 -0
- package/dist/cli/commands/agents.d.ts +35 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +212 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +18 -0
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +111 -0
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +11 -0
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +30 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +58 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +8 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/preflight.d.ts.map +1 -1
- package/dist/cli/utils/preflight.js +6 -0
- package/dist/config/system-directories.d.ts +101 -0
- package/dist/config/system-directories.d.ts.map +1 -0
- package/dist/config/system-directories.js +211 -0
- package/dist/lib/cli-tools/types.d.ts +15 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +92 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -0
- package/dist/lib/detection/status-reason.js +94 -0
- package/dist/lib/updates/agent-updater.d.ts +247 -0
- package/dist/lib/updates/agent-updater.d.ts.map +1 -0
- package/dist/lib/updates/agent-updater.js +373 -0
- package/dist/lib/updates/agent-versions.d.ts +77 -0
- package/dist/lib/updates/agent-versions.d.ts.map +1 -0
- package/dist/lib/updates/agent-versions.js +138 -0
- package/dist/lib/updates/codex-version.d.ts +184 -0
- package/dist/lib/updates/codex-version.d.ts.map +1 -0
- package/dist/lib/updates/codex-version.js +215 -0
- package/dist/lib/verification/verify-config.d.ts +202 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -0
- package/dist/lib/verification/verify-config.js +429 -0
- package/dist/lib/verification/verify-draft.d.ts +182 -0
- package/dist/lib/verification/verify-draft.d.ts.map +1 -0
- package/dist/lib/verification/verify-draft.js +570 -0
- package/dist/server/src/cli/types/api-responses.js +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +15 -1
- package/dist/server/src/config/codex-update-dialog-config.js +154 -0
- package/dist/server/src/config/default-agents.js +138 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +36 -12
- package/dist/server/src/lib/cli-tools/base.js +131 -0
- package/dist/server/src/lib/cli-tools/codex.js +350 -100
- package/dist/server/src/lib/cli-tools/copilot.js +34 -10
- package/dist/server/src/lib/cli-tools/gemini.js +34 -10
- package/dist/server/src/lib/cli-tools/liveness-spec.js +214 -0
- package/dist/server/src/lib/cli-tools/opencode.js +72 -19
- package/dist/server/src/lib/cli-tools/session-liveness.js +64 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +30 -10
- package/dist/server/src/lib/db/app-settings-db.js +142 -0
- package/dist/server/src/lib/db/worktree-db.js +178 -3
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +233 -0
- package/dist/server/src/lib/detection/version-probes.js +290 -0
- package/dist/server/src/lib/git/worktrees.js +10 -0
- package/dist/server/src/lib/repo-config/agents-config.js +298 -0
- package/dist/server/src/lib/selected-agents-validator.js +93 -23
- package/dist/server/src/lib/session/claude-session.js +39 -108
- package/dist/server/src/lib/tmux/tmux.js +29 -0
- package/dist/server/src/lib/updates/agent-updater.js +373 -0
- package/dist/server/src/lib/updates/agent-versions.js +138 -0
- package/dist/server/src/lib/updates/codex-version.js +215 -0
- package/dist/server/src/lib/updates/index.js +42 -0
- package/dist/server/src/lib/verification/gate-runner.js +298 -37
- package/dist/server/src/lib/verification/machine-lock.js +11 -0
- package/dist/server/src/lib/verification/run-verdict-vocabulary.js +151 -0
- package/dist/server/src/lib/verification/verify-config.js +33 -0
- package/dist/server/src/types/sidebar.js +40 -9
- package/dist/types/cli-tool-contracts.d.ts +119 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/package.json +1 -1
- package/.next/server/chunks/1601.js +0 -7
- package/.next/server/chunks/222.js +0 -1
- package/.next/server/chunks/2366.js +0 -1
- package/.next/server/chunks/4689.js +0 -25
- package/.next/server/chunks/5089.js +0 -1
- package/.next/server/chunks/6274.js +0 -14
- package/.next/server/chunks/9067.js +0 -1
- package/.next/server/chunks/9373.js +0 -9
- package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +0 -1
- package/.next/static/chunks/3922.0d2e64daf9f187da.js +0 -1
- package/.next/static/chunks/5229-580b581fce5aeb52.js +0 -1
- package/.next/static/chunks/6381-c8d93ec301dbc380.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +0 -1
- package/.next/static/chunks/app/sessions/page-4d5382b257077c14.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-c07b23b6ca58091c.js +0 -1
- package/.next/static/css/b6990f889f4f9515.css +0 -1
- package/.next/static/uulKcSOgyxChTo4SipUSF/_buildManifest.js +0 -1
- /package/.next/static/{uulKcSOgyxChTo4SipUSF → 0YoRrahue4Vchxg1z83IQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `DETECTOR_VERSION_PROBES` — are the detector's rules still describing the CLI
|
|
4
|
+
* that is installed? (Issue #1929, 方針書 §4 D2 / §7 / §10.11 / §13.2 S17)
|
|
5
|
+
*
|
|
6
|
+
* Every rule in `src/lib/detection/tools/` was read off a capture of one build
|
|
7
|
+
* of one CLI. `tools/verified-against.ts` records which build. This module reads
|
|
8
|
+
* the other half of the comparison — the version that is installed right now —
|
|
9
|
+
* so `capture --json` and `commandmate status` can say "these rules were
|
|
10
|
+
* measured against copilot 1.0.80 and you are running 1.2.0" instead of leaving
|
|
11
|
+
* a reader to guess whether a misdetection is a bug or a version skew.
|
|
12
|
+
*
|
|
13
|
+
* ## The cost rules, and why they are not optional
|
|
14
|
+
*
|
|
15
|
+
* `capture --json` and `GET /current-output` are the **5-second polling path** —
|
|
16
|
+
* the monitor skills run them with no iteration cap. A probe table that spawns
|
|
17
|
+
* six children cannot sit on that path, so (DR3-013):
|
|
18
|
+
*
|
|
19
|
+
* - probes run **once per process**, concurrent first callers share the same
|
|
20
|
+
* in-flight promise, and the result is cached;
|
|
21
|
+
* - {@link getDetectorStalenessSnapshot} **never awaits a child process**. It
|
|
22
|
+
* answers from the cache or answers `undefined` and starts the probe in the
|
|
23
|
+
* background. `undefined` means "not known yet", never "nothing is stale":
|
|
24
|
+
* the hint is additive, so a poll that lands cold simply shows nothing and
|
|
25
|
+
* the next one shows the banner;
|
|
26
|
+
* - {@link getDetectorFreshness} is the awaiting form, for the two callers that
|
|
27
|
+
* genuinely want the answer (`commandmate status`, `check:detector-freshness`)
|
|
28
|
+
* and are operator-initiated one-offs.
|
|
29
|
+
*
|
|
30
|
+
* ## The execution rules (DR4-010 / §10.11)
|
|
31
|
+
*
|
|
32
|
+
* `PATH` is untrusted input: the server's `PATH` comes from the shell that
|
|
33
|
+
* started it, and a repo-local `node_modules/.bin` on it would let opening a
|
|
34
|
+
* worktree decide which binary a cold probe runs. So every `execFile` probe
|
|
35
|
+
* resolves its command to an **absolute path** through
|
|
36
|
+
* {@link findExecutableOnPath} first and **skips entirely** — spawning nothing —
|
|
37
|
+
* when that resolves to nothing; children run with `sanitizeEnvForChildProcess()`
|
|
38
|
+
* so no probe ever sees CommandMate's auth token or DB path; and both `timeout`
|
|
39
|
+
* and `maxBuffer` are explicit.
|
|
40
|
+
*
|
|
41
|
+
* ## copilot is delegated, and must stay delegated (S17)
|
|
42
|
+
*
|
|
43
|
+
* The design policy's first draft probed `gh copilot -- --version`. It cannot be
|
|
44
|
+
* used: `copilot` is not a gh extension but a preview command built into gh
|
|
45
|
+
* 2.86.0, and gh's own help says that when `PATH` has no copilot it
|
|
46
|
+
* **downloads** the CLI into `~/.local/share/gh/copilot`. A version hint that
|
|
47
|
+
* installs software is not a version hint. #1907 measured this and built
|
|
48
|
+
* {@link resolveCopilotExecutable}; #1913 wired it into the catalog's
|
|
49
|
+
* `VERSION_PROBES` as `kind: 'delegated'`; this table reuses the same shape.
|
|
50
|
+
*
|
|
51
|
+
* Delegating is not an exception to DR4-010 (1) — it satisfies it more strongly
|
|
52
|
+
* than an `execFile` row could, because `CopilotTool.isInstalled()` and
|
|
53
|
+
* `startSession()` decide what to launch from **the same function's same return
|
|
54
|
+
* value**, so probe and launch cannot disagree.
|
|
55
|
+
*
|
|
56
|
+
* ## What "probes must not modify the environment" can actually mean (measured)
|
|
57
|
+
*
|
|
58
|
+
* DR4-010 (5) says a probe must not change the environment ("installation,
|
|
59
|
+
* download, or config-file generation"). Measured on 2026-08-23 (macOS
|
|
60
|
+
* darwin 25.6.0) by running each `--version` under a **disposable** `HOME` /
|
|
61
|
+
* `XDG_DATA_HOME` / `XDG_CONFIG_HOME` and listing what appeared:
|
|
62
|
+
*
|
|
63
|
+
* | probe | version | warm ms | wrote into a pristine HOME |
|
|
64
|
+
* |----------------------|-----------|---------|------------------------------------------|
|
|
65
|
+
* | `claude --version` | 2.1.240 | 199 | nothing |
|
|
66
|
+
* | `agy --version` | 1.1.18 | 176 | nothing |
|
|
67
|
+
* | `codex --version` | 0.148.0 | 172 | `~/.codex/tmp/arg0` |
|
|
68
|
+
* | `opencode --version` | 1.18.21 | 404 | `~/.config/opencode`, `~/.cache/opencode`, `~/.local/{state,share}/opencode` |
|
|
69
|
+
* | `copilot --version` | 1.0.80 | 436 | `~/Library/Caches/copilot` |
|
|
70
|
+
* | `gemini --version` | 0.55.1 | 929 | `~/.gemini/projects.json.<uuid>.tmp` ×2 (leaked, not cleaned up) |
|
|
71
|
+
*
|
|
72
|
+
* So the literal reading of (5) is satisfied by **two** of the six probes, and
|
|
73
|
+
* four of the rows the policy already approved fail it. The rule that the D2
|
|
74
|
+
* premise actually rests on is the narrower one #1979 was defending: a probe
|
|
75
|
+
* must not **install or download software, or change which binary would be
|
|
76
|
+
* launched**. Every row above satisfies that; none of them fetches anything.
|
|
77
|
+
* The gemini row is the weakest — it leaks two temp files into a `~/.gemini`
|
|
78
|
+
* that does not exist yet — and it is kept because it is the same class of
|
|
79
|
+
* side effect as codex/opencode/copilot, which are already in the table, and
|
|
80
|
+
* because dropping gemini would leave the one tool with **no** measured
|
|
81
|
+
* detector rules also with no way to notice that.
|
|
82
|
+
*
|
|
83
|
+
* `~/.config/gh` and `~/.local/share/gh` were checksummed before and after the
|
|
84
|
+
* whole measurement and neither changed (`~/.local/share/gh` still does not
|
|
85
|
+
* exist), which is the receipt #1979 asked for.
|
|
86
|
+
*
|
|
87
|
+
* ## Why this module imports nothing through `@/`
|
|
88
|
+
*
|
|
89
|
+
* `commandmate status` is one of the two exposure surfaces §4 D2 names, and
|
|
90
|
+
* `tsconfig.cli.json` compiles the CLI with `"paths": {}`. See the same
|
|
91
|
+
* constraint spelled out in `src/cli/types/api-responses.ts`.
|
|
92
|
+
*
|
|
93
|
+
* @module lib/detection/version-probes
|
|
94
|
+
*/
|
|
95
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
96
|
+
exports.DETECTOR_VERSION_PROBES = exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS = void 0;
|
|
97
|
+
exports.parseCliVersion = parseCliVersion;
|
|
98
|
+
exports.parseVerifiedAgainstVersion = parseVerifiedAgainstVersion;
|
|
99
|
+
exports.compareCliVersions = compareCliVersions;
|
|
100
|
+
exports.runDetectorVersionProbe = runDetectorVersionProbe;
|
|
101
|
+
exports.getDetectorFreshness = getDetectorFreshness;
|
|
102
|
+
exports.toDetectorStaleness = toDetectorStaleness;
|
|
103
|
+
exports.getDetectorStalenessSnapshot = getDetectorStalenessSnapshot;
|
|
104
|
+
exports.clearDetectorVersionProbeCache = clearDetectorVersionProbeCache;
|
|
105
|
+
const child_process_1 = require("child_process");
|
|
106
|
+
const copilot_executable_1 = require("../cli-tools/copilot-executable");
|
|
107
|
+
const env_sanitizer_1 = require("../security/env-sanitizer");
|
|
108
|
+
const verified_against_1 = require("./tools/verified-against");
|
|
109
|
+
/** Budget for one `<cli> --version`. Matches the catalog probe and copilot-executable. */
|
|
110
|
+
exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS = 5000;
|
|
111
|
+
/**
|
|
112
|
+
* Cap on `--version` output kept in memory (DR4-010 (4)).
|
|
113
|
+
*
|
|
114
|
+
* `execFile` defaults to 1MB. A `--version` that answers with a megabyte is
|
|
115
|
+
* already misbehaving, so the buffer is sized to a version banner and the child
|
|
116
|
+
* is killed past it; the over-long answer is discarded rather than parsed.
|
|
117
|
+
*/
|
|
118
|
+
const DETECTOR_VERSION_PROBE_MAX_BUFFER_BYTES = 64 * 1024;
|
|
119
|
+
/** Extracts a `major.minor.patch` triple from arbitrary `--version` output. */
|
|
120
|
+
const VERSION_REGEX = /(\d+)\.(\d+)\.(\d+)/;
|
|
121
|
+
/** Extract a normalized `major.minor.patch` version from `--version` output. */
|
|
122
|
+
function parseCliVersion(output) {
|
|
123
|
+
const match = VERSION_REGEX.exec(output);
|
|
124
|
+
return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A `verifiedAgainst` stamp written as a minor-series wildcard: `0.4.x`.
|
|
128
|
+
*
|
|
129
|
+
* Only ever applied to the stamp, never to a probe's own output — one side of
|
|
130
|
+
* this comparison is a string a human typed into a tool module, the other is
|
|
131
|
+
* what a binary printed about itself, and only the first is allowed to be vague.
|
|
132
|
+
*/
|
|
133
|
+
const VERIFIED_AGAINST_WILDCARD_REGEX = /^(\d+)\.(\d+)\.(?:x|\*)$/i;
|
|
134
|
+
/**
|
|
135
|
+
* The comparable form of a `verifiedAgainst` stamp, or null when there is none.
|
|
136
|
+
*
|
|
137
|
+
* `'unmeasured'` is null — a tool nobody has captured frames for cannot be
|
|
138
|
+
* fresh or stale. `'0.4.x'` becomes `0.4.0`: antigravity's stamp is a minor
|
|
139
|
+
* series rather than a build (Issue #995 measured a range), and reading it as
|
|
140
|
+
* "no version" would silently exempt the one tool whose rules are furthest
|
|
141
|
+
* behind. Widening to `.0` is the safe direction — it can only ever call a
|
|
142
|
+
* newer install stale, never call a stale one current.
|
|
143
|
+
*/
|
|
144
|
+
function parseVerifiedAgainstVersion(stamp) {
|
|
145
|
+
const wildcard = VERIFIED_AGAINST_WILDCARD_REGEX.exec(stamp);
|
|
146
|
+
if (wildcard)
|
|
147
|
+
return `${wildcard[1]}.${wildcard[2]}.0`;
|
|
148
|
+
return parseCliVersion(stamp);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Compare two `major.minor.patch` versions numerically.
|
|
152
|
+
* @returns 1 if a > b, -1 if a < b, 0 if equal.
|
|
153
|
+
*/
|
|
154
|
+
function compareCliVersions(a, b) {
|
|
155
|
+
const pa = a.split('.').map((n) => Number(n) || 0);
|
|
156
|
+
const pb = b.split('.').map((n) => Number(n) || 0);
|
|
157
|
+
for (let i = 0; i < 3; i++) {
|
|
158
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
159
|
+
if (diff !== 0)
|
|
160
|
+
return diff > 0 ? 1 : -1;
|
|
161
|
+
}
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Detector staleness probes: tool id → how to read its installed version.
|
|
166
|
+
*
|
|
167
|
+
* Deliberately the same shape as `VERSION_PROBES` in `slash-command-catalog.ts`
|
|
168
|
+
* (§4 D2: 「`VERSION_PROBES` と同型」), and deliberately a separate table: the
|
|
169
|
+
* catalog's question is "is the bundled slash-command list behind?" and this
|
|
170
|
+
* one's is "were these detection rules read off the build that is installed?".
|
|
171
|
+
* They happen to agree today; nothing requires them to.
|
|
172
|
+
*
|
|
173
|
+
* The binary for antigravity is `agy` — tool id and executable name differ
|
|
174
|
+
* (DR2-023). `gemini`'s row is `gemini --version`, measured for this Issue (the
|
|
175
|
+
* policy left it unconfirmed); its `verifiedAgainst` is `unmeasured`, so it is
|
|
176
|
+
* reported as "installed, rules never measured" rather than compared.
|
|
177
|
+
* `vibe-local` has no row: it is not an external CLI.
|
|
178
|
+
*/
|
|
179
|
+
exports.DETECTOR_VERSION_PROBES = {
|
|
180
|
+
claude: { kind: 'execFile', command: 'claude', args: ['--version'] },
|
|
181
|
+
codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
|
|
182
|
+
antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
|
|
183
|
+
opencode: { kind: 'execFile', command: 'opencode', args: ['--version'] },
|
|
184
|
+
gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
|
|
185
|
+
copilot: {
|
|
186
|
+
kind: 'delegated',
|
|
187
|
+
probe: async () => (await (0, copilot_executable_1.resolveCopilotExecutable)())?.version ?? null,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
let freshnessCache = null;
|
|
191
|
+
let freshnessInFlight = null;
|
|
192
|
+
/**
|
|
193
|
+
* Run one probe. Resolves null on any failure, and **without spawning anything**
|
|
194
|
+
* when the command does not resolve to an absolute path (DR4-010 (2)).
|
|
195
|
+
*/
|
|
196
|
+
function runDetectorVersionProbe(probe) {
|
|
197
|
+
if (probe.kind === 'delegated') {
|
|
198
|
+
return probe.probe().catch(() => null);
|
|
199
|
+
}
|
|
200
|
+
const executable = (0, copilot_executable_1.findExecutableOnPath)(probe.command);
|
|
201
|
+
// Skip, do not fall back to the bare name: handing an unresolved command to
|
|
202
|
+
// execFile is exactly the PATH-decides-the-binary case DR4-010 removes.
|
|
203
|
+
if (!executable)
|
|
204
|
+
return Promise.resolve(null);
|
|
205
|
+
return new Promise((resolve) => {
|
|
206
|
+
(0, child_process_1.execFile)(executable, [...probe.args], {
|
|
207
|
+
timeout: exports.DETECTOR_VERSION_PROBE_TIMEOUT_MS,
|
|
208
|
+
maxBuffer: DETECTOR_VERSION_PROBE_MAX_BUFFER_BYTES,
|
|
209
|
+
env: (0, env_sanitizer_1.sanitizeEnvForChildProcess)(),
|
|
210
|
+
}, (error, stdout, stderr) => {
|
|
211
|
+
if (error) {
|
|
212
|
+
resolve(null);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
resolve(parseCliVersion(`${stdout ?? ''}\n${stderr ?? ''}`));
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
async function computeDetectorFreshness() {
|
|
220
|
+
const tools = Object.keys(exports.DETECTOR_VERSION_PROBES).sort();
|
|
221
|
+
return Promise.all(tools.map(async (tool) => {
|
|
222
|
+
const verifiedAgainst = verified_against_1.DETECTOR_VERIFIED_AGAINST[tool]?.version ?? 'unmeasured';
|
|
223
|
+
const installed = await runDetectorVersionProbe(exports.DETECTOR_VERSION_PROBES[tool]);
|
|
224
|
+
const baseline = parseVerifiedAgainstVersion(verifiedAgainst);
|
|
225
|
+
return {
|
|
226
|
+
tool,
|
|
227
|
+
installed,
|
|
228
|
+
verifiedAgainst,
|
|
229
|
+
stale: installed !== null && baseline !== null && compareCliVersions(installed, baseline) > 0,
|
|
230
|
+
};
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* The full freshness report, computed once per process and cached. Concurrent
|
|
235
|
+
* first callers share one probe.
|
|
236
|
+
*
|
|
237
|
+
* **This awaits child processes — never call it from a request path.** Use
|
|
238
|
+
* {@link getDetectorStalenessSnapshot} there. Kept for `commandmate status`,
|
|
239
|
+
* `npm run check:detector-freshness` and tests, and as the single implementation
|
|
240
|
+
* both entry points share.
|
|
241
|
+
*/
|
|
242
|
+
async function getDetectorFreshness() {
|
|
243
|
+
if (freshnessCache !== null)
|
|
244
|
+
return freshnessCache;
|
|
245
|
+
if (freshnessInFlight)
|
|
246
|
+
return freshnessInFlight;
|
|
247
|
+
freshnessInFlight = computeDetectorFreshness();
|
|
248
|
+
try {
|
|
249
|
+
freshnessCache = await freshnessInFlight;
|
|
250
|
+
return freshnessCache;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
freshnessInFlight = null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/** Reduce a report to the wire shape: stale tools only. */
|
|
257
|
+
function toDetectorStaleness(rows) {
|
|
258
|
+
const staleness = {};
|
|
259
|
+
for (const row of rows) {
|
|
260
|
+
if (!row.stale || row.installed === null)
|
|
261
|
+
continue;
|
|
262
|
+
staleness[row.tool] = { installed: row.installed, verifiedAgainst: row.verifiedAgainst };
|
|
263
|
+
}
|
|
264
|
+
return staleness;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* The staleness this process already knows, or `undefined` plus a background
|
|
268
|
+
* probe when it knows nothing yet. **Never awaits a child process** (§4 D2,
|
|
269
|
+
* DR3-013 (a)(b)(c)).
|
|
270
|
+
*
|
|
271
|
+
* `undefined` is "not known yet", not "nothing is stale" — see the module doc.
|
|
272
|
+
* The returned object is `{}` once the cache is warm and nothing is stale, which
|
|
273
|
+
* is how a caller tells the two apart.
|
|
274
|
+
*/
|
|
275
|
+
function getDetectorStalenessSnapshot() {
|
|
276
|
+
if (freshnessCache !== null)
|
|
277
|
+
return toDetectorStaleness(freshnessCache);
|
|
278
|
+
// Fire and forget. No in-flight check here on purpose: getDetectorFreshness
|
|
279
|
+
// owns that slot and hands a concurrent caller the promise that is already
|
|
280
|
+
// running, so a second guard would be a copy of an invariant that lives one
|
|
281
|
+
// function down — and a copy is what goes stale. It swallows its own failures,
|
|
282
|
+
// so nothing here needs the result.
|
|
283
|
+
void getDetectorFreshness().catch(() => []);
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
/** Clear the process-level probe cache (tests, and any future cache-control wiring). */
|
|
287
|
+
function clearDetectorVersionProbeCache() {
|
|
288
|
+
freshnessCache = null;
|
|
289
|
+
freshnessInFlight = null;
|
|
290
|
+
}
|
|
@@ -24,6 +24,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
24
24
|
const worktree_id_1 = require("./worktree-id");
|
|
25
25
|
const db_1 = require("../../lib/db");
|
|
26
26
|
const logger_1 = require("../../lib/logger");
|
|
27
|
+
const agents_config_1 = require("../../lib/repo-config/agents-config");
|
|
27
28
|
const logger = (0, logger_1.createLogger)('worktrees');
|
|
28
29
|
/**
|
|
29
30
|
* ID minting lives in `worktree-id.ts` — a module that imports nothing but
|
|
@@ -186,6 +187,15 @@ async function scanWorktrees(rootDir) {
|
|
|
186
187
|
// Get repository name from path
|
|
187
188
|
const repositoryPath = path_1.default.resolve(rootDir);
|
|
188
189
|
const repositoryName = path_1.default.basename(repositoryPath);
|
|
190
|
+
// Issue #2066: this is the "read it at sync" the repository-level agent
|
|
191
|
+
// declaration is specified against. Doing it here rather than lazily in
|
|
192
|
+
// `getWorktrees()` is what keeps the file off the sidebar's polled path
|
|
193
|
+
// (#1913's no-filesystem-probe-on-a-hot-path rule), and it is also what
|
|
194
|
+
// makes a broken `.commandmate/agents.yaml` warn once per sync instead of
|
|
195
|
+
// once per poll — the refusal is cached alongside an accepted value.
|
|
196
|
+
// Deliberately after the `git worktree list` above succeeded: a directory
|
|
197
|
+
// that is not a repository has no declaration worth reading.
|
|
198
|
+
(0, agents_config_1.refreshRepoAgentsConfig)(repositoryPath);
|
|
189
199
|
// Filter and validate worktree paths
|
|
190
200
|
return parsed
|
|
191
201
|
.map((wt) => {
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loader for `.commandmate/agents.yaml` — a repository's own declaration of
|
|
4
|
+
* which agents its worktrees start with (Issue #2066).
|
|
5
|
+
*
|
|
6
|
+
* ## Why a file, and why not a key in `CMATE.md`
|
|
7
|
+
*
|
|
8
|
+
* `CMATE.md` already carries per-worktree schedule rows, so it was the obvious
|
|
9
|
+
* alternative. It is the wrong home for this one:
|
|
10
|
+
*
|
|
11
|
+
* - **Scope.** `CMATE.md` is read from a *worktree* root (`cmate-parser.ts`
|
|
12
|
+
* resolves it under the worktree directory and refuses paths outside it).
|
|
13
|
+
* This declaration is a property of the **repository**, and it has to be
|
|
14
|
+
* readable *before* a worktree's roster exists — that is the whole point.
|
|
15
|
+
* - **Grammar.** `CMATE.md` is a Markdown *table* parser: every value is a
|
|
16
|
+
* cell, and an ordered list with an optional primary would have to be
|
|
17
|
+
* encoded into one. `.commandmate/verify.yaml` and `.commandmate/tasks/*.yaml`
|
|
18
|
+
* already establish YAML as the shape for machine-read declarations, and
|
|
19
|
+
* `validateAgentsPair()` wants a real list.
|
|
20
|
+
* - **Blast radius.** `parseCmateConfig()` is on the schedule execution path.
|
|
21
|
+
* Adding a key there means every schedule read re-validates agent ids, and a
|
|
22
|
+
* malformed agents key becomes a way to disturb scheduling.
|
|
23
|
+
*
|
|
24
|
+
* So: a new file, next to the two declarations that already live in
|
|
25
|
+
* `.commandmate/`, following `verify.yaml`'s closed-key-set conventions.
|
|
26
|
+
*
|
|
27
|
+
* ## Shape
|
|
28
|
+
*
|
|
29
|
+
* ```yaml
|
|
30
|
+
* version: 1 # optional; must be 1 when present
|
|
31
|
+
* agents: [codex, claude]
|
|
32
|
+
* primary: claude # optional; must be one of `agents`
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* ## Fail-open
|
|
36
|
+
*
|
|
37
|
+
* Nothing here throws. A file that does not parse, declares an unknown key, or
|
|
38
|
+
* carries a list `validateAgentsPair()` rejects produces a WARNING and `null`,
|
|
39
|
+
* and `resolveSelectedAgents()` then falls through to `app_settings` and finally
|
|
40
|
+
* to the compiled-in constant. A repository must not be able to blank every
|
|
41
|
+
* sidebar tab strip by committing a typo.
|
|
42
|
+
*
|
|
43
|
+
* ## Why the read is cached, and why the cache is not optional
|
|
44
|
+
*
|
|
45
|
+
* `getWorktrees()` runs on every sidebar poll. Issue #1913 made "no filesystem
|
|
46
|
+
* probe on a hot path" a rule, restated by #2065 in
|
|
47
|
+
* `src/config/installed-agents-cache.ts` as "getWorktrees() must not grow a
|
|
48
|
+
* filesystem probe". This layer is inherently file-backed, so the rule is
|
|
49
|
+
* honoured the way the Issue asks for — **read at sync** — plus a TTL so the
|
|
50
|
+
* answer is still self-healing:
|
|
51
|
+
*
|
|
52
|
+
* - {@link refreshRepoAgentsConfig} is called from `scanWorktrees()`, i.e. once
|
|
53
|
+
* per repository per sync. That is the read the Issue specifies.
|
|
54
|
+
* - {@link getRepoDefaultSelectedAgents} serves memory. It touches the disk
|
|
55
|
+
* only on a cold miss (a server restarted since the last sync — the rows in
|
|
56
|
+
* SQLite outlive the process, so "scanned at least once in this process" is
|
|
57
|
+
* not a fact one may assume) or after {@link REPO_AGENTS_CACHE_TTL_MS}.
|
|
58
|
+
*
|
|
59
|
+
* The resulting worst case is one small `readFileSync` per repository per
|
|
60
|
+
* minute, bounded by the number of configured repositories — not per worktree,
|
|
61
|
+
* and not per poll.
|
|
62
|
+
*
|
|
63
|
+
* Server-only: reads from disk, so import this from API routes / CLI / DB
|
|
64
|
+
* helpers, never from a client component.
|
|
65
|
+
*/
|
|
66
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
+
exports.MAX_REPO_AGENTS_CONFIG_BYTES = exports.REPO_AGENTS_CACHE_TTL_MS = exports.REPO_AGENTS_CONFIG_KEYS = exports.REPO_AGENTS_CONFIG_RELATIVE_PATH = void 0;
|
|
68
|
+
exports.parseRepoAgentsConfig = parseRepoAgentsConfig;
|
|
69
|
+
exports.loadRepoAgentsConfig = loadRepoAgentsConfig;
|
|
70
|
+
exports.refreshRepoAgentsConfig = refreshRepoAgentsConfig;
|
|
71
|
+
exports.getRepoDefaultSelectedAgents = getRepoDefaultSelectedAgents;
|
|
72
|
+
exports.clearRepoAgentsConfigCache = clearRepoAgentsConfigCache;
|
|
73
|
+
const fs_1 = require("fs");
|
|
74
|
+
const path_1 = require("path");
|
|
75
|
+
const yaml_1 = require("yaml");
|
|
76
|
+
const logger_1 = require("../../lib/logger");
|
|
77
|
+
const selected_agents_validator_1 = require("../../lib/selected-agents-validator");
|
|
78
|
+
const logger = (0, logger_1.createLogger)('repo-agents-config');
|
|
79
|
+
/** Path of the declaration, relative to the repository root. */
|
|
80
|
+
exports.REPO_AGENTS_CONFIG_RELATIVE_PATH = '.commandmate/agents.yaml';
|
|
81
|
+
/**
|
|
82
|
+
* Top-level keys v1 accepts. Closed, like `verify.yaml`'s: a key nobody reads is
|
|
83
|
+
* indistinguishable from a misspelled key that was meant to be read, and the
|
|
84
|
+
* misspelling is the case worth catching.
|
|
85
|
+
*/
|
|
86
|
+
exports.REPO_AGENTS_CONFIG_KEYS = ['version', 'agents', 'primary'];
|
|
87
|
+
/**
|
|
88
|
+
* How long one parsed declaration is reused before the disk is consulted again.
|
|
89
|
+
*
|
|
90
|
+
* 60s is chosen against the user's loop: edit `agents.yaml`, switch back to the
|
|
91
|
+
* browser, look at a worktree that has no roster yet. Pressing the sync button
|
|
92
|
+
* (which calls {@link refreshRepoAgentsConfig}) makes it immediate; this is the
|
|
93
|
+
* floor for someone who does not.
|
|
94
|
+
*/
|
|
95
|
+
exports.REPO_AGENTS_CACHE_TTL_MS = 60_000;
|
|
96
|
+
/** Largest declaration read into memory. A declaration is a few hundred bytes. */
|
|
97
|
+
exports.MAX_REPO_AGENTS_CONFIG_BYTES = 64 * 1024;
|
|
98
|
+
const cache = new Map();
|
|
99
|
+
/**
|
|
100
|
+
* Render an untrusted value for a log line (R4-005, the same concern
|
|
101
|
+
* `parseSelectedAgents()` documents).
|
|
102
|
+
*
|
|
103
|
+
* A repository file is attacker-adjacent input on a shared machine: ANSI escapes
|
|
104
|
+
* and newlines in it would otherwise reach a terminal that is tailing the server
|
|
105
|
+
* log and forge log lines there.
|
|
106
|
+
*/
|
|
107
|
+
function forLog(value, limit = 120) {
|
|
108
|
+
const text = typeof value === 'string'
|
|
109
|
+
? value
|
|
110
|
+
: Array.isArray(value)
|
|
111
|
+
? 'a list'
|
|
112
|
+
: value === null
|
|
113
|
+
? 'null'
|
|
114
|
+
: typeof value === 'object'
|
|
115
|
+
? 'a mapping'
|
|
116
|
+
: String(value);
|
|
117
|
+
const stripped = text.replace(/[\u0000-\u001F\u007F-\u009F]/g, ' ');
|
|
118
|
+
return stripped.length > limit ? `${stripped.slice(0, limit)}...` : stripped;
|
|
119
|
+
}
|
|
120
|
+
function isMapping(value) {
|
|
121
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse a declaration's text into an ordered agent list.
|
|
125
|
+
*
|
|
126
|
+
* Exported so the rules can be tested without a filesystem, and so a future
|
|
127
|
+
* surface that already holds the text (a repository settings screen previewing
|
|
128
|
+
* an upload) can validate it the same way.
|
|
129
|
+
*
|
|
130
|
+
* @param raw - File contents
|
|
131
|
+
* @param source - Path used in warning messages
|
|
132
|
+
* @returns Ordered agents (`[0]` is the primary), or null when unusable
|
|
133
|
+
*/
|
|
134
|
+
function parseRepoAgentsConfig(raw, source) {
|
|
135
|
+
let document;
|
|
136
|
+
try {
|
|
137
|
+
document = (0, yaml_1.parse)(raw);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.warn('repo-agents:yaml-parse-failed', {
|
|
141
|
+
source,
|
|
142
|
+
error: forLog(error.message),
|
|
143
|
+
});
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
// An empty file parses to null. Treat it as "this repository declares
|
|
147
|
+
// nothing", which is the same answer as having no file at all — and say so at
|
|
148
|
+
// debug level rather than warn, because it is not a mistake worth shouting at.
|
|
149
|
+
if (document === null || document === undefined) {
|
|
150
|
+
logger.debug('repo-agents:empty', { source });
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if (!isMapping(document)) {
|
|
154
|
+
logger.warn('repo-agents:not-a-mapping', { source, got: forLog(document) });
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const unknownKeys = Object.keys(document).filter((key) => !exports.REPO_AGENTS_CONFIG_KEYS.includes(key));
|
|
158
|
+
if (unknownKeys.length > 0) {
|
|
159
|
+
logger.warn('repo-agents:unknown-keys', {
|
|
160
|
+
source,
|
|
161
|
+
keys: unknownKeys.map((key) => forLog(key, 40)),
|
|
162
|
+
});
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
if (document.version !== undefined && document.version !== null) {
|
|
166
|
+
const version = typeof document.version === 'number'
|
|
167
|
+
? document.version
|
|
168
|
+
: typeof document.version === 'string' && /^\d+$/.test(document.version)
|
|
169
|
+
? Number(document.version)
|
|
170
|
+
: null;
|
|
171
|
+
if (version !== 1) {
|
|
172
|
+
logger.warn('repo-agents:unsupported-version', {
|
|
173
|
+
source,
|
|
174
|
+
got: forLog(document.version),
|
|
175
|
+
});
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!Array.isArray(document.agents)) {
|
|
180
|
+
logger.warn('repo-agents:agents-not-a-list', {
|
|
181
|
+
source,
|
|
182
|
+
got: forLog(document.agents),
|
|
183
|
+
});
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
// The shared validator (Issue #2066 requirement 3): 2-6 unique ids drawn from
|
|
187
|
+
// CLI_TOOL_IDS, exactly what `app_settings` and the API input are held to.
|
|
188
|
+
const validated = (0, selected_agents_validator_1.validateAgentsPair)(document.agents);
|
|
189
|
+
if (!validated.valid) {
|
|
190
|
+
logger.warn('repo-agents:invalid-agents', {
|
|
191
|
+
source,
|
|
192
|
+
error: validated.error,
|
|
193
|
+
got: document.agents.map((entry) => forLog(entry, 40)),
|
|
194
|
+
});
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const agents = validated.value;
|
|
198
|
+
if (document.primary === undefined || document.primary === null) {
|
|
199
|
+
return agents;
|
|
200
|
+
}
|
|
201
|
+
if (typeof document.primary !== 'string' || !agents.includes(document.primary)) {
|
|
202
|
+
// Deliberately falls through rather than ignoring the key: `primary` exists
|
|
203
|
+
// to say which tab opens first, and quietly opening a different one is worse
|
|
204
|
+
// than falling back to a default the user can see is a default.
|
|
205
|
+
logger.warn('repo-agents:primary-not-in-agents', {
|
|
206
|
+
source,
|
|
207
|
+
got: forLog(document.primary, 40),
|
|
208
|
+
agents,
|
|
209
|
+
});
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const primary = document.primary;
|
|
213
|
+
return [primary, ...agents.filter((id) => id !== primary)];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Read and parse `<repoPath>/.commandmate/agents.yaml`, bypassing the cache.
|
|
217
|
+
*
|
|
218
|
+
* @param repoPath - Repository root
|
|
219
|
+
* @returns Ordered agents, or null when the file is absent, unreadable or unusable
|
|
220
|
+
*/
|
|
221
|
+
function loadRepoAgentsConfig(repoPath) {
|
|
222
|
+
const configPath = (0, path_1.join)(repoPath, exports.REPO_AGENTS_CONFIG_RELATIVE_PATH);
|
|
223
|
+
let raw;
|
|
224
|
+
try {
|
|
225
|
+
raw = (0, fs_1.readFileSync)(configPath, 'utf8');
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const code = error.code;
|
|
229
|
+
// The overwhelmingly common case: the repository has no declaration.
|
|
230
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
231
|
+
return null;
|
|
232
|
+
logger.warn('repo-agents:read-failed', {
|
|
233
|
+
source: configPath,
|
|
234
|
+
code,
|
|
235
|
+
error: forLog(error.message),
|
|
236
|
+
});
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const bytes = Buffer.byteLength(raw, 'utf8');
|
|
240
|
+
if (bytes > exports.MAX_REPO_AGENTS_CONFIG_BYTES) {
|
|
241
|
+
logger.warn('repo-agents:too-large', {
|
|
242
|
+
source: configPath,
|
|
243
|
+
bytes,
|
|
244
|
+
limit: exports.MAX_REPO_AGENTS_CONFIG_BYTES,
|
|
245
|
+
});
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
return parseRepoAgentsConfig(raw, configPath);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Read the declaration from disk and store the answer, replacing whatever the
|
|
252
|
+
* cache held.
|
|
253
|
+
*
|
|
254
|
+
* This is the "read it at sync" the Issue asks for: `scanWorktrees()` calls it
|
|
255
|
+
* once per repository, so a broken file warns once per sync rather than once per
|
|
256
|
+
* sidebar poll (the negative answer is cached too, which is what keeps the
|
|
257
|
+
* warning from repeating).
|
|
258
|
+
*
|
|
259
|
+
* @param repoPath - Repository root
|
|
260
|
+
* @param now - Injectable clock (tests)
|
|
261
|
+
* @returns Ordered agents, or null when there is no usable declaration
|
|
262
|
+
*/
|
|
263
|
+
function refreshRepoAgentsConfig(repoPath, now = Date.now()) {
|
|
264
|
+
const value = loadRepoAgentsConfig(repoPath);
|
|
265
|
+
cache.set(repoPath, { value, expiresAt: now + exports.REPO_AGENTS_CACHE_TTL_MS });
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* The `repo` layer of `resolveSelectedAgents()` for one repository.
|
|
270
|
+
*
|
|
271
|
+
* Serves memory; see the module header for why, and for the two cases that do
|
|
272
|
+
* reach the disk. Never throws.
|
|
273
|
+
*
|
|
274
|
+
* @param repoPath - Repository root; a falsy path (a worktree row with no
|
|
275
|
+
* `repository_path`) has no repository to ask and answers null
|
|
276
|
+
* @param now - Injectable clock (tests)
|
|
277
|
+
* @returns Ordered agents (`[0]` is the primary), or null when unset/invalid
|
|
278
|
+
*/
|
|
279
|
+
function getRepoDefaultSelectedAgents(repoPath, now = Date.now()) {
|
|
280
|
+
if (!repoPath)
|
|
281
|
+
return null;
|
|
282
|
+
const entry = cache.get(repoPath);
|
|
283
|
+
if (entry && entry.expiresAt > now)
|
|
284
|
+
return entry.value;
|
|
285
|
+
return refreshRepoAgentsConfig(repoPath, now);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Drop cached declarations. Tests, and any surface that just rewrote one.
|
|
289
|
+
*
|
|
290
|
+
* @param repoPath - Only this repository when given; the whole cache otherwise
|
|
291
|
+
*/
|
|
292
|
+
function clearRepoAgentsConfigCache(repoPath) {
|
|
293
|
+
if (repoPath === undefined) {
|
|
294
|
+
cache.clear();
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
cache.delete(repoPath);
|
|
298
|
+
}
|