commandmate 0.44.2 → 0.44.3
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 +149 -149
- 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/react-loadable-manifest.json +0 -6
- 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/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_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 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
- 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]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_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_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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +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 +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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_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 +2 -2
- 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_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 +2 -2
- 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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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]/tasks/route.js +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 +2 -2
- 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_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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_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/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_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.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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +21 -21
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- 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/2460.js +1 -1
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -1
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -1
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +3 -5
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +589 -431
- package/dist/cli/types/api-responses.d.ts +159 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +26 -3
- package/dist/lib/session/prompt-view.d.ts.map +1 -1
- package/dist/lib/session/prompt-view.js +26 -3
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
- package/dist/server/src/lib/auto-yes-poller.js +450 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
- package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
- package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +641 -1142
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +5 -4
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +450 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +26 -3
- package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session-cleanup.js +1 -5
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/4372.js +0 -5
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9798.js +0 -2
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
35
|
exports.claudeAgentEventSource = void 0;
|
|
36
36
|
exports.encodeClaudeVerdict = encodeClaudeVerdict;
|
|
37
|
+
const uat_isolation_1 = require("../../../../config/uat-isolation");
|
|
37
38
|
const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
|
|
38
39
|
const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
|
|
39
40
|
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
@@ -42,6 +43,7 @@ const define_source_1 = require("../define-source");
|
|
|
42
43
|
const event_mapper_1 = require("../event-mapper");
|
|
43
44
|
const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
|
|
44
45
|
const model_switch_1 = require("./model-switch");
|
|
46
|
+
const queued_notice_1 = require("./queued-notice");
|
|
45
47
|
const tool_id_1 = require("./tool-id");
|
|
46
48
|
/**
|
|
47
49
|
* The no-decision body, byte for byte what the #1721 spike returned for D5.
|
|
@@ -158,6 +160,9 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
158
160
|
// the latch. `extractModel` runs before `modelFields`, and answers null for
|
|
159
161
|
// every other event so the flat lookup above is unchanged for them.
|
|
160
162
|
extractModel: model_switch_1.extractClaudeSwitchedModel,
|
|
163
|
+
// Issue #3330. A background-task notice attached to the running turn fires
|
|
164
|
+
// `UserPromptSubmit` too, and continues that turn rather than opening one.
|
|
165
|
+
promptJoinsOpenTurn: queued_notice_1.isClaudeQueuedNoticePrompt,
|
|
161
166
|
// S2.
|
|
162
167
|
extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
|
|
163
168
|
// S7. Both parsers are strict and answer null for anything they cannot vouch
|
|
@@ -171,22 +176,47 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
|
|
|
171
176
|
// writes the settings file, falls back to the bare path on any failure, and is
|
|
172
177
|
// covered byte-for-byte by `tests/unit/hooks/hook-settings-generator.test.ts`.
|
|
173
178
|
prepareLaunch: ({ target, executablePath }) => {
|
|
174
|
-
|
|
179
|
+
// Issue #3312: under `own-home` the settings file goes in only once its
|
|
180
|
+
// directory and the file itself check out inside the dedicated user's
|
|
181
|
+
// HOME; else the launch is refused.
|
|
182
|
+
const ownHome = (0, uat_isolation_1.getUatIsolationMode)() === 'own-home';
|
|
183
|
+
const hookTarget = {
|
|
175
184
|
worktreeId: target.worktreeId,
|
|
176
185
|
instanceId: target.instanceId,
|
|
177
186
|
cliToolId: target.cliToolId,
|
|
178
|
-
}
|
|
187
|
+
};
|
|
188
|
+
if ((0, hook_settings_generator_1.isHookInjectionEnabled)()) {
|
|
189
|
+
(0, uat_isolation_1.assertUatOwnHomeWriteTargets)(tool_id_1.CLAUDE_CLI_TOOL_ID, [
|
|
190
|
+
(0, hook_settings_generator_1.getHookSettingsDirectory)(),
|
|
191
|
+
(0, hook_settings_generator_1.getHookSettingsPath)(hookTarget),
|
|
192
|
+
]);
|
|
193
|
+
}
|
|
194
|
+
const baseCommand = (0, hook_settings_generator_1.buildClaudeLaunchCommand)(executablePath, hookTarget);
|
|
195
|
+
// Issue #3312: under `own-home` a claude without its settings file is a
|
|
196
|
+
// check that cannot see `hook_stop`, so injection switched off or a file
|
|
197
|
+
// that could not be written refuses the launch. `1` and normal mode keep
|
|
198
|
+
// starting the bare executable.
|
|
199
|
+
if (ownHome && baseCommand === executablePath) {
|
|
200
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.CLAUDE_CLI_TOOL_ID, (0, hook_settings_generator_1.isHookInjectionEnabled)() ? 'the hook settings file could not be written' : 'CM_AGENT_HOOKS_INJECT=0', (0, hook_settings_generator_1.isHookInjectionEnabled)()
|
|
201
|
+
? 'Make CM_AGENT_HOOKS_DIR writable by the dedicated user.'
|
|
202
|
+
: 'Do not combine CM_AGENT_HOOKS_INJECT=0 with own-home.');
|
|
203
|
+
}
|
|
179
204
|
// The path is reported only when the command actually names it. Injection
|
|
180
205
|
// can be switched off (`CM_AGENT_HOOKS_INJECT=0`) or fail to write, and both
|
|
181
206
|
// return the bare executable — claiming a settings file in that case would
|
|
182
207
|
// be telling the caller about a file that is not there.
|
|
183
|
-
const settingsPath = (0, hook_settings_generator_1.isHookInjectionEnabled)() &&
|
|
208
|
+
const settingsPath = (0, hook_settings_generator_1.isHookInjectionEnabled)() && baseCommand !== executablePath
|
|
184
209
|
? (0, hook_settings_generator_1.getHookSettingsPath)({
|
|
185
210
|
worktreeId: target.worktreeId,
|
|
186
211
|
instanceId: target.instanceId,
|
|
187
212
|
cliToolId: target.cliToolId,
|
|
188
213
|
})
|
|
189
214
|
: null;
|
|
215
|
+
// Issue #3360: in UAT isolation the user's own `~/.claude/settings.json`
|
|
216
|
+
// (whose hooks post to production) is not loaded; `--settings` still is.
|
|
217
|
+
const command = (0, uat_isolation_1.isUatIsolationEnabled)()
|
|
218
|
+
? `${baseCommand} --setting-sources ${uat_isolation_1.CLAUDE_UAT_SETTING_SOURCES}`
|
|
219
|
+
: baseCommand;
|
|
190
220
|
// Empty, and the only source for which that is uninteresting: `--settings`
|
|
191
221
|
// carries the correlation keys inside the file, so Claude never needed the
|
|
192
222
|
// environment prefix the other four sources reached for (#1846).
|
|
@@ -297,18 +297,12 @@ function readToolDetail(input) {
|
|
|
297
297
|
for (const field of CLAUDE_TOOL_DETAIL_FIELDS) {
|
|
298
298
|
const value = (0, event_mapper_1.readStringField)(input, field);
|
|
299
299
|
if (value)
|
|
300
|
-
return boundToolDetail(collapseToLine(value));
|
|
300
|
+
return boundToolDetail((0, turn_body_1.collapseToLine)(value));
|
|
301
301
|
}
|
|
302
302
|
return null;
|
|
303
303
|
}
|
|
304
|
-
/** A tool detail on one line. A heredoc `command` puts newlines in it. */
|
|
305
|
-
function collapseToLine(value) {
|
|
306
|
-
return value.replace(/\s+/g, ' ').trim();
|
|
307
|
-
}
|
|
308
304
|
function boundToolDetail(value) {
|
|
309
|
-
return value
|
|
310
|
-
? value
|
|
311
|
-
: `${value.slice(0, exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH - 1)}…`;
|
|
305
|
+
return (0, turn_body_1.boundDetail)(value, exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH);
|
|
312
306
|
}
|
|
313
307
|
/**
|
|
314
308
|
* Read one parsed transcript line.
|
|
@@ -787,11 +781,7 @@ function renderClaudeTurn(turn) {
|
|
|
787
781
|
unknown.add(block.type);
|
|
788
782
|
}
|
|
789
783
|
let body = (0, turn_body_1.separateTurnBody)(rendered).body;
|
|
790
|
-
|
|
791
|
-
body =
|
|
792
|
-
body.slice(0, exports.MAX_CLAUDE_TURN_BODY_LENGTH - exports.CLAUDE_TURN_TRUNCATION_MARKER.length) +
|
|
793
|
-
exports.CLAUDE_TURN_TRUNCATION_MARKER;
|
|
794
|
-
}
|
|
784
|
+
body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_CLAUDE_TURN_BODY_LENGTH, exports.CLAUDE_TURN_TRUNCATION_MARKER);
|
|
795
785
|
return {
|
|
796
786
|
sessionId: turn.sessionId,
|
|
797
787
|
promptUuid: turn.promptUuid,
|
|
@@ -95,6 +95,7 @@ exports.isCodexRolloutFileFor = isCodexRolloutFileFor;
|
|
|
95
95
|
exports.findCodexRolloutPath = findCodexRolloutPath;
|
|
96
96
|
exports.captureCodexTranscriptTurn = captureCodexTranscriptTurn;
|
|
97
97
|
exports.resolveCodexTranscriptPath = resolveCodexTranscriptPath;
|
|
98
|
+
const global_state_1 = require("../../../../lib/global-state");
|
|
98
99
|
const promises_1 = require("fs/promises");
|
|
99
100
|
const os_1 = require("os");
|
|
100
101
|
const path_1 = require("path");
|
|
@@ -104,6 +105,7 @@ const user_turn_recorder_1 = require("../../../../lib/history/user-turn-recorder
|
|
|
104
105
|
const assistant_response_saver_1 = require("../../../../lib/assistant-response-saver");
|
|
105
106
|
const logger_1 = require("../../../../lib/logger");
|
|
106
107
|
const agent_transcript_1 = require("../../../../types/agent-transcript");
|
|
108
|
+
const transcript_history_1 = require("../transcript-history");
|
|
107
109
|
const transcript_1 = require("./transcript");
|
|
108
110
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/codex/history');
|
|
109
111
|
/**
|
|
@@ -151,7 +153,7 @@ const CODEX_SESSION_ID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-
|
|
|
151
153
|
* codex sends `session_id` on every event it delivers — but a future one that
|
|
152
154
|
* did not would otherwise blank the pointer mid-session.
|
|
153
155
|
*/
|
|
154
|
-
const sessionPointers = (
|
|
156
|
+
const sessionPointers = (0, global_state_1.getOrInitGlobal)('__codexTranscriptSessions', () => new Map());
|
|
155
157
|
/**
|
|
156
158
|
* Where each session id's rollout file was found.
|
|
157
159
|
*
|
|
@@ -161,7 +163,7 @@ const sessionPointers = (globalThis.__codexTranscriptSessions ??= new Map());
|
|
|
161
163
|
* session started, which is not derivable from the id — and a scan of 1,791
|
|
162
164
|
* files on every finished turn is not something to do twice.
|
|
163
165
|
*/
|
|
164
|
-
const rolloutPaths = (
|
|
166
|
+
const rolloutPaths = (0, global_state_1.getOrInitGlobal)('__codexTranscriptPaths', () => new Map());
|
|
165
167
|
function keyOf(target) {
|
|
166
168
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
167
169
|
}
|
|
@@ -185,24 +187,7 @@ function resetCodexTranscriptSessions() {
|
|
|
185
187
|
* keeps being the only record, which is merely the status quo.
|
|
186
188
|
*/
|
|
187
189
|
async function resolveCodexSessionId(target) {
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
const { getLastAgentEvent } = await Promise.resolve().then(() => __importStar(require('../../../../lib/session/agent-event-state')));
|
|
191
|
-
const sessionId = getLastAgentEvent(target.worktreeId, target.cliToolId, target.instanceId)?.sessionId;
|
|
192
|
-
if (typeof sessionId === 'string' && sessionId.length > 0) {
|
|
193
|
-
sessionPointers.set(key, sessionId);
|
|
194
|
-
return sessionId;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
// A state module that cannot be reached is one that knows no session id.
|
|
199
|
-
logger.debug('codex-transcript-session-lookup-failed', {
|
|
200
|
-
worktreeId: target.worktreeId,
|
|
201
|
-
instanceId: target.instanceId ?? target.cliToolId,
|
|
202
|
-
error: error instanceof Error ? error.message : String(error),
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
return sessionPointers.get(key) ?? null;
|
|
190
|
+
return (0, transcript_history_1.resolveSessionIdFromEvents)(target, sessionPointers, keyOf(target), logger, 'codex-transcript-session-lookup-failed');
|
|
206
191
|
}
|
|
207
192
|
/**
|
|
208
193
|
* `$CODEX_HOME`, or `~/.codex`.
|
|
@@ -234,15 +219,7 @@ function codexSessionsRoot(codexHome) {
|
|
|
234
219
|
* @returns The resolved path, or null when it is not acceptable
|
|
235
220
|
*/
|
|
236
221
|
function acceptCodexRolloutPath(codexHome, candidate) {
|
|
237
|
-
|
|
238
|
-
return null;
|
|
239
|
-
if (candidate.includes('\0'))
|
|
240
|
-
return null;
|
|
241
|
-
const root = (0, path_1.resolve)(codexSessionsRoot(codexHome));
|
|
242
|
-
const resolved = (0, path_1.resolve)(candidate);
|
|
243
|
-
if (resolved !== root && !resolved.startsWith(root + path_1.sep))
|
|
244
|
-
return null;
|
|
245
|
-
return resolved;
|
|
222
|
+
return (0, transcript_history_1.acceptPathUnderRoot)(codexSessionsRoot(codexHome), transcript_1.CODEX_ROLLOUT_EXTENSION, candidate);
|
|
246
223
|
}
|
|
247
224
|
/** Whether a file name is the rollout of this session. */
|
|
248
225
|
function isCodexRolloutFileFor(name, sessionId) {
|
|
@@ -440,7 +417,7 @@ async function captureCodexTranscriptTurn(target, capture = {}, report) {
|
|
|
440
417
|
let captured = false;
|
|
441
418
|
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
442
419
|
const turn = pending.turns[index];
|
|
443
|
-
captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), windowFacts, report);
|
|
420
|
+
captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), (0, transcript_history_1.resolveAssistantTimestampMs)(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, (0, transcript_history_1.nextTurnOpensAt)(pending.turns, userRows, index)), windowFacts, report);
|
|
444
421
|
}
|
|
445
422
|
if (captured) {
|
|
446
423
|
// Issue #2437: History now holds this turn as the agent's own Markdown.
|
|
@@ -506,26 +483,7 @@ function firstCodexRecordAt(records) {
|
|
|
506
483
|
* @param turns - Every turn in the window, oldest first
|
|
507
484
|
*/
|
|
508
485
|
async function selectUnwrittenCodexTurns(target, turns) {
|
|
509
|
-
|
|
510
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
511
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
512
|
-
]);
|
|
513
|
-
const db = getDbInstance();
|
|
514
|
-
for (let index = turns.length - 1; index >= 0; index -= 1) {
|
|
515
|
-
const requestId = (0, agent_transcript_1.codexTurnRequestId)(turns[index].turnId);
|
|
516
|
-
if (!findMessageByRequestId(db, target.worktreeId, requestId))
|
|
517
|
-
continue;
|
|
518
|
-
return {
|
|
519
|
-
turns: turns.slice(index + 1),
|
|
520
|
-
previousStartedAt: turns[index].startedAt,
|
|
521
|
-
anchored: true,
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
return {
|
|
525
|
-
turns: turns.slice(-1),
|
|
526
|
-
previousStartedAt: turns.length > 1 ? turns[turns.length - 2].startedAt : 0,
|
|
527
|
-
anchored: false,
|
|
528
|
-
};
|
|
486
|
+
return (0, transcript_history_1.selectUnwrittenTurns)(target, turns, (turn) => (0, agent_transcript_1.codexTurnRequestId)(turn.turnId));
|
|
529
487
|
}
|
|
530
488
|
/**
|
|
531
489
|
* The rollout file for this session, or null.
|
|
@@ -537,7 +495,7 @@ async function selectUnwrittenCodexTurns(target, turns) {
|
|
|
537
495
|
async function locateCodexRollout(codexHome, sessionId) {
|
|
538
496
|
const memoKey = `${codexHome}\0${sessionId}`;
|
|
539
497
|
const memoised = rolloutPaths.get(memoKey);
|
|
540
|
-
if (memoised && (await isReadableFile(memoised)))
|
|
498
|
+
if (memoised && (await (0, transcript_history_1.isReadableFile)(memoised)))
|
|
541
499
|
return memoised;
|
|
542
500
|
if (memoised)
|
|
543
501
|
rolloutPaths.delete(memoKey);
|
|
@@ -550,14 +508,6 @@ async function locateCodexRollout(codexHome, sessionId) {
|
|
|
550
508
|
rolloutPaths.set(memoKey, accepted);
|
|
551
509
|
return accepted;
|
|
552
510
|
}
|
|
553
|
-
async function isReadableFile(path) {
|
|
554
|
-
try {
|
|
555
|
-
return (await (0, promises_1.stat)(path)).isFile();
|
|
556
|
-
}
|
|
557
|
-
catch {
|
|
558
|
-
return false;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
511
|
/**
|
|
562
512
|
* Record every prompt this turn answers, before the reply is written (#2196).
|
|
563
513
|
*
|
|
@@ -598,7 +548,7 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
|
|
|
598
548
|
}
|
|
599
549
|
return last;
|
|
600
550
|
}
|
|
601
|
-
|
|
551
|
+
/*
|
|
602
552
|
* When the assistant row for this turn is dated.
|
|
603
553
|
*
|
|
604
554
|
* **The turn's LAST record, not its first (Issue #2273).** #2197 dated the reply
|
|
@@ -626,13 +576,6 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
|
|
|
626
576
|
* @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
|
|
627
577
|
* this is the newest turn in the window
|
|
628
578
|
*/
|
|
629
|
-
function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
|
|
630
|
-
const earliest = userRow.timestampMs === null
|
|
631
|
-
? turn.startedAt
|
|
632
|
-
: Math.max(turn.startedAt, userRow.timestampMs + 1);
|
|
633
|
-
const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
|
|
634
|
-
return Math.max(earliest, Math.min(lastRecordAt, latest));
|
|
635
|
-
}
|
|
636
579
|
/**
|
|
637
580
|
* When each turn's last record was written (Issue #2273).
|
|
638
581
|
*
|
|
@@ -660,7 +603,7 @@ function lastCodexRecordAt(records) {
|
|
|
660
603
|
}
|
|
661
604
|
return at;
|
|
662
605
|
}
|
|
663
|
-
|
|
606
|
+
/*
|
|
664
607
|
* The instant the next pending turn's prompt row carries, or null (Issue #2273).
|
|
665
608
|
*
|
|
666
609
|
* The user row's own timestamp when there is one, because that is what History
|
|
@@ -669,12 +612,6 @@ function lastCodexRecordAt(records) {
|
|
|
669
612
|
* prompt is while the previous turn was still running. The turn's start is the
|
|
670
613
|
* fallback for a turn that produced no row at all.
|
|
671
614
|
*/
|
|
672
|
-
function nextTurnOpensAt(turns, userRows, index) {
|
|
673
|
-
const next = turns[index + 1];
|
|
674
|
-
if (!next)
|
|
675
|
-
return null;
|
|
676
|
-
return userRows[index + 1]?.timestampMs ?? next.startedAt;
|
|
677
|
-
}
|
|
678
615
|
/**
|
|
679
616
|
* Write one rendered turn, unless it is already there.
|
|
680
617
|
*
|
|
@@ -63,7 +63,9 @@
|
|
|
63
63
|
* start. Those post too, with the environment variables unset; the relay omits
|
|
64
64
|
* the correlation keys it does not have and the receiver falls back to
|
|
65
65
|
* resolving the worktree from `cwd`, which is exactly the hand-configured
|
|
66
|
-
* behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off
|
|
66
|
+
* behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off;
|
|
67
|
+
* `CM_UAT_ISOLATION=1` keeps it on without writing any shared file (Issue #3360,
|
|
68
|
+
* {@link reuseCodexHookSettingsReadOnly}).
|
|
67
69
|
*
|
|
68
70
|
* ## The shared app-server daemon (Issue #2874)
|
|
69
71
|
*
|
|
@@ -96,12 +98,15 @@ exports.buildCodexPermissionHookCommand = buildCodexPermissionHookCommand;
|
|
|
96
98
|
exports.buildCodexHookSettings = buildCodexHookSettings;
|
|
97
99
|
exports.mergeCodexHookSettings = mergeCodexHookSettings;
|
|
98
100
|
exports.writeCodexHookSettings = writeCodexHookSettings;
|
|
101
|
+
exports.inspectCodexSharedHooksReadOnly = inspectCodexSharedHooksReadOnly;
|
|
102
|
+
exports.reuseCodexHookSettingsReadOnly = reuseCodexHookSettingsReadOnly;
|
|
99
103
|
exports.buildCodexLaunchPlan = buildCodexLaunchPlan;
|
|
100
104
|
const child_process_1 = require("child_process");
|
|
101
105
|
const fs_1 = require("fs");
|
|
102
106
|
const os_1 = require("os");
|
|
103
107
|
const path_1 = require("path");
|
|
104
108
|
const safe_directory_1 = require("../../../../config/safe-directory");
|
|
109
|
+
const uat_isolation_1 = require("../../../../config/uat-isolation");
|
|
105
110
|
const types_1 = require("../../../../lib/cli-tools/types");
|
|
106
111
|
const env_1 = require("../../../../lib/env");
|
|
107
112
|
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
@@ -313,6 +318,13 @@ function isCodexHookTrustBypassEnabled() {
|
|
|
313
318
|
function shouldTrustCodexHooks(worktreePath) {
|
|
314
319
|
if (resolveCodexHookTrustPolicy() === 'never')
|
|
315
320
|
return false;
|
|
321
|
+
// Issue #3360: a grant is codex writing the user's own `config.toml`, which a
|
|
322
|
+
// UAT / daily-check server must not cause. Declined, the hooks stay inert for
|
|
323
|
+
// that session — the "no hooks" case the UAT already has to tolerate.
|
|
324
|
+
// Issue #3312: under `own-home` the `config.toml` is the dedicated user's and
|
|
325
|
+
// was checked with the rest of `$CODEX_HOME` before the launch, so it may.
|
|
326
|
+
if ((0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only')
|
|
327
|
+
return false;
|
|
316
328
|
try {
|
|
317
329
|
// codex reads `<cwd>/.codex/hooks.json` as well as the home one, and a
|
|
318
330
|
// review that includes a hook from the repository is a review this server
|
|
@@ -531,6 +543,10 @@ function mergeCodexHookSettings(existing, generated) {
|
|
|
531
543
|
base.hooks = merged;
|
|
532
544
|
return base;
|
|
533
545
|
}
|
|
546
|
+
/** The bytes `hooks.json` should hold, given what it holds now. */
|
|
547
|
+
function renderCodexHookSettings(existing, options) {
|
|
548
|
+
return `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
|
|
549
|
+
}
|
|
534
550
|
/**
|
|
535
551
|
* Write the hooks file, and answer where it is.
|
|
536
552
|
*
|
|
@@ -543,6 +559,21 @@ function mergeCodexHookSettings(existing, generated) {
|
|
|
543
559
|
*/
|
|
544
560
|
function writeCodexHookSettings(options = {}) {
|
|
545
561
|
const settingsPath = getCodexHooksPath(options);
|
|
562
|
+
// Issue #3360: UAT isolation never writes the shared files. See
|
|
563
|
+
// {@link reuseCodexHookSettingsReadOnly}. Issue #3312: `own-home` writes
|
|
564
|
+
// them, after checking every path below is inside the dedicated user's HOME
|
|
565
|
+
// (and refuses the launch when one is not).
|
|
566
|
+
const codexHome = getCodexHome(options);
|
|
567
|
+
const relayPath = (0, relay_install_1.getCodexRelayInstallPath)(codexHome);
|
|
568
|
+
const policy = (0, uat_isolation_1.sharedHookWritePolicy)('codex', [
|
|
569
|
+
codexHome,
|
|
570
|
+
settingsPath,
|
|
571
|
+
relayPath,
|
|
572
|
+
(0, relay_install_1.getCodexRelayStagingPath)(relayPath),
|
|
573
|
+
(0, path_1.join)(codexHome, 'config.toml'),
|
|
574
|
+
]);
|
|
575
|
+
if (policy === 'read-only')
|
|
576
|
+
return reuseCodexHookSettingsReadOnly(options);
|
|
546
577
|
// Issue #2315: put the relay where the generated file can name it without
|
|
547
578
|
// naming a checkout, BEFORE the content is built — `buildCodexHookSettings`
|
|
548
579
|
// only reads what is installed, so an install that had not happened yet would
|
|
@@ -550,7 +581,15 @@ function writeCodexHookSettings(options = {}) {
|
|
|
550
581
|
// between. Best-effort by construction: the installer never throws, and a
|
|
551
582
|
// machine where it cannot write simply keeps whatever copy is already there.
|
|
552
583
|
if (options.relayScriptPath === undefined) {
|
|
553
|
-
(0,
|
|
584
|
+
if ((0, uat_isolation_1.getUatIsolationMode)() === 'own-home') {
|
|
585
|
+
// Issue #3312: a relay that could not be updated is a failed
|
|
586
|
+
// preparation here (the caller refuses the launch), not an older relay
|
|
587
|
+
// the check would quietly run against.
|
|
588
|
+
(0, relay_install_1.installCodexRelayScriptOrThrow)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
(0, relay_install_1.installCodexRelayScript)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
|
|
592
|
+
}
|
|
554
593
|
}
|
|
555
594
|
let existing = null;
|
|
556
595
|
let previous = null;
|
|
@@ -569,19 +608,100 @@ function writeCodexHookSettings(options = {}) {
|
|
|
569
608
|
return null;
|
|
570
609
|
}
|
|
571
610
|
}
|
|
572
|
-
const content =
|
|
611
|
+
const content = renderCodexHookSettings(existing, options);
|
|
573
612
|
if (previous === content)
|
|
574
613
|
return settingsPath;
|
|
575
614
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
|
|
576
615
|
(0, fs_1.writeFileSync)(settingsPath, content, { mode: 0o600 });
|
|
577
616
|
return settingsPath;
|
|
578
617
|
}
|
|
618
|
+
/**
|
|
619
|
+
* Whether the shared `$CODEX_HOME/hooks.json` may be used, unwritten, by a
|
|
620
|
+
* server in UAT isolation mode (`CM_UAT_ISOLATION=1`, Issue #3360).
|
|
621
|
+
*
|
|
622
|
+
* `$CODEX_HOME/hooks.json`, the installed relay and the hook trust in
|
|
623
|
+
* `config.toml` are shared with the user's production server and live beside
|
|
624
|
+
* codex's login, so they cannot be moved for a UAT either. They do not need to
|
|
625
|
+
* be written to work for one: the file holds no port, worktree or instance —
|
|
626
|
+
* {@link buildCodexLaunchPlan} hands those to the session in its environment —
|
|
627
|
+
* so a file production has already written delivers this session's events to
|
|
628
|
+
* THIS server.
|
|
629
|
+
*
|
|
630
|
+
* Usable means exactly one thing: the file is byte-identical to what this build
|
|
631
|
+
* writes into an EMPTY file. Comparing against the merge with what is there
|
|
632
|
+
* ({@link mergeCodexHookSettings}) would not do — the merge keeps the user's own
|
|
633
|
+
* handlers, so a file holding a hand-written hook that posts straight to
|
|
634
|
+
* production would compare equal and run in the UAT session. So these are all
|
|
635
|
+
* unusable, each with its reason: no file, an unreadable one, hooks or keys
|
|
636
|
+
* CommandMate did not write, a file this build would change (a newer or older
|
|
637
|
+
* CommandMate), or an installed relay whose bytes differ from the one this build
|
|
638
|
+
* ships (the command string would match while running another script).
|
|
639
|
+
*/
|
|
640
|
+
function inspectCodexSharedHooksReadOnly(options = {}) {
|
|
641
|
+
const settingsPath = getCodexHooksPath(options);
|
|
642
|
+
if (options.relayScriptPath === undefined) {
|
|
643
|
+
const shipped = (0, hook_settings_generator_1.resolveRelayScriptPath)();
|
|
644
|
+
const installed = (0, relay_install_1.getCodexRelayInstallPath)(getCodexHome(options));
|
|
645
|
+
try {
|
|
646
|
+
if (shipped &&
|
|
647
|
+
(0, fs_1.existsSync)(installed) &&
|
|
648
|
+
(0, fs_1.readFileSync)(shipped, 'utf8') !== (0, fs_1.readFileSync)(installed, 'utf8')) {
|
|
649
|
+
logger.info('codex-hooks-shared-relay-differs-readonly', { installed });
|
|
650
|
+
return { usable: false, reason: `the installed relay ${installed} differs from the one this build ships`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch {
|
|
654
|
+
return { usable: false, reason: `the installed relay ${installed} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
try {
|
|
658
|
+
if (!(0, fs_1.existsSync)(settingsPath)) {
|
|
659
|
+
logger.info('codex-hooks-shared-absent-readonly', { settingsPath });
|
|
660
|
+
return { usable: false, reason: `${settingsPath} does not exist`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
661
|
+
}
|
|
662
|
+
const previous = (0, fs_1.readFileSync)(settingsPath, 'utf8');
|
|
663
|
+
if (previous === renderCodexHookSettings(null, options)) {
|
|
664
|
+
return { usable: true, settingsPath };
|
|
665
|
+
}
|
|
666
|
+
if (previous === renderCodexHookSettings(JSON.parse(previous), options)) {
|
|
667
|
+
logger.info('codex-hooks-shared-foreign-readonly', { settingsPath });
|
|
668
|
+
return {
|
|
669
|
+
usable: false,
|
|
670
|
+
reason: `${settingsPath} also holds hooks (or keys) CommandMate did not write, which would run in the UAT session`,
|
|
671
|
+
fix: 'Skip codex scenarios in this UAT, or run it where the shared hooks file holds only the hooks CommandMate writes.',
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
logger.info('codex-hooks-shared-differs-readonly', { settingsPath });
|
|
675
|
+
return { usable: false, reason: `${settingsPath} differs from what this build writes`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
676
|
+
}
|
|
677
|
+
catch (error) {
|
|
678
|
+
logger.warn('codex-hooks-config-unreadable', {
|
|
679
|
+
settingsPath,
|
|
680
|
+
error: error instanceof Error ? error.message : String(error),
|
|
681
|
+
});
|
|
682
|
+
return { usable: false, reason: `${settingsPath} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* {@link writeCodexHookSettings} for a server in UAT isolation mode: the path
|
|
687
|
+
* when {@link inspectCodexSharedHooksReadOnly} finds the shared file usable,
|
|
688
|
+
* else null — which the launch plan turns into a refused launch
|
|
689
|
+
* ({@link UatIsolationLaunchRefusedError}), not "codex without hooks", because
|
|
690
|
+
* a bare codex reads the shared file anyway.
|
|
691
|
+
*/
|
|
692
|
+
function reuseCodexHookSettingsReadOnly(options = {}) {
|
|
693
|
+
const inspection = inspectCodexSharedHooksReadOnly(options);
|
|
694
|
+
return inspection.usable ? inspection.settingsPath : null;
|
|
695
|
+
}
|
|
579
696
|
/**
|
|
580
697
|
* The plan that starts codex for one instance.
|
|
581
698
|
*
|
|
582
|
-
* Never throws: hooks are an enhancement to a session
|
|
583
|
-
* so anything that goes wrong here returns the bare
|
|
584
|
-
* byte-for-byte the pre-#1760 launch.
|
|
699
|
+
* Never throws outside UAT isolation: hooks are an enhancement to a session
|
|
700
|
+
* that has to start anyway, so anything that goes wrong here returns the bare
|
|
701
|
+
* executable — which is byte-for-byte the pre-#1760 launch. Under
|
|
702
|
+
* `CM_UAT_ISOLATION=1` (Issue #3360) each of those roads throws
|
|
703
|
+
* {@link UatIsolationLaunchRefusedError} instead: a bare codex still reads the
|
|
704
|
+
* shared, trusted `hooks.json`.
|
|
585
705
|
*
|
|
586
706
|
* The environment assignments are the per-session half of the design. The
|
|
587
707
|
* hooks file cannot hold them (there is one file for the machine), the payload
|
|
@@ -604,19 +724,33 @@ function writeCodexHookSettings(options = {}) {
|
|
|
604
724
|
*/
|
|
605
725
|
function buildCodexLaunchPlan(executablePath, target, options = {}) {
|
|
606
726
|
const bare = { command: executablePath, settingsPath: null, env: {} };
|
|
607
|
-
|
|
727
|
+
// Issue #3360: under UAT isolation every road to `bare` is refused instead.
|
|
728
|
+
// A bare codex still reads `$CODEX_HOME/hooks.json` — production's trusted
|
|
729
|
+
// hooks, with no correlation keys and no `--no-daemon` — so "without hooks"
|
|
730
|
+
// would really be "with production's hooks, posting to production".
|
|
731
|
+
const fallback = (reason, fix) => {
|
|
732
|
+
if ((0, uat_isolation_1.isUatIsolationEnabled)())
|
|
733
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError('codex', reason, fix);
|
|
608
734
|
return bare;
|
|
735
|
+
};
|
|
736
|
+
if (!(0, hook_settings_generator_1.isHookInjectionEnabled)()) {
|
|
737
|
+
return fallback('CM_AGENT_HOOKS_INJECT=0', 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.');
|
|
738
|
+
}
|
|
609
739
|
const instanceId = target.instanceId ?? tool_id_1.CODEX_CLI_TOOL_ID;
|
|
610
740
|
if (!(0, path_validator_1.isValidWorktreeId)(target.worktreeId) || !(0, types_1.isValidInstanceId)(instanceId)) {
|
|
611
741
|
// Both become URL parameters the receiver re-validates; a value that would
|
|
612
742
|
// be rejected there is not worth injecting.
|
|
613
743
|
logger.warn('codex-hooks-invalid-correlation-key', { worktreeId: target.worktreeId });
|
|
614
|
-
return
|
|
744
|
+
return fallback('the worktree or instance id is not a valid correlation key', 'Use a valid worktree and instance id.');
|
|
615
745
|
}
|
|
616
746
|
try {
|
|
617
747
|
const settingsPath = writeCodexHookSettings(options);
|
|
618
|
-
if (!settingsPath)
|
|
619
|
-
|
|
748
|
+
if (!settingsPath) {
|
|
749
|
+
const inspection = (0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only' ? inspectCodexSharedHooksReadOnly(options) : null;
|
|
750
|
+
if (inspection && !inspection.usable)
|
|
751
|
+
return fallback(inspection.reason, inspection.fix);
|
|
752
|
+
return fallback(`${getCodexHooksPath(options)} or its relay is missing or differs from what this build writes`, uat_isolation_1.UAT_SAME_BUILD_FIX);
|
|
753
|
+
}
|
|
620
754
|
const port = options.port ?? (0, env_1.getServerPort)();
|
|
621
755
|
const query = new URLSearchParams({
|
|
622
756
|
tool: tool_id_1.CODEX_CLI_TOOL_ID,
|
|
@@ -652,10 +786,12 @@ function buildCodexLaunchPlan(executablePath, target, options = {}) {
|
|
|
652
786
|
};
|
|
653
787
|
}
|
|
654
788
|
catch (error) {
|
|
789
|
+
if (error instanceof uat_isolation_1.UatIsolationLaunchRefusedError)
|
|
790
|
+
throw error;
|
|
655
791
|
logger.warn('codex-hooks-config-write-failed', {
|
|
656
792
|
worktreeId: target.worktreeId,
|
|
657
793
|
error: error instanceof Error ? error.message : String(error),
|
|
658
794
|
});
|
|
659
|
-
return
|
|
795
|
+
return fallback(`the hook config could not be prepared (${error instanceof Error ? error.message : String(error)})`, uat_isolation_1.UAT_SAME_BUILD_FIX);
|
|
660
796
|
}
|
|
661
797
|
}
|
|
@@ -57,6 +57,8 @@ exports.CODEX_RELAY_INSTALL_BASENAME = exports.CODEX_RELAY_INSTALL_DIRNAME = voi
|
|
|
57
57
|
exports.getCodexRelayInstallPath = getCodexRelayInstallPath;
|
|
58
58
|
exports.getInstalledCodexRelayPath = getInstalledCodexRelayPath;
|
|
59
59
|
exports.installCodexRelayScript = installCodexRelayScript;
|
|
60
|
+
exports.installCodexRelayScriptOrThrow = installCodexRelayScriptOrThrow;
|
|
61
|
+
exports.getCodexRelayStagingPath = getCodexRelayStagingPath;
|
|
60
62
|
const fs_1 = require("fs");
|
|
61
63
|
const path_1 = require("path");
|
|
62
64
|
const logger_1 = require("../../../../lib/logger");
|
|
@@ -109,27 +111,7 @@ function installCodexRelayScript(codexHome, sourcePath) {
|
|
|
109
111
|
const target = getCodexRelayInstallPath(codexHome);
|
|
110
112
|
if (sourcePath && sourcePath !== target) {
|
|
111
113
|
try {
|
|
112
|
-
|
|
113
|
-
const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
|
|
114
|
-
if (current !== desired) {
|
|
115
|
-
(0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
|
|
116
|
-
// `.tmp` beside the target so the rename cannot cross a filesystem.
|
|
117
|
-
const staging = `${target}.tmp`;
|
|
118
|
-
try {
|
|
119
|
-
(0, fs_1.writeFileSync)(staging, desired, { mode: 0o700 });
|
|
120
|
-
(0, fs_1.renameSync)(staging, target);
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
try {
|
|
124
|
-
(0, fs_1.unlinkSync)(staging);
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
// Nothing to clean up, or nothing that can be.
|
|
128
|
-
}
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
logger.info('codex-relay-installed', { target });
|
|
132
|
-
}
|
|
114
|
+
copyRelayIfChanged(sourcePath, target);
|
|
133
115
|
}
|
|
134
116
|
catch (error) {
|
|
135
117
|
// An install that failed is not a launch that failed. If a previous
|
|
@@ -143,3 +125,64 @@ function installCodexRelayScript(codexHome, sourcePath) {
|
|
|
143
125
|
}
|
|
144
126
|
return (0, fs_1.existsSync)(target) ? target : null;
|
|
145
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* {@link installCodexRelayScript} for `CM_UAT_ISOLATION=own-home` (Issue #3312):
|
|
130
|
+
* every failure throws instead of being absorbed — no shipped relay, a copy
|
|
131
|
+
* that could not be written, an installed copy whose bytes still differ from
|
|
132
|
+
* the shipped one — so the launch plan refuses the launch rather than running
|
|
133
|
+
* the check against an older relay.
|
|
134
|
+
*
|
|
135
|
+
* @returns The installed path, byte-identical to `sourcePath`
|
|
136
|
+
* @throws When the relay is missing or could not be made identical
|
|
137
|
+
*/
|
|
138
|
+
function installCodexRelayScriptOrThrow(codexHome, sourcePath) {
|
|
139
|
+
if (!sourcePath)
|
|
140
|
+
throw new Error('this build ships no relay script');
|
|
141
|
+
const target = getCodexRelayInstallPath(codexHome);
|
|
142
|
+
if (sourcePath !== target)
|
|
143
|
+
copyRelayIfChanged(sourcePath, target);
|
|
144
|
+
if (!(0, fs_1.existsSync)(target) || (0, fs_1.readFileSync)(target, 'utf8') !== (0, fs_1.readFileSync)(sourcePath, 'utf8')) {
|
|
145
|
+
throw new Error(`the installed relay ${target} differs from the one this build ships`);
|
|
146
|
+
}
|
|
147
|
+
return target;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Copy `sourcePath` to `target` when the bytes differ. Throws on any failure.
|
|
151
|
+
*
|
|
152
|
+
* The write goes through `<target>.tmp` and a rename, because the file being
|
|
153
|
+
* replaced is one a *running* codex session may be executing at that moment —
|
|
154
|
+
* truncating it in place would hand that session half a script. The temp file
|
|
155
|
+
* is removed first and then created exclusively (`wx`), so a symlink planted
|
|
156
|
+
* at that name is removed, never written through (Issue #3312).
|
|
157
|
+
*/
|
|
158
|
+
function copyRelayIfChanged(sourcePath, target) {
|
|
159
|
+
const desired = (0, fs_1.readFileSync)(sourcePath, 'utf8');
|
|
160
|
+
const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
|
|
161
|
+
if (current === desired)
|
|
162
|
+
return;
|
|
163
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
|
|
164
|
+
// `.tmp` beside the target so the rename cannot cross a filesystem.
|
|
165
|
+
const staging = getCodexRelayStagingPath(target);
|
|
166
|
+
try {
|
|
167
|
+
unlinkIfPresent(staging);
|
|
168
|
+
(0, fs_1.writeFileSync)(staging, desired, { mode: 0o700, flag: 'wx' });
|
|
169
|
+
(0, fs_1.renameSync)(staging, target);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
unlinkIfPresent(staging);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
logger.info('codex-relay-installed', { target });
|
|
176
|
+
}
|
|
177
|
+
/** The temp file the relay is written to before it is renamed over `target`. */
|
|
178
|
+
function getCodexRelayStagingPath(target) {
|
|
179
|
+
return `${target}.tmp`;
|
|
180
|
+
}
|
|
181
|
+
function unlinkIfPresent(file) {
|
|
182
|
+
try {
|
|
183
|
+
(0, fs_1.unlinkSync)(file);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Nothing to clean up, or nothing that can be.
|
|
187
|
+
}
|
|
188
|
+
}
|