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
|
@@ -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
|
}
|
|
@@ -44,6 +44,41 @@ const INERT_SUBSCRIPTION = {
|
|
|
44
44
|
close: async () => { },
|
|
45
45
|
liveness: { state: 'unknown' },
|
|
46
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* The event normalization both factories share: their two bodies were identical.
|
|
49
|
+
*/
|
|
50
|
+
function normalizeSpecEvent(spec, nativeEventNameFields, raw) {
|
|
51
|
+
const receivedAt = raw.receivedAt ?? Date.now();
|
|
52
|
+
const nativeEventName = nativeEventNameFields.length > 0
|
|
53
|
+
? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
|
|
54
|
+
: null;
|
|
55
|
+
// An event word the caller already resolved wins over the payload. This
|
|
56
|
+
// is the only channel antigravity has, and it is also how the relay
|
|
57
|
+
// script's `--event` reaches here for every other tool.
|
|
58
|
+
if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
|
|
59
|
+
return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
|
|
60
|
+
detail: spec.extractDetail,
|
|
61
|
+
conversationId: spec.conversationIdFields,
|
|
62
|
+
toolCallId: spec.toolCallIdFields,
|
|
63
|
+
modelFields: spec.modelFields,
|
|
64
|
+
extractModel: spec.extractModel,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
|
|
68
|
+
if (!mapping) {
|
|
69
|
+
// C8. Not an error: a tool emits more events than CommandMate has words
|
|
70
|
+
// for, and it grows more of them between releases.
|
|
71
|
+
(0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
|
|
75
|
+
detail: spec.extractDetail,
|
|
76
|
+
conversationId: spec.conversationIdFields,
|
|
77
|
+
toolCallId: spec.toolCallIdFields,
|
|
78
|
+
modelFields: spec.modelFields,
|
|
79
|
+
extractModel: spec.extractModel,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
47
82
|
/**
|
|
48
83
|
* Build a push (hook) source from its differences.
|
|
49
84
|
*
|
|
@@ -58,36 +93,7 @@ function definePushHookSource(spec) {
|
|
|
58
93
|
noDecision: spec.noDecision,
|
|
59
94
|
capabilities: spec.capabilities,
|
|
60
95
|
normalizeEvent(raw) {
|
|
61
|
-
|
|
62
|
-
const nativeEventName = nativeEventNameFields.length > 0
|
|
63
|
-
? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
|
|
64
|
-
: null;
|
|
65
|
-
// An event word the caller already resolved wins over the payload. This
|
|
66
|
-
// is the only channel antigravity has, and it is also how the relay
|
|
67
|
-
// script's `--event` reaches here for every other tool.
|
|
68
|
-
if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
|
|
69
|
-
return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
|
|
70
|
-
detail: spec.extractDetail,
|
|
71
|
-
conversationId: spec.conversationIdFields,
|
|
72
|
-
toolCallId: spec.toolCallIdFields,
|
|
73
|
-
modelFields: spec.modelFields,
|
|
74
|
-
extractModel: spec.extractModel,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
|
|
78
|
-
if (!mapping) {
|
|
79
|
-
// C8. Not an error: a tool emits more events than CommandMate has words
|
|
80
|
-
// for, and it grows more of them between releases.
|
|
81
|
-
(0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
|
|
85
|
-
detail: spec.extractDetail,
|
|
86
|
-
conversationId: spec.conversationIdFields,
|
|
87
|
-
toolCallId: spec.toolCallIdFields,
|
|
88
|
-
modelFields: spec.modelFields,
|
|
89
|
-
extractModel: spec.extractModel,
|
|
90
|
-
});
|
|
96
|
+
return normalizeSpecEvent(spec, nativeEventNameFields, raw);
|
|
91
97
|
},
|
|
92
98
|
eventIdentityOf(payload) {
|
|
93
99
|
// Issue #1899. Absent by default, because a push tool whose capability
|
|
@@ -96,6 +102,9 @@ function definePushHookSource(spec) {
|
|
|
96
102
|
// applied to it.
|
|
97
103
|
return spec.extractEventIdentity?.(payload) ?? null;
|
|
98
104
|
},
|
|
105
|
+
promptJoinsOpenTurn(payload) {
|
|
106
|
+
return spec.promptJoinsOpenTurn?.(payload) ?? false;
|
|
107
|
+
},
|
|
99
108
|
parsePermissionRequest: spec.parsePermissionRequest,
|
|
100
109
|
parseQuestion: spec.parseQuestion,
|
|
101
110
|
encodeVerdict(verdict) {
|
|
@@ -149,31 +158,7 @@ function definePullEventSource(spec) {
|
|
|
149
158
|
noDecision: spec.noDecision,
|
|
150
159
|
capabilities: spec.capabilities,
|
|
151
160
|
normalizeEvent(raw) {
|
|
152
|
-
|
|
153
|
-
const nativeEventName = nativeEventNameFields.length > 0
|
|
154
|
-
? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
|
|
155
|
-
: null;
|
|
156
|
-
if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
|
|
157
|
-
return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
|
|
158
|
-
detail: spec.extractDetail,
|
|
159
|
-
conversationId: spec.conversationIdFields,
|
|
160
|
-
toolCallId: spec.toolCallIdFields,
|
|
161
|
-
modelFields: spec.modelFields,
|
|
162
|
-
extractModel: spec.extractModel,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
|
|
166
|
-
if (!mapping) {
|
|
167
|
-
(0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
|
|
171
|
-
detail: spec.extractDetail,
|
|
172
|
-
conversationId: spec.conversationIdFields,
|
|
173
|
-
toolCallId: spec.toolCallIdFields,
|
|
174
|
-
modelFields: spec.modelFields,
|
|
175
|
-
extractModel: spec.extractModel,
|
|
176
|
-
});
|
|
161
|
+
return normalizeSpecEvent(spec, nativeEventNameFields, raw);
|
|
177
162
|
},
|
|
178
163
|
eventIdentityOf(payload) {
|
|
179
164
|
// Issue #1899. See the push factory's copy — the difference is that a
|
|
@@ -39,6 +39,7 @@ exports.isPlainObject = isPlainObject;
|
|
|
39
39
|
exports.readNestedString = readNestedString;
|
|
40
40
|
exports.buildNormalizedEvent = buildNormalizedEvent;
|
|
41
41
|
const agent_event_types_1 = require("../../../lib/hooks/agent-event-types");
|
|
42
|
+
const global_state_1 = require("../../global-state");
|
|
42
43
|
/**
|
|
43
44
|
* The commonest rule: this native name is always that word.
|
|
44
45
|
*
|
|
@@ -69,7 +70,7 @@ function runEventMappers(mappers, nativeEventName, payload) {
|
|
|
69
70
|
}
|
|
70
71
|
/** Cap on remembered distinct names, so an unbounded vocabulary cannot grow this. */
|
|
71
72
|
exports.MAX_UNKNOWN_EVENT_NAMES = 32;
|
|
72
|
-
const unknownEvents = (
|
|
73
|
+
const unknownEvents = (0, global_state_1.getOrInitGlobal)('__agentSourceUnknownEvents', () => new Map());
|
|
73
74
|
/**
|
|
74
75
|
* Record an event that mapped to nothing.
|
|
75
76
|
*
|
|
@@ -51,15 +51,14 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
|
|
|
51
51
|
const tool_id_1 = require("./tool-id");
|
|
52
52
|
const ports_1 = require("./ports");
|
|
53
53
|
const client_1 = require("./client");
|
|
54
|
+
const global_state_1 = require("../../../global-state");
|
|
54
55
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/diff');
|
|
55
56
|
/** Cap on a stored session or message id, so a hostile frame cannot grow the map. */
|
|
56
57
|
const MAX_OPENCODE_DIFF_ID_LENGTH = 128;
|
|
57
58
|
/** compositeKey -> that instance's diff state. */
|
|
58
|
-
const records =
|
|
59
|
-
(globalThis.__opencodeSessionDiff = new Map());
|
|
59
|
+
const records = (0, global_state_1.getOrInitGlobal)('__opencodeSessionDiff', () => new Map());
|
|
60
60
|
/** Keys with a `GET /diff` in flight, so a poll storm makes one request. */
|
|
61
|
-
const refreshing =
|
|
62
|
-
(globalThis.__opencodeSessionDiffRefreshes = new Set());
|
|
61
|
+
const refreshing = (0, global_state_1.getOrInitGlobal)('__opencodeSessionDiffRefreshes', () => new Set());
|
|
63
62
|
function keyOf(target) {
|
|
64
63
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
65
64
|
}
|
|
@@ -94,6 +94,7 @@ const agent_transcript_1 = require("../../../../types/agent-transcript");
|
|
|
94
94
|
const event_mapper_1 = require("../event-mapper");
|
|
95
95
|
const client_1 = require("./client");
|
|
96
96
|
const transcript_1 = require("./transcript");
|
|
97
|
+
const global_state_1 = require("../../../global-state");
|
|
97
98
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/history');
|
|
98
99
|
/**
|
|
99
100
|
* Cap on turns held in memory for one instance.
|
|
@@ -120,7 +121,7 @@ exports.MAX_OPENCODE_BACKFILLED_TURNS = 50;
|
|
|
120
121
|
* otherwise each get a private copy, and the turn accumulated by one would be
|
|
121
122
|
* invisible to the other.
|
|
122
123
|
*/
|
|
123
|
-
const transcripts = (
|
|
124
|
+
const transcripts = (0, global_state_1.getOrInitGlobal)('__opencodeTranscripts', () => new Map());
|
|
124
125
|
function keyOf(target) {
|
|
125
126
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
126
127
|
}
|
|
@@ -58,8 +58,9 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
|
|
|
58
58
|
const logger_1 = require("../../../../lib/logger");
|
|
59
59
|
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
60
60
|
const opencode_instance_settings_1 = require("../../../../types/opencode-instance-settings");
|
|
61
|
+
const global_state_1 = require("../../../global-state");
|
|
61
62
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/launch-settings');
|
|
62
|
-
const cache = (
|
|
63
|
+
const cache = (0, global_state_1.getOrInitGlobal)('__opencodeLaunchSettings', () => new Map());
|
|
63
64
|
function keyOf(target) {
|
|
64
65
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
65
66
|
}
|
|
@@ -41,6 +41,7 @@ exports.readOpencodePermissionSubject = readOpencodePermissionSubject;
|
|
|
41
41
|
exports.toOpencodePendingQuestion = toOpencodePendingQuestion;
|
|
42
42
|
const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
|
|
43
43
|
const event_mapper_1 = require("../event-mapper");
|
|
44
|
+
const global_state_1 = require("../../../global-state");
|
|
44
45
|
/**
|
|
45
46
|
* Cap on remembered `callID -> tool name` pairs.
|
|
46
47
|
*
|
|
@@ -49,7 +50,7 @@ const event_mapper_1 = require("../event-mapper");
|
|
|
49
50
|
* approval, never a wrong one.
|
|
50
51
|
*/
|
|
51
52
|
exports.MAX_TRACKED_TOOL_CALLS = 256;
|
|
52
|
-
const toolCallNames = (
|
|
53
|
+
const toolCallNames = (0, global_state_1.getOrInitGlobal)('__opencodeToolCallNames', () => new Map());
|
|
53
54
|
/** Record that a tool call has a name, seen on a `message.part.updated` frame. */
|
|
54
55
|
function rememberOpencodeToolCall(callId, toolName) {
|
|
55
56
|
toolCallNames.delete(callId);
|
|
@@ -65,12 +65,13 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
|
|
|
65
65
|
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
66
66
|
const logger_1 = require("../../../../lib/logger");
|
|
67
67
|
const client_1 = require("./client");
|
|
68
|
+
const global_state_1 = require("../../../global-state");
|
|
68
69
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/ports');
|
|
69
70
|
/** The window opencode instances are placed in. 100 ports, one per instance. */
|
|
70
71
|
exports.OPENCODE_PORT_RANGE = { min: 4200, max: 4299 };
|
|
71
72
|
/** How many candidates a scan will try before giving up. */
|
|
72
73
|
const PORT_SPAN = exports.OPENCODE_PORT_RANGE.max - exports.OPENCODE_PORT_RANGE.min + 1;
|
|
73
|
-
const assignments = (
|
|
74
|
+
const assignments = (0, global_state_1.getOrInitGlobal)('__opencodePortAssignments', () => new Map());
|
|
74
75
|
function keyOf(target) {
|
|
75
76
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
76
77
|
}
|
|
@@ -78,6 +78,7 @@ const payloads_1 = require("./payloads");
|
|
|
78
78
|
const push_1 = require("./push");
|
|
79
79
|
const ports_1 = require("./ports");
|
|
80
80
|
const turn_gate_1 = require("./turn-gate");
|
|
81
|
+
const global_state_1 = require("../../../global-state");
|
|
81
82
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/subscription');
|
|
82
83
|
/**
|
|
83
84
|
* How long a connection may be silent before it counts as dead.
|
|
@@ -102,7 +103,7 @@ const MAX_SEEN_DECISIONS = 256;
|
|
|
102
103
|
* its overflow beats an unbounded one that does not.
|
|
103
104
|
*/
|
|
104
105
|
exports.MAX_RESYNCED_DECISIONS = 50;
|
|
105
|
-
const subscriptions = (
|
|
106
|
+
const subscriptions = (0, global_state_1.getOrInitGlobal)('__opencodeSubscriptions', () => new Map());
|
|
106
107
|
/**
|
|
107
108
|
* The last liveness of a subscription that was **dropped rather than closed**
|
|
108
109
|
* (Issue #2054).
|
|
@@ -124,7 +125,7 @@ const subscriptions = (globalThis.__opencodeSubscriptions ??= new Map());
|
|
|
124
125
|
* Cleared when a new subscription opens on the key, and when the pane is closed:
|
|
125
126
|
* a process that is gone has no degradation left to report.
|
|
126
127
|
*/
|
|
127
|
-
const droppedLiveness = (
|
|
128
|
+
const droppedLiveness = (0, global_state_1.getOrInitGlobal)('__opencodeDroppedLiveness', () => new Map());
|
|
128
129
|
/**
|
|
129
130
|
* What `AgentEventSource.probeActivity` said the last time a stream was
|
|
130
131
|
* (re-)attached for this instance (Issue #2054).
|
|
@@ -134,7 +135,7 @@ const droppedLiveness = (globalThis.__opencodeDroppedLiveness ??= new Map());
|
|
|
134
135
|
* that turn ends, so "is this pane working right now?" has no answer on the
|
|
135
136
|
* stream and one `GET /session/status` is the whole of it.
|
|
136
137
|
*/
|
|
137
|
-
const probedActivity = (
|
|
138
|
+
const probedActivity = (0, global_state_1.getOrInitGlobal)('__opencodeProbedActivity', () => new Map());
|
|
138
139
|
function keyOf(target) {
|
|
139
140
|
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
140
141
|
}
|
|
@@ -210,19 +210,10 @@ function renderToolPart(part) {
|
|
|
210
210
|
const name = part.tool ?? 'tool';
|
|
211
211
|
const detail = part.title ?? null;
|
|
212
212
|
const failed = part.status === 'error';
|
|
213
|
-
const head = `- \`${name}\`${detail ? ` — ${collapseToLine(detail)}` : ''}`;
|
|
213
|
+
const head = `- \`${name}\`${detail ? ` — ${(0, turn_body_1.collapseToLine)(detail)}` : ''}`;
|
|
214
214
|
if (!failed)
|
|
215
215
|
return head;
|
|
216
|
-
return part.error ? `${head} _(error: ${collapseToLine(part.error)})_` : `${head} _(error)_`;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* A tool title on one line.
|
|
220
|
-
*
|
|
221
|
-
* A `bash` title is the command, and a heredoc puts newlines in it. Left alone
|
|
222
|
-
* they would end the list item and turn the rest of the command into body text.
|
|
223
|
-
*/
|
|
224
|
-
function collapseToLine(value) {
|
|
225
|
-
return value.replace(/\s+/g, ' ').trim();
|
|
216
|
+
return part.error ? `${head} _(error: ${(0, turn_body_1.collapseToLine)(part.error)})_` : `${head} _(error)_`;
|
|
226
217
|
}
|
|
227
218
|
/**
|
|
228
219
|
* Render one turn to Markdown.
|
|
@@ -280,11 +271,7 @@ function renderOpencodeTurn(turn) {
|
|
|
280
271
|
// now sits behind the prose, so what a 200 kB turn loses is the tail of its
|
|
281
272
|
// thinking rather than the answer (Issue #2272).
|
|
282
273
|
let body = separated.body;
|
|
283
|
-
|
|
284
|
-
body =
|
|
285
|
-
body.slice(0, exports.MAX_OPENCODE_TURN_BODY_LENGTH - exports.OPENCODE_TURN_TRUNCATION_MARKER.length) +
|
|
286
|
-
exports.OPENCODE_TURN_TRUNCATION_MARKER;
|
|
287
|
-
}
|
|
274
|
+
body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_OPENCODE_TURN_BODY_LENGTH, exports.OPENCODE_TURN_TRUNCATION_MARKER);
|
|
288
275
|
return {
|
|
289
276
|
sessionId: turn.sessionId,
|
|
290
277
|
userMessageId: turn.userMessageId,
|
|
@@ -111,6 +111,7 @@ const transcript_1 = require("../opencode/transcript");
|
|
|
111
111
|
const client_1 = require("./client");
|
|
112
112
|
const secrets_1 = require("./secrets");
|
|
113
113
|
const tool_id_1 = require("./tool-id");
|
|
114
|
+
const global_state_1 = require("../../../global-state");
|
|
114
115
|
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode-v2/history');
|
|
115
116
|
/** The stream events after which a turn's reply is read (Issue #2940). */
|
|
116
117
|
exports.OPENCODE_V2_TURN_END_EVENT_TYPES = [
|
|
@@ -271,7 +272,7 @@ function readLatestOpencodeV2AssistantModel(entries) {
|
|
|
271
272
|
* ends close together would otherwise race the existence check and insert the
|
|
272
273
|
* same turn twice.
|
|
273
274
|
*/
|
|
274
|
-
const queue = (
|
|
275
|
+
const queue = (0, global_state_1.getOrInitGlobal)('__opencodeV2HistoryQueue', () => new Map());
|
|
275
276
|
/** Forget queued syncs. Test seam. */
|
|
276
277
|
function resetOpencodeV2HistoryQueue() {
|
|
277
278
|
queue.clear();
|