commandmate 0.44.2 → 0.45.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 +289 -289
- package/.next/app-path-routes-manifest.json +20 -20
- package/.next/build-manifest.json +5 -5
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +26 -32
- 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 +3 -3
- 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 +20 -20
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1503.js +2 -2
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- package/.next/server/chunks/1944.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.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 +2 -2
- 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/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5292.js +7 -0
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/5737.js +1 -1
- package/.next/server/chunks/6065.js +1 -1
- 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 +6 -8
- package/.next/server/chunks/9051.js +1 -1
- 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-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1464.09cd37fee202ec4b.js +1 -0
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/2053-390e77fce43b555c.js +1 -0
- package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-dd4a0f04f1349221.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/{2751-9ef0f4b450bd4ef0.js → 2751-5f0b2702accd164d.js} +1 -1
- package/.next/static/chunks/{282.6b6f2e31a96674dd.js → 282.a1013532fd9a61b4.js} +1 -1
- package/.next/static/chunks/3237.94c29281d9ec122e.js +1 -0
- package/.next/static/chunks/3480.2e21f62e5e9d3ba5.js +1 -0
- package/.next/static/chunks/4290.c06dbe243819fea0.js +66 -0
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{5222.305dc0ebba9c0784.js → 5222.39e2034d3fce233c.js} +1 -1
- package/.next/static/chunks/{7095.8c869e553133a40e.js → 7095.87323a4fdf426341.js} +1 -1
- package/.next/static/chunks/{7485.442b21101fca7257.js → 7485.8a2a9d7c5396aa26.js} +3 -3
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-07d040cb3d3ea657.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-35f0e31a725d1c89.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/chunks/{webpack-021f0741f22dd16a.js → webpack-165d8df9acd1c5d4.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/skill-format.d.ts +8 -0
- package/dist/cli/commands/skill-format.d.ts.map +1 -1
- package/dist/cli/commands/skill-format.js +13 -3
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +657 -431
- package/dist/cli/types/api-responses.d.ts +156 -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/cli/utils/verify-runner.d.ts +21 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +38 -1
- 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 +8 -2
- package/dist/server/locales/ja/worktree.json +8 -2
- 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/model-info-extractor.js +57 -3
- 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/status-detector.js +1 -1
- 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/git/git-exec.js +23 -5
- 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/self-resume.js +213 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +57 -10
- 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 +107 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +862 -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 +449 -1107
- 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 +3 -1
- package/dist/server/src/lib/skills/preview-diff.js +24 -3
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +3 -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/verification/env-clean-gate.js +6 -5
- 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/commands-guide.md +0 -1
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +3 -2
- package/release-notes/0.44.3.json +82 -0
- package/release-notes/0.45.0.json +41 -0
- package/scripts/hooks/cmate-agent-event.sh +38 -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/2053-85a974ddfe7498fe.js +0 -1
- package/.next/static/chunks/4290.6cf86f68d73b6e77.js +0 -82
- package/.next/static/chunks/4459.a94b52985a76509a.js +0 -1
- package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
- package/.next/static/chunks/5951.616956b6aa5df63f.js +0 -1
- package/.next/static/chunks/9856.15463dd58437e2ac.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 → TPWbZB3zBp3Zv_eFEOlmt}/_buildManifest.js +0 -0
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → TPWbZB3zBp3Zv_eFEOlmt}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -224,9 +224,9 @@ function readItemDetail(type, item) {
|
|
|
224
224
|
// for a call codex could not parse.
|
|
225
225
|
const parsed = readParsedCommand(item.parsed_cmd);
|
|
226
226
|
if (parsed)
|
|
227
|
-
return boundDetailText(collapseToLine(parsed));
|
|
227
|
+
return boundDetailText((0, turn_body_1.collapseToLine)(parsed));
|
|
228
228
|
const argv = readArgv(item.command);
|
|
229
|
-
return argv ? boundDetailText(collapseToLine(argv)) : null;
|
|
229
|
+
return argv ? boundDetailText((0, turn_body_1.collapseToLine)(argv)) : null;
|
|
230
230
|
}
|
|
231
231
|
if (type === 'FileChange') {
|
|
232
232
|
const changes = item.changes;
|
|
@@ -248,7 +248,7 @@ function readItemDetail(type, item) {
|
|
|
248
248
|
}
|
|
249
249
|
if (type === 'Extension') {
|
|
250
250
|
const query = (0, event_mapper_1.readStringField)(item, 'query') ?? (0, event_mapper_1.readStringField)(item, 'action');
|
|
251
|
-
return query ? boundDetailText(collapseToLine(query)) : null;
|
|
251
|
+
return query ? boundDetailText((0, turn_body_1.collapseToLine)(query)) : null;
|
|
252
252
|
}
|
|
253
253
|
return null;
|
|
254
254
|
}
|
|
@@ -273,14 +273,8 @@ function readArgv(value) {
|
|
|
273
273
|
const parts = value.filter((entry) => typeof entry === 'string');
|
|
274
274
|
return parts.length > 0 ? parts.join(' ') : null;
|
|
275
275
|
}
|
|
276
|
-
/** A tool detail on one line. A heredoc puts newlines in a shell command. */
|
|
277
|
-
function collapseToLine(value) {
|
|
278
|
-
return value.replace(/\s+/g, ' ').trim();
|
|
279
|
-
}
|
|
280
276
|
function boundDetailText(value) {
|
|
281
|
-
return value
|
|
282
|
-
? value
|
|
283
|
-
: `${value.slice(0, exports.MAX_CODEX_TOOL_DETAIL_LENGTH - 1)}…`;
|
|
277
|
+
return (0, turn_body_1.boundDetail)(value, exports.MAX_CODEX_TOOL_DETAIL_LENGTH);
|
|
284
278
|
}
|
|
285
279
|
/**
|
|
286
280
|
* Read one parsed rollout line.
|
|
@@ -565,11 +559,7 @@ function renderCodexTurn(turn) {
|
|
|
565
559
|
// enough to be truncated at both ends still says so at both ends.
|
|
566
560
|
if (!turn.started && body.length > 0)
|
|
567
561
|
body = exports.CODEX_TURN_HEAD_TRUNCATION_MARKER + body;
|
|
568
|
-
|
|
569
|
-
body =
|
|
570
|
-
body.slice(0, exports.MAX_CODEX_TURN_BODY_LENGTH - exports.CODEX_TURN_TRUNCATION_MARKER.length) +
|
|
571
|
-
exports.CODEX_TURN_TRUNCATION_MARKER;
|
|
572
|
-
}
|
|
562
|
+
body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_CODEX_TURN_BODY_LENGTH, exports.CODEX_TURN_TRUNCATION_MARKER);
|
|
573
563
|
return {
|
|
574
564
|
sessionId: turn.sessionId,
|
|
575
565
|
turnId: turn.turnId,
|
|
@@ -129,6 +129,7 @@ exports.acceptCommandCodeTranscriptHint = acceptCommandCodeTranscriptHint;
|
|
|
129
129
|
exports.findCommandCodeTranscriptPath = findCommandCodeTranscriptPath;
|
|
130
130
|
exports.captureCommandCodeTranscriptTurn = captureCommandCodeTranscriptTurn;
|
|
131
131
|
exports.resolveCommandCodeTranscriptPath = resolveCommandCodeTranscriptPath;
|
|
132
|
+
const global_state_1 = require("../../../../lib/global-state");
|
|
132
133
|
const promises_1 = require("fs/promises");
|
|
133
134
|
const os_1 = require("os");
|
|
134
135
|
const path_1 = require("path");
|
|
@@ -138,6 +139,7 @@ const user_turn_recorder_1 = require("../../../../lib/history/user-turn-recorder
|
|
|
138
139
|
const assistant_response_saver_1 = require("../../../../lib/assistant-response-saver");
|
|
139
140
|
const logger_1 = require("../../../../lib/logger");
|
|
140
141
|
const agent_transcript_1 = require("../../../../types/agent-transcript");
|
|
142
|
+
const transcript_history_1 = require("../transcript-history");
|
|
141
143
|
const transcript_1 = require("./transcript");
|
|
142
144
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/command-code/history');
|
|
143
145
|
/**
|
|
@@ -172,7 +174,7 @@ const COMMAND_CODE_SESSION_ID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA
|
|
|
172
174
|
* Command Code sends `session_id` on all four of its events — but an event that
|
|
173
175
|
* did not would otherwise blank the pointer mid-session.
|
|
174
176
|
*/
|
|
175
|
-
const sessionPointers = (
|
|
177
|
+
const sessionPointers = (0, global_state_1.getOrInitGlobal)('__commandCodeTranscriptSessions', () => new Map());
|
|
176
178
|
/**
|
|
177
179
|
* Where each session id's transcript was found.
|
|
178
180
|
*
|
|
@@ -181,7 +183,7 @@ const sessionPointers = (globalThis.__commandCodeTranscriptSessions ??= new Map(
|
|
|
181
183
|
* directory scan — the project directory name is `slugify(cwd)` and not
|
|
182
184
|
* derivable — and a scan on every finished turn is not something to do twice.
|
|
183
185
|
*/
|
|
184
|
-
const transcriptPaths = (
|
|
186
|
+
const transcriptPaths = (0, global_state_1.getOrInitGlobal)('__commandCodeTranscriptPaths', () => new Map());
|
|
185
187
|
function keyOf(target) {
|
|
186
188
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
187
189
|
}
|
|
@@ -206,24 +208,7 @@ function resetCommandCodeTranscriptSessions() {
|
|
|
206
208
|
* is merely the status quo.
|
|
207
209
|
*/
|
|
208
210
|
async function resolveCommandCodeSessionId(target) {
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
const { getLastAgentEvent } = await Promise.resolve().then(() => __importStar(require('../../../../lib/session/agent-event-state')));
|
|
212
|
-
const sessionId = getLastAgentEvent(target.worktreeId, target.cliToolId, target.instanceId)?.sessionId;
|
|
213
|
-
if (typeof sessionId === 'string' && sessionId.length > 0) {
|
|
214
|
-
sessionPointers.set(key, sessionId);
|
|
215
|
-
return sessionId;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
catch (error) {
|
|
219
|
-
// A state module that cannot be reached is one that knows no session id.
|
|
220
|
-
logger.debug('command-code-transcript-session-lookup-failed', {
|
|
221
|
-
worktreeId: target.worktreeId,
|
|
222
|
-
instanceId: target.instanceId ?? target.cliToolId,
|
|
223
|
-
error: error instanceof Error ? error.message : String(error),
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
return sessionPointers.get(key) ?? null;
|
|
211
|
+
return (0, transcript_history_1.resolveSessionIdFromEvents)(target, sessionPointers, keyOf(target), logger, 'command-code-transcript-session-lookup-failed');
|
|
227
212
|
}
|
|
228
213
|
/** `<home>/.commandcode/projects`. */
|
|
229
214
|
function commandCodeProjectsRoot(homeDir) {
|
|
@@ -247,15 +232,7 @@ function commandCodeProjectsRoot(homeDir) {
|
|
|
247
232
|
* @returns The resolved path, or null when it is not acceptable
|
|
248
233
|
*/
|
|
249
234
|
function acceptCommandCodeTranscriptHint(homeDir, hint) {
|
|
250
|
-
|
|
251
|
-
return null;
|
|
252
|
-
if (hint.includes('\0'))
|
|
253
|
-
return null;
|
|
254
|
-
const root = (0, path_1.resolve)(commandCodeProjectsRoot(homeDir));
|
|
255
|
-
const resolved = (0, path_1.resolve)(hint);
|
|
256
|
-
if (resolved !== root && !resolved.startsWith(root + path_1.sep))
|
|
257
|
-
return null;
|
|
258
|
-
return resolved;
|
|
235
|
+
return (0, transcript_history_1.acceptPathUnderRoot)(commandCodeProjectsRoot(homeDir), transcript_1.COMMAND_CODE_TRANSCRIPT_EXTENSION, hint);
|
|
259
236
|
}
|
|
260
237
|
/**
|
|
261
238
|
* Find this session's transcript under `~/.commandcode/projects`.
|
|
@@ -301,7 +278,7 @@ async function findCommandCodeTranscriptPath(homeDir, sessionId) {
|
|
|
301
278
|
const fileName = `${sessionId}${transcript_1.COMMAND_CODE_TRANSCRIPT_EXTENSION}`;
|
|
302
279
|
for (const directory of directories) {
|
|
303
280
|
const candidate = (0, path_1.join)(root, directory.name, fileName);
|
|
304
|
-
if (await isReadableFile(candidate))
|
|
281
|
+
if (await (0, transcript_history_1.isReadableFile)(candidate))
|
|
305
282
|
return candidate;
|
|
306
283
|
}
|
|
307
284
|
return null;
|
|
@@ -438,7 +415,7 @@ async function captureCommandCodeTranscriptTurn(target, capture, report) {
|
|
|
438
415
|
let captured = false;
|
|
439
416
|
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
440
417
|
const turn = pending.turns[index];
|
|
441
|
-
captured = await writeCommandCodeTurn(target, turn, (0, transcript_1.renderCommandCodeTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.promptId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path, report);
|
|
418
|
+
captured = await writeCommandCodeTurn(target, turn, (0, transcript_1.renderCommandCodeTurn)(turn), (0, transcript_history_1.resolveAssistantTimestampMs)(turn, userRows[index], lastRecordAt.get(turn.promptId) ?? 0, (0, transcript_history_1.nextTurnOpensAt)(pending.turns, userRows, index)), path, report);
|
|
442
419
|
}
|
|
443
420
|
if (captured) {
|
|
444
421
|
// Issue #2437: History now holds this turn as the agent's own Markdown.
|
|
@@ -473,26 +450,7 @@ async function captureCommandCodeTranscriptTurn(target, capture, report) {
|
|
|
473
450
|
* there is no evidence in the window that says otherwise.
|
|
474
451
|
*/
|
|
475
452
|
async function selectUnwrittenCommandCodeTurns(target, turns) {
|
|
476
|
-
|
|
477
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
478
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
479
|
-
]);
|
|
480
|
-
const db = getDbInstance();
|
|
481
|
-
for (let index = turns.length - 1; index >= 0; index -= 1) {
|
|
482
|
-
const requestId = (0, agent_transcript_1.commandCodeTurnRequestId)(turns[index].promptId);
|
|
483
|
-
if (!findMessageByRequestId(db, target.worktreeId, requestId))
|
|
484
|
-
continue;
|
|
485
|
-
return {
|
|
486
|
-
turns: turns.slice(index + 1),
|
|
487
|
-
previousStartedAt: turns[index].startedAt,
|
|
488
|
-
anchored: true,
|
|
489
|
-
};
|
|
490
|
-
}
|
|
491
|
-
return {
|
|
492
|
-
turns: turns.slice(-1),
|
|
493
|
-
previousStartedAt: turns.length > 1 ? turns[turns.length - 2].startedAt : 0,
|
|
494
|
-
anchored: false,
|
|
495
|
-
};
|
|
453
|
+
return (0, transcript_history_1.selectUnwrittenTurns)(target, turns, (turn) => (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId));
|
|
496
454
|
}
|
|
497
455
|
/**
|
|
498
456
|
* The transcript file this instance would be read from, or null (Issue #2246).
|
|
@@ -526,14 +484,14 @@ async function locateCommandCodeTranscript(homeDir, capture, sessionId) {
|
|
|
526
484
|
const hint = capture.transcriptPathHint;
|
|
527
485
|
if (typeof hint === 'string' && hint.length > 0) {
|
|
528
486
|
const accepted = acceptCommandCodeTranscriptHint(homeDir, hint);
|
|
529
|
-
if (accepted && (await isReadableFile(accepted)))
|
|
487
|
+
if (accepted && (await (0, transcript_history_1.isReadableFile)(accepted)))
|
|
530
488
|
return accepted;
|
|
531
489
|
}
|
|
532
490
|
if (!sessionId)
|
|
533
491
|
return null;
|
|
534
492
|
const memoKey = `${homeDir}\0${sessionId}`;
|
|
535
493
|
const memoised = transcriptPaths.get(memoKey);
|
|
536
|
-
if (memoised && (await isReadableFile(memoised)))
|
|
494
|
+
if (memoised && (await (0, transcript_history_1.isReadableFile)(memoised)))
|
|
537
495
|
return memoised;
|
|
538
496
|
const found = await findCommandCodeTranscriptPath(homeDir, sessionId);
|
|
539
497
|
if (found)
|
|
@@ -542,14 +500,6 @@ async function locateCommandCodeTranscript(homeDir, capture, sessionId) {
|
|
|
542
500
|
transcriptPaths.delete(memoKey);
|
|
543
501
|
return found;
|
|
544
502
|
}
|
|
545
|
-
async function isReadableFile(path) {
|
|
546
|
-
try {
|
|
547
|
-
return (await (0, promises_1.stat)(path)).isFile();
|
|
548
|
-
}
|
|
549
|
-
catch {
|
|
550
|
-
return false;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
503
|
/**
|
|
554
504
|
* Record the prompt this turn answers, before the reply is written (#2196).
|
|
555
505
|
*
|
|
@@ -592,7 +542,7 @@ async function recordCommandCodeUserTurn(target, turn, previousStartedAt = 0) {
|
|
|
592
542
|
}
|
|
593
543
|
return recorded;
|
|
594
544
|
}
|
|
595
|
-
|
|
545
|
+
/*
|
|
596
546
|
* When the assistant row for this turn is dated.
|
|
597
547
|
*
|
|
598
548
|
* **The turn's LAST assistant record, not its prompt (Issue #2273).** #2252
|
|
@@ -618,13 +568,6 @@ async function recordCommandCodeUserTurn(target, turn, previousStartedAt = 0) {
|
|
|
618
568
|
* @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
|
|
619
569
|
* this is the newest turn in the window
|
|
620
570
|
*/
|
|
621
|
-
function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
|
|
622
|
-
const earliest = userRow.timestampMs === null
|
|
623
|
-
? turn.startedAt
|
|
624
|
-
: Math.max(turn.startedAt, userRow.timestampMs + 1);
|
|
625
|
-
const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
|
|
626
|
-
return Math.max(earliest, Math.min(lastRecordAt, latest));
|
|
627
|
-
}
|
|
628
571
|
/**
|
|
629
572
|
* When each turn's last assistant record was written (Issue #2273).
|
|
630
573
|
*
|
|
@@ -661,7 +604,7 @@ function lastCommandCodeAssistantRecordAt(records) {
|
|
|
661
604
|
}
|
|
662
605
|
return at;
|
|
663
606
|
}
|
|
664
|
-
|
|
607
|
+
/*
|
|
665
608
|
* The instant the next pending turn's prompt row carries, or null (Issue #2273).
|
|
666
609
|
*
|
|
667
610
|
* The user row's own timestamp when there is one, because that is what History
|
|
@@ -670,12 +613,6 @@ function lastCommandCodeAssistantRecordAt(records) {
|
|
|
670
613
|
* prompt is while the previous turn was still running. The turn's start is the
|
|
671
614
|
* fallback for a turn that produced no row at all.
|
|
672
615
|
*/
|
|
673
|
-
function nextTurnOpensAt(turns, userRows, index) {
|
|
674
|
-
const next = turns[index + 1];
|
|
675
|
-
if (!next)
|
|
676
|
-
return null;
|
|
677
|
-
return userRows[index + 1]?.timestampMs ?? next.startedAt;
|
|
678
|
-
}
|
|
679
616
|
/**
|
|
680
617
|
* How many already-written turns are re-rendered and compared (Issue #2264).
|
|
681
618
|
*
|
|
@@ -710,32 +647,7 @@ exports.COMMAND_CODE_TURN_RECHECK_LIMIT = 3;
|
|
|
710
647
|
* @returns Whether the row was replaced
|
|
711
648
|
*/
|
|
712
649
|
async function growCommandCodeTurnRow(target, existing, rendered, path) {
|
|
713
|
-
|
|
714
|
-
const previousLength = existing.content.length;
|
|
715
|
-
if (rendered.body.length <= previousLength)
|
|
716
|
-
return false;
|
|
717
|
-
const [{ getDbInstance }, { updateMessageContent }, { broadcastMessage }] = await Promise.all([
|
|
718
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
719
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
720
|
-
Promise.resolve().then(() => __importStar(require('../../../../lib/ws-server'))),
|
|
721
|
-
]);
|
|
722
|
-
updateMessageContent(getDbInstance(), existing.id, rendered.body);
|
|
723
|
-
broadcastMessage('message_updated', {
|
|
724
|
-
worktreeId: target.worktreeId,
|
|
725
|
-
message: { ...existing, content: rendered.body },
|
|
726
|
-
});
|
|
727
|
-
logger.info('command-code-transcript-turn-updated', {
|
|
728
|
-
worktreeId: target.worktreeId,
|
|
729
|
-
instanceId,
|
|
730
|
-
sessionId: rendered.sessionId,
|
|
731
|
-
requestId: existing.requestId,
|
|
732
|
-
path,
|
|
733
|
-
previousLength,
|
|
734
|
-
bodyLength: rendered.body.length,
|
|
735
|
-
textBlocks: rendered.textBlocks,
|
|
736
|
-
toolBlocks: rendered.toolBlocks,
|
|
737
|
-
});
|
|
738
|
-
return true;
|
|
650
|
+
return (0, transcript_history_1.growTurnRowTo)(target, existing, rendered, path, logger, 'command-code-transcript-turn-updated');
|
|
739
651
|
}
|
|
740
652
|
/**
|
|
741
653
|
* Re-read the newest already-written turns and grow the short ones (#2264).
|
|
@@ -758,25 +670,12 @@ async function growCommandCodeTurnRow(target, existing, rendered, path) {
|
|
|
758
670
|
* @returns How many rows were replaced
|
|
759
671
|
*/
|
|
760
672
|
async function refreshCommandCodeTurnRows(target, candidates, path) {
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
const db = getDbInstance();
|
|
768
|
-
let updated = 0;
|
|
769
|
-
for (const turn of candidates) {
|
|
770
|
-
if (!(0, transcript_1.isCommandCodeTurnWritable)(turn))
|
|
771
|
-
continue;
|
|
772
|
-
const existing = findMessageByRequestId(db, target.worktreeId, (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId));
|
|
773
|
-
if (!existing)
|
|
774
|
-
continue;
|
|
775
|
-
if (await growCommandCodeTurnRow(target, existing, (0, transcript_1.renderCommandCodeTurn)(turn), path)) {
|
|
776
|
-
updated += 1;
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
return updated;
|
|
673
|
+
return (0, transcript_history_1.refreshTurnRowsTo)(target, candidates, path, {
|
|
674
|
+
isWritable: transcript_1.isCommandCodeTurnWritable,
|
|
675
|
+
requestIdOf: (turn) => (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId),
|
|
676
|
+
render: transcript_1.renderCommandCodeTurn,
|
|
677
|
+
grow: growCommandCodeTurnRow,
|
|
678
|
+
});
|
|
780
679
|
}
|
|
781
680
|
/**
|
|
782
681
|
* Write one rendered turn, unless it is already there.
|