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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Yes's Enter on a choice screen CommandMate cannot read (Issue #3397).
|
|
4
|
+
*
|
|
5
|
+
* ## The screen
|
|
6
|
+
*
|
|
7
|
+
* `assessPromptAnswerability` refuses some frames that are plainly a choice
|
|
8
|
+
* screen: an AskUserQuestion picker whose layout no rule could verify
|
|
9
|
+
* (`unsupported_dialog_layout`), or a numbered list the tool's `detectDialog`
|
|
10
|
+
* does not recognise (`prompt_no_longer_active`). The prompt window then says
|
|
11
|
+
* "this screen cannot be operated from CommandMate" and offers direct input,
|
|
12
|
+
* and Auto-Yes — whose dialog gate (#1928) reads the same frame — sends nothing.
|
|
13
|
+
*
|
|
14
|
+
* With Auto-Yes on, that leaves an unattended worker waiting for a human on a
|
|
15
|
+
* screen where one Enter (confirm whatever is selected now) would do.
|
|
16
|
+
*
|
|
17
|
+
* ## When Enter is sent
|
|
18
|
+
*
|
|
19
|
+
* {@link judgeEnterFallback} answers for the frame, and the poller adds the
|
|
20
|
+
* rest (the policy, the session's owner, sending once per screen):
|
|
21
|
+
*
|
|
22
|
+
* 1. the tool is enabled in {@link AUTO_YES_ENTER_FALLBACK_DEFAULT_MODE} (or by
|
|
23
|
+
* {@link AUTO_YES_ENTER_FALLBACK_ENV_VAR});
|
|
24
|
+
* 2. `assessPromptAnswerability(cliToolId, raw).refusal !== null` — the SAME
|
|
25
|
+
* reading the status API publishes as `promptAnswerable`, so the screen
|
|
26
|
+
* that shows the direct-input link and the screen that gets an Enter are
|
|
27
|
+
* one set of frames, not two copies of a rule;
|
|
28
|
+
* 3. there is evidence that the pane's focus is on a choice screen:
|
|
29
|
+
* `unsupported_dialog_layout` (the picker's own footer is on screen), or a
|
|
30
|
+
* claude / codex frame whose input box is not on screen (`no_composer`);
|
|
31
|
+
* 4. the input box is NOT on screen (`content` / `ghost` / `empty`). Not even
|
|
32
|
+
* for `unsupported_dialog_layout`: with the composer up, the list is far more
|
|
33
|
+
* likely an agent's reply quoting one (#1896), and an Enter would submit
|
|
34
|
+
* whatever sits in the composer — the shape of the accident in which a
|
|
35
|
+
* parked `/create-pr` was confirmed without anyone asking for it;
|
|
36
|
+
* 5. the tool is still on the pane (a shell prompt under the list means the
|
|
37
|
+
* agent exited) and is not thinking (a frame mid-stream is not a screen).
|
|
38
|
+
*
|
|
39
|
+
* Everything not decided here is decided on the safe side — no Enter.
|
|
40
|
+
*
|
|
41
|
+
* ## Out of scope
|
|
42
|
+
*
|
|
43
|
+
* opencode / copilot's arrow-key screens (`answerMode: 'keys'`, #1893 — an
|
|
44
|
+
* Enter there confirms whatever is highlighted, which once turned a Reject into
|
|
45
|
+
* an Approve), multi-select screens and options that need typed text (the
|
|
46
|
+
* poller asks `resolveAutoAnswerWithPolicy`, which answers null for both), and
|
|
47
|
+
* Antigravity (its frames reach Auto-Yes only with a hook receipt, #2849).
|
|
48
|
+
*
|
|
49
|
+
* @module lib/polling/auto-yes-enter-fallback
|
|
50
|
+
*/
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.getEnterFallbackSessionEpoch = exports.beginEnterFallbackSession = exports.clearEnterFallbacks = exports.forgetEnterFallbacksByWorktree = exports.forgetEnterFallback = exports.publishEnterFallback = exports.getLastEnterFallback = exports.recordEnterFallbackNoEffect = exports.recordEnterFallbackSent = exports.enterFallbackScreenKey = exports.AUTO_YES_ENTER_FALLBACK_ENV_VAR = exports.AUTO_YES_ENTER_FALLBACK_DEFAULT_MODE = exports.AUTO_YES_ENTER_FALLBACK_MODES = void 0;
|
|
53
|
+
exports.resolveAutoYesEnterFallbackMode = resolveAutoYesEnterFallbackMode;
|
|
54
|
+
exports.judgeEnterFallback = judgeEnterFallback;
|
|
55
|
+
const liveness_spec_1 = require("../../lib/cli-tools/liveness-spec");
|
|
56
|
+
const tool_liveness_1 = require("../../lib/detection/tool-liveness");
|
|
57
|
+
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
58
|
+
const cli_patterns_1 = require("../../lib/detection/cli-patterns");
|
|
59
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
60
|
+
const auto_yes_dialog_gate_1 = require("./auto-yes-dialog-gate");
|
|
61
|
+
/** Every accepted value of {@link AutoYesEnterFallbackMode}, for parsing and tests. */
|
|
62
|
+
exports.AUTO_YES_ENTER_FALLBACK_MODES = ['enabled', 'disabled'];
|
|
63
|
+
/**
|
|
64
|
+
* The state each tool ships in.
|
|
65
|
+
*
|
|
66
|
+
* `enabled` only for claude and codex: they are the two tools whose input box
|
|
67
|
+
* can be located (`SUPPORTED_COMPOSER_TOOLS` in `detection/composer-text`), so
|
|
68
|
+
* they are the only two for which "the composer is not on screen" can be read
|
|
69
|
+
* at all — and condition 4 of the module docstring is what keeps #1896 from
|
|
70
|
+
* coming back. Every other tool stays as it was: the frame is left to a human.
|
|
71
|
+
*/
|
|
72
|
+
exports.AUTO_YES_ENTER_FALLBACK_DEFAULT_MODE = {
|
|
73
|
+
claude: 'enabled',
|
|
74
|
+
codex: 'enabled',
|
|
75
|
+
copilot: 'disabled',
|
|
76
|
+
opencode: 'disabled',
|
|
77
|
+
'opencode-v2': 'disabled',
|
|
78
|
+
gemini: 'disabled',
|
|
79
|
+
antigravity: 'disabled',
|
|
80
|
+
'vibe-local': 'disabled',
|
|
81
|
+
'command-code': 'disabled',
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* The switch, spelled like `CM_AUTOYES_DIALOG_GATE`: comma-separated
|
|
85
|
+
* `<tool>=<mode>` pairs, `*` for every tool, a tool-specific entry beating `*`.
|
|
86
|
+
*
|
|
87
|
+
* ```
|
|
88
|
+
* CM_AUTOYES_ENTER_FALLBACK=*=disabled # never send the Enter
|
|
89
|
+
* CM_AUTOYES_ENTER_FALLBACK=codex=disabled # claude only
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* Read on every poll, so an operator can turn it off without a restart.
|
|
93
|
+
*/
|
|
94
|
+
exports.AUTO_YES_ENTER_FALLBACK_ENV_VAR = 'CM_AUTOYES_ENTER_FALLBACK';
|
|
95
|
+
function isMode(value) {
|
|
96
|
+
return exports.AUTO_YES_ENTER_FALLBACK_MODES.includes(value);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolve one tool's mode. An unparseable entry is ignored rather than thrown:
|
|
100
|
+
* this runs on the polling path.
|
|
101
|
+
*
|
|
102
|
+
* @param tool - CLI tool to resolve for
|
|
103
|
+
* @param env - Environment to read; injectable for tests
|
|
104
|
+
*/
|
|
105
|
+
function resolveAutoYesEnterFallbackMode(tool, env = process.env) {
|
|
106
|
+
const raw = env[exports.AUTO_YES_ENTER_FALLBACK_ENV_VAR];
|
|
107
|
+
let wildcard = null;
|
|
108
|
+
let specific = null;
|
|
109
|
+
if (typeof raw === 'string' && raw.trim() !== '') {
|
|
110
|
+
for (const entry of raw.split(',')) {
|
|
111
|
+
const [rawKey, rawValue] = entry.split('=');
|
|
112
|
+
if (rawValue === undefined)
|
|
113
|
+
continue;
|
|
114
|
+
const key = rawKey.trim();
|
|
115
|
+
const value = rawValue.trim();
|
|
116
|
+
if (!isMode(value))
|
|
117
|
+
continue;
|
|
118
|
+
if (key === '*')
|
|
119
|
+
wildcard = value;
|
|
120
|
+
else if (key === tool)
|
|
121
|
+
specific = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return specific ?? wildcard ?? exports.AUTO_YES_ENTER_FALLBACK_DEFAULT_MODE[tool] ?? 'disabled';
|
|
125
|
+
}
|
|
126
|
+
/** The composer states that mean "the input box is on screen". */
|
|
127
|
+
const COMPOSER_ON_SCREEN = new Set(['content', 'ghost', 'empty']);
|
|
128
|
+
/** The tools whose `no_composer` is a measured reading (see `SUPPORTED_COMPOSER_TOOLS`). */
|
|
129
|
+
const NO_COMPOSER_EVIDENCE_TOOLS = new Set(['claude', 'codex']);
|
|
130
|
+
/**
|
|
131
|
+
* May Auto-Yes send its Enter at this frame? Conditions 1-5 of the module
|
|
132
|
+
* docstring, in that order; the policy, the session's owner and "once per
|
|
133
|
+
* screen" are the poller's.
|
|
134
|
+
*
|
|
135
|
+
* @param cliToolId - CLI tool the frame came from
|
|
136
|
+
* @param rawOutput - The tick's capture as captured (ANSI and box drawing
|
|
137
|
+
* intact). `undefined` is refused: the composer's dim placeholder is only
|
|
138
|
+
* distinguishable with the SGR attributes, and box drawing is what locates it.
|
|
139
|
+
* @param env - Environment to read the switch from; injectable for tests
|
|
140
|
+
*/
|
|
141
|
+
function judgeEnterFallback(cliToolId, rawOutput, env = process.env) {
|
|
142
|
+
if (resolveAutoYesEnterFallbackMode(cliToolId, env) !== 'enabled') {
|
|
143
|
+
return { eligible: false, reason: 'tool-disabled', refusalReason: null, composerState: null };
|
|
144
|
+
}
|
|
145
|
+
if (rawOutput === undefined) {
|
|
146
|
+
return { eligible: false, reason: 'no-raw-frame', refusalReason: null, composerState: null };
|
|
147
|
+
}
|
|
148
|
+
const refusal = (0, auto_yes_dialog_gate_1.assessPromptAnswerability)(cliToolId, rawOutput).refusal;
|
|
149
|
+
if (refusal === null) {
|
|
150
|
+
return { eligible: false, reason: 'answerable', refusalReason: null, composerState: null };
|
|
151
|
+
}
|
|
152
|
+
const composerState = (0, composer_text_1.extractComposerText)(rawOutput, cliToolId).state;
|
|
153
|
+
const ineligible = (reason) => ({
|
|
154
|
+
eligible: false,
|
|
155
|
+
reason,
|
|
156
|
+
refusalReason: refusal.reason,
|
|
157
|
+
composerState,
|
|
158
|
+
});
|
|
159
|
+
if (COMPOSER_ON_SCREEN.has(composerState))
|
|
160
|
+
return ineligible('composer-visible');
|
|
161
|
+
const pickerFooterOnScreen = refusal.reason === auto_yes_dialog_gate_1.UNSUPPORTED_DIALOG_LAYOUT_REASON;
|
|
162
|
+
const composerOffScreen = NO_COMPOSER_EVIDENCE_TOOLS.has(cliToolId) && composerState === 'no_composer';
|
|
163
|
+
if (!pickerFooterOnScreen && !composerOffScreen)
|
|
164
|
+
return ineligible('no-choice-screen-evidence');
|
|
165
|
+
if (!(0, tool_liveness_1.judgeToolLiveness)(rawOutput, (0, liveness_spec_1.resolveLivenessSpec)(cliToolId)).alive) {
|
|
166
|
+
return ineligible('tool-exited');
|
|
167
|
+
}
|
|
168
|
+
const recentLines = (0, cli_patterns_1.stripAnsi)(rawOutput).split('\n').slice(-auto_yes_state_1.THINKING_CHECK_LINE_COUNT).join('\n');
|
|
169
|
+
if ((0, cli_patterns_1.detectThinking)(cliToolId, recentLines))
|
|
170
|
+
return ineligible('thinking');
|
|
171
|
+
return { eligible: true, refusalReason: refusal.reason, composerState };
|
|
172
|
+
}
|
|
173
|
+
// The screen key, the record and the session epoch live in
|
|
174
|
+
// `./auto-yes-enter-fallback-state` (Issue #3397, review round 2): a module with
|
|
175
|
+
// no detection imports, so `agent-session-lifecycle` — on every tool's
|
|
176
|
+
// `startSession` path — can expire the record without pulling this one in.
|
|
177
|
+
var auto_yes_enter_fallback_state_1 = require("./auto-yes-enter-fallback-state");
|
|
178
|
+
Object.defineProperty(exports, "enterFallbackScreenKey", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.enterFallbackScreenKey; } });
|
|
179
|
+
Object.defineProperty(exports, "recordEnterFallbackSent", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.recordEnterFallbackSent; } });
|
|
180
|
+
Object.defineProperty(exports, "recordEnterFallbackNoEffect", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.recordEnterFallbackNoEffect; } });
|
|
181
|
+
Object.defineProperty(exports, "getLastEnterFallback", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.getLastEnterFallback; } });
|
|
182
|
+
Object.defineProperty(exports, "publishEnterFallback", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.publishEnterFallback; } });
|
|
183
|
+
Object.defineProperty(exports, "forgetEnterFallback", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.forgetEnterFallback; } });
|
|
184
|
+
Object.defineProperty(exports, "forgetEnterFallbacksByWorktree", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.forgetEnterFallbacksByWorktree; } });
|
|
185
|
+
Object.defineProperty(exports, "clearEnterFallbacks", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.clearEnterFallbacks; } });
|
|
186
|
+
Object.defineProperty(exports, "beginEnterFallbackSession", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.beginEnterFallbackSession; } });
|
|
187
|
+
Object.defineProperty(exports, "getEnterFallbackSessionEpoch", { enumerable: true, get: function () { return auto_yes_enter_fallback_state_1.getEnterFallbackSessionEpoch; } });
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Base rules (unchanged since Issue #479):
|
|
6
6
|
* - yes/no prompt -> 'y'
|
|
7
|
-
* - multiple_choice with `multiSelect: true
|
|
8
|
-
*
|
|
7
|
+
* - multiple_choice with `multiSelect: true`, or option labels that wear a
|
|
8
|
+
* checkbox (Issue #3397) -> null (Issue #2755: the number ticks a box, the
|
|
9
|
+
* confirm is a separate row, so a default is half an answer)
|
|
9
10
|
* - multiple_choice with default option -> default option number
|
|
10
11
|
* - multiple_choice without default -> first option number
|
|
11
12
|
* - option requiring text input -> null (skip)
|
|
@@ -26,6 +27,7 @@ exports.evaluatePolicyAgainstTexts = evaluatePolicyAgainstTexts;
|
|
|
26
27
|
exports.resolveAutoAnswerWithPolicy = resolveAutoAnswerWithPolicy;
|
|
27
28
|
exports.resolveAutoAnswer = resolveAutoAnswer;
|
|
28
29
|
const auto_yes_config_1 = require("../../config/auto-yes-config");
|
|
30
|
+
const prompt_answer_semantic_1 = require("../../lib/prompt-answer-semantic");
|
|
29
31
|
/**
|
|
30
32
|
* Upper bound on a deny pattern, mirroring MAX_PATTERN_LENGTH in
|
|
31
33
|
* lib/tasks/contract-parser (asserted equal by the unit tests). Contracts are
|
|
@@ -50,7 +52,11 @@ function resolveBaseAnswer(promptData) {
|
|
|
50
52
|
// Issue #2755: a checkbox question. A number ticks a box and the confirm is
|
|
51
53
|
// a separate row, so "the default option" is not an answer — it is half of
|
|
52
54
|
// one. Auto-Yes refuses the prompt instead of ticking something and stopping.
|
|
53
|
-
|
|
55
|
+
// Issue #3397: through the one checkbox reading (`isMultiSelectPrompt`), so
|
|
56
|
+
// a list the parser did not flag but whose labels wear boxes (`[ ]` / `[x]`
|
|
57
|
+
// / `[X]` / `[✔]`) is refused too — the sender answers such a list with
|
|
58
|
+
// Space→Next→Enter, which would tick the default and submit the list.
|
|
59
|
+
if ((0, prompt_answer_semantic_1.isMultiSelectPrompt)(promptData)) {
|
|
54
60
|
return null;
|
|
55
61
|
}
|
|
56
62
|
const defaultOpt = promptData.options.find(o => o.isDefault);
|
|
@@ -27,9 +27,9 @@ exports.recordPolicySuppression = recordPolicySuppression;
|
|
|
27
27
|
exports.getLastPolicySuppression = getLastPolicySuppression;
|
|
28
28
|
exports.clearPolicySuppressions = clearPolicySuppressions;
|
|
29
29
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
30
|
+
const global_state_1 = require("../global-state");
|
|
30
31
|
/** compositeKey -> the most recent policy suppression for that session. */
|
|
31
|
-
const lastPolicySuppressions =
|
|
32
|
-
(globalThis.__autoYesPolicySuppressions = new Map());
|
|
32
|
+
const lastPolicySuppressions = (0, global_state_1.getOrInitGlobal)('__autoYesPolicySuppressions', () => new Map());
|
|
33
33
|
/**
|
|
34
34
|
* Record that the policy withheld an answer for `instanceId`'s current prompt.
|
|
35
35
|
*
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Held scraped responses for CLI tool polling (Issue #3213 split from response-checker.ts). */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PENDING_SCRAPE_HOLD_MS = void 0;
|
|
5
|
+
exports.resetPendingScrapedResponses = resetPendingScrapedResponses;
|
|
6
|
+
exports.hasPendingScrapedResponse = hasPendingScrapedResponse;
|
|
7
|
+
exports.holdScrapedResponse = holdScrapedResponse;
|
|
8
|
+
exports.discardPendingScrapedResponse = discardPendingScrapedResponse;
|
|
9
|
+
exports.flushPendingScrapedResponse = flushPendingScrapedResponse;
|
|
10
|
+
exports.settleExpiredPendingScrapedResponse = settleExpiredPendingScrapedResponse;
|
|
11
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
12
|
+
const db_1 = require("../../lib/db");
|
|
13
|
+
const ws_server_1 = require("../../lib/ws-server");
|
|
14
|
+
const conversation_logger_1 = require("../../lib/conversation-logger");
|
|
15
|
+
const logger_1 = require("../../lib/logger");
|
|
16
|
+
const response_dedup_1 = require("./response-dedup");
|
|
17
|
+
const structured_history_gate_1 = require("./structured-history-gate");
|
|
18
|
+
const stop_history_capture_1 = require("../../lib/hooks/stop-history-capture");
|
|
19
|
+
const global_state_1 = require("../global-state");
|
|
20
|
+
const logger = (0, logger_1.createLogger)('response-poller');
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// The held scrape (Issue #2436)
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* How long a scraped reply is held while its transcript finishes closing.
|
|
26
|
+
*
|
|
27
|
+
* Derived from `STOP_TRANSCRIPT_DEFERRED_DELAYS_MS`, not spelled again: those
|
|
28
|
+
* are the instants the Stop receiver re-reads the transcript at after it has
|
|
29
|
+
* answered the agent (#2398), so their SUM is the moment after which nobody is
|
|
30
|
+
* still trying. Holding past it would be holding for a row that has no producer
|
|
31
|
+
* left; stopping short of it would race the producer that is still running.
|
|
32
|
+
*
|
|
33
|
+
* The measured gap this covers is under a second — codex 2026-09-08 appended
|
|
34
|
+
* `task_complete` ~700 ms after the frame went quiet — so the budget is roughly
|
|
35
|
+
* ten times the case it exists for, spent only on turns that ask for it.
|
|
36
|
+
*/
|
|
37
|
+
exports.PENDING_SCRAPE_HOLD_MS = stop_history_capture_1.STOP_TRANSCRIPT_DEFERRED_DELAYS_MS.reduce((total, delay) => total + delay, 0);
|
|
38
|
+
/**
|
|
39
|
+
* Held scrapes, by poller key.
|
|
40
|
+
*
|
|
41
|
+
* **Deliberately not in `./response-dedup`.** That module's two caches are
|
|
42
|
+
* cleared by `stopPollingByKey` — `clearResponseHashCache` is called from
|
|
43
|
+
* inside it — so a held reply parked beside them would be dropped by the very
|
|
44
|
+
* event that has to write it (Issue #2436, requirement B). It lives here, next
|
|
45
|
+
* to the code that fills it and the code that writes it out, and
|
|
46
|
+
* `flushPendingScrapedResponse` is what the poller calls before it clears
|
|
47
|
+
* anything.
|
|
48
|
+
*
|
|
49
|
+
* On `globalThis` for the reason every shared map in this subsystem is (#1736):
|
|
50
|
+
* under `next dev` the poller's bundle and each route's bundle would otherwise
|
|
51
|
+
* hold a private copy, and a held reply only one bundle can see is a lost one.
|
|
52
|
+
*/
|
|
53
|
+
const pendingScrapedResponses = (0, global_state_1.getOrInitGlobal)('__pendingScrapedResponses', () => new Map());
|
|
54
|
+
/** Forget every held scrape. Test seam. */
|
|
55
|
+
function resetPendingScrapedResponses() {
|
|
56
|
+
pendingScrapedResponses.clear();
|
|
57
|
+
}
|
|
58
|
+
/** Whether a scrape is being held for this poller key. Test seam / diagnostics. */
|
|
59
|
+
function hasPendingScrapedResponse(pollerKey) {
|
|
60
|
+
return pendingScrapedResponses.has(pollerKey);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Hold this tick's scraped reply instead of writing it (Issue #2436).
|
|
64
|
+
*
|
|
65
|
+
* Called when the transcript reader has said `not_yet_closed`: the agent's own
|
|
66
|
+
* Markdown for this turn is coming, and writing the pane's copy now is what put
|
|
67
|
+
* 234,323 characters of prompt echo, intermediate output and footer into
|
|
68
|
+
* History beside the real answer.
|
|
69
|
+
*
|
|
70
|
+
* A second hold for the same key REPLACES the content and keeps the original
|
|
71
|
+
* deadline. Replaces, because a frame that moved on is a better copy of the
|
|
72
|
+
* same turn; keeps, because a pane that redraws every tick would otherwise push
|
|
73
|
+
* its own deadline forward forever and the hold would stop being bounded.
|
|
74
|
+
*/
|
|
75
|
+
function holdScrapedResponse(pollerKey, pending) {
|
|
76
|
+
const existing = pendingScrapedResponses.get(pollerKey);
|
|
77
|
+
if (existing) {
|
|
78
|
+
existing.content = pending.content;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
pendingScrapedResponses.set(pollerKey, pending);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Drop a held scrape without writing it (Issue #2436).
|
|
85
|
+
*
|
|
86
|
+
* The one thing that justifies dropping it: the transcript reader has since
|
|
87
|
+
* written the turn as the agent's own Markdown, so the pane's copy is the
|
|
88
|
+
* duplicate this Issue exists to stop.
|
|
89
|
+
*/
|
|
90
|
+
function discardPendingScrapedResponse(pollerKey) {
|
|
91
|
+
pendingScrapedResponses.delete(pollerKey);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write a held scrape now, whatever the clock says (Issue #2436).
|
|
95
|
+
*
|
|
96
|
+
* Exported because `response-poller-core` calls it from `stopPollingByKey`,
|
|
97
|
+
* which is every way a polling cycle ends: an explicit stop, the session going
|
|
98
|
+
* away, `MAX_POLLING_DURATION`, and the restart that opens the NEXT turn. A
|
|
99
|
+
* held reply must not be able to outlive the cycle that holds it — the caches
|
|
100
|
+
* that key it are cleared in that same function, and a reply nobody writes is
|
|
101
|
+
* strictly worse than the duplicate row this Issue is trading against.
|
|
102
|
+
*
|
|
103
|
+
* **Deliberately bypasses `isDuplicateResponse`.** The hash for this content was
|
|
104
|
+
* registered by the tick that decided to hold it (the dedup guard's check is
|
|
105
|
+
* also its write), so a re-check here would answer "duplicate" for the reply
|
|
106
|
+
* that has never been saved. That is requirement A of the Issue in one line.
|
|
107
|
+
*
|
|
108
|
+
* Synchronous through the row: `better-sqlite3` is, and this runs on shutdown
|
|
109
|
+
* paths where an awaited continuation may never be reached. The Markdown
|
|
110
|
+
* conversation log is fired afterwards and not waited for, because it is a
|
|
111
|
+
* secondary record and the row is the one History reads.
|
|
112
|
+
*
|
|
113
|
+
* @param pollerKey - Poller key ("worktreeId:instanceId")
|
|
114
|
+
* @param reason - What ended the hold; logged, for the operator reading back
|
|
115
|
+
* @returns Whether a held reply was written
|
|
116
|
+
*/
|
|
117
|
+
function flushPendingScrapedResponse(pollerKey, reason) {
|
|
118
|
+
const pending = pendingScrapedResponses.get(pollerKey);
|
|
119
|
+
if (!pending)
|
|
120
|
+
return false;
|
|
121
|
+
pendingScrapedResponses.delete(pollerKey);
|
|
122
|
+
try {
|
|
123
|
+
const db = (0, db_instance_1.getDbInstance)();
|
|
124
|
+
const message = (0, db_1.createMessage)(db, {
|
|
125
|
+
worktreeId: pending.worktreeId,
|
|
126
|
+
role: 'assistant',
|
|
127
|
+
content: pending.content,
|
|
128
|
+
messageType: 'normal',
|
|
129
|
+
timestamp: pending.timestamp,
|
|
130
|
+
cliToolId: pending.cliToolId,
|
|
131
|
+
instanceId: pending.instanceId,
|
|
132
|
+
summary: pending.summary,
|
|
133
|
+
logFileName: pending.logFileName,
|
|
134
|
+
requestId: pending.requestId,
|
|
135
|
+
});
|
|
136
|
+
(0, ws_server_1.broadcastMessage)('message', { worktreeId: pending.worktreeId, message });
|
|
137
|
+
logger.info('pending-scrape-flushed', {
|
|
138
|
+
worktreeId: pending.worktreeId,
|
|
139
|
+
cliToolId: pending.cliToolId,
|
|
140
|
+
instanceId: pending.instanceId,
|
|
141
|
+
reason,
|
|
142
|
+
scrapedLength: pending.content.length,
|
|
143
|
+
heldForMs: Date.now() - pending.timestamp.getTime(),
|
|
144
|
+
});
|
|
145
|
+
void (0, conversation_logger_1.recordClaudeConversation)(db, pending.worktreeId, pending.content, pending.cliToolId).catch(() => { });
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger.warn('pending-scrape-flush-failed', {
|
|
150
|
+
worktreeId: pending.worktreeId,
|
|
151
|
+
cliToolId: pending.cliToolId,
|
|
152
|
+
instanceId: pending.instanceId,
|
|
153
|
+
reason,
|
|
154
|
+
error: error instanceof Error ? error.message : String(error),
|
|
155
|
+
});
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* End a hold whose deadline has passed, one way or the other (Issue #2436).
|
|
161
|
+
*
|
|
162
|
+
* Run at the top of every tick, because the tick that has to notice an expiry
|
|
163
|
+
* is very often one that returns early — a static frame yields no new lines for
|
|
164
|
+
* a scrollback tool and is a duplicate for an alternate-screen one, and neither
|
|
165
|
+
* of those paths reaches the save block at the bottom of `checkForResponse`.
|
|
166
|
+
*
|
|
167
|
+
* The reader is asked ONE more time before the row is written. By the deadline
|
|
168
|
+
* the throttled recheck (#2399) has usually already captured the turn and
|
|
169
|
+
* dropped the hold, but the two are not in step — the recheck is every third
|
|
170
|
+
* duplicate tick and this is a wall clock — and a last read costs one tail
|
|
171
|
+
* parse against writing a pane dump that is about to be superseded.
|
|
172
|
+
*/
|
|
173
|
+
async function settleExpiredPendingScrapedResponse(pollerKey) {
|
|
174
|
+
const pending = pendingScrapedResponses.get(pollerKey);
|
|
175
|
+
if (!pending || Date.now() < pending.expiresAt)
|
|
176
|
+
return;
|
|
177
|
+
const captured = await (0, structured_history_gate_1.captureStructuredHistoryTurn)(pending.worktreeId, pending.cliToolId, pending.instanceId, { worktreePath: pending.worktreePath, transcriptPathHint: pending.transcriptPathHint });
|
|
178
|
+
if (captured) {
|
|
179
|
+
discardPendingScrapedResponse(pollerKey);
|
|
180
|
+
(0, response_dedup_1.settleStructuredHistoryRecheck)(pollerKey);
|
|
181
|
+
logger.info('pending-scrape-superseded', {
|
|
182
|
+
worktreeId: pending.worktreeId,
|
|
183
|
+
cliToolId: pending.cliToolId,
|
|
184
|
+
instanceId: pending.instanceId,
|
|
185
|
+
heldForMs: Date.now() - pending.timestamp.getTime(),
|
|
186
|
+
});
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
flushPendingScrapedResponse(pollerKey, 'hold-expired');
|
|
190
|
+
}
|
|
@@ -39,9 +39,9 @@ exports.getPromptDedupSkips = getPromptDedupSkips;
|
|
|
39
39
|
exports.renamePromptDedupSkips = renamePromptDedupSkips;
|
|
40
40
|
exports.clearPromptDedupSkips = clearPromptDedupSkips;
|
|
41
41
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
42
|
+
const global_state_1 = require("../global-state");
|
|
42
43
|
/** compositeKey -> running tally of suppressed prompts for that session. */
|
|
43
|
-
const promptDedupSkips =
|
|
44
|
-
(globalThis.__promptDedupSkips = new Map());
|
|
44
|
+
const promptDedupSkips = (0, global_state_1.getOrInitGlobal)('__promptDedupSkips', () => new Map());
|
|
45
45
|
/**
|
|
46
46
|
* Count one prompt the dedup guard suppressed for `instanceId`.
|
|
47
47
|
*
|
|
@@ -13,8 +13,8 @@ exports.clearPromptHashCache = clearPromptHashCache;
|
|
|
13
13
|
exports.renamePromptHashCacheKey = renamePromptHashCacheKey;
|
|
14
14
|
exports.normalizePromptForDedup = normalizePromptForDedup;
|
|
15
15
|
const crypto_1 = require("crypto");
|
|
16
|
-
const
|
|
17
|
-
|
|
16
|
+
const global_state_1 = require("../global-state");
|
|
17
|
+
const promptHashCache = (0, global_state_1.getOrInitGlobal)('__promptHashCache', () => new Map());
|
|
18
18
|
/**
|
|
19
19
|
* Check if the given prompt content is a duplicate of the last saved prompt
|
|
20
20
|
* for the same pollerKey. If not a duplicate, updates the cache.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The two gates a prompt candidate passes before it is treated as a live
|
|
4
|
+
* dialog: agy's permission receipt and the tool's own dialog rules
|
|
5
|
+
* (Issue #3374 split from response-checker.ts).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.isWithheldForWantOfReceipt = isWithheldForWantOfReceipt;
|
|
9
|
+
exports.isNumberedDialogVouched = isNumberedDialogVouched;
|
|
10
|
+
const logger_1 = require("../../lib/logger");
|
|
11
|
+
const logger = (0, logger_1.createLogger)('response-poller');
|
|
12
|
+
const antigravity_permission_receipts_1 = require("./antigravity-permission-receipts");
|
|
13
|
+
// Issue #2457: the same rollout table, `hasDialogRules` cross-check and
|
|
14
|
+
// `detectDialog` seam Auto-Yes reads, reached through the presence helper rather
|
|
15
|
+
// than through `evaluateAutoYesDialogGate` — see `isNumberedDialogVouched`.
|
|
16
|
+
const auto_yes_dialog_gate_1 = require("./auto-yes-dialog-gate");
|
|
17
|
+
/**
|
|
18
|
+
* Should an agy frame that reads as a prompt be treated as no prompt because
|
|
19
|
+
* agy asked CommandMate about no tool call lately? (Issue #2849)
|
|
20
|
+
*
|
|
21
|
+
* agy asks (`PreToolUse`) before it draws ANY approval dialog and waits for the
|
|
22
|
+
* reply, so a dialog that is really open follows a question a moment before it,
|
|
23
|
+
* and one that is only quoted in a reply follows nothing. The frame carries no
|
|
24
|
+
* tool name, so the check is time-only.
|
|
25
|
+
*
|
|
26
|
+
* Not gated (false) when there is no scope: a caller that only shows the frame —
|
|
27
|
+
* the status API, the response poller's stored `prompt` row, the notification —
|
|
28
|
+
* must keep showing a real dialog on a machine whose hook is not installed or
|
|
29
|
+
* did not reach us. Only the caller that ANSWERS the frame opts in, because for
|
|
30
|
+
* it a missed answer costs a human a keystroke and a wrong one is sent as an
|
|
31
|
+
* utterance nobody asked for.
|
|
32
|
+
*
|
|
33
|
+
* `debug`, not `info`: the poller re-reads a static pane every 2s, so a
|
|
34
|
+
* quotation left on screen would print this on every tick.
|
|
35
|
+
*/
|
|
36
|
+
function isWithheldForWantOfReceipt(scope) {
|
|
37
|
+
if (scope === undefined)
|
|
38
|
+
return false;
|
|
39
|
+
if ((0, antigravity_permission_receipts_1.hasRecentAntigravityPermissionReceipt)(scope.worktreeId, 'antigravity', scope.instanceId))
|
|
40
|
+
return false;
|
|
41
|
+
logger.debug('antigravity-dialog-no-recent-receipt', {
|
|
42
|
+
worktreeId: scope.worktreeId,
|
|
43
|
+
instanceId: scope.instanceId ?? 'antigravity',
|
|
44
|
+
});
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Is the generic parser's numbered-list candidate a dialog the tool vouches for?
|
|
49
|
+
* (Issue #2457)
|
|
50
|
+
*
|
|
51
|
+
* ## The candidate this removes
|
|
52
|
+
*
|
|
53
|
+
* `detectPrompt` classifies a frame as `multiple_choice` from the ROWS alone,
|
|
54
|
+
* and for Claude `buildDetectPromptOptions` returns
|
|
55
|
+
* `requireDefaultIndicator: false` — so a reply that happens to answer in
|
|
56
|
+
* Markdown ("1. … 2. … 3. …") is a candidate with no `❯` anywhere near it.
|
|
57
|
+
* Every one of those was stored as a `prompt` message, and the chat surface drew
|
|
58
|
+
* a tool-approval chip over an ordinary answer.
|
|
59
|
+
*
|
|
60
|
+
* ## Why the whole frame, and only the frame
|
|
61
|
+
*
|
|
62
|
+
* `detectDialog` decides by POSITION and CHROME — where the option block sits
|
|
63
|
+
* relative to the transcript tail, what (if anything) is drawn under it. None of
|
|
64
|
+
* that survives being handed the extracted response, the question string or a
|
|
65
|
+
* tail window, so the caller passes the same capture the candidate came off, as
|
|
66
|
+
* captured: `evaluateDialogPresence` documents why the box drawing must still be
|
|
67
|
+
* on it.
|
|
68
|
+
*
|
|
69
|
+
* ## What a `false` means downstream
|
|
70
|
+
*
|
|
71
|
+
* Not "there is no output here" — only "this is not a prompt". The caller falls
|
|
72
|
+
* through to the ordinary completion/partial reading, so a real reply is still
|
|
73
|
+
* saved by the normal path and a half-written one still reports
|
|
74
|
+
* `isComplete: false`.
|
|
75
|
+
*
|
|
76
|
+
* @param cliToolId - CLI tool the frame came from
|
|
77
|
+
* @param promptDetection - What the generic parser (or a tool reader) answered
|
|
78
|
+
* @param frame - The whole capture this tick made, as captured
|
|
79
|
+
* @returns True when the candidate may be treated as a live prompt
|
|
80
|
+
*/
|
|
81
|
+
function isNumberedDialogVouched(cliToolId, promptDetection, frame) {
|
|
82
|
+
const presence = (0, auto_yes_dialog_gate_1.evaluateDialogPresence)(cliToolId, promptDetection.promptData?.type, frame);
|
|
83
|
+
if (presence.present)
|
|
84
|
+
return true;
|
|
85
|
+
// `debug`, not `info`: the poller re-reads a static idle pane every 2s, so a
|
|
86
|
+
// reply carrying a numbered list would print this on every tick for as long as
|
|
87
|
+
// it stays on screen. The suppression is not silent where it matters — nothing
|
|
88
|
+
// is stored, so History simply shows the reply the ordinary path saves.
|
|
89
|
+
logger.debug('prompt-candidate-not-vouched', {
|
|
90
|
+
cliToolId,
|
|
91
|
+
promptType: promptDetection.promptData?.type,
|
|
92
|
+
gateMode: presence.mode,
|
|
93
|
+
});
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The result shape of `extractResponse` and its two shared builders
|
|
4
|
+
* (Issue #3374 split from response-checker.ts).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.incompleteResult = incompleteResult;
|
|
8
|
+
exports.buildPromptExtractionResult = buildPromptExtractionResult;
|
|
9
|
+
const cli_patterns_1 = require("../../lib/detection/cli-patterns");
|
|
10
|
+
const response_extractor_1 = require("../response-extractor");
|
|
11
|
+
/**
|
|
12
|
+
* Creates an incomplete extraction result with empty response.
|
|
13
|
+
* Centralizes the repeated pattern of returning an in-progress/incomplete state.
|
|
14
|
+
*
|
|
15
|
+
* @param lineCount - Current line count for state tracking
|
|
16
|
+
* @returns ExtractionResult with empty response and isComplete: false
|
|
17
|
+
*/
|
|
18
|
+
function incompleteResult(lineCount) {
|
|
19
|
+
return { response: '', isComplete: false, lineCount };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a complete ExtractionResult for a detected prompt.
|
|
23
|
+
*
|
|
24
|
+
* Shared between Claude early prompt detection (section 3-4, site 1) and
|
|
25
|
+
* fallback prompt detection (section 3-4, site 2) in extractResponse().
|
|
26
|
+
* Applies resolveExtractionStartIndex() to limit extraction to lastCapturedLine
|
|
27
|
+
* onwards, then strips ANSI codes for safe DB storage (Stage 4 MF-001).
|
|
28
|
+
*
|
|
29
|
+
* @param lines - The trimmed tmux buffer lines array
|
|
30
|
+
* @param lastCapturedLine - Number of lines previously captured
|
|
31
|
+
* @param totalLines - Total line count in the buffer
|
|
32
|
+
* @param bufferReset - External buffer reset flag
|
|
33
|
+
* @param cliToolId - CLI tool identifier
|
|
34
|
+
* @param findRecentUserPromptIndex - Callback to locate the most recent user prompt
|
|
35
|
+
* @param promptDetection - Prompt detection result to carry on the extraction result
|
|
36
|
+
* @param captureWindowSaturated - True when the capture was clipped by the capture window (#1670)
|
|
37
|
+
* @returns ExtractionResult with isComplete: true and ANSI-stripped response
|
|
38
|
+
*/
|
|
39
|
+
function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection, captureWindowSaturated = false) {
|
|
40
|
+
const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, captureWindowSaturated);
|
|
41
|
+
const extractedLines = lines.slice(startIndex);
|
|
42
|
+
return {
|
|
43
|
+
response: (0, cli_patterns_1.stripAnsi)(extractedLines.join('\n')),
|
|
44
|
+
isComplete: true,
|
|
45
|
+
lineCount: totalLines,
|
|
46
|
+
promptDetection,
|
|
47
|
+
bufferReset,
|
|
48
|
+
captureWindowSaturated,
|
|
49
|
+
};
|
|
50
|
+
}
|