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
|
@@ -44,6 +44,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
44
44
|
};
|
|
45
45
|
})();
|
|
46
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.AUTO_YES_ENTER_FALLBACK_ANSWER = void 0;
|
|
47
48
|
exports.getActivePollerCount = getActivePollerCount;
|
|
48
49
|
exports.clearAllPollerStates = clearAllPollerStates;
|
|
49
50
|
exports.getLastServerResponseTimestamp = getLastServerResponseTimestamp;
|
|
@@ -65,13 +66,17 @@ const antigravity_permission_receipts_1 = require("./polling/antigravity-permiss
|
|
|
65
66
|
const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
|
|
66
67
|
const auto_yes_policy_1 = require("./polling/auto-yes-policy");
|
|
67
68
|
const detect_1 = require("./detection/tools/codex/detect");
|
|
69
|
+
const frame_1 = require("./detection/tools/frame");
|
|
68
70
|
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
69
71
|
const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
|
|
72
|
+
const auto_yes_enter_fallback_1 = require("./polling/auto-yes-enter-fallback");
|
|
70
73
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
71
74
|
const db_instance_1 = require("./db/db-instance");
|
|
72
75
|
const chat_db_1 = require("./db/chat-db");
|
|
73
76
|
const worktree_session_ownership_1 = require("./cli-tools/worktree-session-ownership");
|
|
74
77
|
const prompt_answer_sender_1 = require("./prompt-answer-sender");
|
|
78
|
+
const prompt_answer_semantic_1 = require("./prompt-answer-semantic");
|
|
79
|
+
const tmux_1 = require("./tmux/tmux");
|
|
75
80
|
const manager_1 = require("./cli-tools/manager");
|
|
76
81
|
const cli_patterns_1 = require("./detection/cli-patterns");
|
|
77
82
|
const prompt_key_1 = require("./detection/prompt-key");
|
|
@@ -82,17 +87,16 @@ const logger_1 = require("../lib/logger");
|
|
|
82
87
|
const logger = (0, logger_1.createLogger)('auto-yes-poller');
|
|
83
88
|
const path_validator_1 = require("./security/path-validator");
|
|
84
89
|
const auto_yes_state_1 = require("./auto-yes-state");
|
|
90
|
+
const global_state_1 = require("./global-state");
|
|
85
91
|
/** In-memory storage for poller states (globalThis for hot reload persistence) */
|
|
86
|
-
const autoYesPollerStates =
|
|
87
|
-
(globalThis.__autoYesPollerStates = new Map());
|
|
92
|
+
const autoYesPollerStates = (0, global_state_1.getOrInitGlobal)('__autoYesPollerStates', () => new Map());
|
|
88
93
|
/**
|
|
89
94
|
* When `antigravity-autoyes-withheld-no-hook-receipt` was last logged, per
|
|
90
95
|
* compositeKey (Issue #2857). The poller re-reads a static pane every 2s, so the
|
|
91
96
|
* line is limited to one per {@link WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS} per
|
|
92
97
|
* instance. globalThis for the same reason as the poller states above.
|
|
93
98
|
*/
|
|
94
|
-
const withheldNoReceiptLoggedAt =
|
|
95
|
-
(globalThis.__autoYesWithheldNoReceiptLoggedAt = new Map());
|
|
99
|
+
const withheldNoReceiptLoggedAt = (0, global_state_1.getOrInitGlobal)('__autoYesWithheldNoReceiptLoggedAt', () => new Map());
|
|
96
100
|
/** Least gap between two `antigravity-autoyes-withheld-no-hook-receipt` lines for one instance. */
|
|
97
101
|
const WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS = 60_000;
|
|
98
102
|
// =============================================================================
|
|
@@ -160,6 +164,8 @@ function updateLastServerResponseTimestamp(compositeKey, timestamp) {
|
|
|
160
164
|
}
|
|
161
165
|
/**
|
|
162
166
|
* Reset error count for a poller and restore the default polling interval.
|
|
167
|
+
* Called after every poll that ran to the end without an error (Issue #3329)
|
|
168
|
+
* and after an answer is sent.
|
|
163
169
|
*
|
|
164
170
|
* @param compositeKey - Composite key
|
|
165
171
|
*/
|
|
@@ -182,6 +188,14 @@ function incrementErrorCount(compositeKey) {
|
|
|
182
188
|
pollerState.consecutiveErrors++;
|
|
183
189
|
pollerState.currentInterval = (0, auto_yes_state_1.calculateBackoffInterval)(pollerState.consecutiveErrors);
|
|
184
190
|
// Issue #499 Item 5: Auto-stop after consecutive error threshold.
|
|
191
|
+
//
|
|
192
|
+
// Issue #3184: this is the `consecutive-errors` row of AUTO_YES_LIFECYCLE
|
|
193
|
+
// (`lib/auto-yes-lifecycle`) — disable with `consecutive_errors`, stop the
|
|
194
|
+
// poller — applied here directly rather than through `releaseAutoYes`:
|
|
195
|
+
// that module reaches this one through the auto-yes-manager barrel, so
|
|
196
|
+
// importing it back would be a cycle. `auto-yes-lifecycle-3184.test.ts`
|
|
197
|
+
// holds this call and the table row equal. A missing session never gets
|
|
198
|
+
// here (Issue #3329): `pollAutoYes` waits for it instead of counting it.
|
|
185
199
|
if (pollerState.consecutiveErrors >= auto_yes_config_1.AUTO_STOP_ERROR_THRESHOLD) {
|
|
186
200
|
const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
|
|
187
201
|
const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
|
|
@@ -381,6 +395,366 @@ function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, rea
|
|
|
381
395
|
hint: 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認',
|
|
382
396
|
});
|
|
383
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Issue #3214: the form the four suppression exits of `detectAndRespondToPrompt`
|
|
400
|
+
* share. Records why Auto-Yes left the prompt alone (`recordPolicySuppression`,
|
|
401
|
+
* not throttled), then prints the WARN once per frame (`warnOncePerFrame`).
|
|
402
|
+
*
|
|
403
|
+
* @param suppression - Handed to `recordPolicySuppression` as is
|
|
404
|
+
* @param warnFrameKey - Handed to `warnOncePerFrame` as is: the prompt's
|
|
405
|
+
* `frameKey` plus the exit's own detail
|
|
406
|
+
* @param event - The WARN's log name
|
|
407
|
+
* @param detail - The WARN's fields after `worktreeId`, `cliToolId` and `instanceId`
|
|
408
|
+
*/
|
|
409
|
+
function suppressAndWarnOnce(prompt, suppression, warnFrameKey, event, detail) {
|
|
410
|
+
const { worktreeId, cliToolId, instanceId } = prompt;
|
|
411
|
+
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, suppression);
|
|
412
|
+
warnOncePerFrame(prompt.pollerState, warnFrameKey, event, {
|
|
413
|
+
worktreeId,
|
|
414
|
+
cliToolId,
|
|
415
|
+
instanceId,
|
|
416
|
+
...detail,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Issue #3214: steps 3, 3.2 and 3.5 of `detectAndRespondToPrompt` -- the frames
|
|
421
|
+
* that read as a prompt and are still not Auto-Yes's to answer, judged in the
|
|
422
|
+
* order they always were. "The detection above" in the comments below is that
|
|
423
|
+
* function's step 1.
|
|
424
|
+
*
|
|
425
|
+
* Issue #3397: step 3.5 no longer records its refusal here. It hands the gate's
|
|
426
|
+
* verdict back so `tryEnterFallback` can look at the frame first, and records
|
|
427
|
+
* through {@link suppressUnclassifiedFrame} when that sends nothing. Steps 3 and
|
|
428
|
+
* 3.2 still win: an Enter never reaches codex's launch dialogs or its `/model`
|
|
429
|
+
* picker.
|
|
430
|
+
*
|
|
431
|
+
* @param frame - The tick's one normalised frame (Issue #3183)
|
|
432
|
+
*/
|
|
433
|
+
function suppressIfNotOursToAnswer(prompt, frame) {
|
|
434
|
+
const { cliToolId, promptData, frameKey } = prompt;
|
|
435
|
+
// 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
|
|
436
|
+
// to answer, not the poller's. Every one of them defaults to option 1, and
|
|
437
|
+
// the base rules answer the default:
|
|
438
|
+
//
|
|
439
|
+
// "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
|
|
440
|
+
// then sits two screens deep in a review UI that
|
|
441
|
+
// only `t`/`esc` leave, reported as `running`)
|
|
442
|
+
// "Update available" -> 1. Update now (undoes Issue #890; runs
|
|
443
|
+
// `npm install -g @openai/codex`, killing codex)
|
|
444
|
+
// "Do you trust …" -> 1. Yes, continue
|
|
445
|
+
//
|
|
446
|
+
// waitForReady answers the same screens deliberately and differently ('3',
|
|
447
|
+
// '2', '1' — each without a trailing Enter), but only during startSession,
|
|
448
|
+
// while this poller runs on its own 2s phase for the life of the session.
|
|
449
|
+
// Whichever sees the dialog first decides, so the fix is to leave them all
|
|
450
|
+
// to the tool. Auto-answer layer only: the detection above still reports the
|
|
451
|
+
// prompt, so the human keeps seeing the screen and the response poller
|
|
452
|
+
// still notifies them about it.
|
|
453
|
+
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
|
|
454
|
+
if (launchDialog) {
|
|
455
|
+
// Recorded through the #1684 channel so `capture --json` and `cmate wait`
|
|
456
|
+
// can name the reason instead of showing a worker that went quiet.
|
|
457
|
+
suppressAndWarnOnce(prompt, { reason: 'agent-launch-dialog', mode: null, promptType: promptData.type }, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', { dialog: launchDialog, promptType: promptData.type });
|
|
458
|
+
return { kind: 'left-alone' };
|
|
459
|
+
}
|
|
460
|
+
// 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
|
|
461
|
+
// answer. A digit there is an immediate decision, so the base rules'
|
|
462
|
+
// default would choose the model and effort for the operator. Judged by the
|
|
463
|
+
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
464
|
+
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
465
|
+
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
466
|
+
// recognised the frame and deliberately declined it.
|
|
467
|
+
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
|
|
468
|
+
suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', { promptType: promptData.type });
|
|
469
|
+
return { kind: 'left-alone' };
|
|
470
|
+
}
|
|
471
|
+
// 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
|
|
472
|
+
// not enough to send an answer. The detection above judges the ROWS, and the
|
|
473
|
+
// rows of an agent's own reply can be indistinguishable from a dialog's --
|
|
474
|
+
// opencode 1.18 answering "list three options and ask which one" is the
|
|
475
|
+
// reported case (#1896), and the `1` this poller sent in reply was not
|
|
476
|
+
// answering anything, it was SENT AS A USER UTTERANCE. What separates the two
|
|
477
|
+
// is position and chrome, which only the tool's own module knows, so the
|
|
478
|
+
// decision is delegated to `detectDialog` (the seam #1927 declared).
|
|
479
|
+
//
|
|
480
|
+
// Per tool, and only for tools whose dialogs were measured from their own
|
|
481
|
+
// live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
|
|
482
|
+
// reaches `allowed: true` without being judged, which is the pre-#1928
|
|
483
|
+
// behaviour and the right one where nobody has measured anything.
|
|
484
|
+
//
|
|
485
|
+
// Recorded through the #1684 channel with the reason code #1924 landed for
|
|
486
|
+
// exactly this position, so `capture --json` and `cmate wait` can name the
|
|
487
|
+
// gap instead of showing a worker that silently went quiet.
|
|
488
|
+
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptData.type, frame);
|
|
489
|
+
if (!dialogGate.allowed) {
|
|
490
|
+
return { kind: 'dialog-gate-refused', dialogGate };
|
|
491
|
+
}
|
|
492
|
+
return { kind: 'ours' };
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Step 3.5's record: the tool's dialog detector did not vouch for the frame and
|
|
496
|
+
* nothing was sent (Issue #1928). Split out of `suppressIfNotOursToAnswer` by
|
|
497
|
+
* Issue #3397, unchanged, so it runs after `tryEnterFallback` declined.
|
|
498
|
+
*/
|
|
499
|
+
function suppressUnclassifiedFrame(prompt, dialogGate) {
|
|
500
|
+
const { promptData, frameKey } = prompt;
|
|
501
|
+
suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
|
|
502
|
+
promptType: promptData.type,
|
|
503
|
+
dialogKind: dialogGate.dialog?.kind ?? null,
|
|
504
|
+
answerMode: dialogGate.dialog?.answerMode ?? null,
|
|
505
|
+
gateMode: dialogGate.mode,
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* The audit row's `answer` for the Enter (Issue #3397): not a digit, so the
|
|
510
|
+
* History reads as "Auto-Yes pressed Enter" rather than as a chosen option.
|
|
511
|
+
*/
|
|
512
|
+
exports.AUTO_YES_ENTER_FALLBACK_ANSWER = '[Enter]';
|
|
513
|
+
/**
|
|
514
|
+
* Issue #3397: is the fresh capture still the screen the Enter was decided for?
|
|
515
|
+
* Re-reads it the way one tick does — prompt reading, the same `promptFrameKey`,
|
|
516
|
+
* codex's launch dialogs and `/model` picker, the dialog gate refusing with no
|
|
517
|
+
* dialog vouched for, and `judgeEnterFallback` (input box off screen, tool
|
|
518
|
+
* alive, not thinking). The policy and the checkbox rule read `promptData`,
|
|
519
|
+
* which the equal `promptFrameKey` already pins (type, question, options).
|
|
520
|
+
*/
|
|
521
|
+
function isStillEnterFallbackScreen(prompt, fresh) {
|
|
522
|
+
const { worktreeId, cliToolId, instanceId, frameKey } = prompt;
|
|
523
|
+
const clean = (0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(fresh));
|
|
524
|
+
const frame = (0, frame_1.normalizeFrame)(fresh, cliToolId);
|
|
525
|
+
const detection = (0, response_checker_1.detectPromptOnCleanFrame)(clean, cliToolId, clean.split('\n'), fresh, { worktreeId, instanceId }, frame);
|
|
526
|
+
if (!detection.isPrompt || !detection.promptData)
|
|
527
|
+
return false;
|
|
528
|
+
if (promptFrameKey(detection.promptData) !== frameKey)
|
|
529
|
+
return false;
|
|
530
|
+
if (cliToolId === 'codex' && ((0, cli_patterns_1.getCodexLifecycleDialog)(frame) || (0, detect_1.isCodexModelPickerFrame)(frame))) {
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
const gate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, detection.promptData.type, frame);
|
|
534
|
+
if (gate.allowed || gate.dialog !== null)
|
|
535
|
+
return false;
|
|
536
|
+
return (0, auto_yes_enter_fallback_1.judgeEnterFallback)(cliToolId, fresh).eligible;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Issue #3397: a frame the dialog gate refused may still be a choice screen
|
|
540
|
+
* CommandMate cannot read — the one the prompt window offers direct input for.
|
|
541
|
+
* Send ONE Enter there (confirm whatever is selected), under every condition
|
|
542
|
+
* `judgeEnterFallback` and this function check; otherwise record the refusal as
|
|
543
|
+
* step 3.5 always did.
|
|
544
|
+
*
|
|
545
|
+
* Order, each one able to stop the Enter:
|
|
546
|
+
* 1. `judgeEnterFallback` (rollout table, refusal, composer off screen, tool
|
|
547
|
+
* alive, not thinking) — and the gate must not have vouched for a dialog it
|
|
548
|
+
* refused to type into (opencode's `keys` strip, #1893);
|
|
549
|
+
* 2. the screen already had its Enter: record `no-effect`, send nothing;
|
|
550
|
+
* 3. the contract policy, exactly as step 4 applies it (mode, allow-listed
|
|
551
|
+
* types, deny patterns over the question, options and `approvalTarget`);
|
|
552
|
+
* a prompt the base rules would not answer (multi-select, typed text) gets
|
|
553
|
+
* nothing either;
|
|
554
|
+
* 4. the screen must have been eligible on the previous tick as well;
|
|
555
|
+
* 5. the session must be this server's (#2865);
|
|
556
|
+
* 6. a capture taken now, past the capture cache, must still be that screen
|
|
557
|
+
* ({@link isStillEnterFallbackScreen}).
|
|
558
|
+
*
|
|
559
|
+
* @returns true when the Enter was sent; the caller returns `responded`
|
|
560
|
+
*/
|
|
561
|
+
async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput) {
|
|
562
|
+
const { worktreeId, cliToolId, instanceId, pollerState, promptData, frameKey } = prompt;
|
|
563
|
+
const judgement = dialogGate.dialog === null ? (0, auto_yes_enter_fallback_1.judgeEnterFallback)(cliToolId, rawOutput) : null;
|
|
564
|
+
if (judgement === null || !judgement.eligible) {
|
|
565
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
566
|
+
suppressUnclassifiedFrame(prompt, dialogGate);
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
const screenKey = (0, auto_yes_enter_fallback_1.enterFallbackScreenKey)(promptData);
|
|
570
|
+
// 2. The Enter did not move the screen on. Another one would be a guess.
|
|
571
|
+
if (pollerState.enterFallbackSentKey === frameKey) {
|
|
572
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
573
|
+
(0, auto_yes_enter_fallback_1.recordEnterFallbackNoEffect)(worktreeId, cliToolId, instanceId, screenKey);
|
|
574
|
+
suppressUnclassifiedFrame(prompt, dialogGate);
|
|
575
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000enter-fallback-no-effect`, 'poller:auto-yes-enter-fallback-no-effect', {
|
|
576
|
+
worktreeId,
|
|
577
|
+
cliToolId,
|
|
578
|
+
instanceId,
|
|
579
|
+
promptType: promptData.type,
|
|
580
|
+
refusalReason: judgement.refusalReason,
|
|
581
|
+
});
|
|
582
|
+
return false;
|
|
583
|
+
}
|
|
584
|
+
// 3. The contract policy, as step 4 reads it.
|
|
585
|
+
const policy = (0, auto_yes_policy_1.getSessionAutoYesPolicy)(worktreeId, cliToolId, instanceId);
|
|
586
|
+
const resolution = (0, auto_yes_resolver_1.resolveAutoAnswerWithPolicy)(promptData, policy);
|
|
587
|
+
if (resolution.suppressedBy) {
|
|
588
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
589
|
+
suppressAndWarnOnce(prompt, {
|
|
590
|
+
reason: resolution.suppressedBy,
|
|
591
|
+
mode: policy?.mode ?? null,
|
|
592
|
+
promptType: promptData.type,
|
|
593
|
+
pattern: resolution.pattern,
|
|
594
|
+
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
595
|
+
reason: resolution.suppressedBy,
|
|
596
|
+
mode: policy?.mode ?? null,
|
|
597
|
+
pattern: resolution.pattern,
|
|
598
|
+
promptType: promptData.type,
|
|
599
|
+
enterFallback: true,
|
|
600
|
+
});
|
|
601
|
+
return false;
|
|
602
|
+
}
|
|
603
|
+
// A checkbox list is out of scope whatever the parser's flag says: the
|
|
604
|
+
// labels' boxes (`[ ]` / `[x]` / `[X]` / `[✔]`, the one reading in
|
|
605
|
+
// `prompt-answer-semantic` the sender shares) count too, so an Enter never
|
|
606
|
+
// submits a half-ticked list (Issue #3397; the base rules' #2755 reading
|
|
607
|
+
// covers `multiSelect` only).
|
|
608
|
+
if (resolution.answer === null ||
|
|
609
|
+
(promptData.type === 'multiple_choice' && (0, prompt_answer_semantic_1.isMultiSelectPrompt)(promptData))) {
|
|
610
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
611
|
+
suppressUnclassifiedFrame(prompt, dialogGate);
|
|
612
|
+
return false;
|
|
613
|
+
}
|
|
614
|
+
// 4. Seen once: wait for the next tick to see the same screen again.
|
|
615
|
+
// Nothing is recorded as withheld here: Auto-Yes is about to answer, and a
|
|
616
|
+
// fresh `lastSuppression` would make `cmate wait` report the prompt to a
|
|
617
|
+
// human at once instead of holding for Auto-Yes (#2463).
|
|
618
|
+
if (pollerState.enterFallbackCandidateKey !== frameKey) {
|
|
619
|
+
pollerState.enterFallbackCandidateKey = frameKey;
|
|
620
|
+
logger.debug('poller:auto-yes-enter-fallback-candidate', {
|
|
621
|
+
worktreeId,
|
|
622
|
+
cliToolId,
|
|
623
|
+
instanceId,
|
|
624
|
+
promptType: promptData.type,
|
|
625
|
+
});
|
|
626
|
+
return false;
|
|
627
|
+
}
|
|
628
|
+
// 5. Never another server's session (Issue #2865).
|
|
629
|
+
const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
|
|
630
|
+
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName);
|
|
631
|
+
if (ownership === null || ownership.verdict === 'foreign') {
|
|
632
|
+
warnOncePerFrame(pollerState, `${frameKey}\u0000${sessionName}\u0000${ownership ? 'foreign' : 'worktree_not_found'}`, 'poller:auto-yes-skipped-foreign-session', {
|
|
633
|
+
worktreeId,
|
|
634
|
+
cliToolId,
|
|
635
|
+
instanceId,
|
|
636
|
+
sessionName,
|
|
637
|
+
sessionPath: ownership?.sessionPath ?? null,
|
|
638
|
+
reason: ownership ? 'foreign' : 'worktree_not_found',
|
|
639
|
+
enterFallback: true,
|
|
640
|
+
});
|
|
641
|
+
return false;
|
|
642
|
+
}
|
|
643
|
+
// 6. The last look before the key, at a capture taken NOW. The two ticks of
|
|
644
|
+
// step 4 read through the capture cache, whose TTL is longer than the poll
|
|
645
|
+
// interval, so "seen twice" can be one stale frame read twice: a redraw caught
|
|
646
|
+
// with its input box missing (#2457's repaint) while the real pane already
|
|
647
|
+
// has the box back. Everything that decided the Enter is judged again on the
|
|
648
|
+
// fresh frame; any difference sends nothing, and the next tick starts over.
|
|
649
|
+
const fresh = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, (rawOutput ?? '').split('\n').length, instanceId);
|
|
650
|
+
if (!isStillEnterFallbackScreen(prompt, fresh)) {
|
|
651
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
652
|
+
logger.debug('poller:auto-yes-enter-fallback-fresh-frame-differs', {
|
|
653
|
+
worktreeId,
|
|
654
|
+
cliToolId,
|
|
655
|
+
instanceId,
|
|
656
|
+
promptType: promptData.type,
|
|
657
|
+
});
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
try {
|
|
661
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
662
|
+
}
|
|
663
|
+
finally {
|
|
664
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
665
|
+
}
|
|
666
|
+
pollerState.enterFallbackSentKey = frameKey;
|
|
667
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
668
|
+
(0, auto_yes_enter_fallback_1.recordEnterFallbackSent)(worktreeId, cliToolId, instanceId, {
|
|
669
|
+
promptType: promptData.type,
|
|
670
|
+
refusalReason: judgement.refusalReason,
|
|
671
|
+
screenKey,
|
|
672
|
+
});
|
|
673
|
+
logger.info('poller:auto-yes-enter-fallback-sent', {
|
|
674
|
+
worktreeId,
|
|
675
|
+
cliToolId,
|
|
676
|
+
instanceId,
|
|
677
|
+
promptType: promptData.type,
|
|
678
|
+
refusalReason: judgement.refusalReason,
|
|
679
|
+
composerState: judgement.composerState,
|
|
680
|
+
});
|
|
681
|
+
await finishAnsweredPrompt(prompt, promptDetection, exports.AUTO_YES_ENTER_FALLBACK_ANSWER);
|
|
682
|
+
return true;
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Issue #3214: steps 6 and 7 of `detectAndRespondToPrompt` and everything after
|
|
686
|
+
* them -- what is done once the answer has reached tmux, in the order it always
|
|
687
|
+
* ran. Awaited inside that function's `try`, so a throw here still ends the
|
|
688
|
+
* tick as `error`.
|
|
689
|
+
*
|
|
690
|
+
* @param promptDetection - The detection `prompt.promptData` was read from; its
|
|
691
|
+
* content becomes the audit row's
|
|
692
|
+
* @param answer - The answer that was sent
|
|
693
|
+
*/
|
|
694
|
+
async function finishAnsweredPrompt(prompt, promptDetection, answer) {
|
|
695
|
+
const { worktreeId, cliToolId, instanceId, compositeKey, pollerState, promptData, promptKey } = prompt;
|
|
696
|
+
// 6. Update timestamp and reset error count
|
|
697
|
+
updateLastServerResponseTimestamp(compositeKey, Date.now());
|
|
698
|
+
resetErrorCount(compositeKey);
|
|
699
|
+
// 7. Record answered prompt key and timestamp
|
|
700
|
+
pollerState.lastAnsweredPromptKey = promptKey;
|
|
701
|
+
pollerState.lastAnsweredAt = Date.now();
|
|
702
|
+
pollerState.lastSkipWarnKey = null;
|
|
703
|
+
logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
|
|
704
|
+
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
705
|
+
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
706
|
+
// answer. No-ops when this instance is not running a contract.
|
|
707
|
+
(0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
|
|
708
|
+
// Undefined means the primary instance, which the task lookup identifies
|
|
709
|
+
// by the tool id itself (see getActiveTaskForInstance).
|
|
710
|
+
instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptData.type });
|
|
711
|
+
// Issue #1685: persist question/options/answer to chat history so the audit
|
|
712
|
+
// trail survives even when the answer landed inside the response poller's
|
|
713
|
+
// interval and the prompt was never saved as a pending message. Must never
|
|
714
|
+
// fail the answer that already reached tmux.
|
|
715
|
+
let auditRecord = null;
|
|
716
|
+
try {
|
|
717
|
+
auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
|
|
718
|
+
worktreeId,
|
|
719
|
+
cliToolId,
|
|
720
|
+
instanceId: instanceId ?? cliToolId,
|
|
721
|
+
promptData,
|
|
722
|
+
answer,
|
|
723
|
+
answeredBy: 'auto',
|
|
724
|
+
content: promptDetection.rawContent || promptDetection.cleanContent,
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
catch (recordError) {
|
|
728
|
+
logger.warn('poller:prompt-audit-record-failed', {
|
|
729
|
+
worktreeId,
|
|
730
|
+
cliToolId,
|
|
731
|
+
instanceId,
|
|
732
|
+
error: (0, errors_1.getErrorMessage)(recordError),
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
if (auditRecord) {
|
|
736
|
+
const record = auditRecord;
|
|
737
|
+
// Fire-and-forget on purpose: the WS push is advisory, and awaiting a
|
|
738
|
+
// cold ws-server module load inside the poll path would make its
|
|
739
|
+
// completion timing nondeterministic for a side effect it doesn't
|
|
740
|
+
// depend on (the audit row is already committed above).
|
|
741
|
+
void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
|
|
742
|
+
broadcastMessage(record.created ? 'message' : 'message_updated', {
|
|
743
|
+
worktreeId,
|
|
744
|
+
message: record.message,
|
|
745
|
+
});
|
|
746
|
+
})
|
|
747
|
+
.catch(() => { });
|
|
748
|
+
}
|
|
749
|
+
// Dynamic imports avoid a module cycle through terminal-broadcast ->
|
|
750
|
+
// current-output-builder -> auto-yes-manager -> this poller.
|
|
751
|
+
const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
|
|
752
|
+
Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
|
|
753
|
+
Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
|
|
754
|
+
]);
|
|
755
|
+
startResponsePolling(worktreeId, cliToolId, instanceId);
|
|
756
|
+
void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
|
|
757
|
+
}
|
|
384
758
|
/**
|
|
385
759
|
* Detect prompt in terminal output, resolve auto-answer, and send response.
|
|
386
760
|
*
|
|
@@ -438,12 +812,28 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
438
812
|
// machine whose hook does not reach us. The price is that Auto-Yes leaves
|
|
439
813
|
// such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
|
|
440
814
|
// says so.
|
|
815
|
+
// Issue #3397: a session begun since the last tick (a relaunch the poller
|
|
816
|
+
// outlived) starts with no screen that had its Enter.
|
|
817
|
+
const epoch = (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(compositeKey);
|
|
818
|
+
if ((pollerState.enterFallbackEpoch ?? 0) !== epoch) {
|
|
819
|
+
pollerState.enterFallbackSentKey = null;
|
|
820
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
821
|
+
pollerState.enterFallbackEpoch = epoch;
|
|
822
|
+
}
|
|
441
823
|
const receiptScope = { worktreeId, instanceId };
|
|
442
|
-
|
|
824
|
+
// Issue #3183: the ONE frame every judgement below reads — normalised once,
|
|
825
|
+
// from the capture as captured (the input-box markers are rule rows the
|
|
826
|
+
// cleaned spelling has blanked), and handed as the same object to the
|
|
827
|
+
// prompt reading, the codex launch guards and the dialog gate. That is what
|
|
828
|
+
// makes "the status chain and Auto-Yes read the same live region" a fact
|
|
829
|
+
// rather than a hope: there is no second normalisation to disagree with.
|
|
830
|
+
const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
|
|
831
|
+
const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
|
|
443
832
|
if (!promptDetection.isPrompt || !promptDetection.promptData) {
|
|
444
833
|
pollerState.lastAnsweredPromptKey = null;
|
|
445
834
|
pollerState.lastAnsweredAt = null;
|
|
446
835
|
pollerState.lastSkipWarnKey = null;
|
|
836
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
447
837
|
if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
|
|
448
838
|
logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
|
|
449
839
|
}
|
|
@@ -455,97 +845,31 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
455
845
|
if (isDuplicatePrompt(pollerState, promptKey)) {
|
|
456
846
|
return 'duplicate';
|
|
457
847
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
//
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
// to the tool. Auto-answer layer only: the detection above still reports the
|
|
474
|
-
// prompt, so the human keeps seeing the screen and the response poller
|
|
475
|
-
// still notifies them about it.
|
|
476
|
-
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(cleanOutput) : null;
|
|
477
|
-
if (launchDialog) {
|
|
478
|
-
// Recorded through the #1684 channel so `capture --json` and `cmate wait`
|
|
479
|
-
// can name the reason instead of showing a worker that went quiet.
|
|
480
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
481
|
-
reason: 'agent-launch-dialog',
|
|
482
|
-
mode: null,
|
|
483
|
-
promptType: promptDetection.promptData.type,
|
|
484
|
-
});
|
|
485
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', {
|
|
486
|
-
worktreeId,
|
|
487
|
-
cliToolId,
|
|
488
|
-
instanceId,
|
|
489
|
-
dialog: launchDialog,
|
|
490
|
-
promptType: promptDetection.promptData.type,
|
|
491
|
-
});
|
|
492
|
-
return 'no_answer';
|
|
848
|
+
const judged = {
|
|
849
|
+
worktreeId,
|
|
850
|
+
cliToolId,
|
|
851
|
+
instanceId,
|
|
852
|
+
compositeKey,
|
|
853
|
+
pollerState,
|
|
854
|
+
promptData: promptDetection.promptData,
|
|
855
|
+
promptKey,
|
|
856
|
+
frameKey,
|
|
857
|
+
};
|
|
858
|
+
// 3., 3.2., 3.5. Frames that are not Auto-Yes's to answer: see
|
|
859
|
+
// `suppressIfNotOursToAnswer`.
|
|
860
|
+
const notOurs = suppressIfNotOursToAnswer(judged, frame);
|
|
861
|
+
if (notOurs.kind !== 'dialog-gate-refused') {
|
|
862
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
493
863
|
}
|
|
494
|
-
|
|
495
|
-
// answer. A digit there is an immediate decision, so the base rules'
|
|
496
|
-
// default would choose the model and effort for the operator. Judged by the
|
|
497
|
-
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
498
|
-
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
499
|
-
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
500
|
-
// recognised the frame and deliberately declined it.
|
|
501
|
-
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(cleanOutput)) {
|
|
502
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
503
|
-
reason: 'unclassified-frame',
|
|
504
|
-
mode: null,
|
|
505
|
-
promptType: promptDetection.promptData.type,
|
|
506
|
-
});
|
|
507
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
|
|
508
|
-
worktreeId,
|
|
509
|
-
cliToolId,
|
|
510
|
-
instanceId,
|
|
511
|
-
promptType: promptDetection.promptData.type,
|
|
512
|
-
});
|
|
864
|
+
if (notOurs.kind === 'left-alone') {
|
|
513
865
|
return 'no_answer';
|
|
514
866
|
}
|
|
515
|
-
// 3.
|
|
516
|
-
//
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
// is position and chrome, which only the tool's own module knows, so the
|
|
522
|
-
// decision is delegated to `detectDialog` (the seam #1927 declared).
|
|
523
|
-
//
|
|
524
|
-
// Per tool, and only for tools whose dialogs were measured from their own
|
|
525
|
-
// live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
|
|
526
|
-
// reaches `allowed: true` without being judged, which is the pre-#1928
|
|
527
|
-
// behaviour and the right one where nobody has measured anything.
|
|
528
|
-
//
|
|
529
|
-
// Recorded through the #1684 channel with the reason code #1924 landed for
|
|
530
|
-
// exactly this position, so `capture --json` and `cmate wait` can name the
|
|
531
|
-
// gap instead of showing a worker that silently went quiet.
|
|
532
|
-
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type, cleanOutput);
|
|
533
|
-
if (!dialogGate.allowed) {
|
|
534
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
535
|
-
reason: 'unclassified-frame',
|
|
536
|
-
mode: null,
|
|
537
|
-
promptType: promptDetection.promptData.type,
|
|
538
|
-
});
|
|
539
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
|
|
540
|
-
worktreeId,
|
|
541
|
-
cliToolId,
|
|
542
|
-
instanceId,
|
|
543
|
-
promptType: promptDetection.promptData.type,
|
|
544
|
-
dialogKind: dialogGate.dialog?.kind ?? null,
|
|
545
|
-
answerMode: dialogGate.dialog?.answerMode ?? null,
|
|
546
|
-
gateMode: dialogGate.mode,
|
|
547
|
-
});
|
|
548
|
-
return 'no_answer';
|
|
867
|
+
// 3.6. Issue #3397: a refused frame may be a choice screen CommandMate
|
|
868
|
+
// cannot read; with Auto-Yes on it gets one Enter. See `tryEnterFallback`.
|
|
869
|
+
if (notOurs.kind === 'dialog-gate-refused') {
|
|
870
|
+
return (await tryEnterFallback(judged, promptDetection, notOurs.dialogGate, rawOutput))
|
|
871
|
+
? 'responded'
|
|
872
|
+
: 'no_answer';
|
|
549
873
|
}
|
|
550
874
|
// 4. Resolve auto answer under the execution contract's policy (Issue #1547).
|
|
551
875
|
// Auto-Yes reads the frame itself instead of going through status-detector
|
|
@@ -559,16 +883,12 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
559
883
|
// Issue #1684: the log line alone leaves a CLI-driven pipeline blind to
|
|
560
884
|
// why its worker stalled. Record the suppression so buildCurrentOutput
|
|
561
885
|
// can publish it (`autoYes.lastSuppression` in capture --json).
|
|
562
|
-
(
|
|
886
|
+
suppressAndWarnOnce(judged, {
|
|
563
887
|
reason: resolution.suppressedBy,
|
|
564
888
|
mode: policy?.mode ?? null,
|
|
565
889
|
promptType: promptDetection.promptData.type,
|
|
566
890
|
pattern: resolution.pattern,
|
|
567
|
-
}
|
|
568
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
569
|
-
worktreeId,
|
|
570
|
-
cliToolId,
|
|
571
|
-
instanceId,
|
|
891
|
+
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
572
892
|
reason: resolution.suppressedBy,
|
|
573
893
|
mode: policy?.mode ?? null,
|
|
574
894
|
pattern: resolution.pattern,
|
|
@@ -608,67 +928,8 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
608
928
|
finally {
|
|
609
929
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
610
930
|
}
|
|
611
|
-
// 6.
|
|
612
|
-
|
|
613
|
-
resetErrorCount(compositeKey);
|
|
614
|
-
// 7. Record answered prompt key and timestamp
|
|
615
|
-
pollerState.lastAnsweredPromptKey = promptKey;
|
|
616
|
-
pollerState.lastAnsweredAt = Date.now();
|
|
617
|
-
pollerState.lastSkipWarnKey = null;
|
|
618
|
-
logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
|
|
619
|
-
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
620
|
-
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
621
|
-
// answer. No-ops when this instance is not running a contract.
|
|
622
|
-
(0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
|
|
623
|
-
// Undefined means the primary instance, which the task lookup identifies
|
|
624
|
-
// by the tool id itself (see getActiveTaskForInstance).
|
|
625
|
-
instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptDetection.promptData.type });
|
|
626
|
-
// Issue #1685: persist question/options/answer to chat history so the audit
|
|
627
|
-
// trail survives even when the answer landed inside the response poller's
|
|
628
|
-
// interval and the prompt was never saved as a pending message. Must never
|
|
629
|
-
// fail the answer that already reached tmux.
|
|
630
|
-
let auditRecord = null;
|
|
631
|
-
try {
|
|
632
|
-
auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
|
|
633
|
-
worktreeId,
|
|
634
|
-
cliToolId,
|
|
635
|
-
instanceId: instanceId ?? cliToolId,
|
|
636
|
-
promptData: promptDetection.promptData,
|
|
637
|
-
answer,
|
|
638
|
-
answeredBy: 'auto',
|
|
639
|
-
content: promptDetection.rawContent || promptDetection.cleanContent,
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
catch (recordError) {
|
|
643
|
-
logger.warn('poller:prompt-audit-record-failed', {
|
|
644
|
-
worktreeId,
|
|
645
|
-
cliToolId,
|
|
646
|
-
instanceId,
|
|
647
|
-
error: (0, errors_1.getErrorMessage)(recordError),
|
|
648
|
-
});
|
|
649
|
-
}
|
|
650
|
-
if (auditRecord) {
|
|
651
|
-
const record = auditRecord;
|
|
652
|
-
// Fire-and-forget on purpose: the WS push is advisory, and awaiting a
|
|
653
|
-
// cold ws-server module load inside the poll path would make its
|
|
654
|
-
// completion timing nondeterministic for a side effect it doesn't
|
|
655
|
-
// depend on (the audit row is already committed above).
|
|
656
|
-
void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
|
|
657
|
-
broadcastMessage(record.created ? 'message' : 'message_updated', {
|
|
658
|
-
worktreeId,
|
|
659
|
-
message: record.message,
|
|
660
|
-
});
|
|
661
|
-
})
|
|
662
|
-
.catch(() => { });
|
|
663
|
-
}
|
|
664
|
-
// Dynamic imports avoid a module cycle through terminal-broadcast ->
|
|
665
|
-
// current-output-builder -> auto-yes-manager -> this poller.
|
|
666
|
-
const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
|
|
667
|
-
Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
|
|
668
|
-
Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
|
|
669
|
-
]);
|
|
670
|
-
startResponsePolling(worktreeId, cliToolId, instanceId);
|
|
671
|
-
void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
|
|
931
|
+
// 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
|
|
932
|
+
await finishAnsweredPrompt(judged, promptDetection, answer);
|
|
672
933
|
return 'responded';
|
|
673
934
|
}
|
|
674
935
|
catch {
|
|
@@ -703,6 +964,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
703
964
|
// so a dialog anchored on box drawing is not invisible to the one path that
|
|
704
965
|
// can answer it without a human.
|
|
705
966
|
const { raw: rawOutput, clean: cleanOutput } = await capturePollerFrame(worktreeId, cliToolId, captureLines, instanceId);
|
|
967
|
+
if (pollerState.waitingForSession) {
|
|
968
|
+
pollerState.waitingForSession = false;
|
|
969
|
+
logger.info('poller:session-appeared', { worktreeId, cliToolId, instanceId });
|
|
970
|
+
}
|
|
706
971
|
const lines = cleanOutput.split('\n');
|
|
707
972
|
// 3. Stop condition delta check (Issue #314)
|
|
708
973
|
if (processStopConditionDelta(compositeKey, pollerState, cleanOutput)) {
|
|
@@ -710,6 +975,13 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
710
975
|
}
|
|
711
976
|
// 4. Detect and respond to prompt
|
|
712
977
|
const result = await detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, cleanOutput, lines, instanceId, rawOutput);
|
|
978
|
+
// Issue #3329: a poll that ran to the end ends the run of errors, so only
|
|
979
|
+
// failures in a row reach AUTO_STOP_ERROR_THRESHOLD — not ones scattered
|
|
980
|
+
// over hours. Not on 'error': a capture that works followed by an answer
|
|
981
|
+
// that fails every time must still back off and stop.
|
|
982
|
+
if (result !== 'error') {
|
|
983
|
+
resetErrorCount(compositeKey);
|
|
984
|
+
}
|
|
713
985
|
if (result === 'responded') {
|
|
714
986
|
scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.COOLDOWN_INTERVAL_MS);
|
|
715
987
|
return;
|
|
@@ -724,11 +996,37 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
724
996
|
}
|
|
725
997
|
}
|
|
726
998
|
catch (error) {
|
|
999
|
+
// Issue #3329: no session is not an error. Auto-Yes lives independently of
|
|
1000
|
+
// the session it answers for (`auto-yes-lifecycle`), and `send --auto-yes`
|
|
1001
|
+
// enables it before the session starts — so wait until `expiresAt`, at the
|
|
1002
|
+
// backoff cap, instead of counting toward `consecutive_errors`.
|
|
1003
|
+
if (await isSessionMissing(worktreeId, cliToolId, instanceId)) {
|
|
1004
|
+
if (!pollerState.waitingForSession) {
|
|
1005
|
+
pollerState.waitingForSession = true;
|
|
1006
|
+
logger.info('poller:waiting-for-session', { worktreeId, cliToolId, instanceId });
|
|
1007
|
+
}
|
|
1008
|
+
scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.MAX_BACKOFF_MS);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
727
1011
|
incrementErrorCount(compositeKey);
|
|
728
1012
|
logger.warn('poller:poll-error', { worktreeId, cliToolId, instanceId, error: (0, errors_1.getErrorMessage)(error) });
|
|
729
1013
|
}
|
|
730
1014
|
scheduleNextPoll(worktreeId, cliToolId, instanceId);
|
|
731
1015
|
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Whether a failed capture failed because the session does not exist
|
|
1018
|
+
* (Issue #3329). Asked of tmux (`has-session`'s exit code), not read off the
|
|
1019
|
+
* error text. `unknown` — tmux timed out or could not be run — is not "absent":
|
|
1020
|
+
* the failure is counted as before, so a broken tmux still stops Auto-Yes.
|
|
1021
|
+
*/
|
|
1022
|
+
async function isSessionMissing(worktreeId, cliToolId, instanceId) {
|
|
1023
|
+
try {
|
|
1024
|
+
return (await (0, cli_session_1.getSessionPresence)(worktreeId, cliToolId, instanceId)) === 'absent';
|
|
1025
|
+
}
|
|
1026
|
+
catch {
|
|
1027
|
+
return false;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
732
1030
|
/**
|
|
733
1031
|
* Schedule the next polling iteration
|
|
734
1032
|
*
|
|
@@ -820,6 +1118,10 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
820
1118
|
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
821
1119
|
*/
|
|
822
1120
|
function stopAutoYesPolling(compositeKey) {
|
|
1121
|
+
// Issue #3397: before the early return — the disable route and the session
|
|
1122
|
+
// cleanup call this for an instance whose poller may already be gone, and the
|
|
1123
|
+
// Enter record must not outlive the grant or the session either way.
|
|
1124
|
+
(0, auto_yes_enter_fallback_1.forgetEnterFallback)(compositeKey);
|
|
823
1125
|
const pollerState = getPollerState(compositeKey);
|
|
824
1126
|
if (!pollerState)
|
|
825
1127
|
return;
|
|
@@ -842,6 +1144,7 @@ function stopAllAutoYesPolling() {
|
|
|
842
1144
|
logger.info('poller:stopped', { compositeKey: key, reason: 'shutdown' });
|
|
843
1145
|
}
|
|
844
1146
|
autoYesPollerStates.clear();
|
|
1147
|
+
(0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
|
|
845
1148
|
}
|
|
846
1149
|
/**
|
|
847
1150
|
* Get all composite keys that have active auto-yes poller entries.
|
|
@@ -865,6 +1168,8 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
865
1168
|
function stopAutoYesPollingByWorktree(worktreeId) {
|
|
866
1169
|
const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
|
|
867
1170
|
pollerKeys.forEach(key => stopAutoYesPolling(key));
|
|
1171
|
+
// Issue #3397: and the records of instances whose poller had already stopped.
|
|
1172
|
+
(0, auto_yes_enter_fallback_1.forgetEnterFallbacksByWorktree)(worktreeId);
|
|
868
1173
|
}
|
|
869
1174
|
/**
|
|
870
1175
|
* Check if any auto-yes poller is active for a given worktreeId.
|