commandmate 0.22.2 → 0.23.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 +108 -108
- package/.next/app-path-routes-manifest.json +21 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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/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 +3 -3
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +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 +2 -2
- 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 +21 -21
- package/.next/server/chunks/1029.js +1 -1
- package/.next/server/chunks/1068.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/406.js +10 -6
- package/.next/server/chunks/4444.js +1 -1
- package/.next/server/chunks/5959.js +4 -5
- package/.next/server/chunks/5998.js +1 -12
- package/.next/server/chunks/6130.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/8807.js +180 -127
- package/.next/server/chunks/9058.js +1 -1
- package/.next/server/chunks/9067.js +1 -1
- package/.next/server/chunks/9360.js +1 -1
- package/.next/server/chunks/9687.js +2 -2
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{6488-53a3e1d78e4fe8f7.js → 6488-95ba9d24a76f0cc5.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/{page-6dc0b8c4e808ea3e.js → page-966a451ae7b0903a.js} +1 -1
- package/.next/trace +12 -12
- 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/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 +225 -0
- package/dist/server/src/lib/hooks/sources/antigravity/tool-id.js +16 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +143 -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 +138 -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 +169 -0
- package/dist/server/src/lib/hooks/sources/event-mapper.js +157 -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 +261 -0
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +154 -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 +250 -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/session/agent-session-lifecycle.js +82 -0
- package/dist/server/src/lib/session/claude-session.js +10 -3
- package/dist/server/src/lib/tasks/contract-message.js +175 -0
- 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 +802 -0
- package/dist/server/src/lib/verification/scope-gate.js +402 -0
- package/dist/server/src/lib/verification/verify-config.js +281 -0
- package/package.json +1 -1
- package/scripts/hooks/cmate-agent-event.sh +73 -3
- package/.next/server/chunks/8856.js +0 -4
- /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → wH6K6QNPHSdATFkVoIcy3}/_buildManifest.js +0 -0
- /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → wH6K6QNPHSdATFkVoIcy3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Repository default-branch resolution (origin/HEAD).
|
|
4
|
+
* Issue #921: extracted from git-utils.ts (god-module split, P1-a).
|
|
5
|
+
*
|
|
6
|
+
* Shared by reset / deleteBranch / push protection (Issue #783, DR1-001).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DEFAULT_BRANCH_UNRESOLVED = void 0;
|
|
10
|
+
exports.getDefaultBranch = getDefaultBranch;
|
|
11
|
+
exports.resolveDefaultBranchName = resolveDefaultBranchName;
|
|
12
|
+
const git_exec_1 = require("./git-exec");
|
|
13
|
+
/**
|
|
14
|
+
* Sentinel returned by getDefaultBranch when origin/HEAD is UNRESOLVED (the
|
|
15
|
+
* `symbolic-ref` read returned null). DISTINCT from `null` (which means
|
|
16
|
+
* symbolic-ref resolved to a value that is NOT an `origin/` ref). Issue #783,
|
|
17
|
+
* DR1-002: callers must distinguish "unresolved" from "resolved-but-non-origin/"
|
|
18
|
+
* so the reset fallback only fires on TRUE unresolution.
|
|
19
|
+
*/
|
|
20
|
+
exports.DEFAULT_BRANCH_UNRESOLVED = Symbol('default-branch-unresolved');
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the repository default branch name via origin/HEAD (Issue #783,
|
|
23
|
+
* shared by reset / deleteBranch / push protection — DR1-001).
|
|
24
|
+
*
|
|
25
|
+
* Returns THREE distinguishable outcomes (DR1-002 — required for reset's
|
|
26
|
+
* byte-invariance):
|
|
27
|
+
* - string : origin/<name> resolved; returns <name> (e.g. "main")
|
|
28
|
+
* - DEFAULT_BRANCH_UNRESOLVED : symbolic-ref returned null (origin/HEAD unresolved)
|
|
29
|
+
* - null : symbolic-ref returned a value that is NOT an
|
|
30
|
+
* `origin/` ref (unexpected value)
|
|
31
|
+
*
|
|
32
|
+
* Keeping "unresolved" and "resolved-but-non-origin/" separate lets
|
|
33
|
+
* isDefaultBranchForReset's main/master fallback fire ONLY when truly unresolved,
|
|
34
|
+
* preserving the original behavior (a naive `startsWith ? slice : null` would
|
|
35
|
+
* collapse the non-origin/ case into null and wrongly trigger the fallback).
|
|
36
|
+
*/
|
|
37
|
+
async function getDefaultBranch(worktreePath) {
|
|
38
|
+
// DR2-006: execGitCommand returns an already-trimmed string on success / null
|
|
39
|
+
// on failure, so out is trimmed; the out.trim() below is an idempotent (harmless)
|
|
40
|
+
// double-trim. The "trimmed string / null" pair maps cleanly onto the 3 values:
|
|
41
|
+
// UNRESOLVED (out===null) / resolved name (startsWith 'origin/') / non-origin/ (else -> null).
|
|
42
|
+
// Empty-string edge: if symbolic-ref returned '' (non-null), v='' -> startsWith
|
|
43
|
+
// false -> null, matching the original isDefaultBranchForReset behavior.
|
|
44
|
+
const out = await (0, git_exec_1.execGitCommand)(['symbolic-ref', 'refs/remotes/origin/HEAD', '--short'], worktreePath);
|
|
45
|
+
if (out === null)
|
|
46
|
+
return exports.DEFAULT_BRANCH_UNRESOLVED;
|
|
47
|
+
const v = out.trim();
|
|
48
|
+
return v.startsWith('origin/') ? v.slice('origin/'.length) : null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Thin wrapper for callers that only want "the resolved default name, or null
|
|
52
|
+
* when unknown" (Issue #783, DR1-001). Collapses both DEFAULT_BRANCH_UNRESOLVED
|
|
53
|
+
* and the non-origin/ `null` into `null` (= default name unknown). Used by
|
|
54
|
+
* deleteBranch (no fallback) and push protection (null = unprotected).
|
|
55
|
+
*/
|
|
56
|
+
async function resolveDefaultBranchName(worktreePath) {
|
|
57
|
+
const r = await getDefaultBranch(worktreePath);
|
|
58
|
+
return typeof r === 'string' ? r : null;
|
|
59
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effects of a structured agent event (Issue #1549, Phase 3-2).
|
|
4
|
+
*
|
|
5
|
+
* The agent CLI is the only party that knows for certain that it finished a
|
|
6
|
+
* turn. Everything else in this codebase infers it by reading the terminal
|
|
7
|
+
* frame. This module is the first-class path: an event the agent itself sent,
|
|
8
|
+
* turned into a `task_events` row and — when the contract asks for it — a
|
|
9
|
+
* verification run.
|
|
10
|
+
*
|
|
11
|
+
* It does not replace the string analysis. `detectSessionStatus` keeps running
|
|
12
|
+
* and keeps deciding, because a hook only exists when a human wired one up and
|
|
13
|
+
* a completion mechanism that silently does nothing on an unconfigured machine
|
|
14
|
+
* is worse than one that is merely imprecise everywhere.
|
|
15
|
+
*
|
|
16
|
+
* Server-only: touches the filesystem (realpath) and the database.
|
|
17
|
+
*
|
|
18
|
+
* @module lib/hooks/agent-event-service
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.MAX_CWD_LENGTH = exports.isAgentEventType = exports.AGENT_EVENT_TYPES = void 0;
|
|
22
|
+
exports.validateHookCwd = validateHookCwd;
|
|
23
|
+
exports.resolveWorktreeByCwd = resolveWorktreeByCwd;
|
|
24
|
+
exports.applyAgentStopEvent = applyAgentStopEvent;
|
|
25
|
+
const fs_1 = require("fs");
|
|
26
|
+
const path_1 = require("path");
|
|
27
|
+
const db_1 = require("../../lib/db");
|
|
28
|
+
const tasks_db_1 = require("../../lib/db/tasks-db");
|
|
29
|
+
const path_validator_1 = require("../../lib/security/path-validator");
|
|
30
|
+
const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
|
|
31
|
+
const gate_runner_1 = require("../../lib/verification/gate-runner");
|
|
32
|
+
const agent_event_state_1 = require("../../lib/session/agent-event-state");
|
|
33
|
+
const logger_1 = require("../../lib/logger");
|
|
34
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/agent-event-service');
|
|
35
|
+
/**
|
|
36
|
+
* The event vocabulary lives in `agent-event-types` (Issue #1722) so the
|
|
37
|
+
* settings generator and the in-memory state can use it without importing this
|
|
38
|
+
* module's database and verification dependencies. Re-exported here because
|
|
39
|
+
* this is where callers have always found it.
|
|
40
|
+
*
|
|
41
|
+
* The Claude-specific mapping helpers that used to be re-exported alongside
|
|
42
|
+
* them are gone (Issue #1759): a tool's spellings now belong to that tool's
|
|
43
|
+
* `AgentEventSource`, and re-exporting one tool's from the generic service
|
|
44
|
+
* would have made this module the next place a Phase 4-x implementer reached
|
|
45
|
+
* for. Ask `getAgentEventSource(cliToolId).normalizeEvent()` instead.
|
|
46
|
+
*
|
|
47
|
+
* Every kind but `stop` is accepted, recorded and exposed without changing any
|
|
48
|
+
* state: the receiver has to exist before agents can be told to send them, and
|
|
49
|
+
* rejecting them would make every hook config a two-step rollout.
|
|
50
|
+
*/
|
|
51
|
+
var agent_event_types_1 = require("../../lib/hooks/agent-event-types");
|
|
52
|
+
Object.defineProperty(exports, "AGENT_EVENT_TYPES", { enumerable: true, get: function () { return agent_event_types_1.AGENT_EVENT_TYPES; } });
|
|
53
|
+
Object.defineProperty(exports, "isAgentEventType", { enumerable: true, get: function () { return agent_event_types_1.isAgentEventType; } });
|
|
54
|
+
/** Bound on the accepted `cwd`, comfortably above PATH_MAX on every supported platform. */
|
|
55
|
+
exports.MAX_CWD_LENGTH = 4096;
|
|
56
|
+
/**
|
|
57
|
+
* Reject a `cwd` that cannot be a legitimate agent working directory.
|
|
58
|
+
*
|
|
59
|
+
* A hook posts the directory the agent is running in, so the only shapes worth
|
|
60
|
+
* accepting are absolute, traversal-free paths. `..` is refused rather than
|
|
61
|
+
* normalised away: `resolve()` would happily turn `/repos/a/../../etc` into a
|
|
62
|
+
* path that looks nothing like what the caller sent, and a value that changes
|
|
63
|
+
* meaning between validation and use is exactly how traversal checks get
|
|
64
|
+
* defeated. Percent-encoding is decoded first, so `%2e%2e%2f` cannot smuggle a
|
|
65
|
+
* `..` past a raw string scan.
|
|
66
|
+
*/
|
|
67
|
+
function validateHookCwd(raw) {
|
|
68
|
+
if (typeof raw !== 'string' || raw.trim() === '') {
|
|
69
|
+
return { ok: false, reason: 'empty' };
|
|
70
|
+
}
|
|
71
|
+
if (raw.length > exports.MAX_CWD_LENGTH) {
|
|
72
|
+
return { ok: false, reason: 'too_long' };
|
|
73
|
+
}
|
|
74
|
+
let decoded = raw;
|
|
75
|
+
try {
|
|
76
|
+
decoded = decodeURIComponent(raw);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Not valid percent-encoding; the raw string is the only interpretation.
|
|
80
|
+
decoded = raw;
|
|
81
|
+
}
|
|
82
|
+
if (raw.includes('\0') || decoded.includes('\0')) {
|
|
83
|
+
return { ok: false, reason: 'nul_byte' };
|
|
84
|
+
}
|
|
85
|
+
if (!(0, path_1.isAbsolute)(raw)) {
|
|
86
|
+
return { ok: false, reason: 'not_absolute' };
|
|
87
|
+
}
|
|
88
|
+
if (hasTraversalSegment(raw) || hasTraversalSegment(decoded)) {
|
|
89
|
+
return { ok: false, reason: 'traversal' };
|
|
90
|
+
}
|
|
91
|
+
return { ok: true, cwd: raw };
|
|
92
|
+
}
|
|
93
|
+
/** True when any path segment is `..`, under either separator convention. */
|
|
94
|
+
function hasTraversalSegment(value) {
|
|
95
|
+
return value
|
|
96
|
+
.split(path_1.sep === '\\' ? /[\\/]/ : '/')
|
|
97
|
+
.some((segment) => segment === '..');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The registered worktree an agent's `cwd` belongs to, or null.
|
|
101
|
+
*
|
|
102
|
+
* Both sides are resolved through `realpath` before comparison because the two
|
|
103
|
+
* ends disagree routinely and harmlessly: macOS hands agents `/var/...` for a
|
|
104
|
+
* worktree stored as `/private/var/...`, and worktree roots are often symlinked.
|
|
105
|
+
*
|
|
106
|
+
* A descendant matches its worktree — agents commonly run from a subdirectory —
|
|
107
|
+
* and the longest match wins, so a worktree nested inside another resolves to
|
|
108
|
+
* the inner one rather than to whichever row the database returned first.
|
|
109
|
+
*
|
|
110
|
+
* @param cwd - Already through {@link validateHookCwd}
|
|
111
|
+
* @returns null when the path does not exist or belongs to no worktree; the
|
|
112
|
+
* caller must not distinguish those two cases to the client
|
|
113
|
+
*/
|
|
114
|
+
function resolveWorktreeByCwd(db, cwd) {
|
|
115
|
+
const resolvedCwd = safeRealpath(cwd);
|
|
116
|
+
if (resolvedCwd === null) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
let best = null;
|
|
120
|
+
let bestLength = -1;
|
|
121
|
+
for (const worktree of (0, db_1.getWorktrees)(db)) {
|
|
122
|
+
const resolvedWorktree = safeRealpath(worktree.path);
|
|
123
|
+
if (resolvedWorktree === null)
|
|
124
|
+
continue;
|
|
125
|
+
if (!(0, path_validator_1.isWithinRoot)(resolvedCwd, resolvedWorktree))
|
|
126
|
+
continue;
|
|
127
|
+
if (resolvedWorktree.length > bestLength) {
|
|
128
|
+
best = worktree;
|
|
129
|
+
bestLength = resolvedWorktree.length;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return best;
|
|
133
|
+
}
|
|
134
|
+
/** realpath, or null when the path does not exist / is unreadable. */
|
|
135
|
+
function safeRealpath(target) {
|
|
136
|
+
try {
|
|
137
|
+
return (0, fs_1.realpathSync)(target);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Apply a `stop` event to whatever the worktree is currently doing.
|
|
145
|
+
*
|
|
146
|
+
* The no-op is the load-bearing case. Sessions with no contract, and therefore
|
|
147
|
+
* no task, are the overwhelming majority; for them this records the timestamp
|
|
148
|
+
* and returns. Nothing about the existing completion path changes.
|
|
149
|
+
*
|
|
150
|
+
* Never throws. A hook is fire-and-forget from a CLI's stop handler, and a
|
|
151
|
+
* failure here must not become the agent's problem.
|
|
152
|
+
*/
|
|
153
|
+
async function applyAgentStopEvent(db, worktree, cliToolId, instanceId) {
|
|
154
|
+
(0, agent_event_state_1.recordAgentStopEvent)(worktree.id, cliToolId, instanceId);
|
|
155
|
+
let task;
|
|
156
|
+
try {
|
|
157
|
+
task = (0, tasks_db_1.getActiveTaskForInstance)(db, worktree.id, cliToolId, instanceId);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.warn('agent-stop-task-lookup-failed', {
|
|
161
|
+
worktreeId: worktree.id,
|
|
162
|
+
error: error instanceof Error ? error.message : String(error),
|
|
163
|
+
});
|
|
164
|
+
return { taskId: null, taskEventApplied: false, verificationRunId: null };
|
|
165
|
+
}
|
|
166
|
+
if (!task) {
|
|
167
|
+
return { taskId: null, taskEventApplied: false, verificationRunId: null };
|
|
168
|
+
}
|
|
169
|
+
let taskEventApplied = false;
|
|
170
|
+
try {
|
|
171
|
+
const result = (0, task_transition_service_1.applyTaskEvent)(db, task.id, 'agent_idle', { source: 'hook' });
|
|
172
|
+
taskEventApplied = result !== null && result.toStatus !== null;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
logger.warn('agent-stop-event-failed', {
|
|
176
|
+
taskId: task.id,
|
|
177
|
+
error: error instanceof Error ? error.message : String(error),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (!task.contract.success.autoVerifyOnStop) {
|
|
181
|
+
return { taskId: task.id, taskEventApplied, verificationRunId: null };
|
|
182
|
+
}
|
|
183
|
+
let verificationRunId = null;
|
|
184
|
+
try {
|
|
185
|
+
const { runId } = await (0, gate_runner_1.startVerification)({
|
|
186
|
+
worktreeId: worktree.id,
|
|
187
|
+
worktreePath: worktree.path,
|
|
188
|
+
instanceId,
|
|
189
|
+
taskId: task.id,
|
|
190
|
+
trigger: 'task',
|
|
191
|
+
});
|
|
192
|
+
verificationRunId = runId;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// A run already in flight is the expected collision, not a fault: the agent
|
|
196
|
+
// stopping twice while gates execute is ordinary.
|
|
197
|
+
if (!(error instanceof gate_runner_1.VerificationConflictError)) {
|
|
198
|
+
logger.error('agent-stop-auto-verify-failed', {
|
|
199
|
+
taskId: task.id,
|
|
200
|
+
error: error instanceof Error ? error.message : String(error),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { taskId: task.id, taskEventApplied, verificationRunId };
|
|
205
|
+
}
|
|
@@ -9,19 +9,18 @@
|
|
|
9
9
|
* runner. `agent-event-service` re-exports everything here, so existing
|
|
10
10
|
* importers are unaffected.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* **Nothing here names a tool.** It used to: `CLAUDE_HOOK_EVENT_NAMES` and
|
|
13
|
+
* `extractClaudeEventDetail` lived beside the words until Issue #1759 moved
|
|
14
|
+
* them to `lib/hooks/sources/hook-event-vocabulary`, where a source *selects*
|
|
15
|
+
* them. One tool's spellings sitting in the module every tool-agnostic consumer
|
|
16
|
+
* imports is how the next tool ends up appended to the same table instead of
|
|
17
|
+
* bringing its own — the copy-paste Epic #1720 exists to stop.
|
|
17
18
|
*
|
|
18
19
|
* @module lib/hooks/agent-event-types
|
|
19
20
|
*/
|
|
20
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.MAX_EVENT_DETAIL_LENGTH = exports.
|
|
22
|
+
exports.MAX_EVENT_DETAIL_LENGTH = exports.AGENT_EVENT_TYPES = void 0;
|
|
22
23
|
exports.isAgentEventType = isAgentEventType;
|
|
23
|
-
exports.mapClaudeHookEventName = mapClaudeHookEventName;
|
|
24
|
-
exports.extractClaudeEventDetail = extractClaudeEventDetail;
|
|
25
24
|
/**
|
|
26
25
|
* Event kinds accepted by `POST /api/hooks/agent-event`.
|
|
27
26
|
*
|
|
@@ -49,83 +48,5 @@ exports.AGENT_EVENT_TYPES = [
|
|
|
49
48
|
function isAgentEventType(value) {
|
|
50
49
|
return typeof value === 'string' && exports.AGENT_EVENT_TYPES.includes(value);
|
|
51
50
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Claude Code's own `hook_event_name` values, mapped onto the vocabulary above.
|
|
54
|
-
*
|
|
55
|
-
* An injected `type: "http"` hook posts Claude's payload verbatim — there is no
|
|
56
|
-
* way to shape the body — so the receiver has to read Claude's spelling. Only
|
|
57
|
-
* the events CommandMate injects are listed, and an unmapped name is refused
|
|
58
|
-
* rather than silently filed under something else.
|
|
59
|
-
*
|
|
60
|
-
* `PermissionRequest` is absent because it has its own receiver: its response
|
|
61
|
-
* body is a decision the agent obeys, which is the opposite contract to this
|
|
62
|
-
* fire-and-forget route (#1724).
|
|
63
|
-
*
|
|
64
|
-
* `PostToolUse` **is** mapped, on the strength of a measurement taken for Issue
|
|
65
|
-
* #1726 rather than of the #1721 spike, which recorded it as unobserved. Driving
|
|
66
|
-
* a live v2.1.223 session on 2026-08-06 with a `PostToolUse` hook registered:
|
|
67
|
-
*
|
|
68
|
-
* ```
|
|
69
|
-
* 15:36:04.112 PreToolUse AskUserQuestion (picker drawn)
|
|
70
|
-
* 15:36:10.127 Notification permission_prompt (picker still up)
|
|
71
|
-
* 15:36:28.643 PostToolUse AskUserQuestion (the human answered)
|
|
72
|
-
* 15:36:29.992 Stop
|
|
73
|
-
* ```
|
|
74
|
-
*
|
|
75
|
-
* It fires, and it is the precise signal — "this tool call is over" — where
|
|
76
|
-
* `Stop` is "the turn is over" and can be minutes later if the agent keeps
|
|
77
|
-
* working after the answer. Both are wired up; see `agent-event-state`.
|
|
78
|
-
*/
|
|
79
|
-
exports.CLAUDE_HOOK_EVENT_NAMES = {
|
|
80
|
-
Stop: 'stop',
|
|
81
|
-
SubagentStop: 'stop',
|
|
82
|
-
Notification: 'notification',
|
|
83
|
-
SessionStart: 'session_start',
|
|
84
|
-
SessionEnd: 'session_end',
|
|
85
|
-
UserPromptSubmit: 'user_prompt_submit',
|
|
86
|
-
// Issue #1726. Injected with matcher `AskUserQuestion`, so in practice these
|
|
87
|
-
// only ever arrive for that tool — but the receiver re-reads `tool_name`
|
|
88
|
-
// rather than trusting the matcher, because a user's own settings.json is
|
|
89
|
-
// concatenated with the injected one and may register a wider matcher.
|
|
90
|
-
PreToolUse: 'pre_tool_use',
|
|
91
|
-
PostToolUse: 'post_tool_use',
|
|
92
|
-
};
|
|
93
|
-
/** @returns The event this `hook_event_name` maps to, or null when unmapped. */
|
|
94
|
-
function mapClaudeHookEventName(value) {
|
|
95
|
-
if (typeof value !== 'string')
|
|
96
|
-
return null;
|
|
97
|
-
return exports.CLAUDE_HOOK_EVENT_NAMES[value] ?? null;
|
|
98
|
-
}
|
|
99
51
|
/** Bound on the stored `detail`; every observed value is a short enum-ish word. */
|
|
100
52
|
exports.MAX_EVENT_DETAIL_LENGTH = 128;
|
|
101
|
-
/**
|
|
102
|
-
* The event's subtype, as a single short string, or null when it has none.
|
|
103
|
-
*
|
|
104
|
-
* Each event spells this differently and none of them share a field:
|
|
105
|
-
*
|
|
106
|
-
* - `Notification` → `notification_type` (`permission_prompt` / `idle_prompt`).
|
|
107
|
-
* This is also what a `Notification` matcher is tested against — **not**
|
|
108
|
-
* `message`, which is English prose for a human (D3).
|
|
109
|
-
* - `SessionEnd` → `reason` (`clear` / `prompt_input_exit` / …)
|
|
110
|
-
* - `SessionStart` → `source` (`startup` / `clear` / …)
|
|
111
|
-
* - `PreToolUse` / `PostToolUse` → `tool_name` (`AskUserQuestion`), Issue #1726
|
|
112
|
-
*
|
|
113
|
-
* `Stop` and `UserPromptSubmit` have no subtype, so they answer null.
|
|
114
|
-
*/
|
|
115
|
-
function extractClaudeEventDetail(event, payload) {
|
|
116
|
-
const field = event === 'notification'
|
|
117
|
-
? 'notification_type'
|
|
118
|
-
: event === 'session_end'
|
|
119
|
-
? 'reason'
|
|
120
|
-
: event === 'session_start'
|
|
121
|
-
? 'source'
|
|
122
|
-
: event === 'pre_tool_use' || event === 'post_tool_use'
|
|
123
|
-
? 'tool_name'
|
|
124
|
-
: null;
|
|
125
|
-
if (field === null)
|
|
126
|
-
return null;
|
|
127
|
-
const value = payload[field];
|
|
128
|
-
if (typeof value !== 'string' || value === '')
|
|
129
|
-
return null;
|
|
130
|
-
return value.slice(0, exports.MAX_EVENT_DETAIL_LENGTH);
|
|
131
|
-
}
|
|
@@ -28,6 +28,12 @@
|
|
|
28
28
|
* - **Every hook failure is fail-open.** A refused connection or a timeout
|
|
29
29
|
* costs the event, never the session.
|
|
30
30
|
*
|
|
31
|
+
* Issue #1759 made this module *Claude's* config serialiser rather than *the*
|
|
32
|
+
* config serialiser: it is reached through `claudeAgentEventSource.prepareLaunch`
|
|
33
|
+
* (seams S3/S4/S5), and the four other hook tools each bring their own — their
|
|
34
|
+
* files live in different places, nest differently, and cannot use `type:"http"`
|
|
35
|
+
* at all. Nothing here changed; only who calls it did.
|
|
36
|
+
*
|
|
31
37
|
* The generated file is written rather than passed inline. `--settings` does
|
|
32
38
|
* accept a JSON string (D2), but the launch command travels to the CLI through
|
|
33
39
|
* `tmux send-keys` as a single line, and a ~1 KB argument of braces, quotes and
|
|
@@ -55,8 +61,10 @@ const crypto_1 = require("crypto");
|
|
|
55
61
|
const fs_1 = require("fs");
|
|
56
62
|
const os_1 = require("os");
|
|
57
63
|
const path_1 = require("path");
|
|
64
|
+
const safe_directory_1 = require("../../config/safe-directory");
|
|
58
65
|
const env_1 = require("../../lib/env");
|
|
59
66
|
const types_1 = require("../../lib/cli-tools/types");
|
|
67
|
+
const tool_id_1 = require("../../lib/hooks/sources/claude/tool-id");
|
|
60
68
|
const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
|
|
61
69
|
const logger_1 = require("../../lib/logger");
|
|
62
70
|
const logger = (0, logger_1.createLogger)('lib/hooks/hook-settings-generator');
|
|
@@ -178,18 +186,25 @@ function isHookInjectionEnabled() {
|
|
|
178
186
|
function isAuthTokenExpected() {
|
|
179
187
|
return Boolean(process.env[exports.AUTH_TOKEN_ENV_VAR] || process.env.CM_AUTH_TOKEN_HASH);
|
|
180
188
|
}
|
|
181
|
-
/**
|
|
189
|
+
/**
|
|
190
|
+
* Directory the generated settings files live in.
|
|
191
|
+
*
|
|
192
|
+
* Issue #1774: `writeAgentHookSettings` calls `mkdirSync(…, {recursive:true})`
|
|
193
|
+
* on the result, so a value inside `/proc`, `/sys` or `/dev` would spin the
|
|
194
|
+
* event loop forever rather than throw — the fail-open `try/catch` below is
|
|
195
|
+
* never reached, because the call never returns. Such a value is refused here
|
|
196
|
+
* and the default is used.
|
|
197
|
+
*/
|
|
182
198
|
function getHookSettingsDirectory(options = {}) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
return (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'hooks');
|
|
199
|
+
const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'hooks');
|
|
200
|
+
if (options.directory) {
|
|
201
|
+
return (0, safe_directory_1.resolveSafeDirectory)(options.directory, fallback, 'HookSettingsOptions.directory');
|
|
202
|
+
}
|
|
203
|
+
return (0, safe_directory_1.resolveSafeDirectory)(process.env.CM_AGENT_HOOKS_DIR, fallback, 'CM_AGENT_HOOKS_DIR');
|
|
189
204
|
}
|
|
190
205
|
/** The instance this settings file speaks for; primary when unspecified. */
|
|
191
206
|
function resolveTargetInstanceId(target) {
|
|
192
|
-
const cliToolId = target.cliToolId ??
|
|
207
|
+
const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
|
|
193
208
|
const instanceId = target.instanceId ?? cliToolId;
|
|
194
209
|
return instanceId;
|
|
195
210
|
}
|
|
@@ -202,7 +217,7 @@ function resolveTargetInstanceId(target) {
|
|
|
202
217
|
* restart overwrites rather than accumulates.
|
|
203
218
|
*/
|
|
204
219
|
function getHookSettingsPath(target, options = {}) {
|
|
205
|
-
const cliToolId = target.cliToolId ??
|
|
220
|
+
const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
|
|
206
221
|
const instanceId = resolveTargetInstanceId(target);
|
|
207
222
|
const slug = `${cliToolId}-${target.worktreeId}-${instanceId}`.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
208
223
|
const digest = (0, crypto_1.createHash)('sha256')
|
|
@@ -236,7 +251,7 @@ function buildPermissionRequestUrl(target, options = {}) {
|
|
|
236
251
|
return buildReceiverUrl(exports.PERMISSION_REQUEST_PATH, target, options);
|
|
237
252
|
}
|
|
238
253
|
function buildReceiverUrl(path, target, options) {
|
|
239
|
-
const cliToolId = target.cliToolId ??
|
|
254
|
+
const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
|
|
240
255
|
const port = options.port ?? (0, env_1.getServerPort)();
|
|
241
256
|
const params = new URLSearchParams({
|
|
242
257
|
tool: cliToolId,
|
|
@@ -285,7 +300,7 @@ function buildSessionStartCommand(target, options = {}) {
|
|
|
285
300
|
return [
|
|
286
301
|
shellQuote(relay),
|
|
287
302
|
'--tool',
|
|
288
|
-
shellQuote(target.cliToolId ??
|
|
303
|
+
shellQuote(target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID),
|
|
289
304
|
'--event',
|
|
290
305
|
'session_start',
|
|
291
306
|
'--worktree-id',
|