commandmate 0.44.1 → 0.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +169 -169
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +0 -6
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +2 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +2 -2
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -2
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +35 -35
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -0
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -0
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/5845.js +1 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -0
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -5
- package/.next/server/chunks/9390.js +2 -3
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +10 -13
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +608 -416
- package/dist/cli/types/api-responses.d.ts +174 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +228 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +290 -0
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/server.js +5 -3
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
- package/dist/server/src/lib/auto-yes-poller.js +465 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
- package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
- package/dist/server/src/lib/detection/tools/live-region.js +204 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +666 -1162
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +6 -5
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +6 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/relay/relay-triggers.js +9 -0
- package/dist/server/src/lib/resource-cleanup.js +6 -4
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +454 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +290 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +6 -8
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.2.json +33 -0
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/650.js +0 -1
- package/.next/server/chunks/6661.js +0 -1
- package/.next/server/chunks/8583.js +0 -1
- package/.next/server/chunks/964.js +0 -1
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-308072f285c34787.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,670 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The steps split out of `extractResponse`, including the per-tool
|
|
4
|
+
* startup-screen defenses (Issue #3374 split from response-checker.ts).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.findChromeStart = findChromeStart;
|
|
8
|
+
exports.findRecentUserPromptIndexInFrame = findRecentUserPromptIndexInFrame;
|
|
9
|
+
exports.isTurnComplete = isTurnComplete;
|
|
10
|
+
exports.extractCompletedResponse = extractCompletedResponse;
|
|
11
|
+
exports.extractPartialResponse = extractPartialResponse;
|
|
12
|
+
const cli_patterns_1 = require("../../lib/detection/cli-patterns");
|
|
13
|
+
const logger_1 = require("../../lib/logger");
|
|
14
|
+
const thinking_constants_1 = require("../../config/thinking-constants");
|
|
15
|
+
const logger = (0, logger_1.createLogger)('response-poller');
|
|
16
|
+
const response_extractor_1 = require("../response-extractor");
|
|
17
|
+
const startup_screen_1 = require("./startup-screen");
|
|
18
|
+
const response_poller_constants_1 = require("./response-poller-constants");
|
|
19
|
+
const response_checker_extraction_result_1 = require("./response-checker-extraction-result");
|
|
20
|
+
/**
|
|
21
|
+
* How many rows from the bottom of a copilot capture may hold its status bar.
|
|
22
|
+
*
|
|
23
|
+
* `readCopilotStatusBar` stops at the first non-blank row from the end, and the
|
|
24
|
+
* capture handed to it here has already had its trailing blanks trimmed, so one
|
|
25
|
+
* row is enough in practice. The slack exists so the reader keeps working if that
|
|
26
|
+
* trim ever changes, without mapping a thousand rows through `stripAnsi` on every
|
|
27
|
+
* poll tick. (Issue #1897)
|
|
28
|
+
*/
|
|
29
|
+
const COPILOT_STATUS_BAR_SCAN_ROWS = 8;
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// extractResponse (internal)
|
|
32
|
+
// ============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Where the tool's pinned footer starts in the capture — the row the transcript
|
|
35
|
+
* stops at — or -1 when the tool pins none or its landmark is not on the frame.
|
|
36
|
+
*
|
|
37
|
+
* Split out of {@link extractResponse} (Issue #3213). The comment above
|
|
38
|
+
* `openCodeCleanLines` there introduces the first three readers and says why
|
|
39
|
+
* they stay separate functions; the one in the body here continues it.
|
|
40
|
+
*
|
|
41
|
+
* @param cliToolId - CLI tool identifier
|
|
42
|
+
* @param lines - The trimmed tmux buffer lines array
|
|
43
|
+
* @param openCodeCleanLines - `lines` with ANSI stripped for opencode, null for every other tool
|
|
44
|
+
* @returns Index of the first chrome row, or -1
|
|
45
|
+
*/
|
|
46
|
+
function findChromeStart(cliToolId, lines, openCodeCleanLines) {
|
|
47
|
+
// Issue #2250: Command Code is the fourth. Its landmark is its own — the
|
|
48
|
+
// `❯ Ask your question...` composer fenced by two full-pane rules, with the
|
|
49
|
+
// permission-mode row underneath — and it is load-bearing rather than tidy:
|
|
50
|
+
// that placeholder is drawn with the same `❯ <text>` shape as a transcript
|
|
51
|
+
// echo, so without the boundary `findRecentUserPromptIndex` anchors the turn
|
|
52
|
+
// on the FOOTER and every reply extracts as empty (#1289's defect, verbatim).
|
|
53
|
+
//
|
|
54
|
+
// Issue #2400: codex is the fifth, and the one that had been missing. It pins
|
|
55
|
+
// the same two rows — `› Ask Codex to do anything` and the `model · cwd`
|
|
56
|
+
// status bar — and without a boundary the saturated-window anchor (#1670)
|
|
57
|
+
// walked into them: the newest `›` in the pane was the COMPOSER, so extraction
|
|
58
|
+
// started on the status bar and every reply on a saturated pane was saved as
|
|
59
|
+
// that one row. `findCodexChromeStart` reads the composer by its SGR
|
|
60
|
+
// attributes (#2310) rather than by its placeholder wording, which is what the
|
|
61
|
+
// previous guard did and why it stopped working at codex 0.15x.
|
|
62
|
+
return cliToolId === 'claude'
|
|
63
|
+
? (0, cli_patterns_1.findClaudeChromeStart)(lines)
|
|
64
|
+
: cliToolId === 'copilot'
|
|
65
|
+
? (0, cli_patterns_1.findCopilotChromeStart)(lines)
|
|
66
|
+
: cliToolId === 'command-code'
|
|
67
|
+
? (0, cli_patterns_1.findCommandCodeChromeStart)(lines)
|
|
68
|
+
: cliToolId === 'codex'
|
|
69
|
+
? (0, cli_patterns_1.findCodexChromeStart)(lines)
|
|
70
|
+
: openCodeCleanLines
|
|
71
|
+
? (0, cli_patterns_1.findOpenCodeChromeStart)(openCodeCleanLines)
|
|
72
|
+
: -1;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Index of the newest echoed user prompt in the transcript, or -1 when there is
|
|
76
|
+
* none in the window.
|
|
77
|
+
*
|
|
78
|
+
* The body of the `findRecentUserPromptIndex` closure in {@link extractResponse},
|
|
79
|
+
* split out as it was (Issue #3213). The closure is still there: it binds the
|
|
80
|
+
* frame and keeps the default window, because `resolveExtractionStartIndex` and
|
|
81
|
+
* `buildPromptExtractionResult` take the search as a one-argument callback.
|
|
82
|
+
*
|
|
83
|
+
* @param cliToolId - CLI tool identifier
|
|
84
|
+
* @param lines - The trimmed tmux buffer lines array
|
|
85
|
+
* @param openCodeCleanLines - `lines` with ANSI stripped for opencode, null for every other tool
|
|
86
|
+
* @param chromeStart - What `findChromeStart` returned for this frame
|
|
87
|
+
* @param contentEnd - Where the transcript stops: `chromeStart`, or the line count when that is -1
|
|
88
|
+
* @param windowSize - How many rows up from `contentEnd` to search
|
|
89
|
+
* @returns Index into `lines`, or -1
|
|
90
|
+
*/
|
|
91
|
+
function findRecentUserPromptIndexInFrame(cliToolId, lines, openCodeCleanLines, chromeStart, contentEnd, windowSize) {
|
|
92
|
+
let userPromptPattern;
|
|
93
|
+
if (cliToolId === 'codex') {
|
|
94
|
+
// Issue #2400: codex's three uses of `›` are separated by their SGR
|
|
95
|
+
// attributes, not by their text (#2310). This branch used to exclude the
|
|
96
|
+
// composer with a negative lookahead over its placeholder strings
|
|
97
|
+
// (`Implement`, `Find and fix`, `Type`, `Summarize`) — codex 0.1x wording,
|
|
98
|
+
// none of which 0.15x draws. `Ask Codex to do anything` passed the guard,
|
|
99
|
+
// became the newest "echo", and on a saturated pane (#1670) — the only
|
|
100
|
+
// path where this anchor decides where extraction STARTS — every reply was
|
|
101
|
+
// saved as the single status-bar row below it.
|
|
102
|
+
//
|
|
103
|
+
// Two independent things now keep the composer out, and the reader needs
|
|
104
|
+
// both because neither covers the other's frames: `contentEnd` cuts the
|
|
105
|
+
// composer off structurally when `findCodexChromeStart` located it, and
|
|
106
|
+
// when it did not, `findCodexUserEchoIndex` steps over the bottom-most
|
|
107
|
+
// `›` row instead. The second is what still answers on an ANSI-stripped
|
|
108
|
+
// capture, where none of #2310's attributes survive to be read.
|
|
109
|
+
return (0, cli_patterns_1.findCodexUserEchoIndex)(lines, contentEnd, windowSize, chromeStart >= 0);
|
|
110
|
+
}
|
|
111
|
+
else if (openCodeCleanLines) {
|
|
112
|
+
// Issue #1911: anchor on the newest ECHOED USER PROMPT, not on the
|
|
113
|
+
// second-to-last `▣ Build` row. The old anchor belonged to the PREVIOUS
|
|
114
|
+
// turn, so the echoed prompt of the current one was always extracted as
|
|
115
|
+
// part of the reply — and on the first turn of a session, where there is
|
|
116
|
+
// no second marker, it fell through to line 0 and the whole pane (banner
|
|
117
|
+
// included) became the answer. `windowSize` is ignored: the alternate
|
|
118
|
+
// screen has no scrollback, so the whole pane IS the window, and every
|
|
119
|
+
// caller already passes `totalLines` or more for this tool.
|
|
120
|
+
return (0, response_extractor_1.resolveOpenCodeTurnRegion)(openCodeCleanLines).echoEnd;
|
|
121
|
+
}
|
|
122
|
+
else if (cliToolId === 'copilot') {
|
|
123
|
+
// Issue #1897: copilot 1.0.80 draws the transcript one column in, so the
|
|
124
|
+
// bare `^[>❯]` form below never matched the echoed prompt -- every copilot
|
|
125
|
+
// extraction fell back to line 0, i.e. to the launch banner. The composer,
|
|
126
|
+
// which IS at column 0, lives below `contentEnd` and so cannot be picked up
|
|
127
|
+
// as an echo here.
|
|
128
|
+
//
|
|
129
|
+
// The scan then walks past the echo's own wrapped rows and returns the LAST
|
|
130
|
+
// of them, so that callers' `+ 1` lands on the reply rather than on the
|
|
131
|
+
// second half of the operator's question.
|
|
132
|
+
//
|
|
133
|
+
// Same defect as #1911's opencode branch above and the same shape of fix,
|
|
134
|
+
// but NOT the same code: opencode's echo is a `┃ <text>` gutter row and
|
|
135
|
+
// copilot's is ` ❯ <text>` at the pane's one-column indent, so the anchor
|
|
136
|
+
// and the continuation rule are both tool-specific measurements.
|
|
137
|
+
for (let i = contentEnd - 1; i >= Math.max(0, contentEnd - windowSize); i--) {
|
|
138
|
+
if (!cli_patterns_1.COPILOT_USER_ECHO_PATTERN.test((0, cli_patterns_1.stripAnsi)(lines[i])))
|
|
139
|
+
continue;
|
|
140
|
+
let echoEnd = i;
|
|
141
|
+
while (echoEnd + 1 < contentEnd &&
|
|
142
|
+
cli_patterns_1.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN.test((0, cli_patterns_1.stripAnsi)(lines[echoEnd + 1]))) {
|
|
143
|
+
echoEnd++;
|
|
144
|
+
}
|
|
145
|
+
return echoEnd;
|
|
146
|
+
}
|
|
147
|
+
return -1;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
userPromptPattern = /^[>❯]\s+\S/;
|
|
151
|
+
}
|
|
152
|
+
// Issue #1289: for Claude the search stops above the footer. The text the
|
|
153
|
+
// user just typed sits in the footer's input box and matches the same "❯ …"
|
|
154
|
+
// shape as the transcript echo; anchoring on it would treat the footer as
|
|
155
|
+
// the newest turn and extract the status bar as its reply.
|
|
156
|
+
for (let i = contentEnd - 1; i >= Math.max(0, contentEnd - windowSize); i--) {
|
|
157
|
+
const cleanLine = (0, cli_patterns_1.stripAnsi)(lines[i]);
|
|
158
|
+
if (userPromptPattern.test(cleanLine)) {
|
|
159
|
+
return i;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return -1;
|
|
163
|
+
}
|
|
164
|
+
// Startup-screen defenses, split out of extractResponse one function per tool
|
|
165
|
+
// (Issue #3213). Each is called on a frame the completion rules have already
|
|
166
|
+
// accepted, with the `response` extracted from it, and answers only for its own
|
|
167
|
+
// tool: the incomplete result to return when the frame is that tool's startup
|
|
168
|
+
// screen rather than a reply, `null` when the response stands. They are declared
|
|
169
|
+
// in the order extractResponse calls them — the comments inside say "above" and
|
|
170
|
+
// "below" about each other and about the checks that ran before the call.
|
|
171
|
+
//
|
|
172
|
+
// Issue #3293 added the last two, codex and vibe-local. Theirs is the one result
|
|
173
|
+
// here that is not incomplete: an empty COMPLETE one, for the reason given at
|
|
174
|
+
// `readStartupScreenPastCursor`.
|
|
175
|
+
/**
|
|
176
|
+
* Claude: the startup banner, and an echoed prompt with no reply under it yet.
|
|
177
|
+
*
|
|
178
|
+
* @param cliToolId - CLI tool identifier
|
|
179
|
+
* @param response - The response extracted from the frame
|
|
180
|
+
* @param totalLines - Total line count in the buffer
|
|
181
|
+
* @param skipPatterns - The tool's skip patterns from `getCliToolPatterns`
|
|
182
|
+
* @param findRecentUserPromptIndex - Callback to locate the most recent user prompt
|
|
183
|
+
* @returns The incomplete result to return, or null when the response stands
|
|
184
|
+
*/
|
|
185
|
+
function suppressClaudeStartupScreen(cliToolId, response, totalLines, skipPatterns, findRecentUserPromptIndex) {
|
|
186
|
+
// CRITICAL FIX: Detect and skip Claude Code startup banner/screen
|
|
187
|
+
if (cliToolId === 'claude') {
|
|
188
|
+
const cleanResponse = (0, cli_patterns_1.stripAnsi)(response);
|
|
189
|
+
// Issue #2247: `│` is what Claude Code draws markdown TABLES with -- the
|
|
190
|
+
// live frame in `tests/fixtures/claude-live-2247/turn-table.txt` is a
|
|
191
|
+
// two-row table and nothing else -- so it identified a reply, not a banner.
|
|
192
|
+
// The banner's own frame glyphs are the rounded corners and the block
|
|
193
|
+
// shading; those stay.
|
|
194
|
+
const hasBannerArt = /[╭╮╰╯]/.test(cleanResponse) || /░{3,}/.test(cleanResponse) || /▓{3,}/.test(cleanResponse);
|
|
195
|
+
// Issue #2247: the bare `v\d+\.\d+` alternative matched any version string a
|
|
196
|
+
// reply happens to mention. The frame that lost a turn on 2026-09-02 was
|
|
197
|
+
// "GitHub Release v0.30.0 を公開しました" (148 chars, well under the 2000
|
|
198
|
+
// below). What the banner actually prints is the tool's own name and
|
|
199
|
+
// version on one row -- `Claude Code v2.1.258` -- so that is what is
|
|
200
|
+
// matched now, plus the `claude/` form older banners used.
|
|
201
|
+
const hasVersionInfo = /Claude Code v\d+\.\d+|claude\//.test(cleanResponse);
|
|
202
|
+
const hasStartupTips = /Tip:|for shortcuts|\?\s*for help/.test(cleanResponse);
|
|
203
|
+
const hasProjectInit = /^\s*\/Users\/.*$/m.test(cleanResponse) && cleanResponse.split('\n').length < 30;
|
|
204
|
+
// Issue #2247: the anchors above are only evidence of a banner on a pane
|
|
205
|
+
// that has not had a single turn yet -- the same shape as the #1897 copilot
|
|
206
|
+
// fix below. Claude echoes every prompt into the transcript as `❯ <text>`,
|
|
207
|
+
// and the startup screen has none, so an echo anywhere in the transcript
|
|
208
|
+
// rules the banner out no matter what the reply quotes.
|
|
209
|
+
//
|
|
210
|
+
// The search is `findRecentUserPromptIndex`, deliberately: it is the same
|
|
211
|
+
// `/^[>❯]\s+\S/` this file already anchors extraction on, and it stops at
|
|
212
|
+
// `contentEnd`. That bound is load-bearing rather than incidental -- the
|
|
213
|
+
// footer's composer draws a DIM ghost suggestion (`❯ Try "write a test for
|
|
214
|
+
// <filepath>"`, see `boot-banner.txt`) whose stripped bytes are identical
|
|
215
|
+
// to a real echo (#1879), so a scan over the whole pane would read the
|
|
216
|
+
// startup screen as "already had a turn" and put the banner back in
|
|
217
|
+
// History.
|
|
218
|
+
const hasTurnEcho = findRecentUserPromptIndex(totalLines) >= 0;
|
|
219
|
+
const userPromptMatch = cleanResponse.match(/^[>❯]\s+(\S.*)$/m);
|
|
220
|
+
if (userPromptMatch) {
|
|
221
|
+
const userPromptIndex = cleanResponse.indexOf(userPromptMatch[0]);
|
|
222
|
+
const contentAfterPrompt = cleanResponse.substring(userPromptIndex + userPromptMatch[0].length).trim();
|
|
223
|
+
const contentLines = contentAfterPrompt.split('\n').filter(line => {
|
|
224
|
+
const trimmed = line.trim();
|
|
225
|
+
return trimmed &&
|
|
226
|
+
!skipPatterns.some(p => p.test(trimmed)) &&
|
|
227
|
+
!/^─+$/.test(trimmed);
|
|
228
|
+
});
|
|
229
|
+
if (contentLines.length === 0) {
|
|
230
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else if (!hasTurnEcho &&
|
|
234
|
+
(hasBannerArt || hasVersionInfo || hasStartupTips || hasProjectInit) &&
|
|
235
|
+
response.length < 2000) {
|
|
236
|
+
// Issue #2247: this branch used to swallow the turn in silence -- the
|
|
237
|
+
// poller kept ticking every 2s and `response-poller` logged nothing at
|
|
238
|
+
// all, so the only way to tell a lost turn from an idle session was to
|
|
239
|
+
// re-run `extractResponse` on a saved pane by hand. It is reached only
|
|
240
|
+
// before the first echo lands, so it cannot become a per-tick flood.
|
|
241
|
+
logger.info('Claude startup banner suppressed, response not saved', {
|
|
242
|
+
responseLength: response.length,
|
|
243
|
+
hasBannerArt,
|
|
244
|
+
hasVersionInfo,
|
|
245
|
+
hasStartupTips,
|
|
246
|
+
hasProjectInit,
|
|
247
|
+
});
|
|
248
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Copilot: the launch screen.
|
|
255
|
+
*
|
|
256
|
+
* @param cliToolId - CLI tool identifier
|
|
257
|
+
* @param response - The response extracted from the frame
|
|
258
|
+
* @param totalLines - Total line count in the buffer
|
|
259
|
+
* @returns The incomplete result to return, or null when the response stands
|
|
260
|
+
*/
|
|
261
|
+
function suppressCopilotLaunchScreen(cliToolId, response, totalLines) {
|
|
262
|
+
// Issue #1897: copilot's launch screen is a complete, idle frame -- composer
|
|
263
|
+
// drawn, key hints on the status bar -- so every check above accepts it and
|
|
264
|
+
// History used to open with the banner ("Current Sessions Issues Pull
|
|
265
|
+
// requests Gists / No copilot-instructions.md found… / Tip: /app") saved as
|
|
266
|
+
// the agent's first reply, before the operator had said anything.
|
|
267
|
+
//
|
|
268
|
+
// What actually distinguishes it is that no turn has happened: copilot echoes
|
|
269
|
+
// every prompt into the transcript as ` ❯ <text>`, and the launch screen has
|
|
270
|
+
// none. The banner anchors are only consulted once that echo is missing, so a
|
|
271
|
+
// reply that quotes any of this wording is unaffected.
|
|
272
|
+
if (cliToolId === 'copilot') {
|
|
273
|
+
const cleanResponse = (0, cli_patterns_1.stripAnsi)(response);
|
|
274
|
+
const hasUserEcho = cleanResponse
|
|
275
|
+
.split('\n')
|
|
276
|
+
.some(line => cli_patterns_1.COPILOT_USER_ECHO_PATTERN.test(line));
|
|
277
|
+
if (!hasUserEcho && cli_patterns_1.COPILOT_BOOT_BANNER_ANCHORS.some(anchor => anchor.test(cleanResponse))) {
|
|
278
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Command Code: the launch screen.
|
|
285
|
+
*
|
|
286
|
+
* @param cliToolId - CLI tool identifier
|
|
287
|
+
* @param response - The response extracted from the frame
|
|
288
|
+
* @param totalLines - Total line count in the buffer
|
|
289
|
+
* @param findRecentUserPromptIndex - Callback to locate the most recent user prompt
|
|
290
|
+
* @returns The incomplete result to return, or null when the response stands
|
|
291
|
+
*/
|
|
292
|
+
function suppressCommandCodeLaunchScreen(cliToolId, response, totalLines, findRecentUserPromptIndex) {
|
|
293
|
+
// Issue #2250: Command Code's launch screen is a complete, idle frame --
|
|
294
|
+
// block-art logo, three `#` banner rows, composer drawn between its two
|
|
295
|
+
// rules -- so every check above accepts it, and History would open with
|
|
296
|
+
// `# Command Code v1.40.1 / # models: … / # <cwd>` saved as the agent's
|
|
297
|
+
// first reply before the operator has said anything.
|
|
298
|
+
//
|
|
299
|
+
// The rule is ONE condition and it is a positive one: Command Code echoes
|
|
300
|
+
// every prompt into the transcript as `❯ <text>`, and the launch screen has
|
|
301
|
+
// none. That is the shape #1897 and #2247 both converged on; the anchor
|
|
302
|
+
// heuristics claude carries above (`hasBannerArt` / `hasVersionInfo` /
|
|
303
|
+
// `hasStartupTips`) are deliberately NOT reproduced here, because they are
|
|
304
|
+
// what #2247 had to take back -- a bare version string in a reply is a
|
|
305
|
+
// normal reply, and Command Code prints its own version on every launch.
|
|
306
|
+
//
|
|
307
|
+
// `findRecentUserPromptIndex` is the same `/^[>❯]\s+\S/` scan the extraction
|
|
308
|
+
// anchors on, and it stops at `contentEnd`, so the composer's own dim
|
|
309
|
+
// `❯ Ask your question...` placeholder cannot be mistaken for an echo
|
|
310
|
+
// (#1879's trap).
|
|
311
|
+
if (cliToolId === 'command-code' && findRecentUserPromptIndex(totalLines) < 0) {
|
|
312
|
+
logger.info('Command Code launch screen suppressed, response not saved', {
|
|
313
|
+
responseLength: response.length,
|
|
314
|
+
});
|
|
315
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
316
|
+
}
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Gemini: the banner, the auth/loading states, and a frame too short to be a reply.
|
|
321
|
+
*
|
|
322
|
+
* @param cliToolId - CLI tool identifier
|
|
323
|
+
* @param response - The response extracted from the frame
|
|
324
|
+
* @param totalLines - Total line count in the buffer
|
|
325
|
+
* @returns The incomplete result to return, or null when the response stands
|
|
326
|
+
*/
|
|
327
|
+
function suppressGeminiStartupScreen(cliToolId, response, totalLines) {
|
|
328
|
+
// Gemini-specific check
|
|
329
|
+
if (cliToolId === 'gemini') {
|
|
330
|
+
const bannerCharCount = (response.match(/[░█]/g) || []).length;
|
|
331
|
+
const totalChars = response.length;
|
|
332
|
+
if (bannerCharCount > totalChars * 0.3) {
|
|
333
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
334
|
+
}
|
|
335
|
+
if (response_poller_constants_1.GEMINI_LOADING_INDICATORS.some(indicator => response.includes(indicator))) {
|
|
336
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
337
|
+
}
|
|
338
|
+
if (!response.includes('\u2726') && response.length < 10) {
|
|
339
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* The result for a startup screen of a tool that reads its reply from the
|
|
346
|
+
* cursor: nothing to save, and the cursor moved past the screen (Issue #3293).
|
|
347
|
+
*
|
|
348
|
+
* The defenses above return an incomplete result and leave the cursor where it
|
|
349
|
+
* was. Where extraction is anchored on the echoed prompt (copilot,
|
|
350
|
+
* command-code, opencode) that costs nothing: once a turn exists, the banner
|
|
351
|
+
* above its echo is never read. codex and vibe-local start at
|
|
352
|
+
* `lastCapturedLine`. A cursor left at 0 would put the banner back on the first
|
|
353
|
+
* turn — vibe-local's first reply would be saved with the whole startup screen
|
|
354
|
+
* above it.
|
|
355
|
+
*
|
|
356
|
+
* So the screen is reported as read: a COMPLETE result with an empty response
|
|
357
|
+
* and the `lineCount` the banner save had. `checkForResponse` writes that
|
|
358
|
+
* cursor and saves nothing ("Validate response content is not empty"), which
|
|
359
|
+
* leaves every later tick with exactly the cursor it had before this Issue.
|
|
360
|
+
*
|
|
361
|
+
* Asked of the whole pane, by the reader the pre-send flush uses for the same
|
|
362
|
+
* question ({@link isStartupScreenWithoutUserEcho}), and not of a clipped
|
|
363
|
+
* capture: the echo of a turn longer than the window has scrolled out (#1670).
|
|
364
|
+
*
|
|
365
|
+
* @param tool - The tool the calling defense answers for
|
|
366
|
+
* @param ctx - What this call has read off the capture
|
|
367
|
+
* @param response - The response extracted from the frame
|
|
368
|
+
* @param endIndex - The line count `collectCompletedResponse` reported for it
|
|
369
|
+
* @returns The empty complete result to return, or null when the response stands
|
|
370
|
+
*/
|
|
371
|
+
function readStartupScreenPastCursor(tool, ctx, response, endIndex) {
|
|
372
|
+
const { cliToolId, lines, lastCapturedLine, bufferReset, captureWindowSaturated } = ctx;
|
|
373
|
+
// An empty response is already what this would return.
|
|
374
|
+
if (cliToolId !== tool || !response || captureWindowSaturated) {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
if (!(0, startup_screen_1.isStartupScreenWithoutUserEcho)(cliToolId, lines)) {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
// Only when `checkForResponse` goes on to write the cursor, which is once per
|
|
381
|
+
// startup screen. vibe-local's cursor ends on the last row, so every later
|
|
382
|
+
// tick of the idle pane takes the buffer-reset branch, re-extracts the banner
|
|
383
|
+
// and arrives here again.
|
|
384
|
+
if (bufferReset || endIndex > lastCapturedLine) {
|
|
385
|
+
logger.info(`${tool} startup screen suppressed, response not saved`, {
|
|
386
|
+
responseLength: response.length,
|
|
387
|
+
lineCount: endIndex,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
response: '',
|
|
392
|
+
isComplete: true,
|
|
393
|
+
lineCount: endIndex,
|
|
394
|
+
bufferReset,
|
|
395
|
+
captureWindowSaturated,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Codex: the startup screen.
|
|
400
|
+
*
|
|
401
|
+
* @param ctx - What this call has read off the capture
|
|
402
|
+
* @param response - The response extracted from the frame
|
|
403
|
+
* @param endIndex - The line count `collectCompletedResponse` reported for it
|
|
404
|
+
* @returns The empty complete result to return, or null when the response stands
|
|
405
|
+
*/
|
|
406
|
+
function suppressCodexStartupScreen(ctx, response, endIndex) {
|
|
407
|
+
// Issue #3293: codex's startup screen is a complete, idle frame — composer
|
|
408
|
+
// drawn, no status line above it — so `hasPrompt && !isThinking` accepts it,
|
|
409
|
+
// and the rows from the cursor down were saved as the agent's first reply.
|
|
410
|
+
// On 0.160.0 that is `>_ OpenAI Codex (v0.160.0)`, the cwd, a tagline and the
|
|
411
|
+
// block-art logo (20 rows in `tests/fixtures/startup-screen-3293/`); on 0.15x
|
|
412
|
+
// the `Tip:` and usage notices under the banner box, whose own rows the skip
|
|
413
|
+
// patterns happen to drop.
|
|
414
|
+
//
|
|
415
|
+
// It took one poll of that screen. The frame the folder-trust dialog leaves
|
|
416
|
+
// behind when it is answered is this screen, and answering it with `respond`
|
|
417
|
+
// starts the poller.
|
|
418
|
+
//
|
|
419
|
+
// The dialog itself never reaches this point: it has no composer, and it was
|
|
420
|
+
// returned as a prompt by the early check in extractResponse.
|
|
421
|
+
//
|
|
422
|
+
// A turn longer than the pane does reach it, and has to pass. 0.160.0 keeps
|
|
423
|
+
// no scrollback, so the echo of such a turn has left the pane off the top and
|
|
424
|
+
// "composer, no echo above it" holds for a finished reply. The reader asks
|
|
425
|
+
// for the banner row as well, which that pane has lost with the echo.
|
|
426
|
+
//
|
|
427
|
+
// Issue #3335: on 0.160.0 the cursor this leaves (the composer row, 996) is
|
|
428
|
+
// also where it stays — the pane does not grow, so the replies of the
|
|
429
|
+
// session are drawn above it and the screen read takes none of them. That
|
|
430
|
+
// is by design: they reach History from codex's transcript. See the codex
|
|
431
|
+
// branch of `resolveExtractionStartIndex`.
|
|
432
|
+
return readStartupScreenPastCursor('codex', ctx, response, endIndex);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Vibe Local: the startup screen.
|
|
436
|
+
*
|
|
437
|
+
* @param ctx - What this call has read off the capture
|
|
438
|
+
* @param response - The response extracted from the frame
|
|
439
|
+
* @param endIndex - The line count `collectCompletedResponse` reported for it
|
|
440
|
+
* @returns The empty complete result to return, or null when the response stands
|
|
441
|
+
*/
|
|
442
|
+
function suppressVibeLocalStartupScreen(ctx, response, endIndex) {
|
|
443
|
+
// Issue #3293: vibe-local's startup screen ends in an empty `ctx:N% ❯` prompt
|
|
444
|
+
// row with nothing working, so it is accepted the same way. Its skip patterns
|
|
445
|
+
// name some banner rows (`Model …`, `CWD …`) and miss the rest — the
|
|
446
|
+
// launcher's `Model: …` / `Ollama: …` box, the logo, the hint rows — so most
|
|
447
|
+
// of the screen was saved (20 rows of the 1.3.3 capture in the same fixtures).
|
|
448
|
+
return readStartupScreenPastCursor('vibe-local', ctx, response, endIndex);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Does this frame show a finished turn, by its tool's own completion rule?
|
|
452
|
+
*
|
|
453
|
+
* The readings and the four per-tool rules that decided the completion branch
|
|
454
|
+
* of {@link extractResponse}, split out as they were (Issue #3213). The return
|
|
455
|
+
* is the condition that `if` tested.
|
|
456
|
+
*
|
|
457
|
+
* @param ctx - What this call has read off the capture
|
|
458
|
+
* @returns True when the turn on the frame is finished
|
|
459
|
+
*/
|
|
460
|
+
function isTurnComplete(ctx) {
|
|
461
|
+
const { cliToolId, lines, totalLines, checkLineCount, cleanOutputToCheck, promptPattern, separatorPattern, thinkingPattern, } = ctx;
|
|
462
|
+
const hasPrompt = promptPattern.test(cleanOutputToCheck);
|
|
463
|
+
const hasSeparator = separatorPattern.test(cleanOutputToCheck);
|
|
464
|
+
// Issue #1671: Codex's activity markers are past-tense transcript records that
|
|
465
|
+
// never leave the scrollback, so testing them against this fixed tail window
|
|
466
|
+
// reports "still thinking" for a finished turn whenever its final message was
|
|
467
|
+
// short enough to keep the last "• Ran <cmd>" row inside the window. Codex gets
|
|
468
|
+
// a liveness check that keys off the status line it repaints above the composer
|
|
469
|
+
// instead; every other tool keeps the tail-window match.
|
|
470
|
+
const isThinking = cliToolId === 'codex'
|
|
471
|
+
? (0, cli_patterns_1.isCodexTurnActive)(lines, checkLineCount)
|
|
472
|
+
: thinkingPattern.test(cleanOutputToCheck);
|
|
473
|
+
// Issue #1897: copilot's `hasPrompt` is worthless as a completion signal and
|
|
474
|
+
// its `isThinking` is worthless as a liveness one. The `❯` composer is drawn
|
|
475
|
+
// between its two rules throughout a turn (measured on every frame of #1885's
|
|
476
|
+
// running fixtures), and `COPILOT_THINKING_PATTERN` matches nothing copilot
|
|
477
|
+
// 1.0.80 draws (0 of 44 live generating frames). So `hasPrompt && !isThinking`
|
|
478
|
+
// was true on the very first poll of a running turn -- the extractor declared
|
|
479
|
+
// the turn finished, saved the status bar as the reply, and `checkForResponse`
|
|
480
|
+
// stopped polling, which is why the real answer never reached History.
|
|
481
|
+
//
|
|
482
|
+
// 1.0.80 paints the turn's state on the bottom row of the pane and nowhere
|
|
483
|
+
// else, so that ROW -- never a tail window, which copilot's own reply text can
|
|
484
|
+
// forge (`status-vocabulary-in-response.txt`) -- is the evidence. `idle` is a
|
|
485
|
+
// positive observation that the turn is over (design policy §4 D1 decision 1
|
|
486
|
+
// item 2); `working` and `null` (a dialog box has taken the bar away) both mean
|
|
487
|
+
// "not finished", and the dialog case is already served by the prompt path
|
|
488
|
+
// above.
|
|
489
|
+
const copilotStatusBar = cliToolId === 'copilot'
|
|
490
|
+
? (0, cli_patterns_1.readCopilotStatusBar)(lines.slice(Math.max(0, totalLines - COPILOT_STATUS_BAR_SCAN_ROWS)).map(cli_patterns_1.stripAnsi))
|
|
491
|
+
: null;
|
|
492
|
+
// Prompt-based completion logic
|
|
493
|
+
const isPromptBasedComplete = cliToolId === 'copilot'
|
|
494
|
+
? copilotStatusBar === 'idle'
|
|
495
|
+
: (cliToolId === 'codex' || cliToolId === 'gemini' || cliToolId === 'vibe-local' || cliToolId === 'antigravity') && hasPrompt && !isThinking;
|
|
496
|
+
const isClaudeComplete = cliToolId === 'claude' && hasPrompt && hasSeparator && !isThinking;
|
|
497
|
+
// Issue #2250: claude's shape, because Command Code's layout is claude's — the
|
|
498
|
+
// composer sits between two full-pane rules and is drawn only when the agent
|
|
499
|
+
// will accept input. Deliberately NOT keyed on `✻ Worked for`: that row is the
|
|
500
|
+
// live turn's, not the transcript's (it is present in `turn-version.txt` and
|
|
501
|
+
// gone from `dialog-create-file.txt`, the same pane one prompt later) and
|
|
502
|
+
// `WorkedDurationNote` omits it entirely for a turn under 1000 ms.
|
|
503
|
+
const isCommandCodeComplete = cliToolId === 'command-code' && hasPrompt && hasSeparator && !isThinking;
|
|
504
|
+
const isOpenCodeDone = cliToolId === 'opencode' && (0, response_extractor_1.isOpenCodeComplete)(cleanOutputToCheck);
|
|
505
|
+
return isPromptBasedComplete || isClaudeComplete || isCommandCodeComplete || isOpenCodeDone;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Collect the rows of a finished turn's reply, and where the cursor stops.
|
|
509
|
+
*
|
|
510
|
+
* The first half of the completion branch of {@link extractResponse}, split out
|
|
511
|
+
* as it was (Issue #3213). The loop writes `endIndex` when it stops early, so
|
|
512
|
+
* it is returned beside the response instead of being written through.
|
|
513
|
+
*
|
|
514
|
+
* @param ctx - What this call has read off the capture
|
|
515
|
+
* @returns The trimmed response, and the line count to report for it
|
|
516
|
+
*/
|
|
517
|
+
function collectCompletedResponse(ctx) {
|
|
518
|
+
const { cliToolId, lines, totalLines, chromeStart, contentEnd, lastCapturedLine, bufferReset, captureWindowSaturated, skipPatterns, findRecentUserPromptIndex, } = ctx;
|
|
519
|
+
const responseLines = [];
|
|
520
|
+
const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, captureWindowSaturated);
|
|
521
|
+
// `contentEnd` bounds the content only; `endIndex` keeps reporting the full
|
|
522
|
+
// buffer so lineCount bookkeeping in session_states is unchanged (#1289).
|
|
523
|
+
//
|
|
524
|
+
// Issue #2400: codex is the exception, and it is the pre-existing behaviour
|
|
525
|
+
// rather than a new rule. Before this Issue the loop below stopped on the
|
|
526
|
+
// composer's `›` and wrote that row's index into `endIndex`; now the composer
|
|
527
|
+
// is outside `contentEnd`, so the break can no longer fire on it and
|
|
528
|
+
// `endIndex` would silently advance ~3 rows further. Those rows matter for
|
|
529
|
+
// codex specifically: it renders INLINE, and it repaints the composer band in
|
|
530
|
+
// place — the next turn's transcript is printed over exactly the rows the
|
|
531
|
+
// composer occupied in this capture. A cursor parked past them would skip
|
|
532
|
+
// real content on the following poll. So the cursor stops where the content
|
|
533
|
+
// stops, which is what it did before.
|
|
534
|
+
let endIndex = cliToolId === 'codex' ? contentEnd : totalLines;
|
|
535
|
+
for (let i = startIndex; i < contentEnd; i++) {
|
|
536
|
+
const line = lines[i];
|
|
537
|
+
const cleanLine = (0, cli_patterns_1.stripAnsi)(line);
|
|
538
|
+
if (cliToolId === 'codex' && /^›\s+/.test(cleanLine)) {
|
|
539
|
+
endIndex = i;
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
if (cliToolId === 'gemini' && /^(%|\$|.*@.*[%$#])\s*$/.test(cleanLine)) {
|
|
543
|
+
endIndex = i;
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
// Antigravity (agy): the bare ">" input box line marks the end of the
|
|
547
|
+
// response (the status bar and shortcuts footer follow below it). (Issue #988)
|
|
548
|
+
if (cliToolId === 'antigravity' && /^>\s*$/.test(cleanLine)) {
|
|
549
|
+
endIndex = i;
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
// Issue #1911: both rows this stops on (`Ask anything...` in the composer,
|
|
553
|
+
// `tab agents ctrl+p commands` under its border) live in the chrome, which
|
|
554
|
+
// `contentEnd` now excludes structurally. Kept only as the fallback for a
|
|
555
|
+
// frame whose chrome could not be located, because there it is still the
|
|
556
|
+
// one boundary available — and #1883 measured that a REPLY can contain
|
|
557
|
+
// `Ask anything...`, so cutting the turn on it is a last resort, not the
|
|
558
|
+
// primary rule.
|
|
559
|
+
if (cliToolId === 'opencode' && chromeStart < 0) {
|
|
560
|
+
if (cli_patterns_1.OPENCODE_PROMPT_PATTERN.test(cleanLine) || cli_patterns_1.OPENCODE_PROMPT_AFTER_RESPONSE.test(cleanLine)) {
|
|
561
|
+
endIndex = i;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
const shouldSkip = skipPatterns.some(pattern => pattern.test(cleanLine));
|
|
566
|
+
if (shouldSkip) {
|
|
567
|
+
continue;
|
|
568
|
+
}
|
|
569
|
+
responseLines.push(line);
|
|
570
|
+
}
|
|
571
|
+
const response = responseLines.join('\n').trim();
|
|
572
|
+
return { response, endIndex };
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Build the result for a frame the completion rules accepted.
|
|
576
|
+
*
|
|
577
|
+
* The body of the completion branch of {@link extractResponse}, split out as it
|
|
578
|
+
* was (Issue #3213). Every return is `extractResponse`'s own result: incomplete
|
|
579
|
+
* when the reply's tail still shows a thinking indicator or the frame is a
|
|
580
|
+
* startup screen, complete otherwise. (A codex or vibe-local startup screen is
|
|
581
|
+
* the exception — complete, with an empty response; Issue #3293.)
|
|
582
|
+
*
|
|
583
|
+
* @param ctx - What this call has read off the capture
|
|
584
|
+
* @returns What `extractResponse` returns for this frame
|
|
585
|
+
*/
|
|
586
|
+
function extractCompletedResponse(ctx) {
|
|
587
|
+
const { cliToolId, totalLines, openCodeCleanLines, bufferReset, captureWindowSaturated, thinkingPattern, skipPatterns, findRecentUserPromptIndex, } = ctx;
|
|
588
|
+
const { response, endIndex } = collectCompletedResponse(ctx);
|
|
589
|
+
// DR-004: Check only the tail of the response for thinking indicators.
|
|
590
|
+
//
|
|
591
|
+
// Issue #1897: not for copilot. This is the same tail-window match the #1671
|
|
592
|
+
// codex fix removed from the liveness test, and on copilot it is both
|
|
593
|
+
// redundant and harmful: the status bar above has already made a positive
|
|
594
|
+
// `idle` observation about THIS frame, while the window here sees transcript
|
|
595
|
+
// that never scrolls away. `COPILOT_THINKING_PATTERN`'s braille alternative
|
|
596
|
+
// matches any spinner glyph a reply happens to quote, and the turn would then
|
|
597
|
+
// be reported unfinished for the rest of the session.
|
|
598
|
+
const responseTailLines = response.split('\n').slice(-thinking_constants_1.THINKING_TAIL_LINE_COUNT).join('\n');
|
|
599
|
+
if (cliToolId !== 'copilot' && thinkingPattern.test(responseTailLines)) {
|
|
600
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
601
|
+
}
|
|
602
|
+
// Startup-screen defenses, one per tool and in this order. Each answers only
|
|
603
|
+
// for its own tool; `null` means the response stands.
|
|
604
|
+
const startupScreen = suppressClaudeStartupScreen(cliToolId, response, totalLines, skipPatterns, findRecentUserPromptIndex) ??
|
|
605
|
+
suppressCopilotLaunchScreen(cliToolId, response, totalLines) ??
|
|
606
|
+
suppressCommandCodeLaunchScreen(cliToolId, response, totalLines, findRecentUserPromptIndex) ??
|
|
607
|
+
suppressGeminiStartupScreen(cliToolId, response, totalLines) ??
|
|
608
|
+
suppressCodexStartupScreen(ctx, response, endIndex) ??
|
|
609
|
+
suppressVibeLocalStartupScreen(ctx, response, endIndex);
|
|
610
|
+
if (startupScreen) {
|
|
611
|
+
return startupScreen;
|
|
612
|
+
}
|
|
613
|
+
return {
|
|
614
|
+
response,
|
|
615
|
+
isComplete: true,
|
|
616
|
+
lineCount: endIndex,
|
|
617
|
+
bufferReset,
|
|
618
|
+
captureWindowSaturated,
|
|
619
|
+
// Issue #1911: opencode only. `echoEnd < 0` means the turn is longer than
|
|
620
|
+
// the alternate-screen pane and its head has already scrolled away, so
|
|
621
|
+
// `response` starts mid-answer. Nothing else in this frame can recover it.
|
|
622
|
+
turnHeadTruncated: openCodeCleanLines
|
|
623
|
+
? (0, response_extractor_1.resolveOpenCodeTurnRegion)(openCodeCleanLines).headTruncated
|
|
624
|
+
: undefined,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Build the result for a frame whose turn is still running: what has streamed
|
|
629
|
+
* so far, or an empty incomplete result when nothing has.
|
|
630
|
+
*
|
|
631
|
+
* The tail of {@link extractResponse}, split out as it was (Issue #3213). Both
|
|
632
|
+
* returns are `extractResponse`'s own result.
|
|
633
|
+
*
|
|
634
|
+
* @param ctx - What this call has read off the capture
|
|
635
|
+
* @returns What `extractResponse` returns for this frame
|
|
636
|
+
*/
|
|
637
|
+
function extractPartialResponse(ctx) {
|
|
638
|
+
const { lines, totalLines, contentEnd, lastCapturedLine, bufferReset, captureWindowSaturated, skipPatterns, findRecentUserPromptIndex, } = ctx;
|
|
639
|
+
// Partial response in progress
|
|
640
|
+
const responseLines = [];
|
|
641
|
+
const endIndex = totalLines;
|
|
642
|
+
// Issue #1670: a saturated window makes lastCapturedLine meaningless here too —
|
|
643
|
+
// starting the partial slice at it would stream an arbitrary tail fragment
|
|
644
|
+
// instead of the turn so far. Re-anchor on the echoed user prompt.
|
|
645
|
+
const partialBufferReset = bufferReset || captureWindowSaturated || lastCapturedLine >= endIndex - 5;
|
|
646
|
+
const recentPromptIndex = partialBufferReset ? findRecentUserPromptIndex(80) : -1;
|
|
647
|
+
const startIndex = partialBufferReset
|
|
648
|
+
? (recentPromptIndex >= 0 ? recentPromptIndex + 1 : Math.max(0, endIndex - 80))
|
|
649
|
+
: Math.max(0, lastCapturedLine);
|
|
650
|
+
// Partial (still-streaming) content is bounded by the footer too (#1289).
|
|
651
|
+
for (let i = startIndex; i < Math.min(endIndex, contentEnd); i++) {
|
|
652
|
+
const line = lines[i];
|
|
653
|
+
const cleanLine = (0, cli_patterns_1.stripAnsi)(line);
|
|
654
|
+
const shouldSkip = skipPatterns.some(pattern => pattern.test(cleanLine));
|
|
655
|
+
if (shouldSkip) {
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
responseLines.push(line);
|
|
659
|
+
}
|
|
660
|
+
const partialResponse = responseLines.join('\n').trim();
|
|
661
|
+
if (partialResponse) {
|
|
662
|
+
return {
|
|
663
|
+
response: partialResponse,
|
|
664
|
+
isComplete: false,
|
|
665
|
+
lineCount: endIndex,
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
// Response not yet complete
|
|
669
|
+
return (0, response_checker_extraction_result_1.incompleteResult)(totalLines);
|
|
670
|
+
}
|