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,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running an agent CLI's own updater, in a process that is not an agent pane
|
|
3
|
+
* (Issue #2069).
|
|
4
|
+
*
|
|
5
|
+
* ## The failure this replaces
|
|
6
|
+
*
|
|
7
|
+
* codex's "Update now" is not an in-place upgrade. Measured against upstream
|
|
8
|
+
* `codex-rs/cli/src/main.rs`: the codex process **exits**, its parent runs the
|
|
9
|
+
* install in the foreground, prints `Update ran successfully! Please restart
|
|
10
|
+
* Codex.` and stops. Nothing restarts codex. Run inside a CommandMate pane that
|
|
11
|
+
* means the pane's foreground program is gone and the pane falls back to a bare
|
|
12
|
+
* shell — the state #2070 taught the detector to recognise, and which the user
|
|
13
|
+
* then has to clean up by hand.
|
|
14
|
+
*
|
|
15
|
+
* So the update runs **here**: a child of the server (or of the CLI), with its
|
|
16
|
+
* own stdio, wholly outside tmux. A pane that is mid-turn keeps its session; the
|
|
17
|
+
* binary underneath it changes, and restarting that pane is a separate,
|
|
18
|
+
* explicit act (the restart button, or `kill-session`).
|
|
19
|
+
*
|
|
20
|
+
* `tests/unit/api/agents-update-2069.test.ts` holds that structurally: it fails
|
|
21
|
+
* the moment this route's module graph reaches tmux or a CLI tool's session
|
|
22
|
+
* API at all. "Not in the pane" is the Issue's central claim, so it is asserted
|
|
23
|
+
* rather than asserted-in-a-comment.
|
|
24
|
+
*
|
|
25
|
+
* ## The OTHER update path, and why it does not make this one redundant (#2068)
|
|
26
|
+
*
|
|
27
|
+
* codex's dialog can still appear inside a pane — a codex the user updated by
|
|
28
|
+
* hand, an `Update now` they pressed themselves — and #2068 owns what
|
|
29
|
+
* CommandMate answers there and how the pane is repaired afterwards (it re-sends
|
|
30
|
+
* the launch command to the same pane). The two are complements, not
|
|
31
|
+
* duplicates:
|
|
32
|
+
*
|
|
33
|
+
* - the pane path is **reactive**: it only exists because codex asked, and it
|
|
34
|
+
* costs the session (the pane drops to a shell and has to be restarted);
|
|
35
|
+
* - this path is **initiated by the user from CommandMate** and costs no
|
|
36
|
+
* session at all.
|
|
37
|
+
*
|
|
38
|
+
* The consequence for THIS module is the lock below: after #2068 there are
|
|
39
|
+
* three ways to reach one `npm install -g @openai/codex`, and only a lock that
|
|
40
|
+
* every one of them takes is a lock.
|
|
41
|
+
*
|
|
42
|
+
* ## Two strategies, and how the choice is made
|
|
43
|
+
*
|
|
44
|
+
* codex 0.149.0 added a `codex update` subcommand that works out how the binary
|
|
45
|
+
* was installed (npm, Homebrew, the standalone installer) and updates it the
|
|
46
|
+
* same way. That is strictly better than assuming npm, so it is preferred — but
|
|
47
|
+
* only when the installed build actually has it. A `codex update` typed at
|
|
48
|
+
* 0.148 is an unknown-subcommand error, so below
|
|
49
|
+
* {@link CODEX_NATIVE_UPDATE_MIN_VERSION} the plan falls back to
|
|
50
|
+
* `npm install -g @openai/codex@latest`, which is what codex's own pre-0.149
|
|
51
|
+
* updater ran.
|
|
52
|
+
*
|
|
53
|
+
* ### Why the fallback pins `@latest` and codex's own command does not
|
|
54
|
+
*
|
|
55
|
+
* codex spells it `npm install -g @openai/codex`. That resolves through npm's
|
|
56
|
+
* default dist-tag, which is `latest` **unless** the user has set one
|
|
57
|
+
* (`npm config set tag`, or a `tag=` line in `.npmrc`) — in which case the two
|
|
58
|
+
* spellings install different versions. The explicit `@latest` here is the
|
|
59
|
+
* fixed-argv rule applied to the version as well as to the words: what this
|
|
60
|
+
* module runs must not depend on a config value neither CommandMate nor the
|
|
61
|
+
* user is looking at while pressing the button. On a machine with no such
|
|
62
|
+
* setting — which is nearly all of them — the two commands are identical.
|
|
63
|
+
*
|
|
64
|
+
* ## The execution rules (this Issue's 実装内容 4, and DR4-010)
|
|
65
|
+
*
|
|
66
|
+
* - **`execFile` with an argv array, never a shell string.** There is no
|
|
67
|
+
* `sh -c`, no interpolation, and nothing derived from an HTTP request reaches
|
|
68
|
+
* the command: the tool id is validated against {@link UPDATABLE_AGENT_TOOLS}
|
|
69
|
+
* and then *discarded* — the argv is a literal in this file, selected by that
|
|
70
|
+
* id. Same shape as `/api/app/update`'s fixed argv (#1198 §5).
|
|
71
|
+
* - **The command is resolved to an absolute path first**, through
|
|
72
|
+
* {@link resolveAbsoluteExecutable}, and the plan fails rather than handing a
|
|
73
|
+
* relative or bare name to `execFile`. A repo-local `node_modules/.bin/codex`
|
|
74
|
+
* on `PATH` must not be able to decide what "update codex" runs.
|
|
75
|
+
*
|
|
76
|
+
* `findExecutableOnPath` alone is **not** enough for that, which is why this
|
|
77
|
+
* module wraps it: it joins each `PATH` entry with the name and returns the
|
|
78
|
+
* first hit, so a `PATH` carrying a RELATIVE entry (`PATH=.:/usr/bin`, a
|
|
79
|
+
* `node_modules/.bin` written without a leading slash) yields a relative
|
|
80
|
+
* command — `./codex` — and `execFile` would resolve that against the child's
|
|
81
|
+
* cwd. The `isAbsolute` check is the half that makes the sentence above true.
|
|
82
|
+
* - **`PATH` still comes from the shell that started the server**, because that
|
|
83
|
+
* is the PATH the user's codex is actually on; the environment is passed
|
|
84
|
+
* through {@link sanitizeEnvForChildProcess} so the updater cannot read
|
|
85
|
+
* CommandMate's auth token, DB path, or the launching agent's correlation
|
|
86
|
+
* variables (#1996).
|
|
87
|
+
*
|
|
88
|
+
* @module lib/updates/agent-updater
|
|
89
|
+
*/
|
|
90
|
+
/**
|
|
91
|
+
* Tools this module can update.
|
|
92
|
+
*
|
|
93
|
+
* One entry today, and the array — rather than an `if (tool === 'codex')` — is
|
|
94
|
+
* the point: it is the allow-list the route validates against, so adding a tool
|
|
95
|
+
* is adding a row here plus its plan below, and never a new place where a
|
|
96
|
+
* request string reaches a command.
|
|
97
|
+
*/
|
|
98
|
+
export declare const UPDATABLE_AGENT_TOOLS: readonly ["codex"];
|
|
99
|
+
/** A tool id {@link resolveAgentUpdatePlan} accepts. */
|
|
100
|
+
export type UpdatableAgentTool = (typeof UPDATABLE_AGENT_TOOLS)[number];
|
|
101
|
+
/** Narrow arbitrary input — a request body, an argv operand — to a known tool. */
|
|
102
|
+
export declare function isUpdatableAgentTool(value: unknown): value is UpdatableAgentTool;
|
|
103
|
+
/** The package `npm install -g` would fetch when codex cannot update itself. */
|
|
104
|
+
export declare const CODEX_NPM_PACKAGE = "@openai/codex";
|
|
105
|
+
/**
|
|
106
|
+
* First codex release with a `codex update` subcommand.
|
|
107
|
+
*
|
|
108
|
+
* Below this the subcommand does not exist and invoking it is an error, so the
|
|
109
|
+
* plan takes the npm route instead. Measured on 0.149.1, whose `codex update
|
|
110
|
+
* --help` reads "Update Codex to the latest version".
|
|
111
|
+
*/
|
|
112
|
+
export declare const CODEX_NATIVE_UPDATE_MIN_VERSION = "0.149.0";
|
|
113
|
+
/**
|
|
114
|
+
* How long one update may run.
|
|
115
|
+
*
|
|
116
|
+
* An install pulls a release over the network, so this is minutes rather than
|
|
117
|
+
* the five seconds a `--version` probe gets. It is a ceiling on a hang, not a
|
|
118
|
+
* budget: the ordinary run finishes far inside it.
|
|
119
|
+
*/
|
|
120
|
+
export declare const AGENT_UPDATE_TIMEOUT_MS: number;
|
|
121
|
+
/** Cap on captured output. npm is chatty; a runaway installer is not parsed. */
|
|
122
|
+
export declare const AGENT_UPDATE_MAX_BUFFER_BYTES: number;
|
|
123
|
+
/** Which updater a plan runs. */
|
|
124
|
+
export type AgentUpdateStrategy = 'native' | 'npm';
|
|
125
|
+
/** A resolved, ready-to-run update. Every field is decided before any spawn. */
|
|
126
|
+
export interface AgentUpdatePlan {
|
|
127
|
+
tool: UpdatableAgentTool;
|
|
128
|
+
strategy: AgentUpdateStrategy;
|
|
129
|
+
/** Absolute path of the executable. Never a bare name. */
|
|
130
|
+
command: string;
|
|
131
|
+
/** Literal argv. Nothing here is derived from caller input. */
|
|
132
|
+
args: readonly string[];
|
|
133
|
+
/**
|
|
134
|
+
* The same command as a single string, **for display only**.
|
|
135
|
+
*
|
|
136
|
+
* Deliberately not what is executed — it exists so the UI and the CLI can
|
|
137
|
+
* show the user what is about to run. Nothing in this module ever hands it to
|
|
138
|
+
* a shell.
|
|
139
|
+
*/
|
|
140
|
+
display: string;
|
|
141
|
+
/** Version the probe read before planning, or null when not installed. */
|
|
142
|
+
installed: string | null;
|
|
143
|
+
/** Why this strategy was chosen, for the log line and the CLI's output. */
|
|
144
|
+
reason: 'native-subcommand' | 'no-native-subcommand' | 'not-installed';
|
|
145
|
+
}
|
|
146
|
+
/** Why no plan could be made. */
|
|
147
|
+
export interface AgentUpdatePlanFailure {
|
|
148
|
+
ok: false;
|
|
149
|
+
code: 'unsupported-tool' | 'no-executable';
|
|
150
|
+
message: string;
|
|
151
|
+
}
|
|
152
|
+
/** {@link resolveAgentUpdatePlan}'s answer. */
|
|
153
|
+
export type AgentUpdatePlanResult = {
|
|
154
|
+
ok: true;
|
|
155
|
+
plan: AgentUpdatePlan;
|
|
156
|
+
} | AgentUpdatePlanFailure;
|
|
157
|
+
/** Seams for tests: the two things this module reads from the machine. */
|
|
158
|
+
export interface AgentUpdatePlanDeps {
|
|
159
|
+
/** Resolve an executable name on PATH to an absolute path, or null. */
|
|
160
|
+
resolveExecutable?: (name: string) => string | null;
|
|
161
|
+
/** Read the installed version of `tool`, or null. */
|
|
162
|
+
probeInstalledVersion?: (tool: UpdatableAgentTool) => Promise<string | null>;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Decide what "update codex" runs on THIS machine, without running anything.
|
|
166
|
+
*
|
|
167
|
+
* Separated from {@link runAgentUpdate} so both the API route and the CLI can
|
|
168
|
+
* show the user the exact argv before it executes, and so a test can assert the
|
|
169
|
+
* strategy choice without a child process.
|
|
170
|
+
*
|
|
171
|
+
* @param tool - Tool id, validated here rather than trusted.
|
|
172
|
+
* @param deps - Injection seams; production defaults read the real machine.
|
|
173
|
+
*/
|
|
174
|
+
export declare function resolveAgentUpdatePlan(tool: unknown, deps?: AgentUpdatePlanDeps): Promise<AgentUpdatePlanResult>;
|
|
175
|
+
/** One piece of the updater's output, as it arrives. */
|
|
176
|
+
export interface AgentUpdateChunk {
|
|
177
|
+
stream: 'stdout' | 'stderr';
|
|
178
|
+
text: string;
|
|
179
|
+
}
|
|
180
|
+
/** How an update finished. */
|
|
181
|
+
export interface AgentUpdateResult {
|
|
182
|
+
ok: boolean;
|
|
183
|
+
/** Process exit code, or null when it was killed by a signal / never ran. */
|
|
184
|
+
exitCode: number | null;
|
|
185
|
+
/** Signal that killed it (`SIGTERM` on timeout), or null. */
|
|
186
|
+
signal: NodeJS.Signals | null;
|
|
187
|
+
/** Present only on failure: a one-line reason for the UI and the log. */
|
|
188
|
+
error?: string;
|
|
189
|
+
/**
|
|
190
|
+
* `in_progress` when the run was refused because another one holds the lock.
|
|
191
|
+
*
|
|
192
|
+
* A refusal is not a failed install — nothing was spawned — so callers that
|
|
193
|
+
* report failures differently (the route's 409, the CLI's exit code) can tell
|
|
194
|
+
* the two apart without parsing {@link AgentUpdateResult.error}.
|
|
195
|
+
*/
|
|
196
|
+
code?: 'in_progress';
|
|
197
|
+
}
|
|
198
|
+
/** Options for {@link runAgentUpdate}. */
|
|
199
|
+
export interface RunAgentUpdateOptions {
|
|
200
|
+
/** Called for every chunk as it arrives, so callers can stream it onward. */
|
|
201
|
+
onChunk?: (chunk: AgentUpdateChunk) => void;
|
|
202
|
+
/** Override the ceiling. Defaults to {@link AGENT_UPDATE_TIMEOUT_MS}. */
|
|
203
|
+
timeoutMs?: number;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Take the in-flight marker for `tool`, or report that one is already held.
|
|
207
|
+
*
|
|
208
|
+
* Callers that run the update do NOT need this — {@link runAgentUpdate} takes
|
|
209
|
+
* it. It is exported for the one caller that cannot go through that function:
|
|
210
|
+
* #2068's in-pane update path, where codex itself is the thing running the
|
|
211
|
+
* install and CommandMate only answers a dialog.
|
|
212
|
+
*/
|
|
213
|
+
export declare function acquireAgentUpdateLock(tool: UpdatableAgentTool): boolean;
|
|
214
|
+
/** Release the marker. Safe to call when none is held. */
|
|
215
|
+
export declare function releaseAgentUpdateLock(tool: UpdatableAgentTool): void;
|
|
216
|
+
/**
|
|
217
|
+
* Whether an update for `tool` is running in this process.
|
|
218
|
+
*
|
|
219
|
+
* A pre-check, never the control: the authoritative acquisition is inside
|
|
220
|
+
* {@link runAgentUpdate}. The route reads this to choose its status code
|
|
221
|
+
* BEFORE it starts streaming, because once a 200 and a stream have been
|
|
222
|
+
* returned there is no way to answer 409 any more.
|
|
223
|
+
*/
|
|
224
|
+
export declare function isAgentUpdateInProgress(tool: UpdatableAgentTool): boolean;
|
|
225
|
+
/**
|
|
226
|
+
* Run a resolved plan, streaming its output.
|
|
227
|
+
*
|
|
228
|
+
* `execFile` — not `exec`, not `spawn` with `shell: true` — so the argv array is
|
|
229
|
+
* handed to the OS as an array. Its returned `ChildProcess` still exposes
|
|
230
|
+
* `stdout` / `stderr` as streams, which is what makes "argv array" and "stream
|
|
231
|
+
* the output" the same choice rather than a trade: the callback's buffered copy
|
|
232
|
+
* is ignored and the listeners below are the real output path.
|
|
233
|
+
*
|
|
234
|
+
* **Takes the in-flight lock itself**, synchronously, before it returns its
|
|
235
|
+
* promise — so every caller is serialised by calling this function rather than
|
|
236
|
+
* by remembering to. See {@link acquireAgentUpdateLock} for the three paths
|
|
237
|
+
* that reach one global install and why one of them cannot use this door.
|
|
238
|
+
*
|
|
239
|
+
* Never rejects. An updater that fails is a result to render, not an exception
|
|
240
|
+
* to unwind through a route handler; a refusal (`code: 'in_progress'`) is a
|
|
241
|
+
* result too, and spawns nothing.
|
|
242
|
+
*
|
|
243
|
+
* @param plan - From {@link resolveAgentUpdatePlan}. Its argv is used verbatim.
|
|
244
|
+
* @param options - Streaming callback and timeout.
|
|
245
|
+
*/
|
|
246
|
+
export declare function runAgentUpdate(plan: AgentUpdatePlan, options?: RunAgentUpdateOptions): Promise<AgentUpdateResult>;
|
|
247
|
+
//# sourceMappingURL=agent-updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-updater.d.ts","sourceRoot":"","sources":["../../../src/lib/updates/agent-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwFG;AAQH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,oBAAqB,CAAC;AAExD,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AAED,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,YAAY,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAEtD,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,QAAkB,CAAC;AAE7D,iCAAiC;AACjC,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnD,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,MAAM,EAAE,mBAAmB,GAAG,sBAAsB,GAAG,eAAe,CAAC;CACxE;AAED,iCAAiC;AACjC,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG,sBAAsB,CAAC;AAEjG,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,qDAAqD;IACrD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9E;AAmCD;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,EACb,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CA4DhC;AAED,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAIxE;AAED,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAwE5B"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Running an agent CLI's own updater, in a process that is not an agent pane
|
|
4
|
+
* (Issue #2069).
|
|
5
|
+
*
|
|
6
|
+
* ## The failure this replaces
|
|
7
|
+
*
|
|
8
|
+
* codex's "Update now" is not an in-place upgrade. Measured against upstream
|
|
9
|
+
* `codex-rs/cli/src/main.rs`: the codex process **exits**, its parent runs the
|
|
10
|
+
* install in the foreground, prints `Update ran successfully! Please restart
|
|
11
|
+
* Codex.` and stops. Nothing restarts codex. Run inside a CommandMate pane that
|
|
12
|
+
* means the pane's foreground program is gone and the pane falls back to a bare
|
|
13
|
+
* shell — the state #2070 taught the detector to recognise, and which the user
|
|
14
|
+
* then has to clean up by hand.
|
|
15
|
+
*
|
|
16
|
+
* So the update runs **here**: a child of the server (or of the CLI), with its
|
|
17
|
+
* own stdio, wholly outside tmux. A pane that is mid-turn keeps its session; the
|
|
18
|
+
* binary underneath it changes, and restarting that pane is a separate,
|
|
19
|
+
* explicit act (the restart button, or `kill-session`).
|
|
20
|
+
*
|
|
21
|
+
* `tests/unit/api/agents-update-2069.test.ts` holds that structurally: it fails
|
|
22
|
+
* the moment this route's module graph reaches tmux or a CLI tool's session
|
|
23
|
+
* API at all. "Not in the pane" is the Issue's central claim, so it is asserted
|
|
24
|
+
* rather than asserted-in-a-comment.
|
|
25
|
+
*
|
|
26
|
+
* ## The OTHER update path, and why it does not make this one redundant (#2068)
|
|
27
|
+
*
|
|
28
|
+
* codex's dialog can still appear inside a pane — a codex the user updated by
|
|
29
|
+
* hand, an `Update now` they pressed themselves — and #2068 owns what
|
|
30
|
+
* CommandMate answers there and how the pane is repaired afterwards (it re-sends
|
|
31
|
+
* the launch command to the same pane). The two are complements, not
|
|
32
|
+
* duplicates:
|
|
33
|
+
*
|
|
34
|
+
* - the pane path is **reactive**: it only exists because codex asked, and it
|
|
35
|
+
* costs the session (the pane drops to a shell and has to be restarted);
|
|
36
|
+
* - this path is **initiated by the user from CommandMate** and costs no
|
|
37
|
+
* session at all.
|
|
38
|
+
*
|
|
39
|
+
* The consequence for THIS module is the lock below: after #2068 there are
|
|
40
|
+
* three ways to reach one `npm install -g @openai/codex`, and only a lock that
|
|
41
|
+
* every one of them takes is a lock.
|
|
42
|
+
*
|
|
43
|
+
* ## Two strategies, and how the choice is made
|
|
44
|
+
*
|
|
45
|
+
* codex 0.149.0 added a `codex update` subcommand that works out how the binary
|
|
46
|
+
* was installed (npm, Homebrew, the standalone installer) and updates it the
|
|
47
|
+
* same way. That is strictly better than assuming npm, so it is preferred — but
|
|
48
|
+
* only when the installed build actually has it. A `codex update` typed at
|
|
49
|
+
* 0.148 is an unknown-subcommand error, so below
|
|
50
|
+
* {@link CODEX_NATIVE_UPDATE_MIN_VERSION} the plan falls back to
|
|
51
|
+
* `npm install -g @openai/codex@latest`, which is what codex's own pre-0.149
|
|
52
|
+
* updater ran.
|
|
53
|
+
*
|
|
54
|
+
* ### Why the fallback pins `@latest` and codex's own command does not
|
|
55
|
+
*
|
|
56
|
+
* codex spells it `npm install -g @openai/codex`. That resolves through npm's
|
|
57
|
+
* default dist-tag, which is `latest` **unless** the user has set one
|
|
58
|
+
* (`npm config set tag`, or a `tag=` line in `.npmrc`) — in which case the two
|
|
59
|
+
* spellings install different versions. The explicit `@latest` here is the
|
|
60
|
+
* fixed-argv rule applied to the version as well as to the words: what this
|
|
61
|
+
* module runs must not depend on a config value neither CommandMate nor the
|
|
62
|
+
* user is looking at while pressing the button. On a machine with no such
|
|
63
|
+
* setting — which is nearly all of them — the two commands are identical.
|
|
64
|
+
*
|
|
65
|
+
* ## The execution rules (this Issue's 実装内容 4, and DR4-010)
|
|
66
|
+
*
|
|
67
|
+
* - **`execFile` with an argv array, never a shell string.** There is no
|
|
68
|
+
* `sh -c`, no interpolation, and nothing derived from an HTTP request reaches
|
|
69
|
+
* the command: the tool id is validated against {@link UPDATABLE_AGENT_TOOLS}
|
|
70
|
+
* and then *discarded* — the argv is a literal in this file, selected by that
|
|
71
|
+
* id. Same shape as `/api/app/update`'s fixed argv (#1198 §5).
|
|
72
|
+
* - **The command is resolved to an absolute path first**, through
|
|
73
|
+
* {@link resolveAbsoluteExecutable}, and the plan fails rather than handing a
|
|
74
|
+
* relative or bare name to `execFile`. A repo-local `node_modules/.bin/codex`
|
|
75
|
+
* on `PATH` must not be able to decide what "update codex" runs.
|
|
76
|
+
*
|
|
77
|
+
* `findExecutableOnPath` alone is **not** enough for that, which is why this
|
|
78
|
+
* module wraps it: it joins each `PATH` entry with the name and returns the
|
|
79
|
+
* first hit, so a `PATH` carrying a RELATIVE entry (`PATH=.:/usr/bin`, a
|
|
80
|
+
* `node_modules/.bin` written without a leading slash) yields a relative
|
|
81
|
+
* command — `./codex` — and `execFile` would resolve that against the child's
|
|
82
|
+
* cwd. The `isAbsolute` check is the half that makes the sentence above true.
|
|
83
|
+
* - **`PATH` still comes from the shell that started the server**, because that
|
|
84
|
+
* is the PATH the user's codex is actually on; the environment is passed
|
|
85
|
+
* through {@link sanitizeEnvForChildProcess} so the updater cannot read
|
|
86
|
+
* CommandMate's auth token, DB path, or the launching agent's correlation
|
|
87
|
+
* variables (#1996).
|
|
88
|
+
*
|
|
89
|
+
* @module lib/updates/agent-updater
|
|
90
|
+
*/
|
|
91
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
92
|
+
exports.AGENT_UPDATE_MAX_BUFFER_BYTES = exports.AGENT_UPDATE_TIMEOUT_MS = exports.CODEX_NATIVE_UPDATE_MIN_VERSION = exports.CODEX_NPM_PACKAGE = exports.UPDATABLE_AGENT_TOOLS = void 0;
|
|
93
|
+
exports.isUpdatableAgentTool = isUpdatableAgentTool;
|
|
94
|
+
exports.resolveAgentUpdatePlan = resolveAgentUpdatePlan;
|
|
95
|
+
exports.acquireAgentUpdateLock = acquireAgentUpdateLock;
|
|
96
|
+
exports.releaseAgentUpdateLock = releaseAgentUpdateLock;
|
|
97
|
+
exports.isAgentUpdateInProgress = isAgentUpdateInProgress;
|
|
98
|
+
exports.runAgentUpdate = runAgentUpdate;
|
|
99
|
+
const child_process_1 = require("child_process");
|
|
100
|
+
const path_1 = require("path");
|
|
101
|
+
const copilot_executable_1 = require("../cli-tools/copilot-executable");
|
|
102
|
+
const env_sanitizer_1 = require("../security/env-sanitizer");
|
|
103
|
+
const version_probes_1 = require("../detection/version-probes");
|
|
104
|
+
/**
|
|
105
|
+
* Tools this module can update.
|
|
106
|
+
*
|
|
107
|
+
* One entry today, and the array — rather than an `if (tool === 'codex')` — is
|
|
108
|
+
* the point: it is the allow-list the route validates against, so adding a tool
|
|
109
|
+
* is adding a row here plus its plan below, and never a new place where a
|
|
110
|
+
* request string reaches a command.
|
|
111
|
+
*/
|
|
112
|
+
exports.UPDATABLE_AGENT_TOOLS = ['codex'];
|
|
113
|
+
/** Narrow arbitrary input — a request body, an argv operand — to a known tool. */
|
|
114
|
+
function isUpdatableAgentTool(value) {
|
|
115
|
+
return typeof value === 'string' && exports.UPDATABLE_AGENT_TOOLS.includes(value);
|
|
116
|
+
}
|
|
117
|
+
/** The package `npm install -g` would fetch when codex cannot update itself. */
|
|
118
|
+
exports.CODEX_NPM_PACKAGE = '@openai/codex';
|
|
119
|
+
/**
|
|
120
|
+
* First codex release with a `codex update` subcommand.
|
|
121
|
+
*
|
|
122
|
+
* Below this the subcommand does not exist and invoking it is an error, so the
|
|
123
|
+
* plan takes the npm route instead. Measured on 0.149.1, whose `codex update
|
|
124
|
+
* --help` reads "Update Codex to the latest version".
|
|
125
|
+
*/
|
|
126
|
+
exports.CODEX_NATIVE_UPDATE_MIN_VERSION = '0.149.0';
|
|
127
|
+
/**
|
|
128
|
+
* How long one update may run.
|
|
129
|
+
*
|
|
130
|
+
* An install pulls a release over the network, so this is minutes rather than
|
|
131
|
+
* the five seconds a `--version` probe gets. It is a ceiling on a hang, not a
|
|
132
|
+
* budget: the ordinary run finishes far inside it.
|
|
133
|
+
*/
|
|
134
|
+
exports.AGENT_UPDATE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
135
|
+
/** Cap on captured output. npm is chatty; a runaway installer is not parsed. */
|
|
136
|
+
exports.AGENT_UPDATE_MAX_BUFFER_BYTES = 4 * 1024 * 1024;
|
|
137
|
+
/** Default probe: the same `codex --version` row the detector's table uses. */
|
|
138
|
+
async function probeCodexVersion() {
|
|
139
|
+
return (0, version_probes_1.runDetectorVersionProbe)({ kind: 'execFile', command: 'codex', args: ['--version'] });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolve `name` on `PATH` to an **absolute** path, or null.
|
|
143
|
+
*
|
|
144
|
+
* The `isAbsolute` half is not belt-and-braces. `findExecutableOnPath` splits
|
|
145
|
+
* `PATH` and returns `join(entry, name)` for the first entry that holds an
|
|
146
|
+
* executable file; a relative `PATH` entry therefore yields a relative command,
|
|
147
|
+
* which `execFile` resolves against the child's cwd rather than against
|
|
148
|
+
* anything this process decided. A `PATH` of `.:/usr/local/bin` in the shell
|
|
149
|
+
* that started the server would let whichever directory the child happens to
|
|
150
|
+
* run in supply the binary that "update codex" executes.
|
|
151
|
+
*
|
|
152
|
+
* Refusing is the right failure: the caller reports "there is nothing to update
|
|
153
|
+
* with" and nothing is spawned, which is the same answer a machine with no
|
|
154
|
+
* codex and no npm gets.
|
|
155
|
+
*
|
|
156
|
+
* @param name - Executable name to look up, e.g. `codex`.
|
|
157
|
+
* @param resolveExecutable - Injected lookup (tests); defaults to PATH.
|
|
158
|
+
* @returns An absolute path, or null when it is missing OR not absolute.
|
|
159
|
+
*/
|
|
160
|
+
function resolveAbsoluteExecutable(name, resolveExecutable) {
|
|
161
|
+
const resolved = resolveExecutable(name);
|
|
162
|
+
if (!resolved)
|
|
163
|
+
return null;
|
|
164
|
+
return (0, path_1.isAbsolute)(resolved) ? resolved : null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Decide what "update codex" runs on THIS machine, without running anything.
|
|
168
|
+
*
|
|
169
|
+
* Separated from {@link runAgentUpdate} so both the API route and the CLI can
|
|
170
|
+
* show the user the exact argv before it executes, and so a test can assert the
|
|
171
|
+
* strategy choice without a child process.
|
|
172
|
+
*
|
|
173
|
+
* @param tool - Tool id, validated here rather than trusted.
|
|
174
|
+
* @param deps - Injection seams; production defaults read the real machine.
|
|
175
|
+
*/
|
|
176
|
+
async function resolveAgentUpdatePlan(tool, deps = {}) {
|
|
177
|
+
if (!isUpdatableAgentTool(tool)) {
|
|
178
|
+
return {
|
|
179
|
+
ok: false,
|
|
180
|
+
code: 'unsupported-tool',
|
|
181
|
+
message: `No update flow for '${String(tool)}'. Updatable tools: ${exports.UPDATABLE_AGENT_TOOLS.join(', ')}.`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const resolveExecutable = deps.resolveExecutable ?? copilot_executable_1.findExecutableOnPath;
|
|
185
|
+
const probeVersion = deps.probeInstalledVersion ?? probeCodexVersion;
|
|
186
|
+
const codexPath = resolveAbsoluteExecutable('codex', resolveExecutable);
|
|
187
|
+
const installed = codexPath ? await probeVersion(tool) : null;
|
|
188
|
+
// The native subcommand needs both: an executable to run it, and a build old
|
|
189
|
+
// enough that `update` is not a typo to it.
|
|
190
|
+
if (codexPath &&
|
|
191
|
+
installed !== null &&
|
|
192
|
+
(0, version_probes_1.compareCliVersions)(installed, exports.CODEX_NATIVE_UPDATE_MIN_VERSION) >= 0) {
|
|
193
|
+
return {
|
|
194
|
+
ok: true,
|
|
195
|
+
plan: {
|
|
196
|
+
tool,
|
|
197
|
+
strategy: 'native',
|
|
198
|
+
command: codexPath,
|
|
199
|
+
args: ['update'],
|
|
200
|
+
display: 'codex update',
|
|
201
|
+
installed,
|
|
202
|
+
reason: 'native-subcommand',
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const npmPath = resolveAbsoluteExecutable('npm', resolveExecutable);
|
|
207
|
+
if (!npmPath) {
|
|
208
|
+
return {
|
|
209
|
+
ok: false,
|
|
210
|
+
code: 'no-executable',
|
|
211
|
+
message: codexPath === null
|
|
212
|
+
? 'Neither codex nor npm resolves to an absolute path on PATH, so there is nothing to update with.'
|
|
213
|
+
: 'This codex is too old for `codex update`, and npm does not resolve to an absolute path on PATH.',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
ok: true,
|
|
218
|
+
plan: {
|
|
219
|
+
tool,
|
|
220
|
+
strategy: 'npm',
|
|
221
|
+
command: npmPath,
|
|
222
|
+
args: ['install', '-g', `${exports.CODEX_NPM_PACKAGE}@latest`],
|
|
223
|
+
display: `npm install -g ${exports.CODEX_NPM_PACKAGE}@latest`,
|
|
224
|
+
installed,
|
|
225
|
+
reason: codexPath === null ? 'not-installed' : 'no-native-subcommand',
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Tools whose update is running in THIS process.
|
|
231
|
+
*
|
|
232
|
+
* ## What it guards, now that there are three ways in
|
|
233
|
+
*
|
|
234
|
+
* After #2068 there are three routes to one `npm install -g @openai/codex` on
|
|
235
|
+
* one machine, and only the first two are this process's:
|
|
236
|
+
*
|
|
237
|
+
* 1. `POST /api/agents/update` — the More screen's and the agent pane's button;
|
|
238
|
+
* 2. `commandmate agents update <tool>` — the CLI, which may be a SECOND
|
|
239
|
+
* process (a terminal beside a running server);
|
|
240
|
+
* 3. codex's own in-pane `Update now`, which #2068 answers according to
|
|
241
|
+
* `CM_CODEX_UPDATE_DIALOG`.
|
|
242
|
+
*
|
|
243
|
+
* The lock is taken inside {@link runAgentUpdate} rather than by each caller,
|
|
244
|
+
* so (1) and (2) are covered by construction and a fourth caller is covered by
|
|
245
|
+
* calling the function. #2068 wires (3) by taking
|
|
246
|
+
* {@link acquireAgentUpdateLock} itself — which is why these three functions
|
|
247
|
+
* stay exported from `lib/updates` even though nothing inside this module needs
|
|
248
|
+
* them to be.
|
|
249
|
+
*
|
|
250
|
+
* ## Why in-process rather than a lock file
|
|
251
|
+
*
|
|
252
|
+
* Two npm installs of the same global package racing each other is a
|
|
253
|
+
* double-click, not a second machine, and (2) crossing process boundaries is a
|
|
254
|
+
* real gap this deliberately does not close: a cross-process lock would also
|
|
255
|
+
* have to be reconciled with the user running `codex update` in their own
|
|
256
|
+
* terminal, which is legitimate and must not be blocked, and there is no way to
|
|
257
|
+
* tell those two apart from the outside. npm's own global install is the last
|
|
258
|
+
* line either way.
|
|
259
|
+
*/
|
|
260
|
+
const updatesInFlight = new Set();
|
|
261
|
+
/**
|
|
262
|
+
* Take the in-flight marker for `tool`, or report that one is already held.
|
|
263
|
+
*
|
|
264
|
+
* Callers that run the update do NOT need this — {@link runAgentUpdate} takes
|
|
265
|
+
* it. It is exported for the one caller that cannot go through that function:
|
|
266
|
+
* #2068's in-pane update path, where codex itself is the thing running the
|
|
267
|
+
* install and CommandMate only answers a dialog.
|
|
268
|
+
*/
|
|
269
|
+
function acquireAgentUpdateLock(tool) {
|
|
270
|
+
if (updatesInFlight.has(tool))
|
|
271
|
+
return false;
|
|
272
|
+
updatesInFlight.add(tool);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
/** Release the marker. Safe to call when none is held. */
|
|
276
|
+
function releaseAgentUpdateLock(tool) {
|
|
277
|
+
updatesInFlight.delete(tool);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Whether an update for `tool` is running in this process.
|
|
281
|
+
*
|
|
282
|
+
* A pre-check, never the control: the authoritative acquisition is inside
|
|
283
|
+
* {@link runAgentUpdate}. The route reads this to choose its status code
|
|
284
|
+
* BEFORE it starts streaming, because once a 200 and a stream have been
|
|
285
|
+
* returned there is no way to answer 409 any more.
|
|
286
|
+
*/
|
|
287
|
+
function isAgentUpdateInProgress(tool) {
|
|
288
|
+
return updatesInFlight.has(tool);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Run a resolved plan, streaming its output.
|
|
292
|
+
*
|
|
293
|
+
* `execFile` — not `exec`, not `spawn` with `shell: true` — so the argv array is
|
|
294
|
+
* handed to the OS as an array. Its returned `ChildProcess` still exposes
|
|
295
|
+
* `stdout` / `stderr` as streams, which is what makes "argv array" and "stream
|
|
296
|
+
* the output" the same choice rather than a trade: the callback's buffered copy
|
|
297
|
+
* is ignored and the listeners below are the real output path.
|
|
298
|
+
*
|
|
299
|
+
* **Takes the in-flight lock itself**, synchronously, before it returns its
|
|
300
|
+
* promise — so every caller is serialised by calling this function rather than
|
|
301
|
+
* by remembering to. See {@link acquireAgentUpdateLock} for the three paths
|
|
302
|
+
* that reach one global install and why one of them cannot use this door.
|
|
303
|
+
*
|
|
304
|
+
* Never rejects. An updater that fails is a result to render, not an exception
|
|
305
|
+
* to unwind through a route handler; a refusal (`code: 'in_progress'`) is a
|
|
306
|
+
* result too, and spawns nothing.
|
|
307
|
+
*
|
|
308
|
+
* @param plan - From {@link resolveAgentUpdatePlan}. Its argv is used verbatim.
|
|
309
|
+
* @param options - Streaming callback and timeout.
|
|
310
|
+
*/
|
|
311
|
+
function runAgentUpdate(plan, options = {}) {
|
|
312
|
+
const { onChunk } = options;
|
|
313
|
+
const timeout = options.timeoutMs ?? exports.AGENT_UPDATE_TIMEOUT_MS;
|
|
314
|
+
// Synchronous, and before the promise is constructed: a caller that checked
|
|
315
|
+
// `isAgentUpdateInProgress` and then called this has no interleaving point in
|
|
316
|
+
// between, so the pre-check and the acquisition cannot disagree.
|
|
317
|
+
if (!acquireAgentUpdateLock(plan.tool)) {
|
|
318
|
+
return Promise.resolve({
|
|
319
|
+
ok: false,
|
|
320
|
+
exitCode: null,
|
|
321
|
+
signal: null,
|
|
322
|
+
code: 'in_progress',
|
|
323
|
+
error: `An update for ${plan.tool} is already running.`,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return new Promise((resolve) => {
|
|
327
|
+
let settled = false;
|
|
328
|
+
const settle = (result) => {
|
|
329
|
+
if (settled)
|
|
330
|
+
return;
|
|
331
|
+
settled = true;
|
|
332
|
+
releaseAgentUpdateLock(plan.tool);
|
|
333
|
+
resolve(result);
|
|
334
|
+
};
|
|
335
|
+
let child;
|
|
336
|
+
try {
|
|
337
|
+
child = (0, child_process_1.execFile)(plan.command, [...plan.args], {
|
|
338
|
+
timeout,
|
|
339
|
+
maxBuffer: exports.AGENT_UPDATE_MAX_BUFFER_BYTES,
|
|
340
|
+
env: (0, env_sanitizer_1.sanitizeEnvForChildProcess)(),
|
|
341
|
+
}, (error) => {
|
|
342
|
+
if (!error) {
|
|
343
|
+
settle({ ok: true, exitCode: 0, signal: null });
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const failure = error;
|
|
347
|
+
settle({
|
|
348
|
+
ok: false,
|
|
349
|
+
exitCode: typeof failure.code === 'number' ? failure.code : null,
|
|
350
|
+
signal: failure.signal ?? null,
|
|
351
|
+
error: failure.message,
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
// execFile throws synchronously only for a malformed invocation; a
|
|
357
|
+
// missing binary arrives through the callback as ENOENT.
|
|
358
|
+
settle({
|
|
359
|
+
ok: false,
|
|
360
|
+
exitCode: null,
|
|
361
|
+
signal: null,
|
|
362
|
+
error: error instanceof Error ? error.message : String(error),
|
|
363
|
+
});
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (onChunk) {
|
|
367
|
+
child.stdout?.setEncoding('utf-8');
|
|
368
|
+
child.stderr?.setEncoding('utf-8');
|
|
369
|
+
child.stdout?.on('data', (text) => onChunk({ stream: 'stdout', text }));
|
|
370
|
+
child.stderr?.on('data', (text) => onChunk({ stream: 'stderr', text }));
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
}
|