commandmate 0.44.1 → 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 +169 -169
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- 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 -2
- 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 -2
- 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 +3 -3
- 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 +35 -35
- 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 -0
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- 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 -0
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/5845.js +1 -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 -0
- package/.next/server/chunks/8543.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 -5
- package/.next/server/chunks/9390.js +2 -3
- 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-f1f258d4a1d92620.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-da66300cc20244ed.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 +10 -13
- 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 +608 -416
- package/dist/cli/types/api-responses.d.ts +174 -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 +228 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +290 -0
- 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/server.js +5 -3
- 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 +139 -0
- package/dist/server/src/lib/auto-yes-poller.js +465 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
- 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 -3047
- 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/status-detector.js +1 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- 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/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
- package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
- 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 +19 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- 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 +13 -35
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- 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/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
- package/dist/server/src/lib/detection/tools/live-region.js +204 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
- 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-dialog-gate.js +16 -4
- 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 +666 -1162
- 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 +6 -5
- 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 -2
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +6 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/relay/relay-triggers.js +9 -0
- package/dist/server/src/lib/resource-cleanup.js +6 -4
- 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 +454 -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 +290 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
- 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/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +6 -8
- 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.2.json +33 -0
- 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/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/650.js +0 -1
- package/.next/server/chunks/6661.js +0 -1
- package/.next/server/chunks/8583.js +0 -1
- package/.next/server/chunks/964.js +0 -1
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-308072f285c34787.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.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/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -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.
|
|
@@ -202,18 +202,12 @@ function readToolDetail(input) {
|
|
|
202
202
|
for (const field of COMMAND_CODE_TOOL_DETAIL_FIELDS) {
|
|
203
203
|
const value = (0, event_mapper_1.readStringField)(input, field);
|
|
204
204
|
if (value)
|
|
205
|
-
return boundToolDetail(collapseToLine(value));
|
|
205
|
+
return boundToolDetail((0, turn_body_1.collapseToLine)(value));
|
|
206
206
|
}
|
|
207
207
|
return null;
|
|
208
208
|
}
|
|
209
|
-
/** A tool detail on one line. A heredoc `command` puts newlines in it. */
|
|
210
|
-
function collapseToLine(value) {
|
|
211
|
-
return value.replace(/\s+/g, ' ').trim();
|
|
212
|
-
}
|
|
213
209
|
function boundToolDetail(value) {
|
|
214
|
-
return value
|
|
215
|
-
? value
|
|
216
|
-
: `${value.slice(0, exports.MAX_COMMAND_CODE_TOOL_DETAIL_LENGTH - 1)}…`;
|
|
210
|
+
return (0, turn_body_1.boundDetail)(value, exports.MAX_COMMAND_CODE_TOOL_DETAIL_LENGTH);
|
|
217
211
|
}
|
|
218
212
|
/** `message.meta`, when the entry has one. */
|
|
219
213
|
function readMessageMeta(message) {
|
|
@@ -588,11 +582,7 @@ function renderCommandCodeTurn(turn) {
|
|
|
588
582
|
unknown.add(block.type);
|
|
589
583
|
}
|
|
590
584
|
let body = (0, turn_body_1.separateTurnBody)(rendered).body;
|
|
591
|
-
|
|
592
|
-
body =
|
|
593
|
-
body.slice(0, exports.MAX_COMMAND_CODE_TURN_BODY_LENGTH - exports.COMMAND_CODE_TURN_TRUNCATION_MARKER.length) +
|
|
594
|
-
exports.COMMAND_CODE_TURN_TRUNCATION_MARKER;
|
|
595
|
-
}
|
|
585
|
+
body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_COMMAND_CODE_TURN_BODY_LENGTH, exports.COMMAND_CODE_TURN_TRUNCATION_MARKER);
|
|
596
586
|
return {
|
|
597
587
|
sessionId: turn.sessionId,
|
|
598
588
|
promptId: turn.promptId,
|
|
@@ -100,6 +100,15 @@
|
|
|
100
100
|
* the bearer header without looking at where it is going, so a constant
|
|
101
101
|
* destination is what keeps the token on loopback (設計方針書 §10.7).
|
|
102
102
|
*
|
|
103
|
+
* ## UAT isolation (Issue #3391)
|
|
104
|
+
*
|
|
105
|
+
* Under `CM_UAT_ISOLATION=1` (Issue #3360) nothing in `~/.copilot` is written —
|
|
106
|
+
* not `settings.json`, not its backup, not the lock. The file is the user's,
|
|
107
|
+
* shared with their production server, and names a relay by this checkout's
|
|
108
|
+
* path. It is used as it is only when it already holds exactly what this build
|
|
109
|
+
* writes into an empty file ({@link inspectCopilotHookSettingsReadOnly});
|
|
110
|
+
* anything else refuses the launch, the way codex and antigravity do.
|
|
111
|
+
*
|
|
103
112
|
* @module lib/hooks/sources/copilot/hook-settings
|
|
104
113
|
*/
|
|
105
114
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -111,8 +120,9 @@ exports.buildCopilotEventCommand = buildCopilotEventCommand;
|
|
|
111
120
|
exports.buildCopilotPermissionCommand = buildCopilotPermissionCommand;
|
|
112
121
|
exports.buildCopilotHookSettings = buildCopilotHookSettings;
|
|
113
122
|
exports.mergeCopilotHookSettings = mergeCopilotHookSettings;
|
|
114
|
-
exports.readCopilotSettings = readCopilotSettings;
|
|
115
123
|
exports.inspectCopilotConfigHooks = inspectCopilotConfigHooks;
|
|
124
|
+
exports.getCopilotSettingsTempPath = getCopilotSettingsTempPath;
|
|
125
|
+
exports.inspectCopilotHookSettingsReadOnly = inspectCopilotHookSettingsReadOnly;
|
|
116
126
|
exports.writeCopilotHookSettings = writeCopilotHookSettings;
|
|
117
127
|
exports.buildCopilotHookEnvironment = buildCopilotHookEnvironment;
|
|
118
128
|
exports.isCopilotHookInjectionEnabled = isCopilotHookInjectionEnabled;
|
|
@@ -121,6 +131,7 @@ const fs_1 = require("fs");
|
|
|
121
131
|
const os_1 = require("os");
|
|
122
132
|
const path_1 = require("path");
|
|
123
133
|
const safe_directory_1 = require("../../../../config/safe-directory");
|
|
134
|
+
const uat_isolation_1 = require("../../../../config/uat-isolation");
|
|
124
135
|
const types_1 = require("../../../../lib/cli-tools/types");
|
|
125
136
|
const env_1 = require("../../../../lib/env");
|
|
126
137
|
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
@@ -488,6 +499,10 @@ function mergeCopilotHookSettings(existing, generated) {
|
|
|
488
499
|
}
|
|
489
500
|
return { ...existing, hooks: merged };
|
|
490
501
|
}
|
|
502
|
+
/** The bytes `settings.json` should hold, given what it holds now. */
|
|
503
|
+
function renderCopilotHookSettings(existing, options) {
|
|
504
|
+
return `${JSON.stringify(mergeCopilotHookSettings(existing, buildCopilotHookSettings(options)), null, 2)}\n`;
|
|
505
|
+
}
|
|
491
506
|
/** `''` when the file is not there; anything else throws. */
|
|
492
507
|
function readFileOrEmpty(path) {
|
|
493
508
|
try {
|
|
@@ -499,16 +514,6 @@ function readFileOrEmpty(path) {
|
|
|
499
514
|
throw error;
|
|
500
515
|
}
|
|
501
516
|
}
|
|
502
|
-
/**
|
|
503
|
-
* Read the user's `settings.json`.
|
|
504
|
-
*
|
|
505
|
-
* @returns The parsed object, or `{}` when the file does not exist
|
|
506
|
-
* @throws When the file exists but cannot be read or is not a JSON object —
|
|
507
|
-
* the caller turns that into "start without hooks", never into a rewrite
|
|
508
|
-
*/
|
|
509
|
-
function readCopilotSettings(settingsPath) {
|
|
510
|
-
return parseCopilotSettings(readFileOrEmpty(settingsPath));
|
|
511
|
-
}
|
|
512
517
|
function parseCopilotSettings(raw) {
|
|
513
518
|
if (raw.trim() === '')
|
|
514
519
|
return {};
|
|
@@ -682,6 +687,10 @@ function withCopilotSettingsLock(directory, write) {
|
|
|
682
687
|
}
|
|
683
688
|
}
|
|
684
689
|
}
|
|
690
|
+
/** The temp file {@link writeFileAtomic} writes before it renames it over `path`. */
|
|
691
|
+
function getCopilotSettingsTempPath(path) {
|
|
692
|
+
return `${path}.${process.pid}.tmp`;
|
|
693
|
+
}
|
|
685
694
|
/**
|
|
686
695
|
* Replace a file's contents without ever leaving it half-written.
|
|
687
696
|
*
|
|
@@ -692,9 +701,17 @@ function withCopilotSettingsLock(directory, write) {
|
|
|
692
701
|
* runs on (設計方針書 §10.9 決定 1).
|
|
693
702
|
*/
|
|
694
703
|
function writeFileAtomic(path, contents) {
|
|
695
|
-
const temp =
|
|
704
|
+
const temp = getCopilotSettingsTempPath(path);
|
|
696
705
|
try {
|
|
697
|
-
|
|
706
|
+
// Issue #3312: removed first and then created exclusively, so a symlink
|
|
707
|
+
// planted at the temp name is removed, never written through.
|
|
708
|
+
try {
|
|
709
|
+
(0, fs_1.unlinkSync)(temp);
|
|
710
|
+
}
|
|
711
|
+
catch {
|
|
712
|
+
// Not there: the usual case.
|
|
713
|
+
}
|
|
714
|
+
(0, fs_1.writeFileSync)(temp, contents, { mode: 0o600, flag: 'wx' });
|
|
698
715
|
(0, fs_1.renameSync)(temp, path);
|
|
699
716
|
}
|
|
700
717
|
catch (error) {
|
|
@@ -707,22 +724,121 @@ function writeFileAtomic(path, contents) {
|
|
|
707
724
|
throw error;
|
|
708
725
|
}
|
|
709
726
|
}
|
|
727
|
+
/**
|
|
728
|
+
* The `config.json` that can erase `settingsPath`.
|
|
729
|
+
*
|
|
730
|
+
* Next to the settings file rather than via `getCopilotConfigPath()`: the
|
|
731
|
+
* config.json that can erase a settings.json is the one copilot reads from the
|
|
732
|
+
* same directory, and an overridden `settingsPath` must not be checked against
|
|
733
|
+
* a different home's config.
|
|
734
|
+
*/
|
|
735
|
+
function resolveCopilotConfigPathFor(settingsPath, options) {
|
|
736
|
+
return options.configPath ?? (0, path_1.join)((0, path_1.dirname)(settingsPath), 'config.json');
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Whether the shared `~/.copilot/settings.json` may be used, unwritten, by a
|
|
740
|
+
* server in UAT isolation mode (`CM_UAT_ISOLATION=1`, Issue #3391).
|
|
741
|
+
*
|
|
742
|
+
* Usable means exactly one thing, as for codex and antigravity: the file is
|
|
743
|
+
* byte-identical to what this build writes into an EMPTY file. Comparing against
|
|
744
|
+
* the merge with what is there ({@link mergeCopilotHookSettings}) would not do —
|
|
745
|
+
* the merge keeps the user's own handlers, so a file holding a hand-written
|
|
746
|
+
* hook that posts straight to production would compare equal and run in the
|
|
747
|
+
* UAT session. The file holds no port, worktree or instance (they travel in the
|
|
748
|
+
* launch environment), so a file production wrote with the same build delivers
|
|
749
|
+
* this session's events to THIS server.
|
|
750
|
+
*
|
|
751
|
+
* A `hooks` key in copilot's `config.json` is refused too: copilot migrates it
|
|
752
|
+
* over `settings.json` at startup, so those hooks would be the ones that run. An
|
|
753
|
+
* unreadable `config.json` is refused rather than proceeded past, because here
|
|
754
|
+
* nothing may run that this server cannot show is its own.
|
|
755
|
+
*/
|
|
756
|
+
function inspectCopilotHookSettingsReadOnly(options = {}) {
|
|
757
|
+
const settingsPath = options.settingsPath ?? getCopilotSettingsPath();
|
|
758
|
+
const configPath = resolveCopilotConfigPathFor(settingsPath, options);
|
|
759
|
+
if (!isCopilotHookInjectionEnabled()) {
|
|
760
|
+
return {
|
|
761
|
+
usable: false,
|
|
762
|
+
reason: 'CM_AGENT_HOOKS_INJECT=0',
|
|
763
|
+
fix: 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.',
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
try {
|
|
767
|
+
const configHooks = inspectCopilotConfigHooks(configPath);
|
|
768
|
+
if (configHooks !== 'absent') {
|
|
769
|
+
logger.info('copilot-hook-config-json-readonly', { configPath, configHooks });
|
|
770
|
+
return {
|
|
771
|
+
usable: false,
|
|
772
|
+
reason: configHooks === 'present'
|
|
773
|
+
? `${configPath} has a "hooks" key, which copilot migrates over settings.json at startup`
|
|
774
|
+
: `${configPath} could not be parsed, so it may hold hooks copilot migrates over settings.json`,
|
|
775
|
+
fix: 'Skip copilot scenarios in this UAT, or run it where copilot\'s config.json holds no hooks.',
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
const raw = readFileOrEmpty(settingsPath);
|
|
779
|
+
if (raw === '') {
|
|
780
|
+
logger.info('copilot-hook-settings-absent-readonly', { settingsPath });
|
|
781
|
+
return { usable: false, reason: `${settingsPath} does not exist or is empty`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
782
|
+
}
|
|
783
|
+
if (raw === renderCopilotHookSettings({}, options)) {
|
|
784
|
+
return { usable: true, settingsPath };
|
|
785
|
+
}
|
|
786
|
+
if (raw === renderCopilotHookSettings(parseCopilotSettings(raw), options)) {
|
|
787
|
+
logger.info('copilot-hook-settings-foreign-readonly', { settingsPath });
|
|
788
|
+
return {
|
|
789
|
+
usable: false,
|
|
790
|
+
reason: `${settingsPath} also holds hooks (or keys) CommandMate did not write, which would run in the UAT session`,
|
|
791
|
+
fix: 'Skip copilot scenarios in this UAT, or run it where the shared settings file holds only the hooks CommandMate writes.',
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
logger.info('copilot-hook-settings-differs-readonly', { settingsPath });
|
|
795
|
+
return { usable: false, reason: `${settingsPath} differs from what this build writes`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
796
|
+
}
|
|
797
|
+
catch (error) {
|
|
798
|
+
logger.warn('copilot-hook-settings-unreadable', {
|
|
799
|
+
settingsPath,
|
|
800
|
+
error: error instanceof Error ? error.message : String(error),
|
|
801
|
+
});
|
|
802
|
+
return { usable: false, reason: `${settingsPath} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
|
|
803
|
+
}
|
|
804
|
+
}
|
|
710
805
|
/**
|
|
711
806
|
* Merge the generated hooks into copilot's settings file and return its path.
|
|
712
807
|
*
|
|
808
|
+
* Under `CM_UAT_ISOLATION=1` (Issue #3391) nothing is written: a file that
|
|
809
|
+
* already holds exactly this build's hooks is reused, anything else throws
|
|
810
|
+
* {@link UatIsolationLaunchRefusedError}.
|
|
811
|
+
*
|
|
812
|
+
* @throws {UatIsolationLaunchRefusedError} Under UAT isolation, when the shared
|
|
813
|
+
* file cannot be used as it is
|
|
713
814
|
* @throws {CopilotConfigHooksShadowError} When copilot's `config.json` still
|
|
714
815
|
* has a `hooks` key, which it migrates over this file at startup
|
|
715
816
|
* @throws Anything the read, the merge or the write throws, plus a lock the
|
|
716
817
|
* file's other writers are holding. Callers must treat a throw as "launch
|
|
717
|
-
* without hooks" (fail-open).
|
|
818
|
+
* without hooks" (fail-open), except the UAT isolation refusal.
|
|
718
819
|
*/
|
|
719
820
|
function writeCopilotHookSettings(options = {}) {
|
|
720
|
-
|
|
721
|
-
//
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
821
|
+
// Issue #3312: under `own-home` the file, its backup and its lock directory
|
|
822
|
+
// are written once they check out inside the dedicated user's HOME.
|
|
823
|
+
const targetPath = options.settingsPath ?? getCopilotSettingsPath();
|
|
824
|
+
const policy = (0, uat_isolation_1.sharedHookWritePolicy)(tool_id_1.COPILOT_CLI_TOOL_ID, [
|
|
825
|
+
(0, path_1.dirname)(targetPath),
|
|
826
|
+
targetPath,
|
|
827
|
+
`${targetPath}${exports.COPILOT_SETTINGS_BACKUP_SUFFIX}`,
|
|
828
|
+
getCopilotSettingsTempPath(targetPath),
|
|
829
|
+
(0, path_1.join)((0, path_1.dirname)(targetPath), exports.COPILOT_SETTINGS_LOCK_BASENAME),
|
|
830
|
+
]);
|
|
831
|
+
if (policy === 'read-only') {
|
|
832
|
+
// Issue #3391: the file is the user's, shared with their production server,
|
|
833
|
+
// and names a relay by this checkout's path. A UAT server writes nothing to
|
|
834
|
+
// it; see {@link inspectCopilotHookSettingsReadOnly}.
|
|
835
|
+
const inspection = inspectCopilotHookSettingsReadOnly(options);
|
|
836
|
+
if (inspection.usable)
|
|
837
|
+
return inspection.settingsPath;
|
|
838
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.COPILOT_CLI_TOOL_ID, inspection.reason, inspection.fix);
|
|
839
|
+
}
|
|
840
|
+
const settingsPath = targetPath;
|
|
841
|
+
const configPath = resolveCopilotConfigPathFor(settingsPath, options);
|
|
726
842
|
const configHooks = inspectCopilotConfigHooks(configPath);
|
|
727
843
|
if (configHooks === 'present')
|
|
728
844
|
throw new CopilotConfigHooksShadowError(configPath);
|
|
@@ -734,8 +850,7 @@ function writeCopilotHookSettings(options = {}) {
|
|
|
734
850
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
|
|
735
851
|
return withCopilotSettingsLock((0, path_1.dirname)(settingsPath), () => {
|
|
736
852
|
const raw = readFileOrEmpty(settingsPath);
|
|
737
|
-
const
|
|
738
|
-
const next = `${JSON.stringify(merged, null, 2)}\n`;
|
|
853
|
+
const next = renderCopilotHookSettings(parseCopilotSettings(raw), options);
|
|
739
854
|
// Since #1904 the generated commands carry no port and no per-launch value,
|
|
740
855
|
// so the common re-launch produces the bytes already on disk. Returning
|
|
741
856
|
// early keeps the user's file — and its mtime — untouched, and skips the
|
|
@@ -787,26 +902,37 @@ function isCopilotHookInjectionEnabled() {
|
|
|
787
902
|
/**
|
|
788
903
|
* The command that launches copilot for one instance (S3 / S4 / S5).
|
|
789
904
|
*
|
|
790
|
-
* Never throws. Injection is an enhancement to a session
|
|
791
|
-
* anyway, so every failure — the switch is off, an id would
|
|
792
|
-
* receiver's own validation, the settings file is unreadable or
|
|
793
|
-
* returns the bare command and no settings path, which is
|
|
794
|
-
* `cli-tools/copilot.ts` sent before this Issue.
|
|
905
|
+
* Never throws outside UAT isolation. Injection is an enhancement to a session
|
|
906
|
+
* that has to start anyway, so every failure — the switch is off, an id would
|
|
907
|
+
* not survive the receiver's own validation, the settings file is unreadable or
|
|
908
|
+
* unwritable — returns the bare command and no settings path, which is
|
|
909
|
+
* byte-for-byte what `cli-tools/copilot.ts` sent before this Issue.
|
|
910
|
+
*
|
|
911
|
+
* Under `CM_UAT_ISOLATION=1` (Issue #3391) each of those roads throws
|
|
912
|
+
* {@link UatIsolationLaunchRefusedError} instead, as codex's and antigravity's
|
|
913
|
+
* do: a bare copilot still reads the shared `~/.copilot/settings.json`, so
|
|
914
|
+
* "without hooks" would mean "with whatever hooks are in the user's file".
|
|
795
915
|
*
|
|
796
916
|
* @param executablePath - Normally {@link COPILOT_LAUNCH_COMMAND}
|
|
797
917
|
* @param target - The instance being started
|
|
798
918
|
*/
|
|
799
919
|
function buildCopilotLaunchCommand(executablePath, target, options = {}) {
|
|
800
920
|
const bare = { command: executablePath, settingsPath: null, env: {} };
|
|
801
|
-
|
|
921
|
+
const fallback = (reason, fix) => {
|
|
922
|
+
if ((0, uat_isolation_1.isUatIsolationEnabled)())
|
|
923
|
+
throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.COPILOT_CLI_TOOL_ID, reason, fix);
|
|
802
924
|
return bare;
|
|
925
|
+
};
|
|
926
|
+
if (!isCopilotHookInjectionEnabled()) {
|
|
927
|
+
return fallback('CM_AGENT_HOOKS_INJECT=0', 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.');
|
|
928
|
+
}
|
|
803
929
|
const instanceId = target.instanceId ?? tool_id_1.COPILOT_CLI_TOOL_ID;
|
|
804
930
|
if (!(0, types_1.isValidInstanceId)(instanceId) || !(0, path_validator_1.isValidWorktreeId)(target.worktreeId)) {
|
|
805
931
|
// Both become URL parameters the receivers re-validate; a value that would
|
|
806
932
|
// be rejected there is not worth injecting, and a rejected event is worse
|
|
807
933
|
// than no event because it is a 400 in the operator's log for every turn.
|
|
808
934
|
logger.warn('copilot-hook-invalid-correlation-key', { worktreeId: target.worktreeId });
|
|
809
|
-
return
|
|
935
|
+
return fallback('the worktree or instance id is not a valid correlation key', 'Use a valid worktree and instance id.');
|
|
810
936
|
}
|
|
811
937
|
try {
|
|
812
938
|
const settingsPath = writeCopilotHookSettings(options);
|
|
@@ -817,6 +943,8 @@ function buildCopilotLaunchCommand(executablePath, target, options = {}) {
|
|
|
817
943
|
};
|
|
818
944
|
}
|
|
819
945
|
catch (error) {
|
|
946
|
+
if (error instanceof uat_isolation_1.UatIsolationLaunchRefusedError)
|
|
947
|
+
throw error;
|
|
820
948
|
if (error instanceof CopilotConfigHooksShadowError) {
|
|
821
949
|
// Its own reason code because it is the one failure here an operator can
|
|
822
950
|
// fix: move `hooks` out of config.json and into settings.json, or let
|
|
@@ -825,12 +953,14 @@ function buildCopilotLaunchCommand(executablePath, target, options = {}) {
|
|
|
825
953
|
worktreeId: target.worktreeId,
|
|
826
954
|
configPath: error.configPath,
|
|
827
955
|
});
|
|
828
|
-
|
|
956
|
+
// Issue #3312: only `own-home` writes and so can get here isolated; a
|
|
957
|
+
// bare copilot would run the hooks in config.json, so it is refused.
|
|
958
|
+
return fallback(`${error.configPath} has a "hooks" key, which copilot migrates over settings.json at startup`, 'Move the hooks out of copilot\'s config.json.');
|
|
829
959
|
}
|
|
830
960
|
logger.warn('copilot-hook-settings-write-failed', {
|
|
831
961
|
worktreeId: target.worktreeId,
|
|
832
962
|
error: error instanceof Error ? error.message : String(error),
|
|
833
963
|
});
|
|
834
|
-
return
|
|
964
|
+
return fallback('~/.copilot/settings.json could not be prepared', uat_isolation_1.UAT_SAME_BUILD_FIX);
|
|
835
965
|
}
|
|
836
966
|
}
|