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,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Which agent CLIs are installed, and is codex behind?" (Issue #2069)
|
|
3
|
+
*
|
|
4
|
+
* One row per tool for the two update surfaces — the More screen's card and the
|
|
5
|
+
* agent pane's — and the split in what a row carries is deliberate:
|
|
6
|
+
*
|
|
7
|
+
* - **every tool reports `installed` only.** That is this Issue's 実装内容 2:
|
|
8
|
+
* the probe table already exists, it answers without a network, and
|
|
9
|
+
* "installed 1.0.80" is the whole truth CommandMate has about a copilot.
|
|
10
|
+
* - **codex additionally reports `latestVersion` / `updateAvailable`**, because
|
|
11
|
+
* codex is the one tool that writes its own release check to disk. See
|
|
12
|
+
* `./codex-version`.
|
|
13
|
+
*
|
|
14
|
+
* Nothing here queries a registry. A row that says `updateAvailable: false` is
|
|
15
|
+
* saying "nothing on this machine claims otherwise", never "I checked online".
|
|
16
|
+
*
|
|
17
|
+
* ## Why not `getDetectorFreshness()`
|
|
18
|
+
*
|
|
19
|
+
* It answers a different question (are the *detector's rules* stale?) and — the
|
|
20
|
+
* reason that matters here — it caches for the life of the process. This module
|
|
21
|
+
* is read immediately after an update completes, so a permanent memo would show
|
|
22
|
+
* the old version forever and make the acceptance criterion 「完了後に
|
|
23
|
+
* `codex --version` が上がる」 unobservable from the UI. So the probes are run
|
|
24
|
+
* through the same `runDetectorVersionProbe` (same absolute-path resolution,
|
|
25
|
+
* same sanitized env, same timeout) behind a **TTL** instead, on the reasoning
|
|
26
|
+
* `config/installed-agents-cache` already wrote down: the user's loop is
|
|
27
|
+
* "install something, come back, look again".
|
|
28
|
+
*
|
|
29
|
+
* @module lib/updates/agent-versions
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* How long one fan-out of `--version` probes is reused.
|
|
33
|
+
*
|
|
34
|
+
* Same 30s as `config/installed-agents-cache`, and for the same reason: opening
|
|
35
|
+
* a screen twice in a row costs one fan-out, while a version that changed under
|
|
36
|
+
* the server shows up without a restart. An update finishing calls
|
|
37
|
+
* {@link clearAgentVersionsCache} rather than waiting this out.
|
|
38
|
+
*/
|
|
39
|
+
export declare const AGENT_VERSIONS_CACHE_TTL_MS = 30000;
|
|
40
|
+
/** One tool's version row, as the API publishes it. */
|
|
41
|
+
export interface AgentVersionRow {
|
|
42
|
+
/** Catalog / `CLIToolType` id. */
|
|
43
|
+
tool: string;
|
|
44
|
+
/** What `--version` reported, or null when the tool is not on PATH. */
|
|
45
|
+
installed: string | null;
|
|
46
|
+
/** codex only: its own `latest_version`. Null for every other tool. */
|
|
47
|
+
latestVersion: string | null;
|
|
48
|
+
/** codex only: its own `dismissed_version`. Null for every other tool. */
|
|
49
|
+
dismissedVersion: string | null;
|
|
50
|
+
/** True only when a newer version is known AND the tool is installed. */
|
|
51
|
+
updateAvailable: boolean;
|
|
52
|
+
/** True when the available update is one the user dismissed inside codex. */
|
|
53
|
+
dismissedInCodex: boolean;
|
|
54
|
+
/** Whether CommandMate has an update flow for this tool at all. */
|
|
55
|
+
updatable: boolean;
|
|
56
|
+
/** Where `latestVersion` came from, or null when nothing said. */
|
|
57
|
+
source: 'version.json' | null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Every tool's version row, cached for {@link AGENT_VERSIONS_CACHE_TTL_MS}.
|
|
61
|
+
*
|
|
62
|
+
* Single-flight: two concurrent callers share one fan-out rather than doubling
|
|
63
|
+
* the child processes.
|
|
64
|
+
*
|
|
65
|
+
* @param options.force - Skip the cache and re-probe. What the UI passes right
|
|
66
|
+
* after an update, so the new version is visible without a 30s wait.
|
|
67
|
+
* @param options.now - Injectable clock, used for BOTH the expiry comparison
|
|
68
|
+
* and the expiry that is written. Honouring it on only one side would leave
|
|
69
|
+
* the TTL untestable — see {@link expiryFrom}.
|
|
70
|
+
*/
|
|
71
|
+
export declare function getAgentVersions(options?: {
|
|
72
|
+
force?: boolean;
|
|
73
|
+
now?: number;
|
|
74
|
+
}): Promise<AgentVersionRow[]>;
|
|
75
|
+
/** Drop the cached probe. Tests, and every surface that just ran an update. */
|
|
76
|
+
export declare function clearAgentVersionsCache(): void;
|
|
77
|
+
//# sourceMappingURL=agent-versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-versions.d.ts","sourceRoot":"","sources":["../../../src/lib/updates/agent-versions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,yEAAyE;IACzE,eAAe,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AA2DD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,OAAO,CAAC,eAAe,EAAE,CAAC,CA2B5B;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "Which agent CLIs are installed, and is codex behind?" (Issue #2069)
|
|
4
|
+
*
|
|
5
|
+
* One row per tool for the two update surfaces — the More screen's card and the
|
|
6
|
+
* agent pane's — and the split in what a row carries is deliberate:
|
|
7
|
+
*
|
|
8
|
+
* - **every tool reports `installed` only.** That is this Issue's 実装内容 2:
|
|
9
|
+
* the probe table already exists, it answers without a network, and
|
|
10
|
+
* "installed 1.0.80" is the whole truth CommandMate has about a copilot.
|
|
11
|
+
* - **codex additionally reports `latestVersion` / `updateAvailable`**, because
|
|
12
|
+
* codex is the one tool that writes its own release check to disk. See
|
|
13
|
+
* `./codex-version`.
|
|
14
|
+
*
|
|
15
|
+
* Nothing here queries a registry. A row that says `updateAvailable: false` is
|
|
16
|
+
* saying "nothing on this machine claims otherwise", never "I checked online".
|
|
17
|
+
*
|
|
18
|
+
* ## Why not `getDetectorFreshness()`
|
|
19
|
+
*
|
|
20
|
+
* It answers a different question (are the *detector's rules* stale?) and — the
|
|
21
|
+
* reason that matters here — it caches for the life of the process. This module
|
|
22
|
+
* is read immediately after an update completes, so a permanent memo would show
|
|
23
|
+
* the old version forever and make the acceptance criterion 「完了後に
|
|
24
|
+
* `codex --version` が上がる」 unobservable from the UI. So the probes are run
|
|
25
|
+
* through the same `runDetectorVersionProbe` (same absolute-path resolution,
|
|
26
|
+
* same sanitized env, same timeout) behind a **TTL** instead, on the reasoning
|
|
27
|
+
* `config/installed-agents-cache` already wrote down: the user's loop is
|
|
28
|
+
* "install something, come back, look again".
|
|
29
|
+
*
|
|
30
|
+
* @module lib/updates/agent-versions
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.AGENT_VERSIONS_CACHE_TTL_MS = void 0;
|
|
34
|
+
exports.getAgentVersions = getAgentVersions;
|
|
35
|
+
exports.clearAgentVersionsCache = clearAgentVersionsCache;
|
|
36
|
+
const version_probes_1 = require("../detection/version-probes");
|
|
37
|
+
const codex_version_1 = require("./codex-version");
|
|
38
|
+
const agent_updater_1 = require("./agent-updater");
|
|
39
|
+
/**
|
|
40
|
+
* How long one fan-out of `--version` probes is reused.
|
|
41
|
+
*
|
|
42
|
+
* Same 30s as `config/installed-agents-cache`, and for the same reason: opening
|
|
43
|
+
* a screen twice in a row costs one fan-out, while a version that changed under
|
|
44
|
+
* the server shows up without a restart. An update finishing calls
|
|
45
|
+
* {@link clearAgentVersionsCache} rather than waiting this out.
|
|
46
|
+
*/
|
|
47
|
+
exports.AGENT_VERSIONS_CACHE_TTL_MS = 30_000;
|
|
48
|
+
let cache = null;
|
|
49
|
+
let inFlight = null;
|
|
50
|
+
/** Probe one tool and build its row. codex gets the extra half. */
|
|
51
|
+
async function buildRow(tool) {
|
|
52
|
+
const installed = await (0, version_probes_1.runDetectorVersionProbe)(version_probes_1.DETECTOR_VERSION_PROBES[tool]);
|
|
53
|
+
const updatable = (0, agent_updater_1.isUpdatableAgentTool)(tool);
|
|
54
|
+
if (tool !== 'codex') {
|
|
55
|
+
return {
|
|
56
|
+
tool,
|
|
57
|
+
installed,
|
|
58
|
+
latestVersion: null,
|
|
59
|
+
dismissedVersion: null,
|
|
60
|
+
updateAvailable: false,
|
|
61
|
+
dismissedInCodex: false,
|
|
62
|
+
updatable,
|
|
63
|
+
source: null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const status = (0, codex_version_1.evaluateCodexUpdate)(installed, (0, codex_version_1.readCodexVersionFile)());
|
|
67
|
+
return {
|
|
68
|
+
tool,
|
|
69
|
+
installed: status.installed,
|
|
70
|
+
latestVersion: status.latestVersion,
|
|
71
|
+
dismissedVersion: status.dismissedVersion,
|
|
72
|
+
updateAvailable: status.updateAvailable,
|
|
73
|
+
dismissedInCodex: status.dismissedInCodex,
|
|
74
|
+
updatable,
|
|
75
|
+
source: status.source,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async function computeRows() {
|
|
79
|
+
const tools = Object.keys(version_probes_1.DETECTOR_VERSION_PROBES).sort();
|
|
80
|
+
return Promise.all(tools.map(buildRow));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* When a fan-out started at `startedAt` should stop being reused.
|
|
84
|
+
*
|
|
85
|
+
* Takes the caller's clock rather than reading `Date.now()` again, and that is
|
|
86
|
+
* the whole point of the helper: an injected `now` that is honoured on the READ
|
|
87
|
+
* side but ignored on the WRITE side makes every TTL assertion vacuous — the
|
|
88
|
+
* cache is stamped with a real epoch, a test's `now: 2_000` is smaller than it
|
|
89
|
+
* whatever the TTL is, and `AGENT_VERSIONS_CACHE_TTL_MS = 0` still passes.
|
|
90
|
+
*/
|
|
91
|
+
function expiryFrom(startedAt) {
|
|
92
|
+
return startedAt + exports.AGENT_VERSIONS_CACHE_TTL_MS;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Every tool's version row, cached for {@link AGENT_VERSIONS_CACHE_TTL_MS}.
|
|
96
|
+
*
|
|
97
|
+
* Single-flight: two concurrent callers share one fan-out rather than doubling
|
|
98
|
+
* the child processes.
|
|
99
|
+
*
|
|
100
|
+
* @param options.force - Skip the cache and re-probe. What the UI passes right
|
|
101
|
+
* after an update, so the new version is visible without a 30s wait.
|
|
102
|
+
* @param options.now - Injectable clock, used for BOTH the expiry comparison
|
|
103
|
+
* and the expiry that is written. Honouring it on only one side would leave
|
|
104
|
+
* the TTL untestable — see {@link expiryFrom}.
|
|
105
|
+
*/
|
|
106
|
+
async function getAgentVersions(options = {}) {
|
|
107
|
+
const now = options.now ?? Date.now();
|
|
108
|
+
if (options.force) {
|
|
109
|
+
cache = null;
|
|
110
|
+
}
|
|
111
|
+
else if (cache && cache.expiresAt > now) {
|
|
112
|
+
return cache.rows;
|
|
113
|
+
}
|
|
114
|
+
if (inFlight)
|
|
115
|
+
return inFlight;
|
|
116
|
+
inFlight = (async () => {
|
|
117
|
+
try {
|
|
118
|
+
const rows = await computeRows();
|
|
119
|
+
cache = { rows, expiresAt: expiryFrom(now) };
|
|
120
|
+
return rows;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// A probe fan-out that throws must not fail the surface that asked: the
|
|
124
|
+
// versions are an annotation, and an empty list renders as "unknown".
|
|
125
|
+
cache = { rows: [], expiresAt: expiryFrom(now) };
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
inFlight = null;
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
return inFlight;
|
|
133
|
+
}
|
|
134
|
+
/** Drop the cached probe. Tests, and every surface that just ran an update. */
|
|
135
|
+
function clearAgentVersionsCache() {
|
|
136
|
+
cache = null;
|
|
137
|
+
inFlight = null;
|
|
138
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `~/.codex/version.json` — what codex itself already knows about its updates
|
|
3
|
+
* (Issue #2069).
|
|
4
|
+
*
|
|
5
|
+
* ## Why a file rather than a request
|
|
6
|
+
*
|
|
7
|
+
* codex runs its own release check and writes the answer next to its config:
|
|
8
|
+
*
|
|
9
|
+
* ```json
|
|
10
|
+
* {"latest_version":"0.151.0","last_checked_at":"2026-08-30T15:12:18.082219Z","dismissed_version":null}
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* So "is there a newer codex?" is answerable with a `readFileSync` and no
|
|
14
|
+
* network at all. That is the whole reason this module exists rather than a
|
|
15
|
+
* registry query: `GET /api/agents/versions` is rendered on a settings screen
|
|
16
|
+
* and inside the agent pane, and #1913's rule — do not put a network round trip
|
|
17
|
+
* on a surface that renders a list — applies to a fetch exactly as it applies to
|
|
18
|
+
* a child process. The trade is that the answer is only as fresh as the last
|
|
19
|
+
* time codex itself looked, which is the correct freshness: it is codex's own
|
|
20
|
+
* notion of "you are behind", the same one its TUI banner uses.
|
|
21
|
+
*
|
|
22
|
+
* ## Fail-open, in every direction
|
|
23
|
+
*
|
|
24
|
+
* The file is written by another program, on its own schedule, in a format it
|
|
25
|
+
* owns. It is legitimately **absent** (a fresh install, a codex that has never
|
|
26
|
+
* run), legitimately **null-valued** (`dismissed_version` is null until the user
|
|
27
|
+
* dismisses a banner), and it can be a half-written temp file caught mid-rename.
|
|
28
|
+
* None of those is an error here: every failure resolves to
|
|
29
|
+
* {@link EMPTY_CODEX_VERSION_FILE} and the caller reports "no update known",
|
|
30
|
+
* which is exactly what the surfaces render when codex is not installed either.
|
|
31
|
+
* The acceptance criterion for this Issue names that behaviour directly —
|
|
32
|
+
* 「`version.json` が無い / 壊れている環境で落ちない」— and
|
|
33
|
+
* `tests/unit/updates/codex-version-2069.test.ts` pins it case by case.
|
|
34
|
+
*
|
|
35
|
+
* ## `$CODEX_HOME`: why it is resolved here, and where the two rules diverge
|
|
36
|
+
*
|
|
37
|
+
* `lib/hooks/sources/codex/hooks-config.getCodexHome()` answers the same
|
|
38
|
+
* question, and this module cannot call it: that function reaches `@/lib/logger`
|
|
39
|
+
* through `config/safe-directory`, and `tsconfig.cli.json` resets `"paths"` to
|
|
40
|
+
* `{}` — so one alias import anywhere in this module's transitive closure breaks
|
|
41
|
+
* `npm run build:cli` with TS2307 (the #1933 defect PR #1991 fixed), and
|
|
42
|
+
* `commandmate agents update` puts this file in the CLI's closure. The variable
|
|
43
|
+
* NAME therefore exists in two files, and
|
|
44
|
+
* `tests/unit/updates/codex-home-parity-2069.test.ts` is the join: it imports
|
|
45
|
+
* both and fails if the spellings or the shared rules ever drift.
|
|
46
|
+
*
|
|
47
|
+
* The rules are deliberately identical except for one case, and that case is a
|
|
48
|
+
* correctness fix rather than a divergence for its own sake:
|
|
49
|
+
*
|
|
50
|
+
* | `$CODEX_HOME` | hooks-config | here |
|
|
51
|
+
* |--------------------------|-------------------------------------|---------------------|
|
|
52
|
+
* | unset | `~/.codex` | `~/.codex` |
|
|
53
|
+
* | absolute | that path | that path |
|
|
54
|
+
* | inside `/proc`/`/sys`/`/dev` | `~/.codex` (#1774) | `~/.codex` |
|
|
55
|
+
* | **relative** | passed through **verbatim** | **null = unknown** |
|
|
56
|
+
*
|
|
57
|
+
* `resolveSafeDirectory` returns a relative candidate unchanged, and
|
|
58
|
+
* `hooks-config` puts that value on codex's own launch line — so codex resolves
|
|
59
|
+
* it against **the agent's worktree cwd**, and `CODEX_HOME=.codex-shared` means
|
|
60
|
+
* codex writes `<worktree>/.codex-shared/version.json`. This process is not in
|
|
61
|
+
* that worktree and, with several worktrees open, cannot say which one was
|
|
62
|
+
* meant. Falling back to `~/.codex` there is the one genuinely bad answer: it
|
|
63
|
+
* is not "no data", it is an unrelated install's version, reported with the
|
|
64
|
+
* same confidence as a real reading. So a relative value resolves to null and
|
|
65
|
+
* every surface renders "no update information", which is what they already
|
|
66
|
+
* render when codex has never run.
|
|
67
|
+
*
|
|
68
|
+
* @module lib/updates/codex-version
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* The one thing this module reads out of the environment.
|
|
72
|
+
*
|
|
73
|
+
* Narrower than `NodeJS.ProcessEnv` on purpose: vitest's type augmentation
|
|
74
|
+
* makes `NODE_ENV` REQUIRED on that interface, so a test could not hand these
|
|
75
|
+
* functions a two-key literal without also declaring a `NODE_ENV` that has
|
|
76
|
+
* nothing to do with what is being tested.
|
|
77
|
+
*/
|
|
78
|
+
export type CodexVersionEnv = Readonly<Record<string, string | undefined>>;
|
|
79
|
+
/** The file codex writes its release check into, inside `$CODEX_HOME`. */
|
|
80
|
+
export declare const CODEX_VERSION_FILENAME = "version.json";
|
|
81
|
+
/**
|
|
82
|
+
* Largest `version.json` this module will parse.
|
|
83
|
+
*
|
|
84
|
+
* Three short fields; anything past this is not the file we mean. A cap rather
|
|
85
|
+
* than trust because the read happens on a request path and the file is written
|
|
86
|
+
* by another process — an oversized file is discarded, not truncated and parsed.
|
|
87
|
+
*/
|
|
88
|
+
export declare const CODEX_VERSION_FILE_MAX_BYTES: number;
|
|
89
|
+
/** What {@link readCodexVersionFile} could recover from the file. */
|
|
90
|
+
export interface CodexVersionFile {
|
|
91
|
+
/** `latest_version`, normalized to `major.minor.patch`, or null. */
|
|
92
|
+
latestVersion: string | null;
|
|
93
|
+
/** `dismissed_version`, normalized, or null (the ordinary value). */
|
|
94
|
+
dismissedVersion: string | null;
|
|
95
|
+
/** `last_checked_at` verbatim — an opaque timestamp string, or null. */
|
|
96
|
+
lastCheckedAt: string | null;
|
|
97
|
+
/**
|
|
98
|
+
* Absolute path that was read, or null when `$CODEX_HOME` is relative and the
|
|
99
|
+
* file's location therefore depends on a worktree this process cannot name.
|
|
100
|
+
*/
|
|
101
|
+
path: string | null;
|
|
102
|
+
/** False when the file was missing, oversized, unreadable or malformed. */
|
|
103
|
+
readable: boolean;
|
|
104
|
+
}
|
|
105
|
+
/** The answer for every failure: "codex has told us nothing". */
|
|
106
|
+
export declare const EMPTY_CODEX_VERSION_FILE: Omit<CodexVersionFile, 'path'>;
|
|
107
|
+
/**
|
|
108
|
+
* The directory codex keeps its state in, as seen from THIS process.
|
|
109
|
+
*
|
|
110
|
+
* See the table in the module header for the four cases. The one that returns
|
|
111
|
+
* null is a relative `$CODEX_HOME`: `hooks-config` forwards such a value to
|
|
112
|
+
* codex verbatim, codex resolves it against the agent's worktree cwd, and this
|
|
113
|
+
* process has no worktree — so the honest answer is "cannot tell", not
|
|
114
|
+
* `~/.codex`.
|
|
115
|
+
*
|
|
116
|
+
* @param env - Environment to read. Injectable so tests need no `process.env`
|
|
117
|
+
* mutation.
|
|
118
|
+
* @returns An absolute directory path, or null when it cannot be determined.
|
|
119
|
+
*/
|
|
120
|
+
export declare function getCodexHomeForVersionRead(env?: CodexVersionEnv): string | null;
|
|
121
|
+
/**
|
|
122
|
+
* Absolute path of the file codex writes its release check into, or null when
|
|
123
|
+
* {@link getCodexHomeForVersionRead} cannot determine the directory.
|
|
124
|
+
*/
|
|
125
|
+
export declare function getCodexVersionFilePath(env?: CodexVersionEnv): string | null;
|
|
126
|
+
/**
|
|
127
|
+
* Read `$CODEX_HOME/version.json`.
|
|
128
|
+
*
|
|
129
|
+
* Never throws and never rejects: see the module header. A file that parses but
|
|
130
|
+
* carries junk in a field yields null for **that field only**, so a codex build
|
|
131
|
+
* that adds or renames a key still gives up whatever the rest of it says.
|
|
132
|
+
*
|
|
133
|
+
* @param options.path - Read this file instead of the resolved default (tests,
|
|
134
|
+
* and an isolated-HOME verification run).
|
|
135
|
+
* @param options.env - Environment used to resolve the default path.
|
|
136
|
+
*/
|
|
137
|
+
export declare function readCodexVersionFile(options?: {
|
|
138
|
+
path?: string;
|
|
139
|
+
env?: CodexVersionEnv;
|
|
140
|
+
}): CodexVersionFile;
|
|
141
|
+
/** What the two update surfaces render for codex. */
|
|
142
|
+
export interface CodexUpdateStatus {
|
|
143
|
+
/** What `codex --version` reported, or null when it is not installed. */
|
|
144
|
+
installed: string | null;
|
|
145
|
+
/** codex's own `latest_version`, or null when it has not looked. */
|
|
146
|
+
latestVersion: string | null;
|
|
147
|
+
/** codex's own `dismissed_version`, or null. */
|
|
148
|
+
dismissedVersion: string | null;
|
|
149
|
+
/** True only when BOTH versions are known AND latest is strictly newer. */
|
|
150
|
+
updateAvailable: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* True when `dismissed_version` names the update that is available — i.e.
|
|
153
|
+
* **something** answered codex's update banner with "not this version".
|
|
154
|
+
*
|
|
155
|
+
* **Not necessarily the user.** The digit that writes `dismissed_version` is
|
|
156
|
+
* the same one CommandMate can be configured to send for codex's in-pane
|
|
157
|
+
* update dialog (#2068, `CM_CODEX_UPDATE_DIALOG`), and on the default policy
|
|
158
|
+
* CommandMate sends it on every codex launch. So on a stock install this flag
|
|
159
|
+
* goes true without anybody having decided anything, and wording that says
|
|
160
|
+
* "you dismissed this" would be blaming the user for the server's own
|
|
161
|
+
* automatic answer.
|
|
162
|
+
*
|
|
163
|
+
* That is why it is reported and never acted on: it does not hide the update,
|
|
164
|
+
* it does not disable the button, and the copy beside it
|
|
165
|
+
* (`common.agentUpdates.dismissed`) says only that the version was dismissed
|
|
166
|
+
* in codex — without naming who did it.
|
|
167
|
+
*/
|
|
168
|
+
dismissedInCodex: boolean;
|
|
169
|
+
/** Where the "latest" half came from, or null when nothing was readable. */
|
|
170
|
+
source: 'version.json' | null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Combine the installed version with codex's own release check.
|
|
174
|
+
*
|
|
175
|
+
* Both halves are "no answer"-tolerant, and every kind of no-answer resolves to
|
|
176
|
+
* `updateAvailable: false` — not installed, never checked, unparseable. That is
|
|
177
|
+
* the same posture `DetectorFreshnessRow.stale` takes, and for the same reason:
|
|
178
|
+
* an update prompt the user cannot act on is worse than no prompt.
|
|
179
|
+
*
|
|
180
|
+
* @param installed - Output of the `codex --version` probe, or null.
|
|
181
|
+
* @param file - What {@link readCodexVersionFile} recovered.
|
|
182
|
+
*/
|
|
183
|
+
export declare function evaluateCodexUpdate(installed: string | null, file: CodexVersionFile): CodexUpdateStatus;
|
|
184
|
+
//# sourceMappingURL=codex-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-version.d.ts","sourceRoot":"","sources":["../../../src/lib/updates/codex-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AAQH;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAa3E,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,QAAY,CAAC;AAEtD,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,wEAAwE;IACxE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,iEAAiE;AACjE,eAAO,MAAM,wBAAwB,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAKnE,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,eAA6B,GAAG,MAAM,GAAG,IAAI,CAS5F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,eAA6B,GAAG,MAAM,GAAG,IAAI,CAGzF;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,eAAe,CAAA;CAAO,GACrD,gBAAgB,CA2BlB;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2EAA2E;IAC3E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,gBAAgB,GACrB,iBAAiB,CAiBnB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `~/.codex/version.json` — what codex itself already knows about its updates
|
|
4
|
+
* (Issue #2069).
|
|
5
|
+
*
|
|
6
|
+
* ## Why a file rather than a request
|
|
7
|
+
*
|
|
8
|
+
* codex runs its own release check and writes the answer next to its config:
|
|
9
|
+
*
|
|
10
|
+
* ```json
|
|
11
|
+
* {"latest_version":"0.151.0","last_checked_at":"2026-08-30T15:12:18.082219Z","dismissed_version":null}
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* So "is there a newer codex?" is answerable with a `readFileSync` and no
|
|
15
|
+
* network at all. That is the whole reason this module exists rather than a
|
|
16
|
+
* registry query: `GET /api/agents/versions` is rendered on a settings screen
|
|
17
|
+
* and inside the agent pane, and #1913's rule — do not put a network round trip
|
|
18
|
+
* on a surface that renders a list — applies to a fetch exactly as it applies to
|
|
19
|
+
* a child process. The trade is that the answer is only as fresh as the last
|
|
20
|
+
* time codex itself looked, which is the correct freshness: it is codex's own
|
|
21
|
+
* notion of "you are behind", the same one its TUI banner uses.
|
|
22
|
+
*
|
|
23
|
+
* ## Fail-open, in every direction
|
|
24
|
+
*
|
|
25
|
+
* The file is written by another program, on its own schedule, in a format it
|
|
26
|
+
* owns. It is legitimately **absent** (a fresh install, a codex that has never
|
|
27
|
+
* run), legitimately **null-valued** (`dismissed_version` is null until the user
|
|
28
|
+
* dismisses a banner), and it can be a half-written temp file caught mid-rename.
|
|
29
|
+
* None of those is an error here: every failure resolves to
|
|
30
|
+
* {@link EMPTY_CODEX_VERSION_FILE} and the caller reports "no update known",
|
|
31
|
+
* which is exactly what the surfaces render when codex is not installed either.
|
|
32
|
+
* The acceptance criterion for this Issue names that behaviour directly —
|
|
33
|
+
* 「`version.json` が無い / 壊れている環境で落ちない」— and
|
|
34
|
+
* `tests/unit/updates/codex-version-2069.test.ts` pins it case by case.
|
|
35
|
+
*
|
|
36
|
+
* ## `$CODEX_HOME`: why it is resolved here, and where the two rules diverge
|
|
37
|
+
*
|
|
38
|
+
* `lib/hooks/sources/codex/hooks-config.getCodexHome()` answers the same
|
|
39
|
+
* question, and this module cannot call it: that function reaches `@/lib/logger`
|
|
40
|
+
* through `config/safe-directory`, and `tsconfig.cli.json` resets `"paths"` to
|
|
41
|
+
* `{}` — so one alias import anywhere in this module's transitive closure breaks
|
|
42
|
+
* `npm run build:cli` with TS2307 (the #1933 defect PR #1991 fixed), and
|
|
43
|
+
* `commandmate agents update` puts this file in the CLI's closure. The variable
|
|
44
|
+
* NAME therefore exists in two files, and
|
|
45
|
+
* `tests/unit/updates/codex-home-parity-2069.test.ts` is the join: it imports
|
|
46
|
+
* both and fails if the spellings or the shared rules ever drift.
|
|
47
|
+
*
|
|
48
|
+
* The rules are deliberately identical except for one case, and that case is a
|
|
49
|
+
* correctness fix rather than a divergence for its own sake:
|
|
50
|
+
*
|
|
51
|
+
* | `$CODEX_HOME` | hooks-config | here |
|
|
52
|
+
* |--------------------------|-------------------------------------|---------------------|
|
|
53
|
+
* | unset | `~/.codex` | `~/.codex` |
|
|
54
|
+
* | absolute | that path | that path |
|
|
55
|
+
* | inside `/proc`/`/sys`/`/dev` | `~/.codex` (#1774) | `~/.codex` |
|
|
56
|
+
* | **relative** | passed through **verbatim** | **null = unknown** |
|
|
57
|
+
*
|
|
58
|
+
* `resolveSafeDirectory` returns a relative candidate unchanged, and
|
|
59
|
+
* `hooks-config` puts that value on codex's own launch line — so codex resolves
|
|
60
|
+
* it against **the agent's worktree cwd**, and `CODEX_HOME=.codex-shared` means
|
|
61
|
+
* codex writes `<worktree>/.codex-shared/version.json`. This process is not in
|
|
62
|
+
* that worktree and, with several worktrees open, cannot say which one was
|
|
63
|
+
* meant. Falling back to `~/.codex` there is the one genuinely bad answer: it
|
|
64
|
+
* is not "no data", it is an unrelated install's version, reported with the
|
|
65
|
+
* same confidence as a real reading. So a relative value resolves to null and
|
|
66
|
+
* every surface renders "no update information", which is what they already
|
|
67
|
+
* render when codex has never run.
|
|
68
|
+
*
|
|
69
|
+
* @module lib/updates/codex-version
|
|
70
|
+
*/
|
|
71
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
|
+
exports.EMPTY_CODEX_VERSION_FILE = exports.CODEX_VERSION_FILE_MAX_BYTES = exports.CODEX_VERSION_FILENAME = void 0;
|
|
73
|
+
exports.getCodexHomeForVersionRead = getCodexHomeForVersionRead;
|
|
74
|
+
exports.getCodexVersionFilePath = getCodexVersionFilePath;
|
|
75
|
+
exports.readCodexVersionFile = readCodexVersionFile;
|
|
76
|
+
exports.evaluateCodexUpdate = evaluateCodexUpdate;
|
|
77
|
+
const fs_1 = require("fs");
|
|
78
|
+
const os_1 = require("os");
|
|
79
|
+
const path_1 = require("path");
|
|
80
|
+
const system_directories_1 = require("../../config/system-directories");
|
|
81
|
+
const version_probes_1 = require("../detection/version-probes");
|
|
82
|
+
/**
|
|
83
|
+
* codex's own config-directory override.
|
|
84
|
+
*
|
|
85
|
+
* NOT exported: `lib/hooks/sources/codex/hooks-config` already exports this name
|
|
86
|
+
* and that one is the repository's single public spelling. A second exported
|
|
87
|
+
* `CODEX_HOME_ENV_VAR` is how two modules end up disagreeing about it, and the
|
|
88
|
+
* `@/`-import rule above is the only reason the literal exists twice at all.
|
|
89
|
+
* `tests/unit/updates/codex-home-parity-2069.test.ts` pins the two together.
|
|
90
|
+
*/
|
|
91
|
+
const CODEX_HOME_ENV_VAR = 'CODEX_HOME';
|
|
92
|
+
/** The file codex writes its release check into, inside `$CODEX_HOME`. */
|
|
93
|
+
exports.CODEX_VERSION_FILENAME = 'version.json';
|
|
94
|
+
/**
|
|
95
|
+
* Largest `version.json` this module will parse.
|
|
96
|
+
*
|
|
97
|
+
* Three short fields; anything past this is not the file we mean. A cap rather
|
|
98
|
+
* than trust because the read happens on a request path and the file is written
|
|
99
|
+
* by another process — an oversized file is discarded, not truncated and parsed.
|
|
100
|
+
*/
|
|
101
|
+
exports.CODEX_VERSION_FILE_MAX_BYTES = 64 * 1024;
|
|
102
|
+
/** The answer for every failure: "codex has told us nothing". */
|
|
103
|
+
exports.EMPTY_CODEX_VERSION_FILE = {
|
|
104
|
+
latestVersion: null,
|
|
105
|
+
dismissedVersion: null,
|
|
106
|
+
lastCheckedAt: null,
|
|
107
|
+
readable: false,
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* The directory codex keeps its state in, as seen from THIS process.
|
|
111
|
+
*
|
|
112
|
+
* See the table in the module header for the four cases. The one that returns
|
|
113
|
+
* null is a relative `$CODEX_HOME`: `hooks-config` forwards such a value to
|
|
114
|
+
* codex verbatim, codex resolves it against the agent's worktree cwd, and this
|
|
115
|
+
* process has no worktree — so the honest answer is "cannot tell", not
|
|
116
|
+
* `~/.codex`.
|
|
117
|
+
*
|
|
118
|
+
* @param env - Environment to read. Injectable so tests need no `process.env`
|
|
119
|
+
* mutation.
|
|
120
|
+
* @returns An absolute directory path, or null when it cannot be determined.
|
|
121
|
+
*/
|
|
122
|
+
function getCodexHomeForVersionRead(env = process.env) {
|
|
123
|
+
const fallback = (0, path_1.join)((0, os_1.homedir)(), '.codex');
|
|
124
|
+
const configured = env[CODEX_HOME_ENV_VAR];
|
|
125
|
+
if (!configured)
|
|
126
|
+
return fallback;
|
|
127
|
+
// Matches `resolveSafeDirectory`: a /proc, /sys or /dev path is refused and
|
|
128
|
+
// the built-in default is used, on both sides of the join.
|
|
129
|
+
if ((0, system_directories_1.isVirtualFilesystemPath)(configured))
|
|
130
|
+
return fallback;
|
|
131
|
+
if (!(0, path_1.isAbsolute)(configured))
|
|
132
|
+
return null;
|
|
133
|
+
return configured;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Absolute path of the file codex writes its release check into, or null when
|
|
137
|
+
* {@link getCodexHomeForVersionRead} cannot determine the directory.
|
|
138
|
+
*/
|
|
139
|
+
function getCodexVersionFilePath(env = process.env) {
|
|
140
|
+
const home = getCodexHomeForVersionRead(env);
|
|
141
|
+
return home === null ? null : (0, path_1.join)(home, exports.CODEX_VERSION_FILENAME);
|
|
142
|
+
}
|
|
143
|
+
/** Read one field as a normalized version, tolerating null / wrong types. */
|
|
144
|
+
function readVersionField(raw, key) {
|
|
145
|
+
const value = raw[key];
|
|
146
|
+
if (typeof value !== 'string')
|
|
147
|
+
return null;
|
|
148
|
+
return (0, version_probes_1.parseCliVersion)(value);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Read `$CODEX_HOME/version.json`.
|
|
152
|
+
*
|
|
153
|
+
* Never throws and never rejects: see the module header. A file that parses but
|
|
154
|
+
* carries junk in a field yields null for **that field only**, so a codex build
|
|
155
|
+
* that adds or renames a key still gives up whatever the rest of it says.
|
|
156
|
+
*
|
|
157
|
+
* @param options.path - Read this file instead of the resolved default (tests,
|
|
158
|
+
* and an isolated-HOME verification run).
|
|
159
|
+
* @param options.env - Environment used to resolve the default path.
|
|
160
|
+
*/
|
|
161
|
+
function readCodexVersionFile(options = {}) {
|
|
162
|
+
const path = options.path ?? getCodexVersionFilePath(options.env);
|
|
163
|
+
const empty = { ...exports.EMPTY_CODEX_VERSION_FILE, path };
|
|
164
|
+
// Unknown directory (a relative `$CODEX_HOME`): read nothing rather than read
|
|
165
|
+
// the wrong install's file. See the table in the module header.
|
|
166
|
+
if (path === null)
|
|
167
|
+
return empty;
|
|
168
|
+
try {
|
|
169
|
+
const stat = (0, fs_1.statSync)(path);
|
|
170
|
+
if (!stat.isFile())
|
|
171
|
+
return empty;
|
|
172
|
+
if (stat.size > exports.CODEX_VERSION_FILE_MAX_BYTES)
|
|
173
|
+
return empty;
|
|
174
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf-8'));
|
|
175
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
176
|
+
return empty;
|
|
177
|
+
const raw = parsed;
|
|
178
|
+
return {
|
|
179
|
+
latestVersion: readVersionField(raw, 'latest_version'),
|
|
180
|
+
dismissedVersion: readVersionField(raw, 'dismissed_version'),
|
|
181
|
+
lastCheckedAt: typeof raw.last_checked_at === 'string' ? raw.last_checked_at : null,
|
|
182
|
+
path,
|
|
183
|
+
readable: true,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return empty;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Combine the installed version with codex's own release check.
|
|
192
|
+
*
|
|
193
|
+
* Both halves are "no answer"-tolerant, and every kind of no-answer resolves to
|
|
194
|
+
* `updateAvailable: false` — not installed, never checked, unparseable. That is
|
|
195
|
+
* the same posture `DetectorFreshnessRow.stale` takes, and for the same reason:
|
|
196
|
+
* an update prompt the user cannot act on is worse than no prompt.
|
|
197
|
+
*
|
|
198
|
+
* @param installed - Output of the `codex --version` probe, or null.
|
|
199
|
+
* @param file - What {@link readCodexVersionFile} recovered.
|
|
200
|
+
*/
|
|
201
|
+
function evaluateCodexUpdate(installed, file) {
|
|
202
|
+
const updateAvailable = installed !== null &&
|
|
203
|
+
file.latestVersion !== null &&
|
|
204
|
+
(0, version_probes_1.compareCliVersions)(file.latestVersion, installed) > 0;
|
|
205
|
+
return {
|
|
206
|
+
installed,
|
|
207
|
+
latestVersion: file.latestVersion,
|
|
208
|
+
dismissedVersion: file.dismissedVersion,
|
|
209
|
+
updateAvailable,
|
|
210
|
+
dismissedInCodex: updateAvailable &&
|
|
211
|
+
file.dismissedVersion !== null &&
|
|
212
|
+
file.dismissedVersion === file.latestVersion,
|
|
213
|
+
source: file.readable ? 'version.json' : null,
|
|
214
|
+
};
|
|
215
|
+
}
|