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
|
@@ -29,6 +29,10 @@
|
|
|
29
29
|
* 8. clearInProgressMessageId
|
|
30
30
|
* 9. startPolling — record the assistant response afterwards
|
|
31
31
|
*
|
|
32
|
+
* Every attempt that reaches the ownership check also records how it ended —
|
|
33
|
+
* not-sent / sent / indeterminate — for `prompt --json`'s `lastSend` (Issue
|
|
34
|
+
* #3759, `./send-attempt-state`). Nothing is resent on any outcome.
|
|
35
|
+
*
|
|
32
36
|
* Out of scope (kept in the HTTP layer / caller): request/body validation,
|
|
33
37
|
* content trimming/size limits, imagePath validation, CLI-tool availability
|
|
34
38
|
* and session-start (running) checks. The caller passes already-validated input.
|
|
@@ -48,6 +52,10 @@ const worktree_session_ownership_1 = require("../../lib/cli-tools/worktree-sessi
|
|
|
48
52
|
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
49
53
|
const prompt_waiting_guard_1 = require("../../lib/session/prompt-waiting-guard");
|
|
50
54
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
55
|
+
const cli_session_1 = require("../../lib/session/cli-session");
|
|
56
|
+
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
57
|
+
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
58
|
+
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
51
59
|
const opencode_1 = require("../../lib/cli-tools/opencode");
|
|
52
60
|
const logger = (0, logger_1.createLogger)('session/send-user-message');
|
|
53
61
|
function getErrorMessage(error) {
|
|
@@ -92,6 +100,28 @@ async function waitForPreviousTurnRecorded(worktreeId, resolvedInstanceId) {
|
|
|
92
100
|
}
|
|
93
101
|
return true;
|
|
94
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether the composer still shows the message after a send whose submit was
|
|
105
|
+
* never confirmed (Issue #3759) — evidence that it is typed but unsent.
|
|
106
|
+
*
|
|
107
|
+
* Only for the composers `extractComposerText` has measured; any other tool,
|
|
108
|
+
* and any read that fails, answers false and the state stays
|
|
109
|
+
* `submit-unconfirmed`. Either way the state is `indeterminate`: a message in
|
|
110
|
+
* the composer is not one to type again.
|
|
111
|
+
*/
|
|
112
|
+
async function composerStillHolds(worktreeId, cliToolId, instanceId, content) {
|
|
113
|
+
if (!composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId))
|
|
114
|
+
return false;
|
|
115
|
+
try {
|
|
116
|
+
const output = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
|
|
117
|
+
const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
|
|
118
|
+
return read.state === 'content' && (0, send_attempt_state_1.composerHoldsMessage)(read.text, content);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.warn('send-composer-residue-read-failed', { error: getErrorMessage(error) });
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
95
125
|
/**
|
|
96
126
|
* Send a validated user message to the CLI tool and record it in history.
|
|
97
127
|
*
|
|
@@ -111,6 +141,12 @@ async function sendUserMessage(db, params) {
|
|
|
111
141
|
*/
|
|
112
142
|
const resolvedInstanceId = instanceId ?? cliToolId;
|
|
113
143
|
const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
|
|
144
|
+
// Issue #3759: how this attempt left the message, kept for `lastSend` (and
|
|
145
|
+
// read back by the send route for its error). The result's shape is
|
|
146
|
+
// unchanged; recording never throws.
|
|
147
|
+
const settle = (state, reason) => {
|
|
148
|
+
(0, send_attempt_state_1.recordSendAttempt)({ worktreeId, cliToolId, instanceId: resolvedInstanceId }, { state, reason, content });
|
|
149
|
+
};
|
|
114
150
|
// Issue #2865: the send route checks ownership itself, but the timer manager
|
|
115
151
|
// and relay delivery reach tmux only through here. A session under this
|
|
116
152
|
// worktree's name that was created in another directory belongs to another
|
|
@@ -119,6 +155,7 @@ async function sendUserMessage(db, params) {
|
|
|
119
155
|
const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId);
|
|
120
156
|
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName, db);
|
|
121
157
|
if (ownership === null || ownership.verdict === 'foreign') {
|
|
158
|
+
settle('not-sent', 'foreign-session');
|
|
122
159
|
logger.warn('send-refused-foreign-session', {
|
|
123
160
|
worktreeId,
|
|
124
161
|
cliToolId,
|
|
@@ -157,6 +194,7 @@ async function sendUserMessage(db, params) {
|
|
|
157
194
|
ignoreStructured: params.ignoreStructuredPromptGuard,
|
|
158
195
|
});
|
|
159
196
|
if (promptGuard.waiting) {
|
|
197
|
+
settle('not-sent', 'prompt-waiting');
|
|
160
198
|
logger.info('send-refused-prompt-waiting', {
|
|
161
199
|
worktreeId,
|
|
162
200
|
cliToolId,
|
|
@@ -194,6 +232,7 @@ async function sendUserMessage(db, params) {
|
|
|
194
232
|
}
|
|
195
233
|
catch (error) {
|
|
196
234
|
logger.error('failed-to-send-model-command:', { error: getErrorMessage(error) });
|
|
235
|
+
settle('not-sent', 'model-switch-failed');
|
|
197
236
|
return { ok: false, stage: 'model', error: getErrorMessage(error) };
|
|
198
237
|
}
|
|
199
238
|
// Issue #2630: copilot is idle now, and if the previous turn ended during the
|
|
@@ -314,11 +353,18 @@ async function sendUserMessage(db, params) {
|
|
|
314
353
|
}
|
|
315
354
|
catch (error) {
|
|
316
355
|
logger.error('failed-to-send-message-to:', { error: getErrorMessage(error) });
|
|
356
|
+
// Issue #3759: not-sent only when the error says the body was never typed.
|
|
357
|
+
let failure = (0, send_attempt_state_1.classifySendFailure)(error);
|
|
358
|
+
if (failure.reason === 'submit-unconfirmed' && (await composerStillHolds(worktreeId, cliToolId, instanceId, content))) {
|
|
359
|
+
failure = { state: 'indeterminate', reason: 'composer-residue' };
|
|
360
|
+
}
|
|
361
|
+
settle(failure.state, failure.reason);
|
|
317
362
|
if ((0, session_start_error_1.isSessionStartTimeoutError)(error)) {
|
|
318
363
|
return { ok: false, stage: 'send', error: error.message, code: session_start_error_1.SESSION_STARTING_CODE };
|
|
319
364
|
}
|
|
320
365
|
return { ok: false, stage: 'send', error: getErrorMessage(error) };
|
|
321
366
|
}
|
|
367
|
+
settle('sent', 'submitted');
|
|
322
368
|
// 5. Create user message in database (History source: chat_messages).
|
|
323
369
|
const message = (0, db_1.createMessage)(db, {
|
|
324
370
|
worktreeId,
|
|
@@ -86,6 +86,8 @@ const session_ownership_1 = require("../../lib/tmux/session-ownership");
|
|
|
86
86
|
const control_mode_tmux_transport_1 = require("../../lib/tmux/control-mode-tmux-transport");
|
|
87
87
|
const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
|
|
88
88
|
const response_poller_1 = require("../../lib/polling/response-poller");
|
|
89
|
+
const auto_yes_poller_state_1 = require("../../lib/polling/auto-yes-poller-state");
|
|
90
|
+
const auto_yes_enter_fallback_1 = require("../../lib/polling/auto-yes-enter-fallback");
|
|
89
91
|
const ws_server_1 = require("../../lib/ws-server");
|
|
90
92
|
const logger_1 = require("../../lib/logger");
|
|
91
93
|
const logger = (0, logger_1.createLogger)('worktree-session-reconcile');
|
|
@@ -152,8 +154,9 @@ function planSessionRenames(db, rename, errors) {
|
|
|
152
154
|
// getSessionName validates already; assert it explicitly so the guarantee
|
|
153
155
|
// is stated where the name is about to be handed to tmux (Issue #1621).
|
|
154
156
|
(0, validation_1.validateSessionName)(newName);
|
|
155
|
-
if (oldName !== newName)
|
|
156
|
-
plans.push({ oldName, newName, rename, source: 'roster' });
|
|
157
|
+
if (oldName !== newName) {
|
|
158
|
+
plans.push({ oldName, newName, rename, cliToolId, instanceId, source: 'roster' });
|
|
159
|
+
}
|
|
157
160
|
}
|
|
158
161
|
catch (error) {
|
|
159
162
|
errors.push(`session name for ${rename.oldId}/${instanceId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -284,8 +287,16 @@ function discoverSessionRenames(renames, liveNames, knownIds, result) {
|
|
|
284
287
|
: attributed.cliToolId;
|
|
285
288
|
const newName = tool.getSessionName(rename.newId, instanceId);
|
|
286
289
|
(0, validation_1.validateSessionName)(newName);
|
|
287
|
-
if (name !== newName)
|
|
288
|
-
plans.push({
|
|
290
|
+
if (name !== newName) {
|
|
291
|
+
plans.push({
|
|
292
|
+
oldName: name,
|
|
293
|
+
newName,
|
|
294
|
+
rename,
|
|
295
|
+
cliToolId: attributed.cliToolId,
|
|
296
|
+
instanceId,
|
|
297
|
+
source: 'live',
|
|
298
|
+
});
|
|
299
|
+
}
|
|
289
300
|
}
|
|
290
301
|
catch (error) {
|
|
291
302
|
result.errors.push(`attribute session ${name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -374,6 +385,10 @@ function allocateTempName(taken, ordinal) {
|
|
|
374
385
|
}
|
|
375
386
|
/**
|
|
376
387
|
* Rename the live tmux sessions in two stages so no intermediate state collides.
|
|
388
|
+
*
|
|
389
|
+
* @returns The plans whose session was renamed in BOTH stages (Issue #3713: a
|
|
390
|
+
* stage-2 `false` — the session vanished from its temporary name — is not
|
|
391
|
+
* one; it is reported as skipped).
|
|
377
392
|
*/
|
|
378
393
|
async function renameSessionsTwoStage(plans, live, deps, result) {
|
|
379
394
|
if (plans.length === 0)
|
|
@@ -426,7 +441,14 @@ async function renameSessionsTwoStage(plans, live, deps, result) {
|
|
|
426
441
|
const completed = [];
|
|
427
442
|
for (const { plan, tempName } of staged) {
|
|
428
443
|
try {
|
|
429
|
-
await deps.renameSession(tempName, plan.newName)
|
|
444
|
+
if (!(await deps.renameSession(tempName, plan.newName))) {
|
|
445
|
+
result.skippedSessions.push({
|
|
446
|
+
oldName: plan.oldName,
|
|
447
|
+
newName: plan.newName,
|
|
448
|
+
reason: 'session no longer exists',
|
|
449
|
+
});
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
430
452
|
result.renamedSessions.push({ oldName: plan.oldName, newName: plan.newName });
|
|
431
453
|
completed.push(plan);
|
|
432
454
|
// The control-mode attach survived the rename; only the registry key is
|
|
@@ -453,6 +475,37 @@ async function renameSessionsTwoStage(plans, live, deps, result) {
|
|
|
453
475
|
}
|
|
454
476
|
return completed;
|
|
455
477
|
}
|
|
478
|
+
/** The Auto-Yes composite key of a plan's instance under `worktreeId`. */
|
|
479
|
+
function autoYesKeyOf(plan, worktreeId) {
|
|
480
|
+
return (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, plan.cliToolId, plan.instanceId);
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Carry Auto-Yes's memory of an answer stopped part-way, and of a send still in
|
|
484
|
+
* flight, to the new key of each session that moved (Issue #3713).
|
|
485
|
+
*
|
|
486
|
+
* Only for the renames that succeeded in both stages: a refused, failed or
|
|
487
|
+
* vanished rename leaves the destination's live session — and its memory —
|
|
488
|
+
* alone. Not part of {@link migrateRuntimeState}, which still runs for every
|
|
489
|
+
* requested pair: a grant, a response poller or a WebSocket room is about the
|
|
490
|
+
* worktree, this memory is about one process.
|
|
491
|
+
*/
|
|
492
|
+
function moveAutoYesPartialAnswers(completed, sourceEpochs) {
|
|
493
|
+
const moves = [];
|
|
494
|
+
for (const plan of completed) {
|
|
495
|
+
const sourceEpoch = sourceEpochs.get(plan);
|
|
496
|
+
if (sourceEpoch === undefined)
|
|
497
|
+
continue;
|
|
498
|
+
moves.push({
|
|
499
|
+
oldKey: autoYesKeyOf(plan, plan.rename.oldId),
|
|
500
|
+
newKey: autoYesKeyOf(plan, plan.rename.newId),
|
|
501
|
+
sourceEpoch,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
const received = (0, auto_yes_poller_state_1.movePartialAnswers)(moves);
|
|
505
|
+
if (received.length > 0) {
|
|
506
|
+
logger.info('reconcile:auto-yes-partial-answers-moved', { keys: received });
|
|
507
|
+
}
|
|
508
|
+
}
|
|
456
509
|
/**
|
|
457
510
|
* Move the in-process state that is keyed on a worktree ID.
|
|
458
511
|
*
|
|
@@ -468,15 +521,28 @@ function migrateRuntimeState(db, renames, result) {
|
|
|
468
521
|
const runningAutoYesPollers = new Set((0, auto_yes_manager_1.getAutoYesPollerCompositeKeys)());
|
|
469
522
|
const movedAutoYes = (0, auto_yes_manager_1.migrateAutoYesStateWorktreeIds)(renames);
|
|
470
523
|
result.movedAutoYesKeys = movedAutoYes.map((move) => move.newKey);
|
|
524
|
+
// The poller's timer chain captures the worktree ID, so re-keying its map
|
|
525
|
+
// would leave it polling the old session. Stop and restart instead — the
|
|
526
|
+
// Auto-Yes *state* (deadline, stop pattern) is what must survive, and it
|
|
527
|
+
// already has. Every old poller is stopped before any successor starts
|
|
528
|
+
// (Issue #3713): in a swap (A↔B) with both running, stop A → start B would
|
|
529
|
+
// find B's own poller still there ("already_running"), and the stop B that
|
|
530
|
+
// follows would leave the B side with none.
|
|
531
|
+
const restarts = [];
|
|
471
532
|
for (const move of movedAutoYes) {
|
|
472
533
|
if (!runningAutoYesPollers.has(move.oldKey))
|
|
473
534
|
continue;
|
|
474
535
|
try {
|
|
475
|
-
//
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
536
|
+
// Issue #3730: a move, not a release — the grant goes on under newKey.
|
|
537
|
+
(0, auto_yes_manager_1.stopAutoYesPolling)(move.oldKey, 'worktree-id-migrated');
|
|
538
|
+
restarts.push(move);
|
|
539
|
+
}
|
|
540
|
+
catch (error) {
|
|
541
|
+
result.errors.push(`auto-yes poller ${move.newKey}: ${error instanceof Error ? error.message : String(error)}`);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
for (const move of restarts) {
|
|
545
|
+
try {
|
|
480
546
|
const started = (0, auto_yes_manager_1.startAutoYesPolling)(move.newWorktreeId, move.cliToolId, move.instanceId);
|
|
481
547
|
if (started.started) {
|
|
482
548
|
result.restartedAutoYesPollers.push(move.newKey);
|
|
@@ -572,7 +638,15 @@ async function reconcileWorktreeSessions(db, renamesOrOldId, newIdOrOptions, may
|
|
|
572
638
|
result.planSources.discovered++;
|
|
573
639
|
}
|
|
574
640
|
const ownedPlans = excludeForeignSessionPlans(db, plans, live, livePaths, deps, result);
|
|
575
|
-
|
|
641
|
+
// Issue #3713: each source session's epoch, read before the first rename's
|
|
642
|
+
// await — a session begun under the old key while the renames run is not the
|
|
643
|
+
// one that moves, and its memory stays where it is.
|
|
644
|
+
const sourceEpochs = new Map(ownedPlans.map((plan) => [plan, (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(autoYesKeyOf(plan, plan.rename.oldId))]));
|
|
645
|
+
const completed = await renameSessionsTwoStage(ownedPlans, live, deps, result);
|
|
646
|
+
// No await between the renames and this: Auto-Yes's memory of an answer
|
|
647
|
+
// stopped part-way (and of a send still in flight) follows exactly the
|
|
648
|
+
// sessions that moved, before any poller restarts below.
|
|
649
|
+
moveAutoYesPartialAnswers(completed, sourceEpochs);
|
|
576
650
|
}
|
|
577
651
|
// Runtime state moves after the sessions: a poller that ticks in between
|
|
578
652
|
// fails one capture against a name that is briefly gone, which is a logged
|
|
@@ -53,6 +53,13 @@ async function executeTimer(timerId) {
|
|
|
53
53
|
const instanceId = timer.instanceId;
|
|
54
54
|
// [Issue #539] Check if session is running before sending
|
|
55
55
|
const isRunning = await cliTool.isRunning(timer.worktreeId, instanceId);
|
|
56
|
+
// [Issue #3707] A cancel can succeed while the await above is pending.
|
|
57
|
+
// Re-read synchronously (no await between this read and the update below,
|
|
58
|
+
// so better-sqlite3 makes read+update atomic) and bail out unless the
|
|
59
|
+
// timer is still pending; otherwise 'cancelled' would be overwritten.
|
|
60
|
+
const current = (0, timer_db_1.getTimerById)(db, timerId);
|
|
61
|
+
if (!current || current.status !== 'pending')
|
|
62
|
+
return;
|
|
56
63
|
if (!isRunning) {
|
|
57
64
|
logger.warn('timer:no-session', { timerId, worktreeId: timer.worktreeId, instanceId });
|
|
58
65
|
(0, timer_db_1.updateTimerStatus)(db, timerId, timer_constants_1.TIMER_STATUS.NO_SESSION);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "A tmux session of this name was just created" (Issue #3796).
|
|
4
|
+
*
|
|
5
|
+
* The Auto-Yes poller that found no session waits `MAX_BACKOFF_MS` for its next
|
|
6
|
+
* tick, and the push gate holds a prompt wait until that tick (#3791), so a
|
|
7
|
+
* session created right after the poller looked was answered — or its human
|
|
8
|
+
* notified — up to about 64 s late. {@link createSession} reports every session
|
|
9
|
+
* it creates here, and a waiting poller listens for its own session's name and
|
|
10
|
+
* ticks early.
|
|
11
|
+
*
|
|
12
|
+
* Synchronous and dependency-free on purpose: `tmux.ts` is the lowest layer and
|
|
13
|
+
* must not import the poller (it would be a cycle). A listener that throws is
|
|
14
|
+
* isolated from the others and from the session creation that fired it.
|
|
15
|
+
*
|
|
16
|
+
* @module lib/tmux/session-created-signal
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.onTmuxSessionCreated = onTmuxSessionCreated;
|
|
20
|
+
exports.notifyTmuxSessionCreated = notifyTmuxSessionCreated;
|
|
21
|
+
exports.countTmuxSessionCreatedListeners = countTmuxSessionCreatedListeners;
|
|
22
|
+
exports.clearTmuxSessionCreatedListeners = clearTmuxSessionCreatedListeners;
|
|
23
|
+
const global_state_1 = require("../global-state");
|
|
24
|
+
/**
|
|
25
|
+
* sessionName -> listeners. globalThis for the reason every shared in-memory
|
|
26
|
+
* state is (#1736): the creator (a route bundle) and the poller (the server's)
|
|
27
|
+
* can hold separate copies of this module.
|
|
28
|
+
*/
|
|
29
|
+
const listeners = (0, global_state_1.getOrInitGlobal)('__tmuxSessionCreatedListeners', () => new Map());
|
|
30
|
+
/**
|
|
31
|
+
* Call `listener` the next time a session named `sessionName` is created.
|
|
32
|
+
*
|
|
33
|
+
* @returns Unsubscribe; calling it more than once does nothing
|
|
34
|
+
*/
|
|
35
|
+
function onTmuxSessionCreated(sessionName, listener) {
|
|
36
|
+
let set = listeners.get(sessionName);
|
|
37
|
+
if (set === undefined) {
|
|
38
|
+
set = new Set();
|
|
39
|
+
listeners.set(sessionName, set);
|
|
40
|
+
}
|
|
41
|
+
set.add(listener);
|
|
42
|
+
return () => {
|
|
43
|
+
const current = listeners.get(sessionName);
|
|
44
|
+
if (current === undefined)
|
|
45
|
+
return;
|
|
46
|
+
current.delete(listener);
|
|
47
|
+
if (current.size === 0)
|
|
48
|
+
listeners.delete(sessionName);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Tell the listeners of `sessionName` that it was created. Each one is called once and dropped. */
|
|
52
|
+
function notifyTmuxSessionCreated(sessionName) {
|
|
53
|
+
const set = listeners.get(sessionName);
|
|
54
|
+
if (set === undefined)
|
|
55
|
+
return;
|
|
56
|
+
listeners.delete(sessionName);
|
|
57
|
+
for (const listener of set) {
|
|
58
|
+
try {
|
|
59
|
+
listener();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// A listener's failure must not fail the session creation that fired it.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Number of sessions someone is waiting for. Test seam. */
|
|
67
|
+
function countTmuxSessionCreatedListeners() {
|
|
68
|
+
let n = 0;
|
|
69
|
+
for (const set of listeners.values())
|
|
70
|
+
n += set.size;
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
/** Drop every listener. Test seam. */
|
|
74
|
+
function clearTmuxSessionCreatedListeners() {
|
|
75
|
+
listeners.clear();
|
|
76
|
+
}
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.CACHE_MAX_CAPTURE_LINES = exports.CACHE_MAX_ENTRIES = exports.CACHE_TTL_MS = void 0;
|
|
23
23
|
exports.isCaptureWindowSaturated = isCaptureWindowSaturated;
|
|
24
|
+
exports.getCaptureGeneration = getCaptureGeneration;
|
|
25
|
+
exports.isCaptureGenerationCurrent = isCaptureGenerationCurrent;
|
|
24
26
|
exports.sliceOutput = sliceOutput;
|
|
25
27
|
exports.getCachedCapture = getCachedCapture;
|
|
26
28
|
exports.setCachedCapture = setCachedCapture;
|
|
@@ -85,6 +87,37 @@ function getCache() {
|
|
|
85
87
|
function getInflight() {
|
|
86
88
|
return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheInflight', () => new Map());
|
|
87
89
|
}
|
|
90
|
+
function getGenerationState() {
|
|
91
|
+
return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheGeneration', () => ({ global: 0, sessions: new Map() }));
|
|
92
|
+
}
|
|
93
|
+
// =========================================================================
|
|
94
|
+
// getCaptureGeneration() / isCaptureGenerationCurrent()
|
|
95
|
+
// =========================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Take the invalidation generation for a session before starting a capture
|
|
98
|
+
* (Issue #3734). Pass it to isCaptureGenerationCurrent() after the await.
|
|
99
|
+
*
|
|
100
|
+
* @param sessionName - tmux session name
|
|
101
|
+
* @returns Generation snapshot
|
|
102
|
+
*/
|
|
103
|
+
function getCaptureGeneration(sessionName) {
|
|
104
|
+
const state = getGenerationState();
|
|
105
|
+
return { global: state.global, session: state.sessions.get(sessionName) ?? 0 };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Whether no invalidateCache(sessionName) / clearAllCache() ran since the
|
|
109
|
+
* snapshot was taken (Issue #3734). A capture that started before the
|
|
110
|
+
* invalidation may show the screen from before a send, so it must not be
|
|
111
|
+
* written back to the cache.
|
|
112
|
+
*
|
|
113
|
+
* @param sessionName - tmux session name
|
|
114
|
+
* @param generation - Snapshot from getCaptureGeneration()
|
|
115
|
+
* @returns True when the capture may be written back
|
|
116
|
+
*/
|
|
117
|
+
function isCaptureGenerationCurrent(sessionName, generation) {
|
|
118
|
+
const current = getCaptureGeneration(sessionName);
|
|
119
|
+
return current.global === generation.global && current.session === generation.session;
|
|
120
|
+
}
|
|
88
121
|
// =========================================================================
|
|
89
122
|
// sliceOutput()
|
|
90
123
|
// =========================================================================
|
|
@@ -183,6 +216,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
|
|
|
183
216
|
// =========================================================================
|
|
184
217
|
/**
|
|
185
218
|
* Invalidate cache for a specific session.
|
|
219
|
+
* Issue #3734: also advances the session's generation and drops its inflight
|
|
220
|
+
* entry, so a capture started before the invalidation is neither written back
|
|
221
|
+
* nor joined by callers that arrive after it (they start a fresh capture).
|
|
186
222
|
* [SEC4-006] Logs debug message with session name for troubleshooting.
|
|
187
223
|
*
|
|
188
224
|
* @param sessionName - tmux session name to invalidate
|
|
@@ -190,6 +226,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
|
|
|
190
226
|
function invalidateCache(sessionName) {
|
|
191
227
|
const cache = getCache();
|
|
192
228
|
cache.delete(sessionName);
|
|
229
|
+
const generations = getGenerationState().sessions;
|
|
230
|
+
generations.set(sessionName, (generations.get(sessionName) ?? 0) + 1);
|
|
231
|
+
getInflight().delete(sessionName);
|
|
193
232
|
// [SEC4-006] Debug log for cache invalidation chain tracking
|
|
194
233
|
logger.debug('cache:invalidate', { sessionName });
|
|
195
234
|
}
|
|
@@ -197,14 +236,20 @@ function invalidateCache(sessionName) {
|
|
|
197
236
|
// clearAllCache()
|
|
198
237
|
// =========================================================================
|
|
199
238
|
/**
|
|
200
|
-
* Clear all cache entries and inflight requests.
|
|
201
|
-
*
|
|
239
|
+
* Clear all cache entries and inflight requests for every session.
|
|
240
|
+
* Called at the start of a worktree's session cleanup (session-cleanup.ts).
|
|
241
|
+
* Issue #3734: advances the global generation so captures started before the
|
|
242
|
+
* clear are not written back. Per-session counts are dropped here because the
|
|
243
|
+
* global generation alone already tells every older snapshot apart.
|
|
202
244
|
*/
|
|
203
245
|
function clearAllCache() {
|
|
204
246
|
const cache = getCache();
|
|
205
247
|
cache.clear();
|
|
206
248
|
const inflight = getInflight();
|
|
207
249
|
inflight.clear();
|
|
250
|
+
const state = getGenerationState();
|
|
251
|
+
state.global += 1;
|
|
252
|
+
state.sessions.clear();
|
|
208
253
|
}
|
|
209
254
|
// =========================================================================
|
|
210
255
|
// resetCacheForTesting()
|
|
@@ -216,6 +261,7 @@ function clearAllCache() {
|
|
|
216
261
|
function resetCacheForTesting() {
|
|
217
262
|
globalThis.__tmuxCaptureCache = undefined;
|
|
218
263
|
globalThis.__tmuxCaptureCacheInflight = undefined;
|
|
264
|
+
globalThis.__tmuxCaptureCacheGeneration = undefined;
|
|
219
265
|
}
|
|
220
266
|
// =========================================================================
|
|
221
267
|
// getOrFetchCapture() - singleflight pattern
|
|
@@ -247,18 +293,24 @@ async function getOrFetchCapture(sessionName, requestedLines, fetchFn) {
|
|
|
247
293
|
return sliceOutput(result, requestedLines);
|
|
248
294
|
}
|
|
249
295
|
// 3. Create new fetch promise
|
|
296
|
+
// Issue #3734: snapshot the generation before fetchFn() starts
|
|
297
|
+
const generation = getCaptureGeneration(sessionName);
|
|
250
298
|
const fetchPromise = fetchFn();
|
|
251
299
|
inflight.set(sessionName, fetchPromise);
|
|
252
300
|
try {
|
|
253
301
|
const output = await fetchPromise;
|
|
254
|
-
// Cache non-empty results only [SEC4-007]
|
|
255
|
-
|
|
302
|
+
// Cache non-empty results only [SEC4-007], and only when no invalidation
|
|
303
|
+
// happened while waiting (Issue #3734)
|
|
304
|
+
if (output.length > 0 && isCaptureGenerationCurrent(sessionName, generation)) {
|
|
256
305
|
setCachedCapture(sessionName, output, exports.CACHE_MAX_CAPTURE_LINES);
|
|
257
306
|
}
|
|
258
307
|
return sliceOutput(output, requestedLines);
|
|
259
308
|
}
|
|
260
309
|
finally {
|
|
261
|
-
// Clean up inflight entry
|
|
262
|
-
|
|
310
|
+
// Clean up inflight entry, unless an invalidation already replaced it
|
|
311
|
+
// with a newer fetch (Issue #3734)
|
|
312
|
+
if (inflight.get(sessionName) === fetchPromise) {
|
|
313
|
+
inflight.delete(sessionName);
|
|
314
|
+
}
|
|
263
315
|
}
|
|
264
316
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Provides functions to manage tmux sessions for Claude CLI integration
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.DIRECT_INPUT_TEXT_CHUNK_BYTES = exports.REPAINT_INVALIDATE_DELAY_MS = exports.NAVIGATION_KEY_VALUES = exports.SPECIAL_KEY_VALUES = void 0;
|
|
7
|
+
exports.DIRECT_INPUT_TEXT_CHUNK_BYTES = exports.REPAINT_INVALIDATE_DELAY_MS = exports.NAVIGATION_KEY_VALUES = exports.SPECIAL_KEY_VALUES = exports.SpecialKeysAbortedError = void 0;
|
|
8
8
|
exports.exactTarget = exactTarget;
|
|
9
9
|
exports.reconcileSessionGeometry = reconcileSessionGeometry;
|
|
10
10
|
exports.hasSession = hasSession;
|
|
@@ -31,6 +31,7 @@ const util_1 = require("util");
|
|
|
31
31
|
const tmux_capture_cache_1 = require("./tmux-capture-cache");
|
|
32
32
|
const geometry_delegation_1 = require("./geometry-delegation");
|
|
33
33
|
const legacy_session_alias_1 = require("./legacy-session-alias");
|
|
34
|
+
const session_created_signal_1 = require("./session-created-signal");
|
|
34
35
|
const validation_1 = require("../../lib/cli-tools/validation");
|
|
35
36
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
36
37
|
const logger_1 = require("../../lib/logger");
|
|
@@ -449,6 +450,9 @@ async function createSession(sessionNameOrOptions, cwd) {
|
|
|
449
450
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
450
451
|
throw new Error(`Failed to create tmux session: ${errorMessage}`);
|
|
451
452
|
}
|
|
453
|
+
// Issue #3796: an Auto-Yes poller waiting for this session ticks now rather
|
|
454
|
+
// than a backoff later. Outside the try: a listener cannot fail the creation.
|
|
455
|
+
(0, session_created_signal_1.notifyTmuxSessionCreated)(sessionName);
|
|
452
456
|
}
|
|
453
457
|
/**
|
|
454
458
|
* Send keys to a tmux session
|
|
@@ -577,6 +581,21 @@ function isSendableSpecialKey(key) {
|
|
|
577
581
|
}
|
|
578
582
|
/** Delay between individual key presses for TUI apps that need processing time (ms). */
|
|
579
583
|
const SPECIAL_KEY_DELAY_MS = 100;
|
|
584
|
+
/**
|
|
585
|
+
* {@link sendSpecialKeys} stopped between two keys because its
|
|
586
|
+
* `shouldContinue` said so (Issue #3706). Not wrapped in the transport error.
|
|
587
|
+
*/
|
|
588
|
+
class SpecialKeysAbortedError extends Error {
|
|
589
|
+
keysSent;
|
|
590
|
+
constructor(
|
|
591
|
+
/** How many keys reached tmux before the stop (always at least one). */
|
|
592
|
+
keysSent) {
|
|
593
|
+
super(`Special key sequence stopped after ${keysSent} key(s)`);
|
|
594
|
+
this.keysSent = keysSent;
|
|
595
|
+
this.name = 'SpecialKeysAbortedError';
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
exports.SpecialKeysAbortedError = SpecialKeysAbortedError;
|
|
580
599
|
/**
|
|
581
600
|
* Send tmux special keys (unquoted key names like Down, Up, Enter, Space).
|
|
582
601
|
* Used for cursor-based navigation in CLI tool prompts (e.g., Claude Code AskUserQuestion).
|
|
@@ -587,9 +606,11 @@ const SPECIAL_KEY_DELAY_MS = 100;
|
|
|
587
606
|
*
|
|
588
607
|
* @param sessionName - Target session name
|
|
589
608
|
* @param keys - Array of tmux special key names (e.g., ['Down', 'Down', 'Space', 'Enter'])
|
|
609
|
+
* @param options - Optional `shouldContinue`, asked after each delay (Issue #3706)
|
|
590
610
|
* @throws {Error} If any key name is not in the allowed set, or if tmux command fails
|
|
611
|
+
* @throws {SpecialKeysAbortedError} If `shouldContinue` returned false between two keys
|
|
591
612
|
*/
|
|
592
|
-
async function sendSpecialKeys(sessionName, keys) {
|
|
613
|
+
async function sendSpecialKeys(sessionName, keys, options) {
|
|
593
614
|
if (keys.length === 0)
|
|
594
615
|
return;
|
|
595
616
|
// Validate all keys are in the allowed set (command injection prevention)
|
|
@@ -604,10 +625,15 @@ async function sendSpecialKeys(sessionName, keys) {
|
|
|
604
625
|
// Delay between key presses (skip after the last key)
|
|
605
626
|
if (i < keys.length - 1) {
|
|
606
627
|
await new Promise(resolve => setTimeout(resolve, SPECIAL_KEY_DELAY_MS));
|
|
628
|
+
if (options?.shouldContinue && !options.shouldContinue()) {
|
|
629
|
+
throw new SpecialKeysAbortedError(i + 1);
|
|
630
|
+
}
|
|
607
631
|
}
|
|
608
632
|
}
|
|
609
633
|
}
|
|
610
634
|
catch (error) {
|
|
635
|
+
if (error instanceof SpecialKeysAbortedError)
|
|
636
|
+
throw error;
|
|
611
637
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
612
638
|
throw new Error(`Failed to send special keys to tmux session: ${errorMessage}`);
|
|
613
639
|
}
|
|
@@ -572,6 +572,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
572
572
|
removedByOtherRepository: [],
|
|
573
573
|
removedStaleDemoVitest: [],
|
|
574
574
|
ignoredByConfig: [],
|
|
575
|
+
ignoredBuiltIn: [],
|
|
575
576
|
};
|
|
576
577
|
}
|
|
577
578
|
if (!after || after.status !== 'ok') {
|
|
@@ -587,18 +588,20 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
587
588
|
removedByOtherRepository: [],
|
|
588
589
|
removedStaleDemoVitest: [],
|
|
589
590
|
ignoredByConfig: [],
|
|
591
|
+
ignoredBuiltIn: [],
|
|
590
592
|
};
|
|
591
593
|
}
|
|
592
594
|
const beforeKeys = new Set(before.entries.map((entry) => entry.key));
|
|
593
595
|
const afterKeys = new Set(after.entries.map((entry) => entry.key));
|
|
594
596
|
// Only `home-entries`, and only by the whole name: the same string under
|
|
595
597
|
// `~/.commandmate` is a different directory and stays counted.
|
|
596
|
-
const isIgnoredByConfig = (entry) => probeId === 'home-entries' &&
|
|
597
|
-
|
|
598
|
+
const isIgnoredByConfig = (entry) => probeId === 'home-entries' && ignoredHomeEntries.has(entry.key);
|
|
599
|
+
const isIgnoredBuiltIn = (entry) => probeId === 'home-entries' && isZcompdumpEntry(entry.key);
|
|
598
600
|
const added = [];
|
|
599
601
|
const ignoredAdded = [];
|
|
600
602
|
const taskSessionAdded = [];
|
|
601
603
|
const ignoredByConfig = [];
|
|
604
|
+
const ignoredBuiltIn = [];
|
|
602
605
|
for (const entry of after.entries) {
|
|
603
606
|
if (beforeKeys.has(entry.key))
|
|
604
607
|
continue;
|
|
@@ -607,6 +610,10 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
607
610
|
ignoredByConfig.push(toChange(entry, owner));
|
|
608
611
|
continue;
|
|
609
612
|
}
|
|
613
|
+
if (isIgnoredBuiltIn(entry)) {
|
|
614
|
+
ignoredBuiltIn.push(toChange(entry, owner));
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
610
617
|
if (probeId === 'tmux-sessions' && taskSession && entry.key === taskSession) {
|
|
611
618
|
// Additions only: a task session that existed at task start and is gone
|
|
612
619
|
// falls through to `removed` below like everything else (#1624).
|
|
@@ -632,6 +639,9 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
632
639
|
if (isIgnoredByConfig(entry)) {
|
|
633
640
|
ignoredByConfig.push(change);
|
|
634
641
|
}
|
|
642
|
+
else if (isIgnoredBuiltIn(entry)) {
|
|
643
|
+
ignoredBuiltIn.push(change);
|
|
644
|
+
}
|
|
635
645
|
else if (tmuxServerSurvived &&
|
|
636
646
|
change.owner !== 'self' &&
|
|
637
647
|
otherServerSessions.has(entry.key)) {
|
|
@@ -661,6 +671,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
|
661
671
|
removedByOtherRepository,
|
|
662
672
|
removedStaleDemoVitest,
|
|
663
673
|
ignoredByConfig,
|
|
674
|
+
ignoredBuiltIn,
|
|
664
675
|
};
|
|
665
676
|
});
|
|
666
677
|
// A measured violation is a verdict and outranks an unmeasured probe; an
|
|
@@ -735,6 +746,20 @@ function formatIgnoredByConfig(changes) {
|
|
|
735
746
|
const names = changes.map((change) => change.key).join(', ');
|
|
736
747
|
return [` ignored (options.envCleanIgnoreHomeEntries): ${names}`];
|
|
737
748
|
}
|
|
749
|
+
/** Built-in `home-entries` exclusions (zsh compinit cache), on their own line (#3672). */
|
|
750
|
+
function formatIgnoredBuiltIn(changes) {
|
|
751
|
+
if (changes.length === 0)
|
|
752
|
+
return [];
|
|
753
|
+
const names = changes.map((change) => change.key).join(', ');
|
|
754
|
+
return [` ignored (built-in): ${names}`];
|
|
755
|
+
}
|
|
756
|
+
/** Additions excused as another worktree's, named on a clean report (#3683). */
|
|
757
|
+
function formatIgnoredAttributed(changes) {
|
|
758
|
+
if (changes.length === 0)
|
|
759
|
+
return [];
|
|
760
|
+
const names = changes.map((change) => change.key).join(', ');
|
|
761
|
+
return [` ignored (attributed to another worktree): ${names}`];
|
|
762
|
+
}
|
|
738
763
|
/**
|
|
739
764
|
* The header's account of what could be excused, so a report judged against a
|
|
740
765
|
* baseline written before #2472 says why the task's own session was not.
|
|
@@ -765,6 +790,8 @@ function formatEnvCleanReport(diff) {
|
|
|
765
790
|
lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
|
|
766
791
|
lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
|
|
767
792
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
793
|
+
lines.push(...formatIgnoredBuiltIn(probe.ignoredBuiltIn));
|
|
794
|
+
lines.push(...formatIgnoredAttributed(probe.ignoredAdded));
|
|
768
795
|
continue;
|
|
769
796
|
}
|
|
770
797
|
lines.push(` ${probe.probeId} VIOLATED (${label}): +${probe.added.length} -${probe.removed.length}`);
|
|
@@ -775,6 +802,7 @@ function formatEnvCleanReport(diff) {
|
|
|
775
802
|
lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
|
|
776
803
|
lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
|
|
777
804
|
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
805
|
+
lines.push(...formatIgnoredBuiltIn(probe.ignoredBuiltIn));
|
|
778
806
|
for (const excused of probe.ignoredAdded) {
|
|
779
807
|
lines.push(` · ${excused.key} (ignored: belongs to another worktree)`);
|
|
780
808
|
}
|