commandmate 0.22.2 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +383 -374
- package/.next/app-path-routes-manifest.json +16 -15
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +3 -3
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.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 -1
- 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 -1
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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 +1 -1
- 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 +1 -0
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -0
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -4
- 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 -4
- 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 +1 -1
- 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 +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +6 -6
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -4
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/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_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.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 +1 -1
- 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 +1 -1
- 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 +6 -6
- 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 +1 -1
- 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 +16 -15
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1366.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1825.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2546.js +1 -1
- package/.next/server/chunks/3241.js +1 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3451.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/406.js +10 -6
- package/.next/server/chunks/4393.js +1 -0
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/4455.js +1 -0
- package/.next/server/chunks/5164.js +1 -0
- package/.next/server/chunks/5959.js +5 -6
- package/.next/server/chunks/5998.js +2 -13
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6159.js +1 -1
- package/.next/server/chunks/6274.js +3 -3
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -0
- package/.next/server/chunks/7458.js +6 -0
- package/.next/server/chunks/{3753.js → 7970.js} +57 -32
- package/.next/server/chunks/8536.js +1 -1
- package/.next/server/chunks/880.js +21 -0
- package/.next/server/chunks/8807.js +250 -192
- package/.next/server/chunks/9058.js +1 -1
- package/.next/server/chunks/9067.js +1 -1
- package/.next/server/chunks/9123.js +8 -8
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9360.js +1 -1
- package/.next/server/chunks/9373.js +3 -3
- package/.next/server/chunks/9687.js +2 -2
- 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/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/4322-dfd5a7119b5ba4fc.js +1 -0
- package/.next/static/chunks/{4974-eaf66770bfa9dea0.js → 4974-35592ec312322124.js} +1 -1
- package/.next/static/chunks/5229-0610b4e3288e777d.js +1 -0
- package/.next/static/chunks/6381-18a6a02a94d00d76.js +1 -0
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
- package/.next/static/chunks/{744-fa8c0ae444c8338c.js → 744-3ad06d8c8ca482fc.js} +1 -1
- package/.next/static/chunks/app/api/app/update/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/app/update-check/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/conversation/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/current-output/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
- package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/chat/page-15d13fc024d78f5d.js +1 -0
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/more/page-b8ba537baeac8d5b.js +1 -0
- package/.next/static/chunks/app/page-afc64708362f31e5.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/repositories/page-3469dacb6be7842f.js +1 -0
- package/.next/static/chunks/app/review/page-2d9cb7e068f8f35a.js +1 -0
- package/.next/static/chunks/app/sessions/page-7470c2bfd89e0df9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-5e24481162f7ea78.js +1 -0
- package/.next/static/chunks/app/skills/installed/page-efd2d710a27f9735.js +1 -0
- package/.next/static/chunks/app/skills/page-0498adfc6e48684b.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9ddcb224594f620f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e611d30e47989e5d.js +1 -0
- package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-3534d858912a6c92.js} +1 -1
- package/.next/static/css/3ac44cfc082d02ad.css +1 -0
- package/.next/static/smu4mnL7qMf8w38n9dQJE/_buildManifest.js +1 -0
- package/.next/trace +12 -12
- package/.next/types/app/api/push/escalation/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +6 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +19 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +6 -0
- package/dist/cli/commands/verify.js +6 -1
- package/dist/cli/types/api-responses.d.ts +46 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +17 -1
- package/dist/server/locales/en/notifications.json +20 -1
- package/dist/server/locales/ja/notifications.json +20 -1
- package/dist/server/server.js +23 -0
- package/dist/server/src/config/log-config.js +10 -1
- package/dist/server/src/config/safe-directory.js +103 -0
- package/dist/server/src/config/system-directories.js +74 -9
- package/dist/server/src/lib/cli-tools/antigravity.js +19 -2
- package/dist/server/src/lib/cli-tools/codex.js +95 -1
- package/dist/server/src/lib/cli-tools/copilot.js +30 -1
- package/dist/server/src/lib/cli-tools/gemini.js +28 -2
- package/dist/server/src/lib/cli-tools/opencode.js +51 -2
- package/dist/server/src/lib/db/db.js +2 -1
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v56-gate-result-source.js +58 -0
- package/dist/server/src/lib/db/verification-db.js +26 -6
- package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
- package/dist/server/src/lib/git/git-default-branch.js +59 -0
- package/dist/server/src/lib/hooks/agent-event-service.js +205 -0
- package/dist/server/src/lib/hooks/agent-event-types.js +7 -86
- package/dist/server/src/lib/hooks/hook-settings-generator.js +26 -11
- package/dist/server/src/lib/hooks/permission-decision-service.js +269 -0
- package/dist/server/src/lib/hooks/sources/abstain.js +78 -0
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +372 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +229 -0
- package/dist/server/src/lib/hooks/sources/antigravity/tool-id.js +16 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +150 -0
- package/dist/server/src/lib/hooks/sources/claude/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +465 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +143 -0
- package/dist/server/src/lib/hooks/sources/codex/tool-id.js +15 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +473 -0
- package/dist/server/src/lib/hooks/sources/copilot/source.js +210 -0
- package/dist/server/src/lib/hooks/sources/copilot/tool-id.js +15 -0
- package/dist/server/src/lib/hooks/sources/define-source.js +177 -0
- package/dist/server/src/lib/hooks/sources/event-mapper.js +177 -0
- package/dist/server/src/lib/hooks/sources/gemini/event-vocabulary.js +102 -0
- package/dist/server/src/lib/hooks/sources/gemini/settings-generator.js +315 -0
- package/dist/server/src/lib/hooks/sources/gemini/shared-config-tree.js +103 -0
- package/dist/server/src/lib/hooks/sources/gemini/source.js +151 -0
- package/dist/server/src/lib/hooks/sources/gemini/tool-id.js +17 -0
- package/dist/server/src/lib/hooks/sources/hook-event-vocabulary.js +111 -0
- package/dist/server/src/lib/hooks/sources/index.js +62 -0
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +84 -0
- package/dist/server/src/lib/hooks/sources/opencode/client.js +299 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +267 -0
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +176 -0
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +189 -0
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +295 -0
- package/dist/server/src/lib/hooks/sources/opencode/runtime.js +159 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +253 -0
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +422 -0
- package/dist/server/src/lib/hooks/sources/opencode/tool-id.js +14 -0
- package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +193 -0
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +127 -0
- package/dist/server/src/lib/hooks/sources/registry.js +111 -0
- package/dist/server/src/lib/hooks/sources/types.js +46 -0
- package/dist/server/src/lib/polling/response-checker.js +47 -0
- package/dist/server/src/lib/push/escalation-settings.js +114 -0
- package/dist/server/src/lib/push/index.js +21 -1
- package/dist/server/src/lib/push/notification-dedup.js +35 -0
- package/dist/server/src/lib/push/push-sender.js +66 -7
- package/dist/server/src/lib/push/waiting-push-notifier.js +231 -0
- package/dist/server/src/lib/realtime/waiting-broadcast.js +93 -0
- package/dist/server/src/lib/session/agent-event-state.js +260 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +82 -0
- package/dist/server/src/lib/session/claude-session.js +10 -3
- package/dist/server/src/lib/session/current-output-builder.js +24 -0
- package/dist/server/src/lib/session/next-action-helper.js +93 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +38 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +136 -0
- package/dist/server/src/lib/session/waiting-kind.js +59 -0
- package/dist/server/src/lib/tasks/contract-message.js +218 -0
- package/dist/server/src/lib/tasks/contract-parser.js +58 -12
- package/dist/server/src/lib/verification/env-clean-gate.js +320 -0
- package/dist/server/src/lib/verification/env-snapshot.js +474 -0
- package/dist/server/src/lib/verification/gate-runner.js +844 -0
- package/dist/server/src/lib/verification/scope-gate.js +402 -0
- package/dist/server/src/lib/verification/verify-config.js +314 -0
- package/dist/server/src/lib/ws-server.js +9 -0
- package/dist/server/src/types/sidebar.js +68 -0
- package/package.json +1 -1
- package/scripts/hooks/cmate-agent-event.sh +73 -3
- package/.next/server/chunks/6283.js +0 -1
- package/.next/server/chunks/646.js +0 -21
- package/.next/server/chunks/8856.js +0 -4
- package/.next/static/XpKfn5x6H-mtTaXI9yNmb/_buildManifest.js +0 -1
- package/.next/static/chunks/4560-0917ae2e6a0e5400.js +0 -1
- package/.next/static/chunks/6488-53a3e1d78e4fe8f7.js +0 -1
- package/.next/static/chunks/7229.edb331fb9fbafa27.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/skills/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/templates/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +0 -1
- package/.next/static/chunks/app/layout-86574192bd3c0e6b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/more/page-1619018cac999bbc.js +0 -1
- package/.next/static/chunks/app/page-a34d26812f085b6c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +0 -1
- package/.next/static/chunks/app/review/page-b559bfb11c46931b.js +0 -1
- package/.next/static/chunks/app/sessions/page-3fa7e767d0ab3889.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +0 -1
- package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +0 -1
- package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-6041d3c3db326317.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-973ec48531555712.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-6dc0b8c4e808ea3e.js +0 -1
- package/.next/static/css/d3453a6876553d32.css +0 -1
- /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → smu4mnL7qMf8w38n9dQJE}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code's {@link AgentEventSource} — the first implementation of the
|
|
4
|
+
* Issue #1759 abstraction, and the one that has to keep behaving exactly as it
|
|
5
|
+
* did before the abstraction existed.
|
|
6
|
+
*
|
|
7
|
+
* Everything here was already in the codebase; what changed is where it lives.
|
|
8
|
+
* The event-name table and the subtype extraction came out of
|
|
9
|
+
* `agent-event-types` (S1/S2), the verdict shape out of the permission receiver
|
|
10
|
+
* (S6), the payload parsers were already their own modules (S7), and the
|
|
11
|
+
* settings/launch generation stays in `hook-settings-generator` and is reached
|
|
12
|
+
* through {@link prepareLaunch} (S3/S4/S5). No spelling, no field name and no
|
|
13
|
+
* emitted byte is different from before — `buildAgentHookSettings` is untouched
|
|
14
|
+
* and the receiver's decision body is produced by the same code path.
|
|
15
|
+
*
|
|
16
|
+
* ## Why the values below are what they are
|
|
17
|
+
*
|
|
18
|
+
* - `noDecision: 'proceeds'` — measured, not assumed. #1721 D5 drove a live
|
|
19
|
+
* session with a hook that answered `{}` and watched the ordinary TUI
|
|
20
|
+
* approval dialog appear, indistinguishable from a machine with no hook at
|
|
21
|
+
* all. This is what makes "when in doubt, abstain" a safe rule *for Claude*;
|
|
22
|
+
* it is not a safe rule for antigravity or opencode (C3).
|
|
23
|
+
* - `configScope: 'per-instance'` — `--settings <file>` is per launch, so
|
|
24
|
+
* `claude` and `claude-2` in one worktree get different files with different
|
|
25
|
+
* correlation keys baked into the URLs. Most tools cannot do this;
|
|
26
|
+
* antigravity reads one global file and nothing else (#1757 P8).
|
|
27
|
+
* - `decisionTimeoutSeconds` — `PERMISSION_REQUEST_TIMEOUT_SECONDS`, the number
|
|
28
|
+
* the generator writes into the hook. copilot's equivalent is ≈10s and
|
|
29
|
+
* codex's 600s, which is why the number is a capability rather than a
|
|
30
|
+
* constant somebody reads once.
|
|
31
|
+
*
|
|
32
|
+
* @module lib/hooks/sources/claude/source
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.claudeAgentEventSource = void 0;
|
|
36
|
+
exports.encodeClaudeVerdict = encodeClaudeVerdict;
|
|
37
|
+
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
38
|
+
const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
|
|
39
|
+
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
40
|
+
const permission_request_payload_1 = require("../../../../lib/hooks/permission-request-payload");
|
|
41
|
+
const define_source_1 = require("../define-source");
|
|
42
|
+
const event_mapper_1 = require("../event-mapper");
|
|
43
|
+
const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
|
|
44
|
+
const tool_id_1 = require("./tool-id");
|
|
45
|
+
/**
|
|
46
|
+
* The no-decision body, byte for byte what the #1721 spike returned for D5.
|
|
47
|
+
*
|
|
48
|
+
* Empty is not "an error we swallowed": it is the documented way to say
|
|
49
|
+
* "CommandMate has no opinion", and Claude responds to it by doing what it
|
|
50
|
+
* would have done with no hook installed.
|
|
51
|
+
*/
|
|
52
|
+
const NO_DECISION_BODY = {};
|
|
53
|
+
/**
|
|
54
|
+
* Encode a verdict the way §5.4 of the verification report measured Claude
|
|
55
|
+
* obeying (S6).
|
|
56
|
+
*
|
|
57
|
+
* `hookEventName` is required alongside `decision`; without it the body is
|
|
58
|
+
* ignored in silence.
|
|
59
|
+
*
|
|
60
|
+
* Three of the five verdicts collapse to no-decision, and that is the design
|
|
61
|
+
* rather than a gap:
|
|
62
|
+
*
|
|
63
|
+
* - `allowAlways` has no Claude spelling. `permission_suggestions` offers
|
|
64
|
+
* `addRules` candidates, but writing a persistent rule from a hook is a
|
|
65
|
+
* different and much larger promise than approving one call, so this source
|
|
66
|
+
* declines instead of approximating.
|
|
67
|
+
* - `deny` is never emitted at all. `lib/hooks/permission-decision-service`
|
|
68
|
+
* explains why: a denial from Auto-Yes takes the choice away from the human
|
|
69
|
+
* in the direction that cannot be undone by waiting, and every case that
|
|
70
|
+
* wants one is better served by letting the dialog appear.
|
|
71
|
+
* - `answer` belongs to `AskUserQuestion`, whose picker is drawn regardless of
|
|
72
|
+
* what a `PermissionRequest` hook says (#1721 §5.6) — answering here would
|
|
73
|
+
* be answering a question the human is about to be shown anyway.
|
|
74
|
+
*/
|
|
75
|
+
function encodeClaudeVerdict(verdict) {
|
|
76
|
+
if (verdict.kind !== 'allowOnce')
|
|
77
|
+
return NO_DECISION_BODY;
|
|
78
|
+
return {
|
|
79
|
+
hookSpecificOutput: {
|
|
80
|
+
hookEventName: permission_request_payload_1.PERMISSION_REQUEST_EVENT_NAME,
|
|
81
|
+
decision: { behavior: 'allow' },
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Claude Code as an event source.
|
|
87
|
+
*
|
|
88
|
+
* Registered in `../registry`. Nothing outside this directory imports it by
|
|
89
|
+
* name; callers ask the registry for the tool they are holding.
|
|
90
|
+
*/
|
|
91
|
+
exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
92
|
+
cliToolId: tool_id_1.CLAUDE_CLI_TOOL_ID,
|
|
93
|
+
// #1721 D5: an unanswered or empty `PermissionRequest` lands in the ordinary
|
|
94
|
+
// approval flow. Abstaining is free here — and only here plus codex/copilot.
|
|
95
|
+
noDecision: { kind: 'proceeds' },
|
|
96
|
+
capabilities: {
|
|
97
|
+
// Claude is the one tool that emits all seven (#1757 §8.1). It is still not
|
|
98
|
+
// a licence to treat `session_end` as "the process exited": `/clear` emits
|
|
99
|
+
// one too, with `reason: "clear"`, and the pane keeps running.
|
|
100
|
+
supportedEvents: agent_event_types_1.AGENT_EVENT_TYPES,
|
|
101
|
+
configScope: 'per-instance',
|
|
102
|
+
decisionTimeoutSeconds: hook_settings_generator_1.PERMISSION_REQUEST_TIMEOUT_SECONDS,
|
|
103
|
+
},
|
|
104
|
+
// S1. A plain name table is enough *for this tool* — one native name, one
|
|
105
|
+
// word, no predicates — so it is expressed as rules built from the table
|
|
106
|
+
// rather than as a table, and a source that needs conditions (opencode) adds
|
|
107
|
+
// them to the same list.
|
|
108
|
+
mappers: (0, event_mapper_1.fromNameTable)(hook_event_vocabulary_1.CAMEL_CASE_HOOK_EVENT_NAMES),
|
|
109
|
+
nativeEventNameFields: ['hook_event_name'],
|
|
110
|
+
conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
|
|
111
|
+
toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
|
|
112
|
+
// Issue #1783. Claude sends it on `SessionStart` and nowhere else — checked
|
|
113
|
+
// against every fixture in `tests/fixtures/hooks/claude/`, where only
|
|
114
|
+
// `session-start.json` carries the key. So the value has to be *remembered*
|
|
115
|
+
// rather than read off the newest event; `getLastKnownAgentModel` is what
|
|
116
|
+
// does that. The value arrives with its own suffix (`claude-opus-5[1m]`) and
|
|
117
|
+
// is not parsed here: a display string the tool chose is the tool's to spell.
|
|
118
|
+
modelFields: ['model'],
|
|
119
|
+
// S2.
|
|
120
|
+
extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
|
|
121
|
+
// S7. Both parsers are strict and answer null for anything they cannot vouch
|
|
122
|
+
// for; the callers turn null into "no structured data", which degrades to the
|
|
123
|
+
// behaviour of a machine without hooks rather than into a guess.
|
|
124
|
+
parsePermissionRequest: (payload) => (0, permission_request_payload_1.parsePermissionRequestPayload)(payload),
|
|
125
|
+
parseQuestion: (payload) => (0, ask_user_question_payload_1.parseAskUserQuestionPayload)(payload),
|
|
126
|
+
// S6.
|
|
127
|
+
encodeVerdict: encodeClaudeVerdict,
|
|
128
|
+
// S3 / S4 / S5. Delegated rather than reimplemented: `buildClaudeLaunchCommand`
|
|
129
|
+
// writes the settings file, falls back to the bare path on any failure, and is
|
|
130
|
+
// covered byte-for-byte by `tests/unit/hooks/hook-settings-generator.test.ts`.
|
|
131
|
+
prepareLaunch: (target, executablePath) => {
|
|
132
|
+
const command = (0, hook_settings_generator_1.buildClaudeLaunchCommand)(executablePath, {
|
|
133
|
+
worktreeId: target.worktreeId,
|
|
134
|
+
instanceId: target.instanceId,
|
|
135
|
+
cliToolId: target.cliToolId,
|
|
136
|
+
});
|
|
137
|
+
// The path is reported only when the command actually names it. Injection
|
|
138
|
+
// can be switched off (`CM_AGENT_HOOKS_INJECT=0`) or fail to write, and both
|
|
139
|
+
// return the bare executable — claiming a settings file in that case would
|
|
140
|
+
// be telling the caller about a file that is not there.
|
|
141
|
+
const settingsPath = (0, hook_settings_generator_1.isHookInjectionEnabled)() && command !== executablePath
|
|
142
|
+
? (0, hook_settings_generator_1.getHookSettingsPath)({
|
|
143
|
+
worktreeId: target.worktreeId,
|
|
144
|
+
instanceId: target.instanceId,
|
|
145
|
+
cliToolId: target.cliToolId,
|
|
146
|
+
})
|
|
147
|
+
: null;
|
|
148
|
+
return { command, settingsPath };
|
|
149
|
+
},
|
|
150
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code's {@link CLIToolType} id, as a constant.
|
|
4
|
+
*
|
|
5
|
+
* A one-line module so that the literal `'claude'` appears in exactly one place
|
|
6
|
+
* under `src/lib/hooks/`. `hook-settings-generator` defaults its target to this
|
|
7
|
+
* tool, which is correct — it generates Claude's `--settings` file and nothing
|
|
8
|
+
* else — but a bare literal there reads as "this layer knows about Claude",
|
|
9
|
+
* which after Issue #1759 it must not.
|
|
10
|
+
*
|
|
11
|
+
* Separate from `./source` because that module imports the settings generator;
|
|
12
|
+
* importing the constant back out of it would close a cycle.
|
|
13
|
+
*
|
|
14
|
+
* @module lib/hooks/sources/claude/tool-id
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.CLAUDE_CLI_TOOL_ID = void 0;
|
|
18
|
+
exports.CLAUDE_CLI_TOOL_ID = 'claude';
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* codex's `hooks.json`, and the command line that gives one session its
|
|
4
|
+
* correlation keys (Issue #1760, seams S3/S4/S5 for codex).
|
|
5
|
+
*
|
|
6
|
+
* Claude's equivalent is `lib/hooks/hook-settings-generator`, and the two look
|
|
7
|
+
* nothing alike because codex's hook system differs from Claude's in four ways
|
|
8
|
+
* that were all measured on codex-cli **0.147.0** rather than read out of a
|
|
9
|
+
* document. Each one removes an option Claude has:
|
|
10
|
+
*
|
|
11
|
+
* 1. **There is no `--settings`.** codex reads `$CODEX_HOME/hooks.json` and
|
|
12
|
+
* `<cwd>/.codex/hooks.json` and nothing else — no per-launch file, no
|
|
13
|
+
* `--config` pointing at one (#1757 §5.1.2; `hooks.managed_dir` exists as a
|
|
14
|
+
* key and fired zero times). So the file cannot carry a worktree id or an
|
|
15
|
+
* instance id the way Claude's does: whatever is written is shared by every
|
|
16
|
+
* codex session on the machine.
|
|
17
|
+
* 2. **`type: "http"` destroys the file.** One `http` handler and codex
|
|
18
|
+
* discards the whole of `hooks.json` — every `command` hook with it — after
|
|
19
|
+
* printing one line to stderr that the TUI never shows (#1757 §5.1.4). The
|
|
20
|
+
* only delivery mechanism is `type: "command"`.
|
|
21
|
+
* 3. **A hook command runs through a shell.** Measured directly for this Issue
|
|
22
|
+
* against 0.147.0: `$VAR` expands, `"…"` and `'…'` group, `${VAR:+…}`
|
|
23
|
+
* works, `&` inside quotes is literal, and a `#` comment is ignored. The
|
|
24
|
+
* hook process also inherits the environment of the shell that started
|
|
25
|
+
* codex. **That is what makes point 1 survivable**: the file stays static
|
|
26
|
+
* and the per-session keys travel in environment variables set on the
|
|
27
|
+
* launch line, so `codex` and `codex-2` in one worktree report as
|
|
28
|
+
* themselves. Verified live — a session launched with
|
|
29
|
+
* `CM_AGENT_INSTANCE_ID=codex-2` posted `instanceId: "codex-2"`.
|
|
30
|
+
* 4. **Hooks do not run until a human trusts them.** Trust is recorded in the
|
|
31
|
+
* user's own `~/.codex/config.toml` as
|
|
32
|
+
* `[hooks.state."<file>:<event>:0:0"] trusted_hash`, and an untrusted hook
|
|
33
|
+
* is skipped in complete silence (#1757 P4). CommandMate does not write
|
|
34
|
+
* that file — see {@link isCodexHookTrustBypassEnabled} for the whole of
|
|
35
|
+
* the reasoning, and `docs/design/agent-event-source-interface.md`.
|
|
36
|
+
*
|
|
37
|
+
* ## Why `$CODEX_HOME/hooks.json` and not `<worktree>/.codex/hooks.json`
|
|
38
|
+
*
|
|
39
|
+
* Both fire. The worktree-local file was rejected for two reasons: it is inside
|
|
40
|
+
* a git checkout, so every worktree grows an untracked `.codex/` that shows up
|
|
41
|
+
* in the Changes view and that an agent running `git add -A` can commit; and
|
|
42
|
+
* trust is keyed by absolute path, so a per-worktree file means the human
|
|
43
|
+
* re-answers the review dialog once per worktree, forever. The single file is
|
|
44
|
+
* byte-identical for every worktree and every instance, which makes trust a
|
|
45
|
+
* one-time act and makes a rewrite a no-op — {@link writeCodexHookSettings}
|
|
46
|
+
* leaves the file untouched when the content already matches.
|
|
47
|
+
*
|
|
48
|
+
* The cost is that the file is shared with codex sessions CommandMate did not
|
|
49
|
+
* start. Those post too, with the environment variables unset; the relay omits
|
|
50
|
+
* the correlation keys it does not have and the receiver falls back to
|
|
51
|
+
* resolving the worktree from `cwd`, which is exactly the hand-configured
|
|
52
|
+
* behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off.
|
|
53
|
+
*
|
|
54
|
+
* @module lib/hooks/sources/codex/hooks-config
|
|
55
|
+
*/
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.CODEX_SUPPORTED_EVENTS = exports.CODEX_PERMISSION_REQUEST_EVENT = exports.CODEX_REGISTERED_EVENTS = exports.CODEX_SESSION_END_TIMEOUT_SECONDS = exports.CODEX_HOOK_TRUST_BYPASS_FLAG = exports.CODEX_HOOK_TRUST_ENV_VAR = exports.CODEX_PERMISSION_URL_ENV_VAR = exports.CODEX_EVENT_URL_ENV_VAR = exports.CODEX_INSTANCE_ID_ENV_VAR = exports.CODEX_WORKTREE_ID_ENV_VAR = exports.CODEX_TOOL_ENV_VAR = exports.CODEX_HOME_ENV_VAR = exports.CODEX_HOOK_MARKER = void 0;
|
|
58
|
+
exports.isCodexHookTrustBypassEnabled = isCodexHookTrustBypassEnabled;
|
|
59
|
+
exports.getCodexHome = getCodexHome;
|
|
60
|
+
exports.getCodexHooksPath = getCodexHooksPath;
|
|
61
|
+
exports.buildCodexEventHookCommand = buildCodexEventHookCommand;
|
|
62
|
+
exports.buildCodexPermissionHookCommand = buildCodexPermissionHookCommand;
|
|
63
|
+
exports.buildCodexHookSettings = buildCodexHookSettings;
|
|
64
|
+
exports.mergeCodexHookSettings = mergeCodexHookSettings;
|
|
65
|
+
exports.writeCodexHookSettings = writeCodexHookSettings;
|
|
66
|
+
exports.buildCodexLaunchCommand = buildCodexLaunchCommand;
|
|
67
|
+
const fs_1 = require("fs");
|
|
68
|
+
const os_1 = require("os");
|
|
69
|
+
const path_1 = require("path");
|
|
70
|
+
const safe_directory_1 = require("../../../../config/safe-directory");
|
|
71
|
+
const types_1 = require("../../../../lib/cli-tools/types");
|
|
72
|
+
const env_1 = require("../../../../lib/env");
|
|
73
|
+
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
74
|
+
const logger_1 = require("../../../../lib/logger");
|
|
75
|
+
const path_validator_1 = require("../../../../lib/security/path-validator");
|
|
76
|
+
const event_mapper_1 = require("../event-mapper");
|
|
77
|
+
const tool_id_1 = require("./tool-id");
|
|
78
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/sources/codex/hooks-config');
|
|
79
|
+
/** Loopback: the agent runs on the machine the server runs on. */
|
|
80
|
+
const CODEX_HOOK_HOST = '127.0.0.1';
|
|
81
|
+
/**
|
|
82
|
+
* Marks a handler as this server's, so a rewrite replaces CommandMate's entries
|
|
83
|
+
* and leaves the operator's alone.
|
|
84
|
+
*
|
|
85
|
+
* Spelled as a trailing shell comment rather than as an extra JSON field
|
|
86
|
+
* because codex's config parser rejects what it does not know — an unknown
|
|
87
|
+
* `type` takes the entire file down (#1757 §5.1.4), and an unknown key is not
|
|
88
|
+
* worth finding out about the same way. Measured: a hook whose command ends
|
|
89
|
+
* `… # commandmate:agent-hooks` runs and receives its arguments unchanged.
|
|
90
|
+
*/
|
|
91
|
+
exports.CODEX_HOOK_MARKER = 'commandmate:agent-hooks';
|
|
92
|
+
/** `$CODEX_HOME` — codex's own override, honoured so a sandboxed codex stays sandboxed. */
|
|
93
|
+
exports.CODEX_HOME_ENV_VAR = 'CODEX_HOME';
|
|
94
|
+
/** Relay defaults to this tool when the hook does not pass `--tool`. */
|
|
95
|
+
exports.CODEX_TOOL_ENV_VAR = 'CM_AGENT_TOOL';
|
|
96
|
+
/** Correlation key: which worktree this codex process belongs to. */
|
|
97
|
+
exports.CODEX_WORKTREE_ID_ENV_VAR = 'CM_AGENT_WORKTREE_ID';
|
|
98
|
+
/**
|
|
99
|
+
* Correlation key: which instance.
|
|
100
|
+
*
|
|
101
|
+
* The whole of the answer to "`codex` and `codex-2` run in the same directory".
|
|
102
|
+
* `cwd` cannot tell them apart and neither can `session_id`; the environment of
|
|
103
|
+
* the process can, because CommandMate is the one that starts it.
|
|
104
|
+
*/
|
|
105
|
+
exports.CODEX_INSTANCE_ID_ENV_VAR = 'CM_AGENT_INSTANCE_ID';
|
|
106
|
+
/** Event receiver URL. Already the relay script's own environment override. */
|
|
107
|
+
exports.CODEX_EVENT_URL_ENV_VAR = 'CM_HOOK_URL';
|
|
108
|
+
/** Auto-Yes v2 receiver URL, with the correlation keys already in its query. */
|
|
109
|
+
exports.CODEX_PERMISSION_URL_ENV_VAR = 'CM_PERMISSION_HOOK_URL';
|
|
110
|
+
/** Opt-in switch for {@link CODEX_HOOK_TRUST_BYPASS_FLAG}; `bypass` is the only value that acts. */
|
|
111
|
+
exports.CODEX_HOOK_TRUST_ENV_VAR = 'CM_CODEX_HOOK_TRUST';
|
|
112
|
+
/** codex's own flag for running unreviewed hooks, for one invocation. */
|
|
113
|
+
exports.CODEX_HOOK_TRUST_BYPASS_FLAG = '--dangerously-bypass-hook-trust';
|
|
114
|
+
/**
|
|
115
|
+
* `SessionEnd`'s budget, in seconds.
|
|
116
|
+
*
|
|
117
|
+
* Not a preference: codex clamps this hook to 3 s and says so in the TUI
|
|
118
|
+
* (`⚠ clamping SessionEnd hook timeout to 3s in …/hooks.json`), measured on
|
|
119
|
+
* 0.147.0. Writing {@link HOOK_TIMEOUT_SECONDS} here would put a warning banner
|
|
120
|
+
* above every session for a value codex was going to ignore.
|
|
121
|
+
*/
|
|
122
|
+
exports.CODEX_SESSION_END_TIMEOUT_SECONDS = 3;
|
|
123
|
+
/**
|
|
124
|
+
* The events CommandMate registers, and the word each maps to.
|
|
125
|
+
*
|
|
126
|
+
* Four of codex's eleven. What is deliberately absent matters more than what is
|
|
127
|
+
* here:
|
|
128
|
+
*
|
|
129
|
+
* - **`Notification` does not exist on codex** (#1757 §5.1.1: the review screen
|
|
130
|
+
* enumerates eleven events and it is not among them). Writing one is
|
|
131
|
+
* discarded in silence.
|
|
132
|
+
* - **`PreToolUse` / `PostToolUse` are not registered**, though they do fire.
|
|
133
|
+
* Claude registers them for the single matcher `AskUserQuestion` (#1726)
|
|
134
|
+
* because that tool's arguments *are* the question a human has to answer.
|
|
135
|
+
* codex has no such tool, so the only thing registering them would buy is
|
|
136
|
+
* two POSTs per tool call — on a session that greps in a loop, two requests
|
|
137
|
+
* per `Read`, each of which the agent waits for. `capabilities.supportedEvents`
|
|
138
|
+
* says so, so nothing above waits for a word that cannot arrive.
|
|
139
|
+
* - **`PermissionRequest` is not here** because it is not an observation: its
|
|
140
|
+
* response body is a decision codex obeys, so it goes to its own receiver
|
|
141
|
+
* through {@link buildCodexPermissionHookCommand}.
|
|
142
|
+
*/
|
|
143
|
+
exports.CODEX_REGISTERED_EVENTS = {
|
|
144
|
+
SessionStart: 'session_start',
|
|
145
|
+
UserPromptSubmit: 'user_prompt_submit',
|
|
146
|
+
Stop: 'stop',
|
|
147
|
+
SessionEnd: 'session_end',
|
|
148
|
+
};
|
|
149
|
+
/** codex's spelling of the event whose reply is a verdict (#1757 §5.1.6). */
|
|
150
|
+
exports.CODEX_PERMISSION_REQUEST_EVENT = 'PermissionRequest';
|
|
151
|
+
/** The four words a codex session can actually produce, given the config above. */
|
|
152
|
+
exports.CODEX_SUPPORTED_EVENTS = Object.values(exports.CODEX_REGISTERED_EVENTS);
|
|
153
|
+
/**
|
|
154
|
+
* Whether to launch codex with {@link CODEX_HOOK_TRUST_BYPASS_FLAG}.
|
|
155
|
+
*
|
|
156
|
+
* **Off by default, and the default is the security decision.** The flag
|
|
157
|
+
* disables review for *every* hook the invocation can see, which includes
|
|
158
|
+
* `<cwd>/.codex/hooks.json` — a file that lives inside the repository being
|
|
159
|
+
* worked on. Turning it on by default would mean that cloning a hostile
|
|
160
|
+
* repository and opening it in CommandMate runs whatever that repository put in
|
|
161
|
+
* `.codex/hooks.json`, with no dialog, defeating the exact mechanism codex
|
|
162
|
+
* built to prevent it. A structured `Stop` event is not worth that.
|
|
163
|
+
*
|
|
164
|
+
* So the default posture is: CommandMate writes the config and never grants the
|
|
165
|
+
* trust. The human grants it once, through codex's own review screen, which is
|
|
166
|
+
* also the only thing that may write `~/.codex/config.toml` — a file this
|
|
167
|
+
* server never touches (it holds, among other things, the `notify` entry a
|
|
168
|
+
* user's Computer Use integration depends on). Until then the hooks are inert,
|
|
169
|
+
* the screen scraper keeps doing what it did before this Issue, and
|
|
170
|
+
* `cli-tools/codex` dismisses the review dialog so a session still starts.
|
|
171
|
+
*
|
|
172
|
+
* `CM_CODEX_HOOK_TRUST=bypass` exists for headless and CI operators who have
|
|
173
|
+
* weighed that trade for themselves.
|
|
174
|
+
*/
|
|
175
|
+
function isCodexHookTrustBypassEnabled() {
|
|
176
|
+
return process.env[exports.CODEX_HOOK_TRUST_ENV_VAR] === 'bypass';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `$CODEX_HOME`, or `~/.codex`.
|
|
180
|
+
*
|
|
181
|
+
* Issue #1774: `writeCodexHookSettings` creates this directory with a recursive
|
|
182
|
+
* mkdir, which does not fail but *hangs* for a path inside `/proc`, `/sys` or
|
|
183
|
+
* `/dev`. Such a value is refused here and `~/.codex` is used instead.
|
|
184
|
+
*/
|
|
185
|
+
function getCodexHome(options = {}) {
|
|
186
|
+
const fallback = (0, path_1.join)((0, os_1.homedir)(), '.codex');
|
|
187
|
+
if (options.codexHome) {
|
|
188
|
+
return (0, safe_directory_1.resolveSafeDirectory)(options.codexHome, fallback, 'CodexHookOptions.codexHome');
|
|
189
|
+
}
|
|
190
|
+
return (0, safe_directory_1.resolveSafeDirectory)(process.env[exports.CODEX_HOME_ENV_VAR], fallback, exports.CODEX_HOME_ENV_VAR);
|
|
191
|
+
}
|
|
192
|
+
/** Absolute path of the hooks file codex reads. */
|
|
193
|
+
function getCodexHooksPath(options = {}) {
|
|
194
|
+
return (0, path_1.join)(getCodexHome(options), 'hooks.json');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Receiver URL for a manually launched codex, as a shell expansion.
|
|
198
|
+
*
|
|
199
|
+
* Every session CommandMate starts has the variable set, so this default is
|
|
200
|
+
* only reached by a codex the operator ran themselves. It mirrors the relay
|
|
201
|
+
* script's own default (`CM_PORT`, else 3000) rather than baking in the port of
|
|
202
|
+
* whichever server happened to write the file — the file is machine-wide and
|
|
203
|
+
* this repository is routinely run as several servers at once.
|
|
204
|
+
*/
|
|
205
|
+
function fallbackUrlExpression(path, query) {
|
|
206
|
+
return `http://${CODEX_HOOK_HOST}:\${CM_PORT:-3000}${path}${query}`;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The command for one lifecycle event.
|
|
210
|
+
*
|
|
211
|
+
* Prefers the shipped relay, which already reads codex's payload from stdin,
|
|
212
|
+
* omits correlation keys it was handed empty, and exits 0 when the POST fails.
|
|
213
|
+
* The inline fallback posts codex's payload verbatim to the same receiver —
|
|
214
|
+
* which reads it, because the source's mappers know `hook_event_name`.
|
|
215
|
+
*/
|
|
216
|
+
function buildCodexEventHookCommand(event, options = {}) {
|
|
217
|
+
const marker = ` # ${exports.CODEX_HOOK_MARKER}`;
|
|
218
|
+
const relay = options.relayScriptPath === undefined ? (0, hook_settings_generator_1.resolveRelayScriptPath)() : options.relayScriptPath;
|
|
219
|
+
if (relay) {
|
|
220
|
+
return ([
|
|
221
|
+
(0, hook_settings_generator_1.shellQuote)(relay),
|
|
222
|
+
'--tool',
|
|
223
|
+
tool_id_1.CODEX_CLI_TOOL_ID,
|
|
224
|
+
'--event',
|
|
225
|
+
event,
|
|
226
|
+
// Quoted so an unset variable is one empty argument rather than none;
|
|
227
|
+
// the relay drops an empty correlation key and falls back to `cwd`.
|
|
228
|
+
'--worktree-id',
|
|
229
|
+
`"$${exports.CODEX_WORKTREE_ID_ENV_VAR}"`,
|
|
230
|
+
'--instance-id',
|
|
231
|
+
`"$${exports.CODEX_INSTANCE_ID_ENV_VAR}"`,
|
|
232
|
+
'--stdin-json',
|
|
233
|
+
].join(' ') + marker);
|
|
234
|
+
}
|
|
235
|
+
const withAuthHeader = options.withAuthHeader ?? (0, hook_settings_generator_1.isAuthTokenExpected)();
|
|
236
|
+
const auth = withAuthHeader ? ` -H "Authorization: Bearer $${hook_settings_generator_1.AUTH_TOKEN_ENV_VAR}"` : '';
|
|
237
|
+
// `${VAR:+&k=$VAR}` so a manually launched codex posts no empty correlation
|
|
238
|
+
// key at all, rather than one the receiver has to reject.
|
|
239
|
+
const url = `"\${${exports.CODEX_EVENT_URL_ENV_VAR}:-${fallbackUrlExpression(hook_settings_generator_1.AGENT_EVENT_PATH, '')}}` +
|
|
240
|
+
`?tool=${tool_id_1.CODEX_CLI_TOOL_ID}` +
|
|
241
|
+
`\${${exports.CODEX_WORKTREE_ID_ENV_VAR}:+&worktreeId=$${exports.CODEX_WORKTREE_ID_ENV_VAR}}` +
|
|
242
|
+
`\${${exports.CODEX_INSTANCE_ID_ENV_VAR}:+&instanceId=$${exports.CODEX_INSTANCE_ID_ENV_VAR}}"`;
|
|
243
|
+
return (`curl -sS -f -m ${hook_settings_generator_1.HOOK_TIMEOUT_SECONDS} -X POST -H 'Content-Type: application/json'${auth} ` +
|
|
244
|
+
`--data-binary @- ${url} >/dev/null 2>&1 || true${marker}`);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* The command for `PermissionRequest`, whose stdout **is** the verdict.
|
|
248
|
+
*
|
|
249
|
+
* Never the relay: that script discards the response body, and the body is the
|
|
250
|
+
* entire point here. `curl` writes what the receiver answers straight to
|
|
251
|
+
* stdout, which is where codex reads a command hook's decision from — measured
|
|
252
|
+
* live for this Issue: an `{"hookSpecificOutput":{…"behavior":"allow"}}` reply
|
|
253
|
+
* ran the command with no dialog, `{}` produced the ordinary approval dialog,
|
|
254
|
+
* and a receiver that was not running produced the same dialog a second later.
|
|
255
|
+
*
|
|
256
|
+
* `-f` so an HTTP error prints nothing, `2>/dev/null` so a connection failure
|
|
257
|
+
* prints nothing, `|| true` so the hook exits 0. All three land on the same
|
|
258
|
+
* behaviour: no output, and codex asks the human — which is what it does with
|
|
259
|
+
* no hook installed at all.
|
|
260
|
+
*/
|
|
261
|
+
function buildCodexPermissionHookCommand(options = {}) {
|
|
262
|
+
const withAuthHeader = options.withAuthHeader ?? (0, hook_settings_generator_1.isAuthTokenExpected)();
|
|
263
|
+
const auth = withAuthHeader ? ` -H "Authorization: Bearer $${hook_settings_generator_1.AUTH_TOKEN_ENV_VAR}"` : '';
|
|
264
|
+
const url = `"\${${exports.CODEX_PERMISSION_URL_ENV_VAR}:-` +
|
|
265
|
+
`${fallbackUrlExpression(hook_settings_generator_1.PERMISSION_REQUEST_PATH, `?tool=${tool_id_1.CODEX_CLI_TOOL_ID}`)}}"`;
|
|
266
|
+
return (`curl -sS -f -m ${hook_settings_generator_1.PERMISSION_REQUEST_TIMEOUT_SECONDS} -X POST ` +
|
|
267
|
+
`-H 'Content-Type: application/json'${auth} --data-binary @- ${url} ` +
|
|
268
|
+
`2>/dev/null || true # ${exports.CODEX_HOOK_MARKER}`);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* The hooks CommandMate contributes.
|
|
272
|
+
*
|
|
273
|
+
* Deterministic and free of per-session values: the same bytes on every
|
|
274
|
+
* worktree, every instance and every server on the machine. That is what makes
|
|
275
|
+
* the human's one-time trust survive a restart — codex keys trust by the hash
|
|
276
|
+
* of the handler, so a file that changed would have to be reviewed again.
|
|
277
|
+
*/
|
|
278
|
+
function buildCodexHookSettings(options = {}) {
|
|
279
|
+
const handler = (event, timeout) => ({
|
|
280
|
+
hooks: [{ type: 'command', command: buildCodexEventHookCommand(event, options), timeout }],
|
|
281
|
+
});
|
|
282
|
+
const hooks = {};
|
|
283
|
+
for (const [nativeName, event] of Object.entries(exports.CODEX_REGISTERED_EVENTS)) {
|
|
284
|
+
const timeout = nativeName === 'SessionEnd' ? exports.CODEX_SESSION_END_TIMEOUT_SECONDS : hook_settings_generator_1.HOOK_TIMEOUT_SECONDS;
|
|
285
|
+
hooks[nativeName] = [handler(event, timeout)];
|
|
286
|
+
}
|
|
287
|
+
hooks[exports.CODEX_PERMISSION_REQUEST_EVENT] = [
|
|
288
|
+
{
|
|
289
|
+
hooks: [
|
|
290
|
+
{
|
|
291
|
+
type: 'command',
|
|
292
|
+
command: buildCodexPermissionHookCommand(options),
|
|
293
|
+
timeout: hook_settings_generator_1.PERMISSION_REQUEST_TIMEOUT_SECONDS,
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
},
|
|
297
|
+
];
|
|
298
|
+
return { hooks };
|
|
299
|
+
}
|
|
300
|
+
/** Whether a handler was written by this server. */
|
|
301
|
+
function isCommandMateHandler(handler) {
|
|
302
|
+
if (!(0, event_mapper_1.isPlainObject)(handler))
|
|
303
|
+
return false;
|
|
304
|
+
return typeof handler.command === 'string' && handler.command.includes(exports.CODEX_HOOK_MARKER);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Drop this server's previous handlers from one event's groups, keeping
|
|
308
|
+
* everything else — including groups that end up empty, which are the
|
|
309
|
+
* operator's to remove.
|
|
310
|
+
*/
|
|
311
|
+
function withoutCommandMateHandlers(groups) {
|
|
312
|
+
return groups
|
|
313
|
+
.map((group) => {
|
|
314
|
+
if (!(0, event_mapper_1.isPlainObject)(group) || !Array.isArray(group.hooks))
|
|
315
|
+
return group;
|
|
316
|
+
const kept = group.hooks.filter((handler) => !isCommandMateHandler(handler));
|
|
317
|
+
if (kept.length === group.hooks.length)
|
|
318
|
+
return group;
|
|
319
|
+
return { ...group, hooks: kept };
|
|
320
|
+
})
|
|
321
|
+
.filter((group) => {
|
|
322
|
+
// A group that held nothing but our handler is ours to remove; one the
|
|
323
|
+
// operator wrote empty is left exactly as found.
|
|
324
|
+
if (!(0, event_mapper_1.isPlainObject)(group) || !Array.isArray(group.hooks))
|
|
325
|
+
return true;
|
|
326
|
+
return group.hooks.length > 0;
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Fold the generated hooks into whatever is already in the file.
|
|
331
|
+
*
|
|
332
|
+
* The file is the operator's, and on most machines it is the *only* place their
|
|
333
|
+
* own codex hooks can live — there is no second file to put them in. So this
|
|
334
|
+
* appends rather than replaces: unrelated events keep their handlers, unrelated
|
|
335
|
+
* top-level keys are carried through untouched, and a handler this server wrote
|
|
336
|
+
* earlier is replaced rather than duplicated.
|
|
337
|
+
*
|
|
338
|
+
* An event whose existing value is not an array is left exactly as it is and
|
|
339
|
+
* gets no handler from us. Overwriting a shape this function does not
|
|
340
|
+
* understand would cost the operator a config it presumably tested.
|
|
341
|
+
*
|
|
342
|
+
* @param existing - The parsed file, or null when there was none
|
|
343
|
+
* @param generated - {@link buildCodexHookSettings}
|
|
344
|
+
* @returns The object to serialise
|
|
345
|
+
*/
|
|
346
|
+
function mergeCodexHookSettings(existing, generated) {
|
|
347
|
+
const base = (0, event_mapper_1.isPlainObject)(existing) ? { ...existing } : {};
|
|
348
|
+
const existingHooks = (0, event_mapper_1.isPlainObject)(base.hooks) ? base.hooks : {};
|
|
349
|
+
const merged = {};
|
|
350
|
+
for (const [event, groups] of Object.entries(existingHooks)) {
|
|
351
|
+
merged[event] = Array.isArray(groups) ? withoutCommandMateHandlers(groups) : groups;
|
|
352
|
+
}
|
|
353
|
+
for (const [event, groups] of Object.entries(generated.hooks)) {
|
|
354
|
+
const current = merged[event];
|
|
355
|
+
if (current !== undefined && !Array.isArray(current))
|
|
356
|
+
continue;
|
|
357
|
+
merged[event] = [...(current ?? []), ...groups];
|
|
358
|
+
}
|
|
359
|
+
base.hooks = merged;
|
|
360
|
+
return base;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Write the hooks file, and answer where it is.
|
|
364
|
+
*
|
|
365
|
+
* Idempotent to the byte: when the merged content already matches, the file is
|
|
366
|
+
* not opened for writing at all, so a machine whose hooks are trusted keeps its
|
|
367
|
+
* mtime and its trust and sees no review dialog on the next launch.
|
|
368
|
+
*
|
|
369
|
+
* @returns The path, or null when the file could not be prepared — which the
|
|
370
|
+
* caller turns into "start codex without hooks", never into a failed launch
|
|
371
|
+
*/
|
|
372
|
+
function writeCodexHookSettings(options = {}) {
|
|
373
|
+
const settingsPath = getCodexHooksPath(options);
|
|
374
|
+
let existing = null;
|
|
375
|
+
let previous = null;
|
|
376
|
+
if ((0, fs_1.existsSync)(settingsPath)) {
|
|
377
|
+
try {
|
|
378
|
+
previous = (0, fs_1.readFileSync)(settingsPath, 'utf8');
|
|
379
|
+
existing = JSON.parse(previous);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
// Someone's file that this server cannot read is someone's file this
|
|
383
|
+
// server must not overwrite. Injection is skipped; the session starts.
|
|
384
|
+
logger.warn('codex-hooks-config-unreadable', {
|
|
385
|
+
settingsPath,
|
|
386
|
+
error: error instanceof Error ? error.message : String(error),
|
|
387
|
+
});
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
const content = `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
|
|
392
|
+
if (previous === content)
|
|
393
|
+
return settingsPath;
|
|
394
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
|
|
395
|
+
(0, fs_1.writeFileSync)(settingsPath, content, { mode: 0o600 });
|
|
396
|
+
return settingsPath;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* The command that starts codex for one instance.
|
|
400
|
+
*
|
|
401
|
+
* Never throws: hooks are an enhancement to a session that has to start anyway,
|
|
402
|
+
* so anything that goes wrong here returns the bare executable — which is
|
|
403
|
+
* byte-for-byte the pre-#1760 launch.
|
|
404
|
+
*
|
|
405
|
+
* The environment assignments are the per-session half of the design. The
|
|
406
|
+
* hooks file cannot hold them (there is one file for the machine), the payload
|
|
407
|
+
* cannot supply them (`cwd` is identical for `codex` and `codex-2`, and
|
|
408
|
+
* `session_id` changes under the instance), and codex injects nothing of its
|
|
409
|
+
* own (#1757 §5.1.7 found no `CLAUDE_PROJECT_DIR` equivalent). What is left is
|
|
410
|
+
* the environment of the process CommandMate starts, which a hook inherits.
|
|
411
|
+
*
|
|
412
|
+
* @param executablePath - Resolved codex CLI path or bare command name
|
|
413
|
+
* @param target - The instance being started
|
|
414
|
+
* @returns `<assignments> <codex>`, or `executablePath` unchanged when
|
|
415
|
+
* injection is off, the ids are unusable, or the file could not be written
|
|
416
|
+
*/
|
|
417
|
+
function buildCodexLaunchCommand(executablePath, target, options = {}) {
|
|
418
|
+
if (!(0, hook_settings_generator_1.isHookInjectionEnabled)())
|
|
419
|
+
return executablePath;
|
|
420
|
+
const instanceId = target.instanceId ?? tool_id_1.CODEX_CLI_TOOL_ID;
|
|
421
|
+
if (!(0, path_validator_1.isValidWorktreeId)(target.worktreeId) || !(0, types_1.isValidInstanceId)(instanceId)) {
|
|
422
|
+
// Both become URL parameters the receiver re-validates; a value that would
|
|
423
|
+
// be rejected there is not worth injecting.
|
|
424
|
+
logger.warn('codex-hooks-invalid-correlation-key', { worktreeId: target.worktreeId });
|
|
425
|
+
return executablePath;
|
|
426
|
+
}
|
|
427
|
+
try {
|
|
428
|
+
const settingsPath = writeCodexHookSettings(options);
|
|
429
|
+
if (!settingsPath)
|
|
430
|
+
return executablePath;
|
|
431
|
+
const port = options.port ?? (0, env_1.getServerPort)();
|
|
432
|
+
const query = new URLSearchParams({
|
|
433
|
+
tool: tool_id_1.CODEX_CLI_TOOL_ID,
|
|
434
|
+
worktreeId: target.worktreeId,
|
|
435
|
+
instanceId,
|
|
436
|
+
});
|
|
437
|
+
const assignments = [
|
|
438
|
+
// Pin the home the file was just written to, rather than trusting the
|
|
439
|
+
// agent to resolve the same one. Measured on 2026-08-13: a tmux session
|
|
440
|
+
// inherits the environment of the *tmux server*, which was started long
|
|
441
|
+
// before CommandMate and knows nothing about its environment — so a
|
|
442
|
+
// server run with `CODEX_HOME=…` wrote its hooks into that directory
|
|
443
|
+
// while the codex it launched read `~/.codex` and found none. No error,
|
|
444
|
+
// no missing file, simply zero events. Naming it here makes "the file we
|
|
445
|
+
// wrote" and "the file codex reads" the same file by construction; in the
|
|
446
|
+
// ordinary case where nothing sets it, this is the default codex would
|
|
447
|
+
// have picked anyway.
|
|
448
|
+
`${exports.CODEX_HOME_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(getCodexHome(options))}`,
|
|
449
|
+
`${exports.CODEX_TOOL_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(tool_id_1.CODEX_CLI_TOOL_ID)}`,
|
|
450
|
+
`${exports.CODEX_WORKTREE_ID_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(target.worktreeId)}`,
|
|
451
|
+
`${exports.CODEX_INSTANCE_ID_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(instanceId)}`,
|
|
452
|
+
`${exports.CODEX_EVENT_URL_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(`http://${CODEX_HOOK_HOST}:${port}${hook_settings_generator_1.AGENT_EVENT_PATH}`)}`,
|
|
453
|
+
`${exports.CODEX_PERMISSION_URL_ENV_VAR}=${(0, hook_settings_generator_1.shellQuote)(`http://${CODEX_HOOK_HOST}:${port}${hook_settings_generator_1.PERMISSION_REQUEST_PATH}?${query.toString()}`)}`,
|
|
454
|
+
];
|
|
455
|
+
const trust = isCodexHookTrustBypassEnabled() ? ` ${exports.CODEX_HOOK_TRUST_BYPASS_FLAG}` : '';
|
|
456
|
+
return `${assignments.join(' ')} ${(0, hook_settings_generator_1.shellQuote)(executablePath)}${trust}`;
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
logger.warn('codex-hooks-config-write-failed', {
|
|
460
|
+
worktreeId: target.worktreeId,
|
|
461
|
+
error: error instanceof Error ? error.message : String(error),
|
|
462
|
+
});
|
|
463
|
+
return executablePath;
|
|
464
|
+
}
|
|
465
|
+
}
|