commandmate 0.46.0 → 0.47.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 +417 -410
- package/.next/app-path-routes-manifest.json +22 -21
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- 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 +4 -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_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_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 +9 -9
- 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 -7
- package/.next/server/app/api/push/escalation/route.js.nft.json +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 -7
- package/.next/server/app/api/push/vapid/route.js.nft.json +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.js +1 -1
- 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 +1 -1
- 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_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.js +9 -9
- 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 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_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 +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_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.js.nft.json +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.js.nft.json +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 +22 -21
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +2 -2
- package/.next/server/chunks/1559.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1836.js +1 -0
- package/.next/server/chunks/1945.js +14 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/{3077.js → 4194.js} +12 -12
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5292.js +3 -3
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5845.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/{2283.js → 6486.js} +7 -7
- package/.next/server/chunks/6722.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +2 -2
- package/.next/server/chunks/7166.js +19 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +12 -12
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +6 -6
- package/.next/server/chunks/9199.js +1 -0
- package/.next/server/chunks/936.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -0
- package/.next/server/chunks/9627.js +3 -2
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- 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/{2407-acb644c5487e1720.js → 2407-b2f524f99f7fc353.js} +1 -1
- package/.next/static/chunks/{2717.21abf5b6bbd45520.js → 2717.1583400c272dc1d9.js} +1 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +1 -0
- package/.next/static/chunks/602-1c1488959215e140.js +1 -0
- package/.next/static/chunks/{8407-9a72e6f07c5d5458.js → 8407-155f84e5ba05f1d5.js} +1 -1
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
- package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
- package/.next/static/chunks/{webpack-c0b821f340afdebf.js → webpack-468b7b33030234b3.js} +1 -1
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/auto-yes.d.ts +19 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +45 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -18
- package/dist/cli/commands/ls.d.ts +15 -1
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +39 -3
- package/dist/cli/commands/prompt.d.ts +42 -0
- package/dist/cli/commands/prompt.d.ts.map +1 -0
- package/dist/cli/commands/prompt.js +211 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +13 -1
- package/dist/cli/commands/respond-strict.d.ts +31 -0
- package/dist/cli/commands/respond-strict.d.ts.map +1 -0
- package/dist/cli/commands/respond-strict.js +214 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +38 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +41 -5
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +18 -0
- package/dist/cli/commands/wait.d.ts +21 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +113 -12
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +63 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -2
- package/dist/cli/types/api-responses.d.ts +62 -6
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +30 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +12 -1
- package/dist/cli/utils/api-client.d.ts +13 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +10 -2
- package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
- package/dist/cli/utils/daemon-factory.js +3 -1
- package/dist/cli/utils/daemon.d.ts +38 -1
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +161 -8
- package/dist/cli/utils/paths.d.ts +12 -0
- package/dist/cli/utils/paths.d.ts.map +1 -1
- package/dist/cli/utils/paths.js +17 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +55 -1
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +20 -0
- package/dist/lib/prompt-observation/kinds.d.ts +101 -0
- package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
- package/dist/lib/prompt-observation/kinds.js +123 -0
- package/dist/lib/prompt-observation/types.d.ts +271 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -0
- package/dist/lib/prompt-observation/types.js +14 -0
- package/dist/lib/session/send-attempt-types.d.ts +66 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
- package/dist/lib/session/send-attempt-types.js +17 -0
- package/dist/server/locales/en/worktree.json +4 -0
- package/dist/server/locales/ja/worktree.json +4 -0
- package/dist/server/server.js +20 -1
- package/dist/server/src/config/auto-yes-config.js +11 -0
- package/dist/server/src/lib/assistant-response-saver.js +13 -0
- package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
- package/dist/server/src/lib/auto-yes-poller.js +593 -78
- package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
- package/dist/server/src/lib/auto-yes-state.js +197 -4
- package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
- package/dist/server/src/lib/cli-tools/command-code.js +10 -2
- package/dist/server/src/lib/cli-tools/copilot.js +21 -10
- package/dist/server/src/lib/cli-tools/gemini.js +60 -13
- package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
- package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
- package/dist/server/src/lib/conversation-logger.js +14 -2
- package/dist/server/src/lib/db/chat-db.js +2 -1
- package/dist/server/src/lib/detection/selection-shape.js +35 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
- package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
- package/dist/server/src/lib/history/user-turn-recorder.js +14 -0
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +28 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/codex/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/command-code/history.js +7 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
- package/dist/server/src/lib/hooks/sources/transcript-history.js +34 -0
- package/dist/server/src/lib/log-manager.js +7 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +22 -3
- package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +234 -0
- package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +20 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
- package/dist/server/src/lib/polling/pending-scraped-response.js +119 -3
- package/dist/server/src/lib/polling/poller-owner.js +110 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
- package/dist/server/src/lib/polling/response-checker.js +211 -39
- package/dist/server/src/lib/polling/response-dedup.js +8 -0
- package/dist/server/src/lib/polling/response-poller-core.js +226 -75
- package/dist/server/src/lib/polling/structured-history-gate.js +20 -1
- package/dist/server/src/lib/prompt-answer-sender.js +59 -12
- package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
- package/dist/server/src/lib/prompt-observation/types.js +14 -0
- package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
- package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
- package/dist/server/src/lib/realtime/terminal-broadcast.js +14 -0
- package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
- package/dist/server/src/lib/relay/relay-delivery.js +76 -30
- package/dist/server/src/lib/schedule-manager.js +28 -0
- package/dist/server/src/lib/session/chat-turn-progress.js +57 -6
- package/dist/server/src/lib/session/cli-session.js +38 -3
- package/dist/server/src/lib/session/current-output-builder.js +19 -0
- package/dist/server/src/lib/session/send-attempt-state.js +155 -0
- package/dist/server/src/lib/session/send-attempt-types.js +17 -0
- package/dist/server/src/lib/session/send-user-message.js +46 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +85 -11
- package/dist/server/src/lib/timer-manager.js +7 -0
- package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
- package/dist/server/src/lib/tmux/tmux.js +28 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +30 -2
- package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
- package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
- package/dist/server/src/lib/verification/scope-gate.js +19 -271
- package/dist/server/src/lib/ws-server.js +48 -6
- package/docs/en/user-guide/cli-setup-guide.md +12 -1
- package/docs/en/user-guide/webapp-guide.md +2 -0
- package/package.json +1 -1
- package/release-notes/0.46.1.json +40 -0
- package/release-notes/0.47.0.json +118 -0
- package/.next/server/chunks/1789.js +0 -1
- package/.next/server/chunks/2908.js +0 -1
- package/.next/server/chunks/3718.js +0 -1
- package/.next/server/chunks/4837.js +0 -14
- package/.next/server/chunks/5625.js +0 -25
- package/.next/server/chunks/611.js +0 -1
- package/.next/server/chunks/850.js +0 -1
- package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
- package/.next/static/chunks/5371-a94ed618148287a0.js +0 -1
- package/.next/static/chunks/5794-947fb4934d8be193.js +0 -1
- package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/layout-ae30ce63569c22be.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2eb1d0fd0a077b7e.js +0 -1
- /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
- /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
|
@@ -57,6 +57,8 @@ const relay_policy_1 = require("../../lib/relay/relay-policy");
|
|
|
57
57
|
const relay_readiness_1 = require("../../lib/relay/relay-readiness");
|
|
58
58
|
const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
|
|
59
59
|
const relay_system_line_1 = require("../../lib/relay/relay-system-line");
|
|
60
|
+
const relay_delivery_claims_1 = require("../../lib/relay/relay-delivery-claims");
|
|
61
|
+
const types_1 = require("../../lib/relay/types");
|
|
60
62
|
const logger_1 = require("../../lib/logger");
|
|
61
63
|
const global_state_1 = require("../global-state");
|
|
62
64
|
const logger = (0, logger_1.createLogger)('relay-delivery');
|
|
@@ -158,6 +160,7 @@ const inFlight = (0, global_state_1.getOrInitGlobal)('__relayDeliveryInFlight',
|
|
|
158
160
|
/** Forget every in-flight delivery. Test seam. */
|
|
159
161
|
function resetRelayDeliveryState() {
|
|
160
162
|
inFlight.clear();
|
|
163
|
+
(0, relay_delivery_claims_1.resetRelayDeliveryClaims)();
|
|
161
164
|
globalThis.__relayPumpRunning = false;
|
|
162
165
|
}
|
|
163
166
|
function senderLabel(db, relay) {
|
|
@@ -431,6 +434,13 @@ function notifyRelayPromptWaiting(worker) {
|
|
|
431
434
|
function sweepExpiredRelays(db, now = Date.now()) {
|
|
432
435
|
let expired = 0;
|
|
433
436
|
for (const relay of (0, relay_db_1.listExpiredOpenRelays)(db, now)) {
|
|
437
|
+
// A send already under way for this relay cannot be taken back (#3732).
|
|
438
|
+
// Expiring it now would leave A with both the reply and the expiry notice,
|
|
439
|
+
// and the delivery's own cleanup would then wipe that notice. The next
|
|
440
|
+
// sweep finds it closed (delivered) or, if the send was refused, still
|
|
441
|
+
// open and expires it then.
|
|
442
|
+
if ((0, relay_delivery_claims_1.isRelayDeliveryClaimed)(relay.id))
|
|
443
|
+
continue;
|
|
434
444
|
try {
|
|
435
445
|
const locale = (0, model_change_push_notifier_1.resolveReadersLocale)(db);
|
|
436
446
|
// A payload that never went out is superseded by the expiry notice: A
|
|
@@ -465,47 +475,83 @@ function sweepExpiredRelays(db, now = Date.now()) {
|
|
|
465
475
|
* repeat delivery is prevented by the in-flight set within a process and by
|
|
466
476
|
* `markRelayDelivered`'s guarded update across one, which is the idempotency the
|
|
467
477
|
* Issue asks for by name.
|
|
478
|
+
*
|
|
479
|
+
* `kind` and `body` are what the pump's listing saw, and that listing is stale
|
|
480
|
+
* by the time the readiness check returns (#3732): an earlier relay's send, or
|
|
481
|
+
* this one's own capture, may have let a cancel or an expiry sweep run. So the
|
|
482
|
+
* row is read again AFTER the last await before the send, and the send goes
|
|
483
|
+
* ahead only when it still carries the same payload — and, for anything but an
|
|
484
|
+
* expiry notice, is still open. The claim is taken in that same synchronous
|
|
485
|
+
* stretch, so no cancel can slip in between the check and the send; from then
|
|
486
|
+
* on `withdrawRelay` answers `delivering`.
|
|
468
487
|
*/
|
|
469
488
|
async function deliverOne(db, relayId, kind, body) {
|
|
470
|
-
const
|
|
471
|
-
if (!
|
|
489
|
+
const listed = (0, relay_db_1.getRelayById)(db, relayId);
|
|
490
|
+
if (!listed)
|
|
472
491
|
return 'skipped';
|
|
473
|
-
const
|
|
474
|
-
const hold = await (0, relay_readiness_1.findRelayHoldReason)(
|
|
492
|
+
const listedRequester = (0, relay_session_ref_1.resolveRelaySession)(db, listed.from);
|
|
493
|
+
const hold = await (0, relay_readiness_1.findRelayHoldReason)(listedRequester.worktreeId, listedRequester.cliToolId, listedRequester.instanceId, db);
|
|
475
494
|
if (hold) {
|
|
476
495
|
logger.debug('relay-delivery-held', { relayId, kind, reason: hold });
|
|
477
496
|
return 'held';
|
|
478
497
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
if (!result.ok) {
|
|
491
|
-
logger.info('relay-delivery-refused', { relayId, kind, stage: result.stage });
|
|
492
|
-
return result.stage === 'prompt_waiting' ? 'held' : 'failed';
|
|
498
|
+
// Synchronous from here to the send: re-read, then claim.
|
|
499
|
+
const current = findCurrentPayload(db, relayId);
|
|
500
|
+
if (!current || current.kind !== kind || current.body !== body) {
|
|
501
|
+
logger.info('relay-delivery-superseded', { relayId, kind });
|
|
502
|
+
return 'skipped';
|
|
503
|
+
}
|
|
504
|
+
// An expiry notice is delivered from a CLOSED relay by design; everything
|
|
505
|
+
// else is only owed while the relay is open.
|
|
506
|
+
if (kind !== 'expired' && !(0, types_1.isOpenRelayState)(current.relay.state)) {
|
|
507
|
+
logger.info('relay-delivery-closed', { relayId, kind, state: current.relay.state });
|
|
508
|
+
return 'skipped';
|
|
493
509
|
}
|
|
494
|
-
const
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
510
|
+
const relay = current.relay;
|
|
511
|
+
const requester = (0, relay_session_ref_1.resolveRelaySession)(db, relay.from);
|
|
512
|
+
(0, relay_delivery_claims_1.claimRelayDelivery)(relayId);
|
|
513
|
+
try {
|
|
514
|
+
const result = await (0, send_user_message_1.sendUserMessage)(db, {
|
|
515
|
+
worktreeId: requester.worktreeId,
|
|
516
|
+
content: body,
|
|
517
|
+
cliToolId: requester.cliToolId,
|
|
518
|
+
instanceId: requester.instanceId,
|
|
519
|
+
messageType: 'relay',
|
|
520
|
+
// The pointer back at the ledger. Also `session_relays.sent_request_id` for
|
|
521
|
+
// a reply, which carries a UNIQUE index — so a second delivery of the same
|
|
522
|
+
// relay cannot be recorded even if one were somehow attempted.
|
|
523
|
+
requestId: kind === 'reply' ? (0, chat_db_1.relayRequestId)(relay.id) : undefined,
|
|
524
|
+
});
|
|
525
|
+
if (!result.ok) {
|
|
526
|
+
logger.info('relay-delivery-refused', { relayId, kind, stage: result.stage });
|
|
527
|
+
return result.stage === 'prompt_waiting' ? 'held' : 'failed';
|
|
528
|
+
}
|
|
529
|
+
const now = Date.now();
|
|
530
|
+
if (kind === 'reply') {
|
|
531
|
+
if (!(0, relay_db_1.markRelayDelivered)(db, relay.id, (0, chat_db_1.relayRequestId)(relay.id), now)) {
|
|
532
|
+
// Somebody closed it underneath us. The message is already in A's
|
|
533
|
+
// composer, which is the outcome that mattered.
|
|
534
|
+
logger.info('relay-already-closed-on-deliver', { relayId });
|
|
535
|
+
}
|
|
536
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'replied', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
500
537
|
}
|
|
501
|
-
|
|
538
|
+
else if (kind === 'prompt') {
|
|
539
|
+
(0, relay_system_line_1.writeRelaySystemLine)(db, relay.id, 'waiting', requester, (0, relay_session_ref_1.resolveRelaySession)(db, relay.to), now);
|
|
540
|
+
}
|
|
541
|
+
(0, relay_db_1.clearRelayPending)(db, relay.id, now);
|
|
542
|
+
logger.info('relay-delivered', { relayId, kind, to: `${requester.worktreeId}/${requester.instanceId}` });
|
|
543
|
+
return 'delivered';
|
|
502
544
|
}
|
|
503
|
-
|
|
504
|
-
|
|
545
|
+
finally {
|
|
546
|
+
// Delivered: a reply is closed now and a prompt notice leaves the relay
|
|
547
|
+
// open on purpose, so either way a later cancel must be judged by the row.
|
|
548
|
+
// Held or failed: nothing reached A, so the relay can be withdrawn again.
|
|
549
|
+
(0, relay_delivery_claims_1.releaseRelayDelivery)(relayId);
|
|
505
550
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
551
|
+
}
|
|
552
|
+
/** The payload this relay carries right now, read straight from the ledger. */
|
|
553
|
+
function findCurrentPayload(db, relayId) {
|
|
554
|
+
return (0, relay_db_1.listRelaysWithPendingPayload)(db).find((item) => item.relay.id === relayId) ?? null;
|
|
509
555
|
}
|
|
510
556
|
/**
|
|
511
557
|
* Deliver every stashed payload that can be delivered now.
|
|
@@ -209,6 +209,8 @@ function getManagerState() {
|
|
|
209
209
|
initialized: false,
|
|
210
210
|
isSyncing: false,
|
|
211
211
|
cmateFileCache: new Map(),
|
|
212
|
+
generation: 0,
|
|
213
|
+
worktreeStopCounts: new Map(),
|
|
212
214
|
}));
|
|
213
215
|
}
|
|
214
216
|
// =============================================================================
|
|
@@ -251,6 +253,10 @@ async function syncSchedules() {
|
|
|
251
253
|
return;
|
|
252
254
|
manager.isSyncing = true;
|
|
253
255
|
try {
|
|
256
|
+
// Issue #3735: remember what had been stopped when this pass began, so that
|
|
257
|
+
// a stop landing during the readCmateFile() await is noticed afterwards.
|
|
258
|
+
const startGeneration = manager.generation ?? 0;
|
|
259
|
+
const startStopCounts = new Map(manager.worktreeStopCounts);
|
|
254
260
|
const worktrees = (0, cron_parser_1.getAllWorktrees)();
|
|
255
261
|
// Track which scheduleIds are still valid
|
|
256
262
|
const activeScheduleIds = new Set();
|
|
@@ -300,7 +306,26 @@ async function syncSchedules() {
|
|
|
300
306
|
continue;
|
|
301
307
|
const entries = (0, cmate_parser_1.parseSchedulesSection)(scheduleRows);
|
|
302
308
|
// Issue #409: Batch upsert all entries for this worktree
|
|
309
|
+
// (Issue #3735: deliberately not gated — a row for a stopped worktree is
|
|
310
|
+
// fixed by the FK CASCADE or the next sync's disableStaleSchedules())
|
|
303
311
|
const scheduleIds = (0, cron_parser_1.batchUpsertSchedules)(worktree.id, entries);
|
|
312
|
+
// Issue #3735: no await below, so this synchronous check covers every
|
|
313
|
+
// cron created, replaced or recovered for this worktree.
|
|
314
|
+
if ((manager.generation ?? 0) !== startGeneration) {
|
|
315
|
+
// stopAllSchedules() ran. Abandon the pass entirely: the stale-removal
|
|
316
|
+
// step below would otherwise judge schedules of a restarted manager
|
|
317
|
+
// against this pass's partial activeScheduleIds.
|
|
318
|
+
manager.cmateFileCache.delete(worktree.path);
|
|
319
|
+
logger.info('sync:aborted-by-stop-all', { worktreeId: worktree.id });
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if ((manager.worktreeStopCounts?.get(worktree.id) ?? 0) !== (startStopCounts.get(worktree.id) ?? 0)) {
|
|
323
|
+
// The mtime cache was set before the await; drop it so a worktree
|
|
324
|
+
// that still exists is picked up by the next pass.
|
|
325
|
+
manager.cmateFileCache.delete(worktree.path);
|
|
326
|
+
logger.info('sync:skipped-stopped-worktree', { worktreeId: worktree.id });
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
304
329
|
for (let i = 0; i < entries.length; i++) {
|
|
305
330
|
const entry = entries[i];
|
|
306
331
|
const scheduleId = scheduleIds[i];
|
|
@@ -472,6 +497,7 @@ function stopAllSchedules() {
|
|
|
472
497
|
}
|
|
473
498
|
}
|
|
474
499
|
manager.schedules.clear();
|
|
500
|
+
manager.generation = (manager.generation ?? 0) + 1;
|
|
475
501
|
// DR1-008: Clear mtime cache to prevent stale values from causing
|
|
476
502
|
// incorrect skip decisions on next initScheduleManager() call
|
|
477
503
|
manager.cmateFileCache.clear();
|
|
@@ -504,6 +530,8 @@ function stopAllSchedules() {
|
|
|
504
530
|
*/
|
|
505
531
|
function stopScheduleForWorktree(worktreeId) {
|
|
506
532
|
const manager = getManagerState();
|
|
533
|
+
const stopCounts = (manager.worktreeStopCounts ??= new Map());
|
|
534
|
+
stopCounts.set(worktreeId, (stopCounts.get(worktreeId) ?? 0) + 1);
|
|
507
535
|
// Stop and remove cron jobs for the target worktree
|
|
508
536
|
for (const [scheduleId, state] of manager.schedules) {
|
|
509
537
|
if (state.worktreeId === worktreeId) {
|
|
@@ -52,6 +52,7 @@ exports.publishChatTurnProgress = publishChatTurnProgress;
|
|
|
52
52
|
const types_1 = require("../../lib/realtime/types");
|
|
53
53
|
const logger_1 = require("../../lib/logger");
|
|
54
54
|
const global_state_1 = require("../global-state");
|
|
55
|
+
const poller_owner_1 = require("../../lib/polling/poller-owner");
|
|
55
56
|
// Issue #3215: the name is the one these lines have always been logged under.
|
|
56
57
|
// It is what an operator greps for, so it did not move with the code.
|
|
57
58
|
const logger = (0, logger_1.createLogger)('current-output-builder');
|
|
@@ -169,6 +170,19 @@ function logChatTurnProgressOutcome(target, outcome, turnKey, extra = {}) {
|
|
|
169
170
|
* @returns The frame to broadcast, or null when there is nothing new to say
|
|
170
171
|
*/
|
|
171
172
|
async function buildChatTurnProgress(target, source, now = Date.now()) {
|
|
173
|
+
const prepared = await prepareChatTurnProgress(target, source, now);
|
|
174
|
+
return prepared === null ? null : commitChatTurnProgress(target, prepared);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The half of {@link buildChatTurnProgress} that awaits: the throttle, the read
|
|
178
|
+
* and the bound — and nothing remembered about the body (Issue #3705).
|
|
179
|
+
*
|
|
180
|
+
* Split so that {@link emitChatTurnProgress} can remember a body only once it is
|
|
181
|
+
* actually going out. Remembered at the build and refused at the broadcast (a
|
|
182
|
+
* poller snapshot superseded in the `await` between the two), the body stood
|
|
183
|
+
* as "already sent" and suppressed the successor's identical frame.
|
|
184
|
+
*/
|
|
185
|
+
async function prepareChatTurnProgress(target, source, now) {
|
|
172
186
|
const key = chatTurnProgressKey(target);
|
|
173
187
|
const state = chatTurnProgressState.get(key) ?? newChatTurnProgressState();
|
|
174
188
|
if (now - state.askedAt < types_1.CHAT_TURN_PROGRESS_MIN_INTERVAL_MS)
|
|
@@ -186,20 +200,43 @@ async function buildChatTurnProgress(target, source, now = Date.now()) {
|
|
|
186
200
|
}
|
|
187
201
|
if (!draft || draft.body.length === 0)
|
|
188
202
|
return null;
|
|
203
|
+
// Issue #3705: the frame of a poller snapshot whose tick was superseded while
|
|
204
|
+
// the transcript was read is not built — and, above all, not remembered: the
|
|
205
|
+
// turn key and body are what suppress the successor's identical frame.
|
|
206
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
207
|
+
return null;
|
|
189
208
|
const bounded = (0, types_1.truncateChatTurnProgressBody)(draft.body);
|
|
190
209
|
if (draft.turnKey === state.turnKey && bounded.body === state.body)
|
|
191
210
|
return null;
|
|
192
|
-
|
|
193
|
-
|
|
211
|
+
return {
|
|
212
|
+
turnKey: draft.turnKey,
|
|
213
|
+
body: bounded.body,
|
|
214
|
+
partial: bounded.truncated || draft.partial === true,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Remember a prepared frame and give it its version — synchronous, so the
|
|
219
|
+
* caller can make it the last step before the broadcast (Issue #3705). The
|
|
220
|
+
* no-change rule is applied again against what is remembered NOW, since another
|
|
221
|
+
* frame may have gone out while the read was in flight.
|
|
222
|
+
*/
|
|
223
|
+
function commitChatTurnProgress(target, prepared) {
|
|
224
|
+
const key = chatTurnProgressKey(target);
|
|
225
|
+
const state = chatTurnProgressState.get(key) ?? newChatTurnProgressState();
|
|
226
|
+
if (prepared.turnKey === state.turnKey && prepared.body === state.body)
|
|
227
|
+
return null;
|
|
228
|
+
state.turnKey = prepared.turnKey;
|
|
229
|
+
state.body = prepared.body;
|
|
194
230
|
state.version += 1;
|
|
231
|
+
chatTurnProgressState.set(key, state);
|
|
195
232
|
return {
|
|
196
233
|
type: types_1.CHAT_TURN_PROGRESS_EVENT_TYPE,
|
|
197
234
|
worktreeId: target.worktreeId,
|
|
198
235
|
cliToolId: target.cliToolId,
|
|
199
236
|
instanceId: target.instanceId ?? target.cliToolId,
|
|
200
|
-
turnKey:
|
|
201
|
-
body:
|
|
202
|
-
partial:
|
|
237
|
+
turnKey: prepared.turnKey,
|
|
238
|
+
body: prepared.body,
|
|
239
|
+
partial: prepared.partial,
|
|
203
240
|
version: state.version,
|
|
204
241
|
done: false,
|
|
205
242
|
};
|
|
@@ -232,9 +269,18 @@ async function emitChatTurnProgress(target, source, now = Date.now()) {
|
|
|
232
269
|
logChatTurnProgressOutcome(target, 'no-subscribers', null);
|
|
233
270
|
return false;
|
|
234
271
|
}
|
|
235
|
-
const
|
|
272
|
+
const prepared = await prepareChatTurnProgress(target, source, now);
|
|
236
273
|
// Not logged: null is the throttle, an unchanged body, or a turn with no
|
|
237
274
|
// text yet — the quiet, correct majority of ticks.
|
|
275
|
+
if (!prepared)
|
|
276
|
+
return false;
|
|
277
|
+
// Issue #3705: asked after the build's `await`, and BEFORE the body is
|
|
278
|
+
// remembered — a frame refused here leaves nothing behind that would make
|
|
279
|
+
// the successor's same body look already sent. From here to the broadcast
|
|
280
|
+
// there is no `await`.
|
|
281
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
282
|
+
return false;
|
|
283
|
+
const event = commitChatTurnProgress(target, prepared);
|
|
238
284
|
if (!event)
|
|
239
285
|
return false;
|
|
240
286
|
broadcast(target.worktreeId, event);
|
|
@@ -302,6 +348,11 @@ async function publishChatTurnProgress(db, worktreeId, cliToolId, instanceId) {
|
|
|
302
348
|
// sessions nobody is watching, which is the bargain that was already being
|
|
303
349
|
// struck one frame later.
|
|
304
350
|
const { hasRoomSubscribers } = await Promise.resolve().then(() => __importStar(require('../../lib/ws-server')));
|
|
351
|
+
// Issue #3705: the progress of a superseded tick's snapshot is not started.
|
|
352
|
+
// The detached read below keeps the snapshot's owner in its async context
|
|
353
|
+
// and asks again before it remembers or broadcasts anything.
|
|
354
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
355
|
+
return;
|
|
305
356
|
if (!hasRoomSubscribers(worktreeId)) {
|
|
306
357
|
logChatTurnProgressOutcome(target, 'no-subscribers', null);
|
|
307
358
|
return;
|
|
@@ -16,6 +16,8 @@ exports.isSessionRunning = isSessionRunning;
|
|
|
16
16
|
exports.getSessionPresence = getSessionPresence;
|
|
17
17
|
exports.captureSessionOutput = captureSessionOutput;
|
|
18
18
|
exports.captureSessionOutputFresh = captureSessionOutputFresh;
|
|
19
|
+
exports.sendSessionAnswerKey = sendSessionAnswerKey;
|
|
20
|
+
exports.readSessionPaneCommand = readSessionPaneCommand;
|
|
19
21
|
exports.getSessionName = getSessionName;
|
|
20
22
|
exports.publishSessionSurface = publishSessionSurface;
|
|
21
23
|
exports.forgetSessionSurface = forgetSessionSurface;
|
|
@@ -115,7 +117,8 @@ async function captureSessionOutput(worktreeId, cliToolId, lines = 1000, instanc
|
|
|
115
117
|
* Capture CLI session output bypassing cache (fresh capture).
|
|
116
118
|
*
|
|
117
119
|
* Issue #405: Used by prompt-response endpoint to ensure fresh output
|
|
118
|
-
* for prompt re-verification. Writes back to cache on success
|
|
120
|
+
* for prompt re-verification. Writes back to cache on success, unless the
|
|
121
|
+
* session was invalidated while the capture was in flight (Issue #3734).
|
|
119
122
|
*
|
|
120
123
|
* @param worktreeId - Worktree ID
|
|
121
124
|
* @param cliToolId - CLI tool ID
|
|
@@ -127,11 +130,16 @@ async function captureSessionOutputFresh(worktreeId, cliToolId, lines = 5000, in
|
|
|
127
130
|
log.debug('captureSessionOutputFresh:start', { requestedLines: lines });
|
|
128
131
|
const { cliTool, sessionName } = resolveSessionContext(worktreeId, cliToolId, instanceId);
|
|
129
132
|
const transport = getDefaultTransport();
|
|
133
|
+
// Issue #3734: snapshot the generation before the capture starts
|
|
134
|
+
const generation = (0, tmux_capture_cache_1.getCaptureGeneration)(sessionName);
|
|
130
135
|
try {
|
|
131
136
|
const output = await transport.captureSnapshot(sessionName, { startLine: -lines });
|
|
132
|
-
// Write back to cache if non-empty [SEC4-007]
|
|
137
|
+
// Write back to cache if non-empty [SEC4-007]. Skip it when the session was
|
|
138
|
+
// invalidated while waiting: the output may predate a send (Issue #3734).
|
|
133
139
|
if (output.length > 0) {
|
|
134
|
-
(0, tmux_capture_cache_1.
|
|
140
|
+
if ((0, tmux_capture_cache_1.isCaptureGenerationCurrent)(sessionName, generation)) {
|
|
141
|
+
(0, tmux_capture_cache_1.setCachedCapture)(sessionName, output, lines);
|
|
142
|
+
}
|
|
135
143
|
}
|
|
136
144
|
else {
|
|
137
145
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -146,6 +154,33 @@ async function captureSessionOutputFresh(worktreeId, cliToolId, lines = 5000, in
|
|
|
146
154
|
throw new Error(`Failed to capture ${cliTool.name} output: ${errorMessage}`);
|
|
147
155
|
}
|
|
148
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Send ONE answer key to a session and drop its cached capture, so the next
|
|
159
|
+
* read is of the pane after the key (Issue #3756). One key per call: the
|
|
160
|
+
* strict `respond` reads the screen again between two keys.
|
|
161
|
+
*/
|
|
162
|
+
async function sendSessionAnswerKey(worktreeId, cliToolId, key, instanceId) {
|
|
163
|
+
if (key !== 'Up' && key !== 'Down' && key !== 'Enter') {
|
|
164
|
+
throw new Error(`Unsupported answer key: ${String(key)}`);
|
|
165
|
+
}
|
|
166
|
+
const { sessionName } = resolveSessionContext(worktreeId, cliToolId, instanceId);
|
|
167
|
+
try {
|
|
168
|
+
await (0, tmux_1.sendSpecialKeys)(sessionName, [key]);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* The foreground command of a session's pane (`#{pane_current_command}`), or
|
|
176
|
+
* null when tmux cannot say (Issue #3788). The strict `respond` reads it after
|
|
177
|
+
* its Enter: agy exits on the trust screen's `No, exit` and leaves the shell in
|
|
178
|
+
* a pane that is still up, which only this tells apart from an unread screen.
|
|
179
|
+
*/
|
|
180
|
+
async function readSessionPaneCommand(worktreeId, cliToolId, instanceId) {
|
|
181
|
+
const { sessionName } = resolveSessionContext(worktreeId, cliToolId, instanceId);
|
|
182
|
+
return (0, tmux_1.getPaneCurrentCommand)(sessionName);
|
|
183
|
+
}
|
|
149
184
|
/**
|
|
150
185
|
* Get session name for a CLI tool and worktree
|
|
151
186
|
*
|
|
@@ -48,6 +48,7 @@ const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate")
|
|
|
48
48
|
const layer_disagreement_1 = require("../../lib/session/layer-disagreement");
|
|
49
49
|
const structured_prompt_1 = require("../../lib/session/structured-prompt");
|
|
50
50
|
const chat_turn_progress_1 = require("./chat-turn-progress");
|
|
51
|
+
const poller_owner_1 = require("../../lib/polling/poller-owner");
|
|
51
52
|
const structured_status_merge_1 = require("./structured-status-merge");
|
|
52
53
|
const current_output_history_writers_1 = require("./current-output-history-writers");
|
|
53
54
|
const detection_divergence_1 = require("./detection-divergence");
|
|
@@ -74,6 +75,11 @@ const logger = (0, logger_1.createLogger)('current-output-builder');
|
|
|
74
75
|
*/
|
|
75
76
|
async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId, resolution) {
|
|
76
77
|
const payload = await buildPayload(db, worktreeId, cliToolId, instanceId);
|
|
78
|
+
// Issue #3705: the payload's own writers asked after their awaits (see
|
|
79
|
+
// `buildPayload`); the progress frame below is one more write, of the turn
|
|
80
|
+
// the payload describes.
|
|
81
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
82
|
+
throw new poller_owner_1.RetiredSnapshotError();
|
|
77
83
|
// Issue #2199. Fire-and-forget, and placed HERE rather than in the poller for
|
|
78
84
|
// one reason: this is the function both live paths run through. The WebSocket
|
|
79
85
|
// push calls it from `broadcastTerminalSnapshot` on every generating poller
|
|
@@ -565,6 +571,15 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
565
571
|
const sessionName = cliTool.getSessionName(worktreeId, instanceId);
|
|
566
572
|
const { stopEventAt, eventSource, askUserQuestion, structuredEvents } = readAgentEvents(worktreeId, cliToolId, instanceId, resolvedInstanceId);
|
|
567
573
|
const running = await cliTool.isRunning(worktreeId, instanceId);
|
|
574
|
+
// Issue #3705: a terminal snapshot the response poller started for a tick
|
|
575
|
+
// that has since been superseded writes nothing from here on — not the
|
|
576
|
+
// latch, the starting state, the unclassified-frame row, the structured
|
|
577
|
+
// prompt row or the status evidence — because they would describe the turn
|
|
578
|
+
// that ended on top of the successor's. Thrown, not answered, so the payload
|
|
579
|
+
// type stays what the route reads; `broadcastTerminalSnapshot` catches it.
|
|
580
|
+
// Never thrown outside a poller snapshot (`maySnapshotPublish`).
|
|
581
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
582
|
+
throw new poller_owner_1.RetiredSnapshotError();
|
|
568
583
|
if (!running) {
|
|
569
584
|
// Issue #1926: the latch describes a process, and this one is gone. Dropped
|
|
570
585
|
// rather than aged out so the next session on this key starts with no
|
|
@@ -632,6 +647,10 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
|
|
|
632
647
|
const sessionState = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId);
|
|
633
648
|
const lastCapturedLine = sessionState?.lastCapturedLine || 0;
|
|
634
649
|
const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
|
|
650
|
+
// Issue #3705: the last `await` of the build. Everything below it, through
|
|
651
|
+
// `observeStatusEvidence`, runs without one.
|
|
652
|
+
if (!(0, poller_owner_1.maySnapshotPublish)())
|
|
653
|
+
throw new poller_owner_1.RetiredSnapshotError();
|
|
635
654
|
const lines = output.split('\n');
|
|
636
655
|
const totalLines = lines.length;
|
|
637
656
|
// Issue #1670: `content` is "everything the poller has not saved yet", which
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The last send attempt per instance (Issue #3759).
|
|
4
|
+
*
|
|
5
|
+
* When the first message of a session did not arrive (#3746:
|
|
6
|
+
* `Antigravity prompt not ready`), nothing said whether it was still to be
|
|
7
|
+
* sent, already on the pane, or somewhere in between. This module keeps, per
|
|
8
|
+
* (worktree, tool, instance), how the last {@link sendUserMessage} attempt
|
|
9
|
+
* ended — `not-sent` / `sent` / `indeterminate` (`./send-attempt-types`) — and
|
|
10
|
+
* `prompt --json` publishes it as `lastSend`.
|
|
11
|
+
*
|
|
12
|
+
* The record carries a digest of the message, never the message: it says which
|
|
13
|
+
* message the state is about without keeping what was written.
|
|
14
|
+
*
|
|
15
|
+
* Nothing here resends. The sender (a person, or the supervising agent) decides,
|
|
16
|
+
* and an `indeterminate` message is not to be resent before looking at the pane.
|
|
17
|
+
*
|
|
18
|
+
* In memory on `globalThis` (the send route and the observing route are bundled
|
|
19
|
+
* apart under `next dev`), bounded; a restart forgets every record, which
|
|
20
|
+
* publishes as "no record", never as a state.
|
|
21
|
+
*
|
|
22
|
+
* Recording must never change a send's outcome: {@link recordSendAttempt}
|
|
23
|
+
* swallows its own failures.
|
|
24
|
+
*
|
|
25
|
+
* @module lib/session/send-attempt-state
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.sendMessageDigest = sendMessageDigest;
|
|
29
|
+
exports.recordSendAttempt = recordSendAttempt;
|
|
30
|
+
exports.getLastSendAttempt = getLastSendAttempt;
|
|
31
|
+
exports.clearSendAttempts = clearSendAttempts;
|
|
32
|
+
exports.classifySendFailure = classifySendFailure;
|
|
33
|
+
exports.composerHoldsMessage = composerHoldsMessage;
|
|
34
|
+
exports.describeSendAttemptState = describeSendAttemptState;
|
|
35
|
+
const crypto_1 = require("crypto");
|
|
36
|
+
const global_state_1 = require("../../lib/global-state");
|
|
37
|
+
const logger_1 = require("../../lib/logger");
|
|
38
|
+
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
39
|
+
const send_attempt_types_1 = require("./send-attempt-types");
|
|
40
|
+
const logger = (0, logger_1.createLogger)('session/send-attempt-state');
|
|
41
|
+
/** How many instances are tracked at once; the least recently sent to is forgotten first. */
|
|
42
|
+
const MAX_TRACKED_INSTANCES = 1024;
|
|
43
|
+
const records = (0, global_state_1.getOrInitGlobal)('__sendAttemptRecords', () => new Map());
|
|
44
|
+
function keyOf(instance) {
|
|
45
|
+
return JSON.stringify([instance.worktreeId, instance.cliToolId, instance.instanceId]);
|
|
46
|
+
}
|
|
47
|
+
/** The digest a record carries for `content`. */
|
|
48
|
+
function sendMessageDigest(content) {
|
|
49
|
+
return (0, crypto_1.createHash)('sha256').update(content, 'utf8').digest('hex').slice(0, 16);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Record how a send attempt ended. Never throws: a record that cannot be made
|
|
53
|
+
* leaves the send exactly as it was.
|
|
54
|
+
*/
|
|
55
|
+
function recordSendAttempt(instance, attempt, now = Date.now()) {
|
|
56
|
+
try {
|
|
57
|
+
const key = keyOf(instance);
|
|
58
|
+
// Re-inserted, so the map's order is least recently sent to first.
|
|
59
|
+
records.delete(key);
|
|
60
|
+
records.set(key, {
|
|
61
|
+
at: Math.floor(now),
|
|
62
|
+
state: attempt.state,
|
|
63
|
+
reason: attempt.reason,
|
|
64
|
+
messageDigest: sendMessageDigest(attempt.content),
|
|
65
|
+
});
|
|
66
|
+
while (records.size > MAX_TRACKED_INSTANCES) {
|
|
67
|
+
const oldest = records.keys().next().value;
|
|
68
|
+
if (oldest === undefined)
|
|
69
|
+
break;
|
|
70
|
+
records.delete(oldest);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.warn('send-attempt-record-failed', { error: error instanceof Error ? error.message : String(error) });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** The instance's last recorded attempt, or null when none is held. */
|
|
78
|
+
function getLastSendAttempt(instance) {
|
|
79
|
+
return records.get(keyOf(instance)) ?? null;
|
|
80
|
+
}
|
|
81
|
+
/** Forget every record (tests). */
|
|
82
|
+
function clearSendAttempts() {
|
|
83
|
+
records.clear();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Where a failed `ICLITool.sendMessage` stopped, read from its error.
|
|
87
|
+
*
|
|
88
|
+
* Only failures whose wording says the body was never typed are `not-sent`;
|
|
89
|
+
* every other failure is `indeterminate`, because "we do not know" must never
|
|
90
|
+
* read as "safe to resend". The tools wrap these messages
|
|
91
|
+
* (`Failed to send message to <tool>: …`), so they are matched anywhere in it.
|
|
92
|
+
*/
|
|
93
|
+
function classifySendFailure(error) {
|
|
94
|
+
if (typeof error === 'object' &&
|
|
95
|
+
error !== null &&
|
|
96
|
+
error.code === session_start_error_1.SESSION_STARTING_CODE) {
|
|
97
|
+
return { state: 'not-sent', reason: 'session-starting' };
|
|
98
|
+
}
|
|
99
|
+
// #3772: the plan review overlay refused the send before the body was typed.
|
|
100
|
+
if (typeof error === 'object' &&
|
|
101
|
+
error !== null &&
|
|
102
|
+
error.code === send_attempt_types_1.PLAN_REVIEW_SEND_REFUSED_CODE) {
|
|
103
|
+
return { state: 'not-sent', reason: 'plan-review' };
|
|
104
|
+
}
|
|
105
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
106
|
+
// The readiness waits of every tool throw before typing anything.
|
|
107
|
+
if (/prompt not ready/i.test(message))
|
|
108
|
+
return { state: 'not-sent', reason: 'prompt-not-ready' };
|
|
109
|
+
// #1880: refused before the body, after only the clear keys (C-e / C-u).
|
|
110
|
+
if (/still holds unsent text after \d+ clear passes/.test(message)) {
|
|
111
|
+
return { state: 'not-sent', reason: 'composer-not-empty' };
|
|
112
|
+
}
|
|
113
|
+
// #2464 / #3366: typed, never submitted, taken back out best-effort.
|
|
114
|
+
if (/Enter was not pressed, so nothing was submitted/.test(message)) {
|
|
115
|
+
return { state: 'indeterminate', reason: 'body-not-landed' };
|
|
116
|
+
}
|
|
117
|
+
// #1501: the input line was cleared best-effort.
|
|
118
|
+
if (/replaced by a TUI autocompletion/.test(message)) {
|
|
119
|
+
return { state: 'indeterminate', reason: 'replaced-by-completion' };
|
|
120
|
+
}
|
|
121
|
+
// #1471: typed, Enter sent (more than once), never confirmed.
|
|
122
|
+
if (/submit could not be confirmed/i.test(message)) {
|
|
123
|
+
return { state: 'indeterminate', reason: 'submit-unconfirmed' };
|
|
124
|
+
}
|
|
125
|
+
return { state: 'indeterminate', reason: 'send-error' };
|
|
126
|
+
}
|
|
127
|
+
/** The whitespace-free form two renderings of one text share. */
|
|
128
|
+
function compact(text) {
|
|
129
|
+
return text.replace(/\s+/g, '');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Whether a composer read (`extractComposerText(...).text`) still holds the
|
|
133
|
+
* message: its compacted text contains the compacted start of the message's
|
|
134
|
+
* first non-blank line. Only the start, because a long body is cut by the
|
|
135
|
+
* reader and wrapped by the TUI.
|
|
136
|
+
*/
|
|
137
|
+
function composerHoldsMessage(composerText, content) {
|
|
138
|
+
const firstLine = content.split('\n').find((line) => line.trim() !== '') ?? '';
|
|
139
|
+
const needle = compact(firstLine).slice(0, 32);
|
|
140
|
+
return needle !== '' && compact(composerText).includes(needle);
|
|
141
|
+
}
|
|
142
|
+
/** One line for a failed send's error: what state the message is in, and who resends it. */
|
|
143
|
+
function describeSendAttemptState(attempt) {
|
|
144
|
+
if (attempt.state === 'not-sent') {
|
|
145
|
+
return (`[send state: not-sent (${attempt.reason}): the message was not typed. ` +
|
|
146
|
+
'CommandMate does not resend it; send it again once the input prompt is back ' +
|
|
147
|
+
'(`commandmate prompt <worktree-id> --json` shows the screen and lastSend).]');
|
|
148
|
+
}
|
|
149
|
+
if (attempt.state === 'indeterminate') {
|
|
150
|
+
return (`[send state: indeterminate (${attempt.reason}): part of the message may have been typed or submitted. ` +
|
|
151
|
+
'CommandMate does not resend it; do not resend before checking the pane ' +
|
|
152
|
+
'(`commandmate capture <worktree-id> --pane`), or it may arrive twice.]');
|
|
153
|
+
}
|
|
154
|
+
return `[send state: sent (${attempt.reason})]`;
|
|
155
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What the last send to an instance did to its pane (Issue #3759): types only.
|
|
4
|
+
*
|
|
5
|
+
* Kept free of imports so the CLI can read the payload's shape through
|
|
6
|
+
* `lib/prompt-observation/types` without pulling the server graph in (the same
|
|
7
|
+
* rule `polling/auto-yes-suppression-reason` follows).
|
|
8
|
+
*
|
|
9
|
+
* @module lib/session/send-attempt-types
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PLAN_REVIEW_SEND_REFUSED_CODE = void 0;
|
|
13
|
+
/**
|
|
14
|
+
* `code` on the error a tool throws when a plan review overlay refuses the
|
|
15
|
+
* send before any body is typed (Issue #3772). Matched by code, never by wording.
|
|
16
|
+
*/
|
|
17
|
+
exports.PLAN_REVIEW_SEND_REFUSED_CODE = 'PLAN_REVIEW_SEND_REFUSED';
|