commandmate 0.44.2 → 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 +149 -149
- package/.next/app-path-routes-manifest.json +21 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +21 -21
- 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 -1
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -1
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/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 -1
- package/.next/server/chunks/5625.js +25 -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 -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 -1
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-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-051f6f84226a9f2c.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-9da1ab602bcb3051.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 +3 -5
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +589 -431
- package/dist/cli/types/api-responses.d.ts +159 -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 +26 -3
- package/dist/lib/session/prompt-view.d.ts.map +1 -1
- package/dist/lib/session/prompt-view.js +26 -3
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
- package/dist/server/src/lib/auto-yes-poller.js +450 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/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/tools/antigravity/detect.js +5 -29
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
- package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
- package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/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-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +641 -1142
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +5 -4
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +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 +450 -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 +26 -3
- package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session-cleanup.js +1 -5
- package/dist/server/src/lib/skills/install-plan.js +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.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/4372.js +0 -5
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9798.js +0 -2
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → 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;
|
|
@@ -68,11 +69,14 @@ const detect_1 = require("./detection/tools/codex/detect");
|
|
|
68
69
|
const frame_1 = require("./detection/tools/frame");
|
|
69
70
|
const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
|
|
70
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");
|
|
71
73
|
const task_transition_service_1 = require("./tasks/task-transition-service");
|
|
72
74
|
const db_instance_1 = require("./db/db-instance");
|
|
73
75
|
const chat_db_1 = require("./db/chat-db");
|
|
74
76
|
const worktree_session_ownership_1 = require("./cli-tools/worktree-session-ownership");
|
|
75
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");
|
|
76
80
|
const manager_1 = require("./cli-tools/manager");
|
|
77
81
|
const cli_patterns_1 = require("./detection/cli-patterns");
|
|
78
82
|
const prompt_key_1 = require("./detection/prompt-key");
|
|
@@ -83,17 +87,16 @@ const logger_1 = require("../lib/logger");
|
|
|
83
87
|
const logger = (0, logger_1.createLogger)('auto-yes-poller');
|
|
84
88
|
const path_validator_1 = require("./security/path-validator");
|
|
85
89
|
const auto_yes_state_1 = require("./auto-yes-state");
|
|
90
|
+
const global_state_1 = require("./global-state");
|
|
86
91
|
/** In-memory storage for poller states (globalThis for hot reload persistence) */
|
|
87
|
-
const autoYesPollerStates =
|
|
88
|
-
(globalThis.__autoYesPollerStates = new Map());
|
|
92
|
+
const autoYesPollerStates = (0, global_state_1.getOrInitGlobal)('__autoYesPollerStates', () => new Map());
|
|
89
93
|
/**
|
|
90
94
|
* When `antigravity-autoyes-withheld-no-hook-receipt` was last logged, per
|
|
91
95
|
* compositeKey (Issue #2857). The poller re-reads a static pane every 2s, so the
|
|
92
96
|
* line is limited to one per {@link WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS} per
|
|
93
97
|
* instance. globalThis for the same reason as the poller states above.
|
|
94
98
|
*/
|
|
95
|
-
const withheldNoReceiptLoggedAt =
|
|
96
|
-
(globalThis.__autoYesWithheldNoReceiptLoggedAt = new Map());
|
|
99
|
+
const withheldNoReceiptLoggedAt = (0, global_state_1.getOrInitGlobal)('__autoYesWithheldNoReceiptLoggedAt', () => new Map());
|
|
97
100
|
/** Least gap between two `antigravity-autoyes-withheld-no-hook-receipt` lines for one instance. */
|
|
98
101
|
const WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS = 60_000;
|
|
99
102
|
// =============================================================================
|
|
@@ -161,6 +164,8 @@ function updateLastServerResponseTimestamp(compositeKey, timestamp) {
|
|
|
161
164
|
}
|
|
162
165
|
/**
|
|
163
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.
|
|
164
169
|
*
|
|
165
170
|
* @param compositeKey - Composite key
|
|
166
171
|
*/
|
|
@@ -189,7 +194,8 @@ function incrementErrorCount(compositeKey) {
|
|
|
189
194
|
// poller — applied here directly rather than through `releaseAutoYes`:
|
|
190
195
|
// that module reaches this one through the auto-yes-manager barrel, so
|
|
191
196
|
// importing it back would be a cycle. `auto-yes-lifecycle-3184.test.ts`
|
|
192
|
-
// holds this call and the table row equal.
|
|
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.
|
|
193
199
|
if (pollerState.consecutiveErrors >= auto_yes_config_1.AUTO_STOP_ERROR_THRESHOLD) {
|
|
194
200
|
const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
|
|
195
201
|
const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
|
|
@@ -389,6 +395,366 @@ function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, rea
|
|
|
389
395
|
hint: 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認',
|
|
390
396
|
});
|
|
391
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
|
+
}
|
|
392
758
|
/**
|
|
393
759
|
* Detect prompt in terminal output, resolve auto-answer, and send response.
|
|
394
760
|
*
|
|
@@ -446,6 +812,14 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
446
812
|
// machine whose hook does not reach us. The price is that Auto-Yes leaves
|
|
447
813
|
// such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
|
|
448
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
|
+
}
|
|
449
823
|
const receiptScope = { worktreeId, instanceId };
|
|
450
824
|
// Issue #3183: the ONE frame every judgement below reads — normalised once,
|
|
451
825
|
// from the capture as captured (the input-box markers are rule rows the
|
|
@@ -459,6 +833,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
459
833
|
pollerState.lastAnsweredPromptKey = null;
|
|
460
834
|
pollerState.lastAnsweredAt = null;
|
|
461
835
|
pollerState.lastSkipWarnKey = null;
|
|
836
|
+
pollerState.enterFallbackCandidateKey = null;
|
|
462
837
|
if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
|
|
463
838
|
logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
|
|
464
839
|
}
|
|
@@ -470,97 +845,31 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
470
845
|
if (isDuplicatePrompt(pollerState, promptKey)) {
|
|
471
846
|
return 'duplicate';
|
|
472
847
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
//
|
|
484
|
-
//
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
// to the tool. Auto-answer layer only: the detection above still reports the
|
|
489
|
-
// prompt, so the human keeps seeing the screen and the response poller
|
|
490
|
-
// still notifies them about it.
|
|
491
|
-
const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
|
|
492
|
-
if (launchDialog) {
|
|
493
|
-
// Recorded through the #1684 channel so `capture --json` and `cmate wait`
|
|
494
|
-
// can name the reason instead of showing a worker that went quiet.
|
|
495
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
496
|
-
reason: 'agent-launch-dialog',
|
|
497
|
-
mode: null,
|
|
498
|
-
promptType: promptDetection.promptData.type,
|
|
499
|
-
});
|
|
500
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', {
|
|
501
|
-
worktreeId,
|
|
502
|
-
cliToolId,
|
|
503
|
-
instanceId,
|
|
504
|
-
dialog: launchDialog,
|
|
505
|
-
promptType: promptDetection.promptData.type,
|
|
506
|
-
});
|
|
507
|
-
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;
|
|
508
863
|
}
|
|
509
|
-
|
|
510
|
-
// answer. A digit there is an immediate decision, so the base rules'
|
|
511
|
-
// default would choose the model and effort for the operator. Judged by the
|
|
512
|
-
// picker's own footer, not by `kind: picker`, which the hooks screens share.
|
|
513
|
-
// The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
|
|
514
|
-
// (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
|
|
515
|
-
// recognised the frame and deliberately declined it.
|
|
516
|
-
if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
|
|
517
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
518
|
-
reason: 'unclassified-frame',
|
|
519
|
-
mode: null,
|
|
520
|
-
promptType: promptDetection.promptData.type,
|
|
521
|
-
});
|
|
522
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
|
|
523
|
-
worktreeId,
|
|
524
|
-
cliToolId,
|
|
525
|
-
instanceId,
|
|
526
|
-
promptType: promptDetection.promptData.type,
|
|
527
|
-
});
|
|
864
|
+
if (notOurs.kind === 'left-alone') {
|
|
528
865
|
return 'no_answer';
|
|
529
866
|
}
|
|
530
|
-
// 3.
|
|
531
|
-
//
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
// is position and chrome, which only the tool's own module knows, so the
|
|
537
|
-
// decision is delegated to `detectDialog` (the seam #1927 declared).
|
|
538
|
-
//
|
|
539
|
-
// Per tool, and only for tools whose dialogs were measured from their own
|
|
540
|
-
// live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
|
|
541
|
-
// reaches `allowed: true` without being judged, which is the pre-#1928
|
|
542
|
-
// behaviour and the right one where nobody has measured anything.
|
|
543
|
-
//
|
|
544
|
-
// Recorded through the #1684 channel with the reason code #1924 landed for
|
|
545
|
-
// exactly this position, so `capture --json` and `cmate wait` can name the
|
|
546
|
-
// gap instead of showing a worker that silently went quiet.
|
|
547
|
-
const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type, frame);
|
|
548
|
-
if (!dialogGate.allowed) {
|
|
549
|
-
(0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
|
|
550
|
-
reason: 'unclassified-frame',
|
|
551
|
-
mode: null,
|
|
552
|
-
promptType: promptDetection.promptData.type,
|
|
553
|
-
});
|
|
554
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
|
|
555
|
-
worktreeId,
|
|
556
|
-
cliToolId,
|
|
557
|
-
instanceId,
|
|
558
|
-
promptType: promptDetection.promptData.type,
|
|
559
|
-
dialogKind: dialogGate.dialog?.kind ?? null,
|
|
560
|
-
answerMode: dialogGate.dialog?.answerMode ?? null,
|
|
561
|
-
gateMode: dialogGate.mode,
|
|
562
|
-
});
|
|
563
|
-
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';
|
|
564
873
|
}
|
|
565
874
|
// 4. Resolve auto answer under the execution contract's policy (Issue #1547).
|
|
566
875
|
// Auto-Yes reads the frame itself instead of going through status-detector
|
|
@@ -574,16 +883,12 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
574
883
|
// Issue #1684: the log line alone leaves a CLI-driven pipeline blind to
|
|
575
884
|
// why its worker stalled. Record the suppression so buildCurrentOutput
|
|
576
885
|
// can publish it (`autoYes.lastSuppression` in capture --json).
|
|
577
|
-
(
|
|
886
|
+
suppressAndWarnOnce(judged, {
|
|
578
887
|
reason: resolution.suppressedBy,
|
|
579
888
|
mode: policy?.mode ?? null,
|
|
580
889
|
promptType: promptDetection.promptData.type,
|
|
581
890
|
pattern: resolution.pattern,
|
|
582
|
-
}
|
|
583
|
-
warnOncePerFrame(pollerState, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
584
|
-
worktreeId,
|
|
585
|
-
cliToolId,
|
|
586
|
-
instanceId,
|
|
891
|
+
}, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
|
|
587
892
|
reason: resolution.suppressedBy,
|
|
588
893
|
mode: policy?.mode ?? null,
|
|
589
894
|
pattern: resolution.pattern,
|
|
@@ -623,67 +928,8 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
|
|
|
623
928
|
finally {
|
|
624
929
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
625
930
|
}
|
|
626
|
-
// 6.
|
|
627
|
-
|
|
628
|
-
resetErrorCount(compositeKey);
|
|
629
|
-
// 7. Record answered prompt key and timestamp
|
|
630
|
-
pollerState.lastAnsweredPromptKey = promptKey;
|
|
631
|
-
pollerState.lastAnsweredAt = Date.now();
|
|
632
|
-
pollerState.lastSkipWarnKey = null;
|
|
633
|
-
logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
|
|
634
|
-
// Issue #1548: the prompt was answered without a human. Raised only after
|
|
635
|
-
// the keys actually reached tmux, so a send that threw is not logged as an
|
|
636
|
-
// answer. No-ops when this instance is not running a contract.
|
|
637
|
-
(0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
|
|
638
|
-
// Undefined means the primary instance, which the task lookup identifies
|
|
639
|
-
// by the tool id itself (see getActiveTaskForInstance).
|
|
640
|
-
instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptDetection.promptData.type });
|
|
641
|
-
// Issue #1685: persist question/options/answer to chat history so the audit
|
|
642
|
-
// trail survives even when the answer landed inside the response poller's
|
|
643
|
-
// interval and the prompt was never saved as a pending message. Must never
|
|
644
|
-
// fail the answer that already reached tmux.
|
|
645
|
-
let auditRecord = null;
|
|
646
|
-
try {
|
|
647
|
-
auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
|
|
648
|
-
worktreeId,
|
|
649
|
-
cliToolId,
|
|
650
|
-
instanceId: instanceId ?? cliToolId,
|
|
651
|
-
promptData: promptDetection.promptData,
|
|
652
|
-
answer,
|
|
653
|
-
answeredBy: 'auto',
|
|
654
|
-
content: promptDetection.rawContent || promptDetection.cleanContent,
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
catch (recordError) {
|
|
658
|
-
logger.warn('poller:prompt-audit-record-failed', {
|
|
659
|
-
worktreeId,
|
|
660
|
-
cliToolId,
|
|
661
|
-
instanceId,
|
|
662
|
-
error: (0, errors_1.getErrorMessage)(recordError),
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
if (auditRecord) {
|
|
666
|
-
const record = auditRecord;
|
|
667
|
-
// Fire-and-forget on purpose: the WS push is advisory, and awaiting a
|
|
668
|
-
// cold ws-server module load inside the poll path would make its
|
|
669
|
-
// completion timing nondeterministic for a side effect it doesn't
|
|
670
|
-
// depend on (the audit row is already committed above).
|
|
671
|
-
void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
|
|
672
|
-
broadcastMessage(record.created ? 'message' : 'message_updated', {
|
|
673
|
-
worktreeId,
|
|
674
|
-
message: record.message,
|
|
675
|
-
});
|
|
676
|
-
})
|
|
677
|
-
.catch(() => { });
|
|
678
|
-
}
|
|
679
|
-
// Dynamic imports avoid a module cycle through terminal-broadcast ->
|
|
680
|
-
// current-output-builder -> auto-yes-manager -> this poller.
|
|
681
|
-
const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
|
|
682
|
-
Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
|
|
683
|
-
Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
|
|
684
|
-
]);
|
|
685
|
-
startResponsePolling(worktreeId, cliToolId, instanceId);
|
|
686
|
-
void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
|
|
931
|
+
// 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
|
|
932
|
+
await finishAnsweredPrompt(judged, promptDetection, answer);
|
|
687
933
|
return 'responded';
|
|
688
934
|
}
|
|
689
935
|
catch {
|
|
@@ -718,6 +964,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
718
964
|
// so a dialog anchored on box drawing is not invisible to the one path that
|
|
719
965
|
// can answer it without a human.
|
|
720
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
|
+
}
|
|
721
971
|
const lines = cleanOutput.split('\n');
|
|
722
972
|
// 3. Stop condition delta check (Issue #314)
|
|
723
973
|
if (processStopConditionDelta(compositeKey, pollerState, cleanOutput)) {
|
|
@@ -725,6 +975,13 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
725
975
|
}
|
|
726
976
|
// 4. Detect and respond to prompt
|
|
727
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
|
+
}
|
|
728
985
|
if (result === 'responded') {
|
|
729
986
|
scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.COOLDOWN_INTERVAL_MS);
|
|
730
987
|
return;
|
|
@@ -739,11 +996,37 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
|
|
|
739
996
|
}
|
|
740
997
|
}
|
|
741
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
|
+
}
|
|
742
1011
|
incrementErrorCount(compositeKey);
|
|
743
1012
|
logger.warn('poller:poll-error', { worktreeId, cliToolId, instanceId, error: (0, errors_1.getErrorMessage)(error) });
|
|
744
1013
|
}
|
|
745
1014
|
scheduleNextPoll(worktreeId, cliToolId, instanceId);
|
|
746
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
|
+
}
|
|
747
1030
|
/**
|
|
748
1031
|
* Schedule the next polling iteration
|
|
749
1032
|
*
|
|
@@ -835,6 +1118,10 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
|
|
|
835
1118
|
* @param compositeKey - Composite key (worktreeId:cliToolId)
|
|
836
1119
|
*/
|
|
837
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);
|
|
838
1125
|
const pollerState = getPollerState(compositeKey);
|
|
839
1126
|
if (!pollerState)
|
|
840
1127
|
return;
|
|
@@ -857,6 +1144,7 @@ function stopAllAutoYesPolling() {
|
|
|
857
1144
|
logger.info('poller:stopped', { compositeKey: key, reason: 'shutdown' });
|
|
858
1145
|
}
|
|
859
1146
|
autoYesPollerStates.clear();
|
|
1147
|
+
(0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
|
|
860
1148
|
}
|
|
861
1149
|
/**
|
|
862
1150
|
* Get all composite keys that have active auto-yes poller entries.
|
|
@@ -880,6 +1168,8 @@ function getAutoYesPollerCompositeKeys() {
|
|
|
880
1168
|
function stopAutoYesPollingByWorktree(worktreeId) {
|
|
881
1169
|
const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
|
|
882
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);
|
|
883
1173
|
}
|
|
884
1174
|
/**
|
|
885
1175
|
* Check if any auto-yes poller is active for a given worktreeId.
|