commandmate 0.47.2 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +180 -180
- package/.next/app-path-routes-manifest.json +30 -30
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- 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_client-reference-manifest.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 +3 -3
- 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_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_client-reference-manifest.js +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_client-reference-manifest.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_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_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_client-reference-manifest.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_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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.js +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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_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_client-reference-manifest.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_client-reference-manifest.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_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_client-reference-manifest.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_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_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_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_client-reference-manifest.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_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_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]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/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_client-reference-manifest.js +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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- 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_client-reference-manifest.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_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.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +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.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +12 -12
- 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 +30 -30
- package/.next/server/chunks/1191.js +11 -4
- package/.next/server/chunks/1501.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1945.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/255.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3505.js +2 -2
- package/.next/server/chunks/4243.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/4280.js +1 -0
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +9 -8
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/720.js +103 -0
- package/.next/server/chunks/7604.js +2 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +8 -8
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8807.js +19 -18
- package/.next/server/chunks/8918.js +2 -104
- package/.next/server/chunks/936.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9731.js +2 -2
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
- package/.next/static/chunks/{2407-a6533805a86d05bd.js → 2407-ab92ae9837c39dce.js} +1 -1
- package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-7173dc305dffc4f6.js} +1 -1
- package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
- package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
- package/.next/static/chunks/9079-987939d231704218.js +1 -0
- package/.next/static/chunks/app/{layout-538d8d2746ad1588.js → layout-aa8e66164a4367af.js} +1 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +1 -0
- package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/auto-yes.d.ts +24 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +76 -8
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +5 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +10 -1
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +5 -3
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +19 -6
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +8 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +101 -13
- package/dist/cli/config/duration-constants.d.ts +16 -13
- package/dist/cli/config/duration-constants.d.ts.map +1 -1
- package/dist/cli/config/duration-constants.js +21 -21
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +29 -1
- package/dist/cli/types/api-responses.d.ts +145 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +4 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.d.ts +0 -18
- package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.js +1 -51
- package/dist/cli/utils/verify-runner.d.ts +24 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +54 -1
- package/dist/config/auto-yes-duration.d.ts +56 -0
- package/dist/config/auto-yes-duration.d.ts.map +1 -0
- package/dist/config/auto-yes-duration.js +76 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +54 -2
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +33 -2
- package/dist/lib/prompt-observation/types.d.ts +13 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +2 -1
- package/dist/server/locales/ja/worktree.json +2 -1
- package/dist/server/src/config/auto-yes-config.js +14 -19
- package/dist/server/src/config/auto-yes-duration.js +76 -0
- package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
- package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
- package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
- package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
- package/dist/server/src/lib/auto-yes-poller.js +337 -376
- package/dist/server/src/lib/auto-yes-state.js +59 -4
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +235 -19
- package/dist/server/src/lib/db/chat-db.js +5 -1
- package/dist/server/src/lib/db/verification-db.js +23 -2
- package/dist/server/src/lib/detection/composer-text.js +215 -11
- package/dist/server/src/lib/detection/option-recommendation.js +120 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +402 -539
- package/dist/server/src/lib/detection/prompt-detector.js +92 -21
- package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
- package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
- package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
- package/dist/server/src/lib/detection/upstream-faults.js +19 -2
- package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +7 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +3 -0
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +34 -3
- package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +124 -0
- package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +11 -5
- package/dist/server/src/lib/polling/auto-yes-poller-capture.js +15 -2
- package/dist/server/src/lib/polling/auto-yes-poller-generation.js +42 -1
- package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +42 -5
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +147 -49
- package/dist/server/src/lib/polling/auto-yes-poller-steps.js +172 -2
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +96 -21
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +33 -2
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
- package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
- package/dist/server/src/lib/polling/response-checker.js +145 -58
- package/dist/server/src/lib/prompt-answer-sender.js +104 -10
- package/dist/server/src/lib/push/notification-dedup.js +15 -2
- package/dist/server/src/lib/push/prompt-card-state.js +140 -19
- package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
- package/dist/server/src/lib/push/push-sender.js +23 -3
- package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
- package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
- package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
- package/dist/server/src/lib/session/agent-event-state.js +25 -5
- package/dist/server/src/lib/session/agent-event-turn.js +140 -46
- package/dist/server/src/lib/session/cli-session.js +21 -2
- package/dist/server/src/lib/session/composer-clear.js +56 -4
- package/dist/server/src/lib/session/current-output-builder.js +66 -12
- package/dist/server/src/lib/session/send-attempt-state.js +24 -7
- package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
- package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
- package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
- package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
- package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
- package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +68 -91
- package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
- package/dist/server/src/lib/tmux/tmux.js +79 -9
- package/dist/server/src/lib/verification/gate-runner.js +172 -16
- package/dist/server/src/lib/verification/machine-lock.js +5 -0
- package/dist/server/src/lib/ws-server.js +18 -3
- package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
- package/dist/server/src/types/auto-yes-decision.js +61 -0
- package/dist/server/src/types/auto-yes.js +6 -0
- package/dist/server/src/types/prompt-reading.js +32 -0
- package/dist/types/auto-yes-answer-mode.d.ts +35 -0
- package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
- package/dist/types/auto-yes-answer-mode.js +38 -0
- package/docs/en/user-guide/webapp-guide.md +47 -13
- package/package.json +1 -1
- package/public/sw.js +76 -4
- package/release-notes/0.48.0.json +57 -0
- package/release-notes/0.49.0.json +45 -0
- package/.next/server/chunks/1559.js +0 -2
- package/.next/server/chunks/2460.js +0 -1
- package/.next/server/chunks/5595.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6722.js +0 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
- package/.next/static/chunks/602-1c1488959215e140.js +0 -1
- package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
- package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-46aced20b2b1c010.js +0 -1
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
|
@@ -33,7 +33,11 @@ const cli_session_1 = require("../../lib/session/cli-session");
|
|
|
33
33
|
const status_detector_1 = require("../../lib/detection/status-detector");
|
|
34
34
|
const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
|
|
35
35
|
const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
|
|
36
|
-
const
|
|
36
|
+
const auto_yes_poller_state_1 = require("../../lib/polling/auto-yes-poller-state");
|
|
37
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
38
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
39
|
+
const auto_yes_decision_state_1 = require("../../lib/polling/auto-yes-decision-state");
|
|
40
|
+
const antigravity_receipt_episodes_1 = require("../../lib/polling/antigravity-receipt-episodes");
|
|
37
41
|
const prompt_dedup_state_1 = require("../../lib/polling/prompt-dedup-state");
|
|
38
42
|
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
39
43
|
const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
|
|
@@ -45,6 +49,7 @@ const status_evidence_1 = require("../../lib/session/status-evidence");
|
|
|
45
49
|
const ask_user_question_prompt_1 = require("../../lib/session/ask-user-question-prompt");
|
|
46
50
|
const prompt_view_1 = require("../../lib/session/prompt-view");
|
|
47
51
|
const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
|
|
52
|
+
const prompt_screen_reading_1 = require("../../lib/polling/prompt-screen-reading");
|
|
48
53
|
const layer_disagreement_1 = require("../../lib/session/layer-disagreement");
|
|
49
54
|
const structured_prompt_1 = require("../../lib/session/structured-prompt");
|
|
50
55
|
const chat_turn_progress_1 = require("./chat-turn-progress");
|
|
@@ -226,7 +231,7 @@ function readAgentEvents(worktreeId, cliToolId, instanceId, resolvedInstanceId)
|
|
|
226
231
|
* every value below is derived from the arguments, and nothing is assigned
|
|
227
232
|
* outside this function.
|
|
228
233
|
*/
|
|
229
|
-
function composePromptData({ worktreeId, cliToolId, output, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
|
|
234
|
+
function composePromptData({ worktreeId, cliToolId, output, captureWindowLines, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
|
|
230
235
|
const scraperPromptWaiting = statusResult.hasActivePrompt;
|
|
231
236
|
// Issue #1726: the agent's own account of what it asked. It contributes only
|
|
232
237
|
// where some other layer has already established that a dialog is on screen —
|
|
@@ -238,7 +243,14 @@ function composePromptData({ worktreeId, cliToolId, output, statusResult, starti
|
|
|
238
243
|
// takes it there today (the decision entries publish the same episode's
|
|
239
244
|
// choices) — and this line now re-uses it, so the two surfaces cannot describe
|
|
240
245
|
// different instants.
|
|
241
|
-
|
|
246
|
+
//
|
|
247
|
+
// Issue #3881 (second review N3): with the capture's top as the Auto-Yes
|
|
248
|
+
// poller reads it — an approval target whose upward scan reached a top that
|
|
249
|
+
// may be cut carries `approvalTargetCompleteness: 'top-unknown'`, so the
|
|
250
|
+
// contract re-evaluation of `observe=1` (`prompt-observation/observe.ts`)
|
|
251
|
+
// and `wait` read the same completeness the poller acted on, from the same
|
|
252
|
+
// `captureTopOf` on this payload's own capture window.
|
|
253
|
+
const scraperPromptData = (0, prompt_screen_reading_1.withCaptureTopCompleteness)(statusResult.promptDetection, (0, prompt_screen_reading_1.captureTopOf)(output, captureWindowLines, cliToolId)).promptData;
|
|
242
254
|
const correctedPromptData = scraperPromptData && askUserQuestion
|
|
243
255
|
? (0, ask_user_question_prompt_1.applyAskUserQuestion)(scraperPromptData, askUserQuestion.spec)
|
|
244
256
|
: null;
|
|
@@ -468,12 +480,26 @@ function logDetectionDivergence(worktreeId, cliToolId, resolvedInstanceId, statu
|
|
|
468
480
|
});
|
|
469
481
|
}
|
|
470
482
|
}
|
|
483
|
+
/**
|
|
484
|
+
* Issue #3821: the agy hook call the receipt on screen was accepted for, for
|
|
485
|
+
* the decision to be matched against; null when unknown. Read only, never throws.
|
|
486
|
+
*/
|
|
487
|
+
function acceptedAgyCallId(worktreeId, instanceId) {
|
|
488
|
+
try {
|
|
489
|
+
return (0, antigravity_receipt_episodes_1.getAntigravityAcceptedReceiptCallId)(worktreeId, instanceId);
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
471
495
|
/**
|
|
472
496
|
* The payload of a running session (Issue #3272). Split out of
|
|
473
497
|
* {@link buildPayload} as it stood there, so the keys keep their order and the
|
|
474
498
|
* reads inside it keep theirs.
|
|
475
499
|
*/
|
|
476
|
-
function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, published, merged, newContent, output, realtimeSnippet, totalLines, lastCapturedLine, isPromptWaiting, promptData, promptAnswerable, autoYesState, lastEnterFallback, isSelectionListActive, isPagerActive, isDismissablePanelActive, startingSince, lastKnown, lastServerResponseTimestamp, compositeKey, stopEventAt, structuredEvents, model, effort, upstreamFaultMatch, paneObstruction, composer, }) {
|
|
500
|
+
function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, published, merged, newContent, output, realtimeSnippet, totalLines, lastCapturedLine, isPromptWaiting, promptData, promptAnswerable, autoYesState, lastEnterFallback, autoYesDecision, isSelectionListActive, isPagerActive, isDismissablePanelActive, startingSince, lastKnown, lastServerResponseTimestamp, compositeKey, stopEventAt, structuredEvents, model, effort, upstreamFaultMatch, paneObstruction, composer, }) {
|
|
501
|
+
const lastSuppression = (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId);
|
|
502
|
+
const waitingEpisodeId = (0, waiting_episode_state_1.getWaitingEpisodeRecord)(worktreeId, cliToolId, instanceId)?.episodeId ?? null;
|
|
477
503
|
return {
|
|
478
504
|
isRunning: true,
|
|
479
505
|
sessionName,
|
|
@@ -496,14 +522,29 @@ function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, p
|
|
|
496
522
|
enabled: autoYesState?.enabled ?? false,
|
|
497
523
|
expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
|
|
498
524
|
stopReason: autoYesState?.stopReason,
|
|
499
|
-
lastSuppression
|
|
525
|
+
lastSuppression,
|
|
526
|
+
// Issue #3798: read in the same step as the record above, which names the
|
|
527
|
+
// wait it was written for — `cmate wait` holds the two against each other.
|
|
528
|
+
waitingEpisodeId,
|
|
500
529
|
// Issue #1694: undefined (so the key is absent from the JSON) unless a
|
|
501
530
|
// stop pattern actually fired — the state clears it on every other path.
|
|
502
531
|
stopMatchedText: autoYesState?.stopMatchedText,
|
|
503
532
|
// Issue #3397: appended last, after the published fields above. Null when
|
|
504
|
-
// Auto-Yes never sent its Enter to an unreadable choice screen here
|
|
533
|
+
// Auto-Yes never sent its Enter to an unreadable choice screen here —
|
|
534
|
+
// always, since Issue #3821 retired the Enter.
|
|
505
535
|
lastEnterFallback,
|
|
536
|
+
// Issue #3798: appended last. Whether the poller answered the open wait
|
|
537
|
+
// after the record above was written — the push gate's own reading, so
|
|
538
|
+
// `cmate wait` does not take that record for this wait's reason.
|
|
539
|
+
lastSuppressionAnswered: lastSuppression !== null &&
|
|
540
|
+
(0, auto_yes_suppression_state_1.suppressionPredatesAnswer)(lastSuppression, waitingEpisodeId, (0, auto_yes_poller_state_1.getAutoYesLastAnswer)(compositeKey)),
|
|
506
541
|
},
|
|
542
|
+
// Issue #3821: next to `autoYes`, and about `promptData` above — whether
|
|
543
|
+
// Auto-Yes is answering it, has left it to a human, or neither.
|
|
544
|
+
autoYesDecision,
|
|
545
|
+
// Issue #3863: how a question on this screen is treated while Auto-Yes is
|
|
546
|
+
// on; the key is absent while it is off.
|
|
547
|
+
...(autoYesState?.enabled ? { autoYesAnswerMode: (0, auto_yes_state_1.autoYesAnswerModeOf)(autoYesState) } : {}),
|
|
507
548
|
isSelectionListActive,
|
|
508
549
|
isPagerActive,
|
|
509
550
|
isDismissablePanelActive,
|
|
@@ -664,7 +705,8 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
664
705
|
// The effective window is the smaller of what this path asks for and what the
|
|
665
706
|
// capture layer will ever fetch — captureSessionOutput() reads at most
|
|
666
707
|
// CACHE_MAX_CAPTURE_LINES regardless of the request.
|
|
667
|
-
const
|
|
708
|
+
const captureWindowLines = Math.min(status_capture_config_1.STATUS_CAPTURE_LINES, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES);
|
|
709
|
+
const captureWindowSaturated = (0, tmux_capture_cache_1.isCaptureWindowSaturated)(totalLines, captureWindowLines);
|
|
668
710
|
// Issue #1910: saturation of the capture WINDOW is only one of the two ways
|
|
669
711
|
// the cursor dies, and it is the one that never fires for the alternate-screen
|
|
670
712
|
// tools — their pane is 1000 rows (claude / copilot) or 200 (opencode), so a
|
|
@@ -761,6 +803,7 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
761
803
|
worktreeId,
|
|
762
804
|
cliToolId,
|
|
763
805
|
output,
|
|
806
|
+
captureWindowLines,
|
|
764
807
|
statusResult,
|
|
765
808
|
startingSince,
|
|
766
809
|
promptWaiting,
|
|
@@ -871,7 +914,8 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
871
914
|
// Issue #1879: structural, and computed here next to the other frame readers
|
|
872
915
|
// rather than inside a status branch — the bar it feeds must appear on the
|
|
873
916
|
// strength of what is in the box, never on the strength of a status verdict.
|
|
874
|
-
|
|
917
|
+
// Issue #3927: the live box — a codex composer left above a dialog is not one.
|
|
918
|
+
const composer = (0, composer_text_1.extractLiveComposerText)(output, cliToolId);
|
|
875
919
|
// Issue #1839: judged on exactly what is published as `realtimeSnippet`, not
|
|
876
920
|
// on `output`. The wider capture keeps a banner from an hour ago in scope, and
|
|
877
921
|
// a fault the operator cannot see in the payload next to it is unverifiable.
|
|
@@ -922,10 +966,20 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
922
966
|
promptData,
|
|
923
967
|
promptAnswerable,
|
|
924
968
|
autoYesState,
|
|
925
|
-
// Issue #
|
|
926
|
-
|
|
927
|
-
//
|
|
928
|
-
|
|
969
|
+
// Issue #3821: the Enter is retired; the key is kept, and is null.
|
|
970
|
+
lastEnterFallback: null,
|
|
971
|
+
// Issue #3821: judged against the screen-read prompt only — the one
|
|
972
|
+
// `promptAnswerable` is published for, and the only kind the poller
|
|
973
|
+
// answers. A structured (hook / degraded) prompt is never that screen, and
|
|
974
|
+
// reads `none`.
|
|
975
|
+
autoYesDecision: (0, auto_yes_decision_state_1.publishAutoYesDecision)({
|
|
976
|
+
compositeKey,
|
|
977
|
+
grant: autoYesState,
|
|
978
|
+
promptData: promptData !== null && promptAnswerable !== undefined ? statusResult.promptDetection.promptData : null,
|
|
979
|
+
// agy: the decision is tied to the hook call its receipt was accepted for.
|
|
980
|
+
callId: cliToolId === 'antigravity' ? acceptedAgyCallId(worktreeId, instanceId) : null,
|
|
981
|
+
pollerActive: (0, auto_yes_manager_1.isPollerActive)(compositeKey),
|
|
982
|
+
}),
|
|
929
983
|
isSelectionListActive,
|
|
930
984
|
isPagerActive,
|
|
931
985
|
isDismissablePanelActive,
|
|
@@ -82,6 +82,12 @@ function getLastSendAttempt(instance) {
|
|
|
82
82
|
function clearSendAttempts() {
|
|
83
83
|
records.clear();
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* The wordings of a failed tmux call that can carry the message body: `tmux.ts`
|
|
87
|
+
* wraps the child_process error (`Command failed: tmux …argv…`) as
|
|
88
|
+
* `Failed to send keys to tmux session: …` and the like (Issue #3880).
|
|
89
|
+
*/
|
|
90
|
+
const TMUX_TRANSPORT_FAILURE = /Command failed: tmux |Failed to send (?:special )?keys? to tmux session|Failed to send special key:|Failed to paste message into tmux session/;
|
|
85
91
|
/**
|
|
86
92
|
* Where a failed `ICLITool.sendMessage` stopped, read from its error.
|
|
87
93
|
*
|
|
@@ -103,13 +109,10 @@ function classifySendFailure(error) {
|
|
|
103
109
|
return { state: 'not-sent', reason: 'plan-review' };
|
|
104
110
|
}
|
|
105
111
|
const message = error instanceof Error ? error.message : String(error);
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
//
|
|
110
|
-
if (/still holds unsent text after \d+ clear passes/.test(message)) {
|
|
111
|
-
return { state: 'not-sent', reason: 'composer-not-empty' };
|
|
112
|
-
}
|
|
112
|
+
// Issue #3880: the "after the body was typed" wordings are matched FIRST. A
|
|
113
|
+
// body-not-landed error quotes what the composer shows — the user's own text —
|
|
114
|
+
// and a body that says `prompt not ready` must not turn "may have been typed"
|
|
115
|
+
// into "was not typed". Indeterminate wins whenever its wording is present.
|
|
113
116
|
// #2464 / #3366: typed, never submitted, taken back out best-effort.
|
|
114
117
|
if (/Enter was not pressed, so nothing was submitted/.test(message)) {
|
|
115
118
|
return { state: 'indeterminate', reason: 'body-not-landed' };
|
|
@@ -122,6 +125,20 @@ function classifySendFailure(error) {
|
|
|
122
125
|
if (/submit could not be confirmed/i.test(message)) {
|
|
123
126
|
return { state: 'indeterminate', reason: 'submit-unconfirmed' };
|
|
124
127
|
}
|
|
128
|
+
// Issue #3880 (N2): a failed tmux call quotes its argv — and the argv of a
|
|
129
|
+
// literal send IS the body (`Command failed: tmux send-keys -t =s: -l -- <body>`).
|
|
130
|
+
// Whether any of the body reached the pane is unknown, and the body's own words
|
|
131
|
+
// (`Explain prompt not ready.`) must not be read as a readiness refusal below.
|
|
132
|
+
if (TMUX_TRANSPORT_FAILURE.test(message))
|
|
133
|
+
return { state: 'indeterminate', reason: 'send-error' };
|
|
134
|
+
// The readiness waits of every tool throw before typing anything.
|
|
135
|
+
if (/prompt not ready/i.test(message))
|
|
136
|
+
return { state: 'not-sent', reason: 'prompt-not-ready' };
|
|
137
|
+
// #1880: refused before the body, after only the clear keys (C-e / C-u, or C-e / BSpace
|
|
138
|
+
// for a codex composer holding only a paste placeholder, #3937).
|
|
139
|
+
if (/still holds unsent text after \d+ clear passes/.test(message)) {
|
|
140
|
+
return { state: 'not-sent', reason: 'composer-not-empty' };
|
|
141
|
+
}
|
|
125
142
|
return { state: 'indeterminate', reason: 'send-error' };
|
|
126
143
|
}
|
|
127
144
|
/** The whitespace-free form two renderings of one text share. */
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The observation half of `waiting-episode-binding` (Issue #3798): the
|
|
4
|
+
* observers' starts, the dating of a captured frame, and the plan of tables
|
|
5
|
+
* O-1 / O-2. Split out of `waiting-episode-binding` (Issue #3892), which
|
|
6
|
+
* re-exports all of it and carries the plan out (`commitWaitingObservation`).
|
|
7
|
+
*
|
|
8
|
+
* @module lib/session/waiting-episode-binding-observation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.startWaitingObservation = startWaitingObservation;
|
|
12
|
+
exports.startWorktreeWaitingObservations = startWorktreeWaitingObservations;
|
|
13
|
+
exports.captureFrameTime = captureFrameTime;
|
|
14
|
+
exports.captureObservedFrame = captureObservedFrame;
|
|
15
|
+
exports.planWaitingObservation = planWaitingObservation;
|
|
16
|
+
const async_hooks_1 = require("async_hooks");
|
|
17
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
18
|
+
const prompt_screen_key_1 = require("../../lib/detection/prompt-screen-key");
|
|
19
|
+
const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
|
|
20
|
+
const waiting_episode_binding_resolve_1 = require("../../lib/session/waiting-episode-binding-resolve");
|
|
21
|
+
const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
|
|
22
|
+
const waiting_episode_verdict_1 = require("../../lib/session/waiting-episode-verdict");
|
|
23
|
+
const global_state_1 = require("../global-state");
|
|
24
|
+
/** Where `cli-session` reports a frame's source to the observer it runs for (Issue #3798). */
|
|
25
|
+
function frameMetaSink() {
|
|
26
|
+
return (0, global_state_1.getOrInitGlobal)('__captureFrameMetaSink', () => new async_hooks_1.AsyncLocalStorage());
|
|
27
|
+
}
|
|
28
|
+
/** Fix the observer's start (design §2.5). Read-only. */
|
|
29
|
+
function startWaitingObservation(worktreeId, cliToolId, instanceId) {
|
|
30
|
+
return {
|
|
31
|
+
generation: (0, waiting_episode_binding_resolve_1.generationOf)({ worktreeId, cliToolId, instanceId }),
|
|
32
|
+
version: (0, waiting_episode_state_1.getEpisodeVersion)(worktreeId, cliToolId, instanceId),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Fix the start of every instance of a worktree at once (design §2.5): the
|
|
37
|
+
* status routes call it before `listSessions()`, so a session that started —
|
|
38
|
+
* and opened a wait — after the list was taken is not closed as gone by a
|
|
39
|
+
* probe that did not see it. Instances that have no version or generation yet
|
|
40
|
+
* are fixed at 0 / none.
|
|
41
|
+
*/
|
|
42
|
+
function startWorktreeWaitingObservations(worktreeId) {
|
|
43
|
+
const prefix = `${worktreeId}${auto_yes_state_1.COMPOSITE_KEY_SEPARATOR}`;
|
|
44
|
+
const versions = (0, waiting_episode_state_1.snapshotEpisodeVersions)(worktreeId);
|
|
45
|
+
const generations = new Map();
|
|
46
|
+
for (const [key, at] of agent_event_turn_1.generationStartedAt) {
|
|
47
|
+
if (key.startsWith(prefix))
|
|
48
|
+
generations.set(key, at);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
startFor(cliToolId, instanceId) {
|
|
52
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
|
|
53
|
+
return { generation: (0, agent_event_turn_1.toGenerationRef)(generations.get(key) ?? null), version: versions.get(key) ?? 0 };
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* When the frame a scraper just read was fetched (design §2.2
|
|
59
|
+
* `frameCapturedAt`), from `meta` — what the capture reported for that one
|
|
60
|
+
* frame ({@link captureObservedFrame}). A frame served from the cache, or
|
|
61
|
+
* joined to a fetch already in flight, is as old as that fetch, and is never
|
|
62
|
+
* one this observer fetched itself — even when that fetch started in the very
|
|
63
|
+
* millisecond the observer asked. Only a frame the capture fetched itself,
|
|
64
|
+
* starting at or after `requestedAt` (the moment the observer asked, after its
|
|
65
|
+
* start), counts as fetched after the start. A frame nothing was reported for
|
|
66
|
+
* (a capture module a test replaced) is dated 0, before any close (design
|
|
67
|
+
* §2.6): it opens no wait I6 would hold back, and closes no `screen`.
|
|
68
|
+
*/
|
|
69
|
+
function captureFrameTime(meta, requestedAt) {
|
|
70
|
+
if (meta === null)
|
|
71
|
+
return { frameCapturedAt: 0, frameFetchedAfterStart: false };
|
|
72
|
+
return {
|
|
73
|
+
frameCapturedAt: Math.min(meta.fetchStartedAt, requestedAt),
|
|
74
|
+
frameFetchedAfterStart: meta.source === 'fetched' && meta.fetchStartedAt >= requestedAt,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Run one capture for an observer and date the frame it returns (Issue #3798):
|
|
79
|
+
* `cli-session` reports where THIS call's frame came from through an async
|
|
80
|
+
* context set up here, so another capture of the same session running at the
|
|
81
|
+
* same time — a different number of lines, a different text — cannot stand in
|
|
82
|
+
* for it.
|
|
83
|
+
*/
|
|
84
|
+
async function captureObservedFrame(capture) {
|
|
85
|
+
const reported = { meta: null };
|
|
86
|
+
const requestedAt = Date.now();
|
|
87
|
+
const frame = await frameMetaSink().run((meta) => {
|
|
88
|
+
reported.meta = meta;
|
|
89
|
+
}, capture);
|
|
90
|
+
return { frame, frameTime: captureFrameTime(reported.meta, requestedAt) };
|
|
91
|
+
}
|
|
92
|
+
function screenBinding(generation, originTurnId) {
|
|
93
|
+
return { kind: 'screen', generation, originTurnId };
|
|
94
|
+
}
|
|
95
|
+
function sameBinding(a, b) {
|
|
96
|
+
if (a.kind !== b.kind)
|
|
97
|
+
return false;
|
|
98
|
+
switch (a.kind) {
|
|
99
|
+
case 'turn':
|
|
100
|
+
return a.turnId === b.turnId;
|
|
101
|
+
case 'dialog-only':
|
|
102
|
+
return a.recordTurnId === b.recordTurnId;
|
|
103
|
+
default:
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Whether the Auto-Yes poller answered this episode and the screen now shows another confirmation (R1-7, PR 3). */
|
|
108
|
+
function answeredThenAnother(obs, episode, k) {
|
|
109
|
+
return (obs.freshPrompt === true &&
|
|
110
|
+
obs.lastAnswer != null &&
|
|
111
|
+
obs.lastAnswer.episodeId === episode.episodeId &&
|
|
112
|
+
k !== null &&
|
|
113
|
+
k !== obs.lastAnswer.screenKey);
|
|
114
|
+
}
|
|
115
|
+
/** Table O-1: a `waiting` reading on the instance's episode (or none). */
|
|
116
|
+
function verdictForWaiting(obs, episode, humanHeld, c, k, current) {
|
|
117
|
+
if (episode === null)
|
|
118
|
+
return { action: 'opened', binding: c };
|
|
119
|
+
const binding = episode.binding;
|
|
120
|
+
// The row below the table: a binding of another generation is replaced (P3-2).
|
|
121
|
+
if (!(0, waiting_episode_verdict_1.sameGeneration)(binding.generation, current))
|
|
122
|
+
return { action: 'replaced', binding: c };
|
|
123
|
+
if (humanHeld) {
|
|
124
|
+
if (binding.kind === 'screen')
|
|
125
|
+
return { action: 'kept' };
|
|
126
|
+
return { action: 'rebound', binding: screenBinding(current, binding.kind === 'turn' ? binding.turnId : null) };
|
|
127
|
+
}
|
|
128
|
+
switch (binding.kind) {
|
|
129
|
+
case 'turn': {
|
|
130
|
+
const stillOpen = c.kind === 'turn' && c.turnId === binding.turnId;
|
|
131
|
+
if (stillOpen)
|
|
132
|
+
return answeredThenAnother(obs, episode, k) ? { action: 'replaced', binding: c } : { action: 'kept' };
|
|
133
|
+
if (c.kind === 'turn')
|
|
134
|
+
return { action: 'replaced', binding: c };
|
|
135
|
+
// T has ended (stop, screen evidence, the 30-minute stale bound — R2-3):
|
|
136
|
+
// only another confirmation replaces it.
|
|
137
|
+
return obs.freshPrompt === true && k !== null && k !== episode.promptScreenKey
|
|
138
|
+
? { action: 'replaced', binding: c }
|
|
139
|
+
: { action: 'kept' };
|
|
140
|
+
}
|
|
141
|
+
case 'dialog-only':
|
|
142
|
+
if (c.kind === 'turn')
|
|
143
|
+
return { action: 'rebound', binding: c };
|
|
144
|
+
if (c.kind === 'dialog-only' && c.recordTurnId !== binding.recordTurnId)
|
|
145
|
+
return { action: 'replaced', binding: c };
|
|
146
|
+
return { action: 'kept' };
|
|
147
|
+
case 'unattributed':
|
|
148
|
+
if (c.kind === 'unattributed') {
|
|
149
|
+
return answeredThenAnother(obs, episode, k) ? { action: 'replaced', binding: c } : { action: 'kept' };
|
|
150
|
+
}
|
|
151
|
+
if (c.kind === 'dialog-only')
|
|
152
|
+
return { action: 'rebound', binding: c };
|
|
153
|
+
// c = turn(N): the wait turned out to be N's when it shows the same confirmation (R2-4).
|
|
154
|
+
return k !== null && k === episode.promptScreenKey
|
|
155
|
+
? { action: 'rebound', binding: c }
|
|
156
|
+
: { action: 'replaced', binding: c };
|
|
157
|
+
case 'screen':
|
|
158
|
+
return c.kind === 'turn' && c.turnId === binding.originTurnId
|
|
159
|
+
? { action: 'rebound', binding: c }
|
|
160
|
+
: { action: 'replaced', binding: c };
|
|
161
|
+
default:
|
|
162
|
+
binding;
|
|
163
|
+
return { action: 'kept' };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Table O-2: the closing side. Null when the reading closes nothing. */
|
|
167
|
+
function closeReasonFor(obs, episode) {
|
|
168
|
+
const { reading } = obs;
|
|
169
|
+
if (reading.kind === 'gone')
|
|
170
|
+
return 'session-gone';
|
|
171
|
+
if (reading.kind !== 'not-waiting')
|
|
172
|
+
return null;
|
|
173
|
+
switch (obs.observer) {
|
|
174
|
+
case 'status-probe':
|
|
175
|
+
return 'screen-cleared';
|
|
176
|
+
case 'response-checker':
|
|
177
|
+
return 'response-recorded';
|
|
178
|
+
case 'auto-yes-poller':
|
|
179
|
+
// A screen only after a frame fetched since it became one (R3-1, P3-1);
|
|
180
|
+
// any other wait only when the poller answered it (PR 3, 規則 3).
|
|
181
|
+
if (episode.binding.kind === 'screen') {
|
|
182
|
+
return obs.frameCapturedAt > Math.max(episode.openedAt, episode.boundAt) ? 'screen-cleared' : null;
|
|
183
|
+
}
|
|
184
|
+
return obs.lastAnswer != null && obs.lastAnswer.episodeId === episode.episodeId ? 'poller-answered' : null;
|
|
185
|
+
default:
|
|
186
|
+
obs.observer;
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Why the old episode of a replacement ended. */
|
|
191
|
+
function replacedBecause(old, next, current) {
|
|
192
|
+
if (!(0, waiting_episode_verdict_1.sameGeneration)(old.generation, current))
|
|
193
|
+
return 'generation';
|
|
194
|
+
return next.kind === 'turn' || next.kind === 'dialog-only' ? 'turn-superseded' : 'screen-cleared';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Decide what one observation does to the instance's episode (design §2.4
|
|
198
|
+
* 規則 3・4・5, tables O-1 / O-2 and preconditions 1–3). Reads the store and
|
|
199
|
+
* the turn model; writes nothing.
|
|
200
|
+
*/
|
|
201
|
+
function planWaitingObservation(obs) {
|
|
202
|
+
const at = obs.now ?? Date.now();
|
|
203
|
+
const parts = { worktreeId: obs.worktreeId, cliToolId: obs.cliToolId, instanceId: obs.instanceId };
|
|
204
|
+
const episode = (0, waiting_episode_state_1.getWaitingEpisodeRecord)(obs.worktreeId, obs.cliToolId, obs.instanceId);
|
|
205
|
+
const current = (0, waiting_episode_binding_resolve_1.generationOf)(parts);
|
|
206
|
+
const base = {
|
|
207
|
+
observation: obs,
|
|
208
|
+
action: 'ignored',
|
|
209
|
+
episodeId: episode?.episodeId ?? null,
|
|
210
|
+
since: obs.reading.kind === 'waiting' ? episode?.since ?? null : null,
|
|
211
|
+
next: null,
|
|
212
|
+
binding: null,
|
|
213
|
+
closeReason: null,
|
|
214
|
+
ignoredBecause: null,
|
|
215
|
+
at,
|
|
216
|
+
};
|
|
217
|
+
const ignored = (because) => ({
|
|
218
|
+
...base,
|
|
219
|
+
action: 'ignored',
|
|
220
|
+
ignoredBecause: because,
|
|
221
|
+
});
|
|
222
|
+
// Precondition 1: the observer started in another generation.
|
|
223
|
+
if (!(0, waiting_episode_verdict_1.sameGeneration)(obs.start.generation, current))
|
|
224
|
+
return ignored('generation');
|
|
225
|
+
const versionMoved = obs.start.version !== (0, waiting_episode_state_1.getEpisodeVersion)(obs.worktreeId, obs.cliToolId, obs.instanceId) && obs.freshPrompt !== true;
|
|
226
|
+
const { reading } = obs;
|
|
227
|
+
if (reading.kind !== 'waiting') {
|
|
228
|
+
// Table O-2.
|
|
229
|
+
if (episode === null)
|
|
230
|
+
return ignored('nothing-open');
|
|
231
|
+
if (reading.kind === 'unknown')
|
|
232
|
+
return ignored('unknown-frame');
|
|
233
|
+
const reason = closeReasonFor(obs, episode);
|
|
234
|
+
if (reason === null)
|
|
235
|
+
return ignored('not-this-observer');
|
|
236
|
+
if (versionMoved)
|
|
237
|
+
return ignored('version');
|
|
238
|
+
return { ...base, action: 'closed', closeReason: reason, since: null };
|
|
239
|
+
}
|
|
240
|
+
// Table O-1.
|
|
241
|
+
const k = reading.promptData !== null ? (0, prompt_screen_key_1.promptScreenKey)(reading.promptData) : null;
|
|
242
|
+
// 規則 1: a person's screen is `screen` whatever the turn model says, with
|
|
243
|
+
// the open turn as its origin.
|
|
244
|
+
const resolved = (0, waiting_episode_binding_resolve_1.resolveEpisodeBinding)(parts, at);
|
|
245
|
+
const c = reading.humanHeld
|
|
246
|
+
? screenBinding(current, resolved.kind === 'turn' ? resolved.turnId : null)
|
|
247
|
+
: resolved;
|
|
248
|
+
const verdict = verdictForWaiting(obs, episode, reading.humanHeld, c, k, current);
|
|
249
|
+
if (verdict.action === 'kept')
|
|
250
|
+
return { ...base, action: 'kept' };
|
|
251
|
+
// Precondition 2 (I5 (b) / (d)) and 3 (I6).
|
|
252
|
+
if (versionMoved)
|
|
253
|
+
return ignored('version');
|
|
254
|
+
const lastClosed = (0, waiting_episode_state_1.getLastClosedEpisode)(obs.worktreeId, obs.cliToolId, obs.instanceId);
|
|
255
|
+
const closedBeforeOwnFetch = obs.frameFetchedAfterStart === true &&
|
|
256
|
+
obs.start.version === (0, waiting_episode_state_1.getEpisodeVersion)(obs.worktreeId, obs.cliToolId, obs.instanceId);
|
|
257
|
+
if (lastClosed !== null &&
|
|
258
|
+
!closedBeforeOwnFetch &&
|
|
259
|
+
obs.frameCapturedAt <= lastClosed.at &&
|
|
260
|
+
(k === null || k === lastClosed.promptScreenKey)) {
|
|
261
|
+
return ignored('stale-frame');
|
|
262
|
+
}
|
|
263
|
+
if (verdict.action === 'rebound') {
|
|
264
|
+
if (episode !== null && sameBinding(episode.binding, verdict.binding))
|
|
265
|
+
return { ...base, action: 'kept' };
|
|
266
|
+
return { ...base, action: 'rebound', binding: verdict.binding };
|
|
267
|
+
}
|
|
268
|
+
const binding = verdict.binding;
|
|
269
|
+
const structuredSince = reading.structuredSince;
|
|
270
|
+
const since = verdict.action === 'opened' || episode === null
|
|
271
|
+
? structuredSince ?? at
|
|
272
|
+
: structuredSince !== null && structuredSince > episode.since
|
|
273
|
+
? structuredSince
|
|
274
|
+
: at;
|
|
275
|
+
const next = {
|
|
276
|
+
since,
|
|
277
|
+
kind: reading.waitingKind,
|
|
278
|
+
binding,
|
|
279
|
+
openedBy: obs.observer,
|
|
280
|
+
promptScreenKey: k,
|
|
281
|
+
};
|
|
282
|
+
return {
|
|
283
|
+
...base,
|
|
284
|
+
action: verdict.action,
|
|
285
|
+
since,
|
|
286
|
+
next,
|
|
287
|
+
closeReason: verdict.action === 'replaced' && episode !== null ? replacedBecause(episode.binding, binding, current) : null,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What a new waiting episode is bound to, read from the turn model (Issue #3798).
|
|
4
|
+
* Split out of `waiting-episode-binding` (Issue #3892), which re-exports it.
|
|
5
|
+
*
|
|
6
|
+
* @module lib/session/waiting-episode-binding-resolve
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.generationOf = generationOf;
|
|
10
|
+
exports.resolveEpisodeBinding = resolveEpisodeBinding;
|
|
11
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
12
|
+
const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
|
|
13
|
+
function generationOf(parts) {
|
|
14
|
+
return (0, agent_event_turn_1.toGenerationRef)((0, agent_event_turn_1.currentGeneration)((0, auto_yes_state_1.buildCompositeKey)(parts.worktreeId, parts.cliToolId, parts.instanceId)));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* What an episode opening now is bound to (design §2.4 規則 1).
|
|
18
|
+
*
|
|
19
|
+
* Read from the fenced, aged turn record — the same reading `getAgentTurn`
|
|
20
|
+
* gives every other reader — with the live decisions counted without retiring
|
|
21
|
+
* the expired ones, so deciding a binding writes nothing a transition would
|
|
22
|
+
* later read differently.
|
|
23
|
+
*/
|
|
24
|
+
function resolveEpisodeBinding(parts, at) {
|
|
25
|
+
const generation = generationOf(parts);
|
|
26
|
+
const turn = (0, agent_event_turn_1.getAgentTurn)(parts.worktreeId, parts.cliToolId, parts.instanceId, at);
|
|
27
|
+
if (turn === null)
|
|
28
|
+
return { kind: 'unattributed', generation, lastClosedTurnId: null };
|
|
29
|
+
if (turn.closedAt === null && turn.openedAt !== null) {
|
|
30
|
+
return { kind: 'turn', generation, turnId: turn.turnId };
|
|
31
|
+
}
|
|
32
|
+
if (turn.closedAt === null && (0, agent_event_turn_1.liveDecisionCount)(turn, at) > 0) {
|
|
33
|
+
return { kind: 'dialog-only', generation, recordTurnId: turn.turnId, sessionId: turn.sessionId };
|
|
34
|
+
}
|
|
35
|
+
// A closed turn, or a record holding no live decision (an `idle_prompt`
|
|
36
|
+
// display record, or a forecast whose 20 s ran out).
|
|
37
|
+
return { kind: 'unattributed', generation, lastClosedTurnId: turn.turnId };
|
|
38
|
+
}
|