commandmate 0.49.0 → 0.49.2
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 +251 -248
- package/.next/app-path-routes-manifest.json +22 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.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_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/[relayId]/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
- 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.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.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +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.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.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_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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +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_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_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 +144 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.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.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.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.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.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/1062.js +1 -0
- package/.next/server/chunks/{936.js → 110.js} +1 -1
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/{4280.js → 3756.js} +1 -1
- package/.next/server/chunks/3801.js +31 -0
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/{9130.js → 5630.js} +1 -1
- package/.next/server/chunks/610.js +1 -0
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6808.js +4 -0
- package/.next/server/chunks/7023.js +14 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +8 -8
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +63 -53
- package/.next/server/chunks/8918.js +103 -1
- package/.next/server/chunks/9198.js +144 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-07a237575e1ceb9e.js} +1 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/page-c6eb7c02db2f4c80.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +1 -0
- package/.next/static/css/c1e307d05daf93b6.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +233 -17
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +39 -5
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +100 -8
- package/dist/cli/commands/relays.d.ts +26 -2
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +70 -5
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +22 -5
- package/dist/cli/commands/respond.d.ts +12 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +83 -18
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +14 -8
- package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
- package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
- package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
- package/dist/cli/commands/wait-instance.d.ts +29 -0
- package/dist/cli/commands/wait-instance.d.ts.map +1 -0
- package/dist/cli/commands/wait-instance.js +56 -0
- package/dist/cli/commands/wait-notices.d.ts +87 -0
- package/dist/cli/commands/wait-notices.d.ts.map +1 -0
- package/dist/cli/commands/wait-notices.js +301 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
- package/dist/cli/commands/wait-poll-state.d.ts +136 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-state.js +6 -0
- package/dist/cli/commands/wait-timing.d.ts +46 -0
- package/dist/cli/commands/wait-timing.d.ts.map +1 -0
- package/dist/cli/commands/wait-timing.js +99 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
- package/dist/cli/commands/wait-turn-boundary.js +427 -0
- package/dist/cli/commands/wait-verify.d.ts +51 -0
- package/dist/cli/commands/wait-verify.d.ts.map +1 -0
- package/dist/cli/commands/wait-verify.js +128 -0
- package/dist/cli/commands/wait.d.ts +6 -105
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +240 -968
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +24 -1
- package/dist/cli/types/api-responses.d.ts +49 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +69 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +226 -18
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +80 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +147 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/session/send-attempt-types.d.ts +48 -1
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +18 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +20 -3
- package/dist/server/locales/ja/worktree.json +20 -3
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +54 -11
- package/dist/server/src/lib/cli-tools/antigravity.js +45 -9
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/codex.js +67 -15
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
- package/dist/server/src/lib/cli-tools/command-code.js +7 -3
- package/dist/server/src/lib/cli-tools/copilot.js +125 -33
- package/dist/server/src/lib/cli-tools/gemini.js +37 -10
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +60 -15
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +590 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +512 -620
- package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
- package/dist/server/src/lib/db/migrations/runner.js +37 -4
- package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
- package/dist/server/src/lib/db/relay-bind-db.js +437 -0
- package/dist/server/src/lib/db/relay-db.js +59 -96
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/upstream-faults.js +40 -6
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
- package/dist/server/src/lib/polling/response-checker.js +7 -5
- package/dist/server/src/lib/prompt-answer-errors.js +362 -0
- package/dist/server/src/lib/prompt-answer-sender.js +264 -288
- package/dist/server/src/lib/push/failure-episode-state.js +4 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
- package/dist/server/src/lib/realtime-snippet.js +54 -0
- package/dist/server/src/lib/relay/relay-bind.js +294 -0
- package/dist/server/src/lib/relay/relay-boot.js +51 -0
- package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
- package/dist/server/src/lib/relay/relay-delivery.js +134 -220
- package/dist/server/src/lib/relay/relay-messages.js +39 -4
- package/dist/server/src/lib/relay/relay-overlap.js +92 -0
- package/dist/server/src/lib/relay/relay-system-line.js +3 -2
- package/dist/server/src/lib/relay/types.js +12 -1
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +23 -0
- package/dist/server/src/lib/session/claude-session.js +59 -8
- package/dist/server/src/lib/session/composer-clear.js +54 -1
- package/dist/server/src/lib/session/current-output-builder.js +26 -8
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +664 -0
- package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
- package/dist/server/src/lib/session/send-attempt-state.js +65 -0
- package/dist/server/src/lib/session/send-attempt-types.js +18 -1
- package/dist/server/src/lib/session/send-user-message.js +84 -14
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +12 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +0 -27
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.1.json +66 -0
- package/release-notes/0.49.2.json +49 -0
- package/.next/server/chunks/1210.js +0 -1
- package/.next/server/chunks/1945.js +0 -14
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/4194.js +0 -67
- package/.next/server/chunks/5845.js +0 -1
- package/.next/server/chunks/720.js +0 -103
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9540.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
- package/.next/static/chunks/9079-987939d231704218.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
- package/.next/static/css/db8959555c3d9c96.css +0 -1
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* the promptType/defaultOptionNumber fallback introduced in Bug1).
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.PromptAnswerAbortedError = exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.
|
|
10
|
+
exports.PromptAnswerRejectedError = exports.PromptAnswerNotDeliveredError = exports.PromptAnswerInputLostError = exports.PromptAnswerAbortedError = exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.ANSWER_NOT_DELIVERED_REASON = exports.ANSWER_MODE_KEYS_REASON = void 0;
|
|
11
11
|
exports.sendPromptAnswer = sendPromptAnswer;
|
|
12
12
|
const tmux_1 = require("./tmux/tmux");
|
|
13
13
|
const frame_1 = require("../lib/detection/tools/frame");
|
|
@@ -19,6 +19,23 @@ const models_1 = require("../types/models");
|
|
|
19
19
|
const tmux_capture_cache_1 = require("./tmux/tmux-capture-cache");
|
|
20
20
|
const prompt_answer_semantic_1 = require("../lib/prompt-answer-semantic");
|
|
21
21
|
const cli_tool_timing_config_1 = require("../config/cli-tool-timing-config");
|
|
22
|
+
const auto_yes_dialog_gate_1 = require("../lib/polling/auto-yes-dialog-gate");
|
|
23
|
+
const instance_input_lock_1 = require("../lib/session/instance-input-lock");
|
|
24
|
+
const prompt_answer_errors_1 = require("./prompt-answer-errors");
|
|
25
|
+
// Issue #3965: the refusals and their reason codes live in `prompt-answer-errors`
|
|
26
|
+
// and are re-exported here, so every caller keeps importing them from this module.
|
|
27
|
+
var prompt_answer_errors_2 = require("./prompt-answer-errors");
|
|
28
|
+
Object.defineProperty(exports, "ANSWER_MODE_KEYS_REASON", { enumerable: true, get: function () { return prompt_answer_errors_2.ANSWER_MODE_KEYS_REASON; } });
|
|
29
|
+
Object.defineProperty(exports, "ANSWER_NOT_DELIVERED_REASON", { enumerable: true, get: function () { return prompt_answer_errors_2.ANSWER_NOT_DELIVERED_REASON; } });
|
|
30
|
+
Object.defineProperty(exports, "FREE_TEXT_AT_MENU_ROW_REASON", { enumerable: true, get: function () { return prompt_answer_errors_2.FREE_TEXT_AT_MENU_ROW_REASON; } });
|
|
31
|
+
Object.defineProperty(exports, "FreeTextAnswerRejectedError", { enumerable: true, get: function () { return prompt_answer_errors_2.FreeTextAnswerRejectedError; } });
|
|
32
|
+
Object.defineProperty(exports, "FreeTextAtChoiceOnlyPromptError", { enumerable: true, get: function () { return prompt_answer_errors_2.FreeTextAtChoiceOnlyPromptError; } });
|
|
33
|
+
Object.defineProperty(exports, "MULTI_SELECT_NOT_COMMITTED_REASON", { enumerable: true, get: function () { return prompt_answer_errors_2.MULTI_SELECT_NOT_COMMITTED_REASON; } });
|
|
34
|
+
Object.defineProperty(exports, "MultiSelectAnswerRejectedError", { enumerable: true, get: function () { return prompt_answer_errors_2.MultiSelectAnswerRejectedError; } });
|
|
35
|
+
Object.defineProperty(exports, "PromptAnswerAbortedError", { enumerable: true, get: function () { return prompt_answer_errors_2.PromptAnswerAbortedError; } });
|
|
36
|
+
Object.defineProperty(exports, "PromptAnswerInputLostError", { enumerable: true, get: function () { return prompt_answer_errors_2.PromptAnswerInputLostError; } });
|
|
37
|
+
Object.defineProperty(exports, "PromptAnswerNotDeliveredError", { enumerable: true, get: function () { return prompt_answer_errors_2.PromptAnswerNotDeliveredError; } });
|
|
38
|
+
Object.defineProperty(exports, "PromptAnswerRejectedError", { enumerable: true, get: function () { return prompt_answer_errors_2.PromptAnswerRejectedError; } });
|
|
22
39
|
// Issue #3397: the checkbox reading (`hasCheckboxOptions`) lives in
|
|
23
40
|
// `prompt-answer-semantic`, shared with the semantic resolver and Auto-Yes.
|
|
24
41
|
/**
|
|
@@ -37,14 +54,6 @@ const cli_tool_timing_config_1 = require("../config/cli-tool-timing-config");
|
|
|
37
54
|
* has already range-checked against the option list on the FRESH frame.
|
|
38
55
|
*/
|
|
39
56
|
const SELECTION_SET_PATTERN = /^\d+(?:,\d+)*$/;
|
|
40
|
-
/**
|
|
41
|
-
* The reason code a caller gets back when a digit meets a `keys`-mode dialog
|
|
42
|
-
* (Issue #2033).
|
|
43
|
-
*
|
|
44
|
-
* Spelled as a constant because it crosses two boundaries: the API refusal body
|
|
45
|
-
* `respond` reads (`/prompt-response`), and the assertions that pin it.
|
|
46
|
-
*/
|
|
47
|
-
exports.ANSWER_MODE_KEYS_REASON = 'answer_mode_keys';
|
|
48
57
|
/**
|
|
49
58
|
* The only {@link DialogAnswerMode} a typed digit can actually drive.
|
|
50
59
|
*
|
|
@@ -61,156 +70,6 @@ const TEXT_ANSWERABLE_ANSWER_MODE = 'numbered';
|
|
|
61
70
|
* would otherwise take on a path that runs before every keystroke.
|
|
62
71
|
*/
|
|
63
72
|
const GUARD_CAPTURE_LINES = 200;
|
|
64
|
-
/**
|
|
65
|
-
* A prompt answer that was refused BEFORE any key reached the pane.
|
|
66
|
-
*
|
|
67
|
-
* The distinction matters to every caller: a throw from `sendKeys` leaves the
|
|
68
|
-
* terminal in an unknown state, whereas this one is a guarantee that nothing was
|
|
69
|
-
* typed and the dialog is still exactly as the operator left it.
|
|
70
|
-
*/
|
|
71
|
-
class PromptAnswerRejectedError extends Error {
|
|
72
|
-
/** Machine-readable code, currently always {@link ANSWER_MODE_KEYS_REASON}. */
|
|
73
|
-
reason;
|
|
74
|
-
/** The dialog family the tool vouched for, e.g. `permission` / `picker`. */
|
|
75
|
-
dialogKind;
|
|
76
|
-
/** How that dialog actually takes its answer. */
|
|
77
|
-
answerMode;
|
|
78
|
-
constructor(cliToolId, answer, dialog) {
|
|
79
|
-
super(`Refused to send "${answer}" to ${cliToolId}: its ${dialog.kind} dialog takes `
|
|
80
|
-
+ `'${dialog.answerMode}' input, not a typed number (${exports.ANSWER_MODE_KEYS_REASON}). `
|
|
81
|
-
+ 'The digit would be swallowed and the Enter after it would confirm whatever is '
|
|
82
|
-
+ 'highlighted. Nothing was sent.');
|
|
83
|
-
this.name = 'PromptAnswerRejectedError';
|
|
84
|
-
this.reason = exports.ANSWER_MODE_KEYS_REASON;
|
|
85
|
-
this.dialogKind = dialog.kind;
|
|
86
|
-
this.answerMode = dialog.answerMode;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
exports.PromptAnswerRejectedError = PromptAnswerRejectedError;
|
|
90
|
-
/**
|
|
91
|
-
* The reason code a caller gets back when free text meets a prompt whose
|
|
92
|
-
* text-bearing options are all menu rows (Issue #2573).
|
|
93
|
-
*
|
|
94
|
-
* The code `/prompt-response` already answers "this answer cannot be mapped onto
|
|
95
|
-
* a choice, and nothing was sent" with (#1681, #2522), so `respond` reports it
|
|
96
|
-
* without a new branch.
|
|
97
|
-
*/
|
|
98
|
-
exports.FREE_TEXT_AT_MENU_ROW_REASON = 'unresolvable_answer';
|
|
99
|
-
/**
|
|
100
|
-
* The sentence for each refusal, built from a tool id and option numbers only.
|
|
101
|
-
*
|
|
102
|
-
* Fixed text, a tool id and option numbers, never the answer (SEC-003, as in
|
|
103
|
-
* `prompt-answer-semantic`): the answer is whatever the operator typed, and
|
|
104
|
-
* `/prompt-response` returns this message to the client verbatim.
|
|
105
|
-
*
|
|
106
|
-
* The two sentences sit side by side on purpose. They differ in the one thing
|
|
107
|
-
* the operator has to act on — what to do next — and that is only comparable
|
|
108
|
-
* when both are readable at once.
|
|
109
|
-
*/
|
|
110
|
-
function freeTextRefusalMessage(cliToolId, optionNumbers, detail) {
|
|
111
|
-
const numbers = optionNumbers.join(', ');
|
|
112
|
-
if (detail === undefined) {
|
|
113
|
-
return `Refused to type free text at ${cliToolId}'s prompt: option ${numbers} `
|
|
114
|
-
+ 'reads as taking your own words, but on this screen it is a menu row, not a text field. '
|
|
115
|
-
+ 'The text would be ignored and the Enter after it would confirm whatever is highlighted. '
|
|
116
|
-
+ 'Nothing was sent. Answer with the option number, then send the instructions as a message.';
|
|
117
|
-
}
|
|
118
|
-
return `Refused to type free text at ${cliToolId}'s prompt: option ${numbers} is the text field `
|
|
119
|
-
+ `on this screen, but the cursor is on option ${detail.cursorOptionNumber}. The text would be `
|
|
120
|
-
+ `ignored and the Enter after it would confirm option ${detail.cursorOptionNumber}. Nothing `
|
|
121
|
-
+ 'was sent. Move the cursor onto the text field in the terminal and send the text again — '
|
|
122
|
-
+ 'sending its option number does not move the cursor, it selects nothing.';
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Free text refused BEFORE any key reached the pane (Issue #2573, #2584).
|
|
126
|
-
*
|
|
127
|
-
* A sibling of {@link PromptAnswerRejectedError}, not a use of it, because the
|
|
128
|
-
* two cite different evidence. That one cites the dialog the tool's own rules
|
|
129
|
-
* vouched for (`dialogKind` / `answerMode`), and no such verdict can decide this
|
|
130
|
-
* case: Command Code has had rules since Issue #2574, and the permission dialog
|
|
131
|
-
* this guard is first about is vouched `numbered` — the verdict that lets a
|
|
132
|
-
* DIGIT through — while the `AskUserQuestion` screen whose free text must keep
|
|
133
|
-
* working is deliberately not recognised by those rules at all
|
|
134
|
-
* (`tools/command-code/permission.ts`). `answerMode` says how a CHOICE is
|
|
135
|
-
* pressed; it says nothing about which row is a text field, nor about which row
|
|
136
|
-
* the cursor is on. So what this one cites is the rows.
|
|
137
|
-
*
|
|
138
|
-
* One class rather than two because `/prompt-response` is out of reach of both
|
|
139
|
-
* Issues' scope and matches this type by `instanceof` to report the refusal at
|
|
140
|
-
* all; {@link FreeTextRefusalKind} is what tells the two cases apart.
|
|
141
|
-
*/
|
|
142
|
-
class FreeTextAnswerRejectedError extends Error {
|
|
143
|
-
/** Machine-readable code, always {@link FREE_TEXT_AT_MENU_ROW_REASON}. */
|
|
144
|
-
reason;
|
|
145
|
-
/**
|
|
146
|
-
* The text-bearing options this refusal is about: the menu rows for
|
|
147
|
-
* `menu_row`, the measured text field(s) for `cursor_elsewhere`.
|
|
148
|
-
*/
|
|
149
|
-
optionNumbers;
|
|
150
|
-
/** Which measurement refused (Issue #2584). */
|
|
151
|
-
kind;
|
|
152
|
-
/** The option the Enter would have confirmed, or null for `menu_row`. */
|
|
153
|
-
cursorOptionNumber;
|
|
154
|
-
constructor(cliToolId, optionNumbers, detail) {
|
|
155
|
-
super(freeTextRefusalMessage(cliToolId, optionNumbers, detail));
|
|
156
|
-
this.name = 'FreeTextAnswerRejectedError';
|
|
157
|
-
this.reason = exports.FREE_TEXT_AT_MENU_ROW_REASON;
|
|
158
|
-
this.optionNumbers = optionNumbers;
|
|
159
|
-
this.kind = detail?.kind ?? 'menu_row';
|
|
160
|
-
this.cursorOptionNumber = detail?.cursorOptionNumber ?? null;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
exports.FreeTextAnswerRejectedError = FreeTextAnswerRejectedError;
|
|
164
|
-
/**
|
|
165
|
-
* Free text refused because NO row on the screen takes typed text (Issue #2583).
|
|
166
|
-
*
|
|
167
|
-
* ## The hole #2573 left
|
|
168
|
-
*
|
|
169
|
-
* {@link FreeTextAnswerRejectedError} looks for rows that READ as taking the
|
|
170
|
-
* operator's own words (`requiresTextInput`, i.e. `TEXT_INPUT_PATTERNS`) and
|
|
171
|
-
* only judges the answer when it finds at least one. A permission dialog with
|
|
172
|
-
* no such row was therefore never judged at all, and the text arm typed the
|
|
173
|
-
* answer and pressed Enter. Measured on 2026-09-16 against develop `9f4b4e29`:
|
|
174
|
-
*
|
|
175
|
-
* | tool | dialog | rows | result |
|
|
176
|
-
* |------|--------|------|--------|
|
|
177
|
-
* | Claude Code 2.1.273 | Bash command | `1. Yes` / `2. Yes, and always allow access to …` / `3. Yes, and switch to auto mode` / `4. No` | `success: true`, the `mkdir` RAN |
|
|
178
|
-
* | Antigravity 1.2.3 | Run this command? | `1. Yes, run command` / `2. Yes, and always allow …` / `3. Yes, … (Persist to settings.json)` / `4. No, cancel` | `success: true`, the `mkdir` RAN |
|
|
179
|
-
*
|
|
180
|
-
* Same screens, but with a path containing the word `custom`, `/custom/i`
|
|
181
|
-
* flagged the quoting row and #2573's guard refused. So what was left decided
|
|
182
|
-
* whether a refusal meaning "do not do this" approved instead: the SPELLING of
|
|
183
|
-
* the command being approved.
|
|
184
|
-
*
|
|
185
|
-
* ## What the caller is told, and why the count rather than the rows
|
|
186
|
-
*
|
|
187
|
-
* There is no row to name here — that is the whole condition — so the message
|
|
188
|
-
* cites how many options the screen has and points at the option number. It
|
|
189
|
-
* never quotes the answer (SEC-003, as in `prompt-answer-semantic`): the answer
|
|
190
|
-
* is whatever the operator typed and `/prompt-response` hands this message back
|
|
191
|
-
* to the client verbatim.
|
|
192
|
-
*
|
|
193
|
-
* Shares {@link FREE_TEXT_AT_MENU_ROW_REASON} with its sibling deliberately:
|
|
194
|
-
* the reason code is what `respond` and `/prompt-response` branch on, and both
|
|
195
|
-
* cases are the same promise to the caller — the answer could not be mapped onto
|
|
196
|
-
* a choice and NOTHING was sent.
|
|
197
|
-
*/
|
|
198
|
-
class FreeTextAtChoiceOnlyPromptError extends Error {
|
|
199
|
-
/** Machine-readable code, always {@link FREE_TEXT_AT_MENU_ROW_REASON}. */
|
|
200
|
-
reason;
|
|
201
|
-
/** How many options the screen offers, none of which is a text field. */
|
|
202
|
-
optionCount;
|
|
203
|
-
constructor(cliToolId, optionCount) {
|
|
204
|
-
super(`Refused to type free text at ${cliToolId}'s prompt: none of its ${optionCount} options is a `
|
|
205
|
-
+ 'text field on this screen, so the text would be ignored and the Enter after it would '
|
|
206
|
-
+ 'confirm whatever is highlighted. Nothing was sent. Answer with the option number instead, '
|
|
207
|
-
+ 'then send your instructions as a separate message.');
|
|
208
|
-
this.name = 'FreeTextAtChoiceOnlyPromptError';
|
|
209
|
-
this.reason = exports.FREE_TEXT_AT_MENU_ROW_REASON;
|
|
210
|
-
this.optionCount = optionCount;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
exports.FreeTextAtChoiceOnlyPromptError = FreeTextAtChoiceOnlyPromptError;
|
|
214
73
|
/**
|
|
215
74
|
* The pane to judge the tool's own dialog rules against.
|
|
216
75
|
*
|
|
@@ -300,7 +159,7 @@ async function assertAnswerModeAcceptsNumber(params) {
|
|
|
300
159
|
return null;
|
|
301
160
|
if (dialog.answerMode === TEXT_ANSWERABLE_ANSWER_MODE)
|
|
302
161
|
return dialog;
|
|
303
|
-
throw new PromptAnswerRejectedError(params.cliToolId, params.answer, dialog);
|
|
162
|
+
throw new prompt_answer_errors_1.PromptAnswerRejectedError(params.cliToolId, params.answer, dialog);
|
|
304
163
|
}
|
|
305
164
|
/**
|
|
306
165
|
* Resolve the effective SubmitMode from the dialog on screen, promptData, fallback, and default.
|
|
@@ -435,11 +294,11 @@ function assertFreeTextHasATextField(params) {
|
|
|
435
294
|
// a screen that has at least one candidate, and this branch is the screen that
|
|
436
295
|
// has none.
|
|
437
296
|
if (textBearing.length === 0) {
|
|
438
|
-
throw new FreeTextAtChoiceOnlyPromptError(params.cliToolId, promptData.options.length);
|
|
297
|
+
throw new prompt_answer_errors_1.FreeTextAtChoiceOnlyPromptError(params.cliToolId, promptData.options.length);
|
|
439
298
|
}
|
|
440
299
|
if (textBearing.some(prompt_detect_multiple_choice_1.isTypedTextFieldOption))
|
|
441
300
|
return;
|
|
442
|
-
throw new FreeTextAnswerRejectedError(params.cliToolId, textBearing.map((option) => option.number));
|
|
301
|
+
throw new prompt_answer_errors_1.FreeTextAnswerRejectedError(params.cliToolId, textBearing.map((option) => option.number));
|
|
443
302
|
}
|
|
444
303
|
/**
|
|
445
304
|
* Refuse free text while the cursor is on another row (Issue #2584).
|
|
@@ -515,57 +374,8 @@ function assertFreeTextCursorIsOnTheField(params) {
|
|
|
515
374
|
return;
|
|
516
375
|
if ((0, prompt_detect_multiple_choice_1.isTypedTextFieldOption)(cursor))
|
|
517
376
|
return;
|
|
518
|
-
throw new FreeTextAnswerRejectedError(params.cliToolId, fields.map((option) => option.number), { kind: 'cursor_elsewhere', cursorOptionNumber: cursor.number });
|
|
377
|
+
throw new prompt_answer_errors_1.FreeTextAnswerRejectedError(params.cliToolId, fields.map((option) => option.number), { kind: 'cursor_elsewhere', cursorOptionNumber: cursor.number });
|
|
519
378
|
}
|
|
520
|
-
/**
|
|
521
|
-
* The reason code every Command Code multi-select refusal carries
|
|
522
|
-
* (Issue #2755).
|
|
523
|
-
*
|
|
524
|
-
* Shares the shape of {@link ANSWER_MODE_KEYS_REASON} and
|
|
525
|
-
* {@link FREE_TEXT_AT_MENU_ROW_REASON} — a machine-readable code the API and
|
|
526
|
-
* `respond` branch on — and means one thing: **the question was not
|
|
527
|
-
* committed.** What varies is how far the arm got, which
|
|
528
|
-
* {@link MultiSelectAnswerRejectedError.stage} says.
|
|
529
|
-
*/
|
|
530
|
-
exports.MULTI_SELECT_NOT_COMMITTED_REASON = 'multi_select_not_committed';
|
|
531
|
-
/**
|
|
532
|
-
* A Command Code checkbox answer that did not reach the agent (Issue #2755).
|
|
533
|
-
*
|
|
534
|
-
* The sibling of {@link PromptAnswerRejectedError} for the two-stage confirm.
|
|
535
|
-
* Unlike that one it does NOT always promise an untouched pane — ticking boxes
|
|
536
|
-
* is the first half of this answer and it may already have happened — so
|
|
537
|
-
* {@link keysSent} says which of the two the caller is looking at. What it does
|
|
538
|
-
* promise in every case is that the question was **not submitted**: the arm
|
|
539
|
-
* stops before the confirm row whenever the screen it re-read is not the one it
|
|
540
|
-
* was asked to answer.
|
|
541
|
-
*
|
|
542
|
-
* Fixed text, a tool id and option numbers only (SEC-003, as in
|
|
543
|
-
* `prompt-answer-semantic`): `/prompt-response` returns this message verbatim.
|
|
544
|
-
*/
|
|
545
|
-
class MultiSelectAnswerRejectedError extends Error {
|
|
546
|
-
/** Machine-readable code, always {@link MULTI_SELECT_NOT_COMMITTED_REASON}. */
|
|
547
|
-
reason;
|
|
548
|
-
stage;
|
|
549
|
-
/** Whether any key reached the pane before the refusal. */
|
|
550
|
-
keysSent;
|
|
551
|
-
/** The set the caller asked for, ascending. */
|
|
552
|
-
wanted;
|
|
553
|
-
constructor(stage, keysSent, wanted) {
|
|
554
|
-
super(`The question was not submitted (${stage}). `
|
|
555
|
-
+ (keysSent
|
|
556
|
-
? 'Some boxes may have been ticked, but the confirm row was not pressed, so the '
|
|
557
|
-
+ 'question is still on screen exactly as the pane shows it. '
|
|
558
|
-
: 'No key was sent. ')
|
|
559
|
-
+ `Requested selection: ${wanted.join(', ')}. Check the terminal and answer it there, or `
|
|
560
|
-
+ 'retry once the screen has settled.');
|
|
561
|
-
this.name = 'MultiSelectAnswerRejectedError';
|
|
562
|
-
this.reason = exports.MULTI_SELECT_NOT_COMMITTED_REASON;
|
|
563
|
-
this.stage = stage;
|
|
564
|
-
this.keysSent = keysSent;
|
|
565
|
-
this.wanted = wanted;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
exports.MultiSelectAnswerRejectedError = MultiSelectAnswerRejectedError;
|
|
569
379
|
/**
|
|
570
380
|
* Is this request a Command Code checkbox answer? (Issue #2755)
|
|
571
381
|
*
|
|
@@ -665,10 +475,10 @@ async function recaptureAfterKeys(sessionName) {
|
|
|
665
475
|
* @throws {MultiSelectAnswerRejectedError} whenever the question was not
|
|
666
476
|
* committed; `keysSent` says whether the pane was touched.
|
|
667
477
|
*/
|
|
668
|
-
async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent, touch) {
|
|
478
|
+
async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent, touch, assertOwned = () => { }) {
|
|
669
479
|
const cursor = promptData.options.find((option) => option.isDefault === true);
|
|
670
480
|
if (cursor === undefined) {
|
|
671
|
-
throw new MultiSelectAnswerRejectedError('cursor-unknown', false, wanted);
|
|
481
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('cursor-unknown', false, wanted);
|
|
672
482
|
}
|
|
673
483
|
// 1. The symmetric difference, ascending, one digit per press. An empty one
|
|
674
484
|
// sends nothing at all — the set on screen is already the set asked for,
|
|
@@ -679,6 +489,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
679
489
|
...current.filter((n) => !wanted.includes(n)),
|
|
680
490
|
].sort((a, b) => a - b);
|
|
681
491
|
if (toggles.length > 0) {
|
|
492
|
+
assertOwned(false);
|
|
682
493
|
await sendSpecialKeysWhileCurrent(sessionName, toggles.map(String), stillCurrent, touch);
|
|
683
494
|
}
|
|
684
495
|
const keysSent = toggles.length > 0;
|
|
@@ -687,7 +498,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
687
498
|
const afterToggle = await recaptureAfterKeys(sessionName);
|
|
688
499
|
assertStillCurrent(stillCurrent, keysSent);
|
|
689
500
|
if (afterToggle === null) {
|
|
690
|
-
throw new MultiSelectAnswerRejectedError('recapture-failed', keysSent, wanted);
|
|
501
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('recapture-failed', keysSent, wanted);
|
|
691
502
|
}
|
|
692
503
|
const reading = (0, dialog_1.readCommandCodeQuestionDialog)(afterToggle);
|
|
693
504
|
if (reading.kind !== 'prompt' ||
|
|
@@ -695,11 +506,11 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
695
506
|
reading.prompt.promptData.multiSelect !== true ||
|
|
696
507
|
reading.prompt.promptData.question !== promptData.question ||
|
|
697
508
|
reading.prompt.promptData.options.length !== promptData.options.length) {
|
|
698
|
-
throw new MultiSelectAnswerRejectedError('screen-changed', keysSent, wanted);
|
|
509
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('screen-changed', keysSent, wanted);
|
|
699
510
|
}
|
|
700
511
|
const verified = reading.prompt.promptData;
|
|
701
512
|
if (!sameNumbers(tickedNumbers(verified), [...wanted])) {
|
|
702
|
-
throw new MultiSelectAnswerRejectedError('toggle-mismatch', keysSent, wanted);
|
|
513
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('toggle-mismatch', keysSent, wanted);
|
|
703
514
|
}
|
|
704
515
|
// 3. Walk to the confirm row and open it. `Down` is the only movement key
|
|
705
516
|
// measured to be deterministic here: it steps one row at a time through
|
|
@@ -710,8 +521,10 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
710
521
|
// been built from a slightly older frame.
|
|
711
522
|
const cursorNow = verified.options.find((option) => option.isDefault === true);
|
|
712
523
|
if (cursorNow === undefined) {
|
|
713
|
-
throw new MultiSelectAnswerRejectedError('cursor-unknown', keysSent, wanted);
|
|
524
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('cursor-unknown', keysSent, wanted);
|
|
714
525
|
}
|
|
526
|
+
// Issue #3952 review P2: the input held since the toggles, across the re-read.
|
|
527
|
+
assertOwned(keysSent);
|
|
715
528
|
await sendSpecialKeysWhileCurrent(sessionName, [...downKeys(verified.options.length - cursorNow.number + 1), 'Enter'], stillCurrent, touch);
|
|
716
529
|
// 4. The second stage. `Submit` opens the Review page and the answer is sent
|
|
717
530
|
// from there; `Next` advances to the following question, which IS the
|
|
@@ -719,15 +532,16 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
719
532
|
const afterConfirm = await recaptureAfterKeys(sessionName);
|
|
720
533
|
assertStillCurrent(stillCurrent, true);
|
|
721
534
|
if (afterConfirm === null) {
|
|
722
|
-
throw new MultiSelectAnswerRejectedError('recapture-failed', true, wanted);
|
|
535
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('recapture-failed', true, wanted);
|
|
723
536
|
}
|
|
724
537
|
const review = (0, selection_shape_1.readCommandCodeReviewPage)(afterConfirm);
|
|
725
538
|
if (review !== null) {
|
|
726
539
|
// Reached with answers still missing — the `d` shape. Confirming it would
|
|
727
540
|
// send `No answer` for questions nobody has been shown (Issue #2755 §7).
|
|
728
541
|
if (review.hasUnansweredWarning) {
|
|
729
|
-
throw new MultiSelectAnswerRejectedError('review-unanswered', true, wanted);
|
|
542
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('review-unanswered', true, wanted);
|
|
730
543
|
}
|
|
544
|
+
assertOwned(true);
|
|
731
545
|
await sendSpecialKeysWhileCurrent(sessionName, ['Enter'], stillCurrent, touch);
|
|
732
546
|
return;
|
|
733
547
|
}
|
|
@@ -736,26 +550,125 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
|
|
|
736
550
|
next.prompt.promptData?.type === 'multiple_choice' &&
|
|
737
551
|
next.prompt.promptData.question !== promptData.question;
|
|
738
552
|
if (!advanced) {
|
|
739
|
-
throw new MultiSelectAnswerRejectedError('not-committed', true, wanted);
|
|
553
|
+
throw new prompt_answer_errors_1.MultiSelectAnswerRejectedError('not-committed', true, wanted);
|
|
740
554
|
}
|
|
741
555
|
}
|
|
556
|
+
/** The prompt a frame shows, read as `/prompt-response` verifies one; null when none is answerable. */
|
|
557
|
+
function readAnswerablePrompt(cliToolId, frame) {
|
|
558
|
+
const { promptCheck, refusal } = (0, auto_yes_dialog_gate_1.assessPromptAnswerability)(cliToolId, frame);
|
|
559
|
+
if (refusal || !promptCheck?.isPrompt)
|
|
560
|
+
return null;
|
|
561
|
+
return promptCheck.promptData ?? null;
|
|
562
|
+
}
|
|
563
|
+
/** A text as compared: runs of whitespace as one, and no cursor glyphs (`❯ 1. Yes` is `1. Yes`). */
|
|
564
|
+
function comparable(text) {
|
|
565
|
+
return (text ?? '').replace(/[❯›▶]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
566
|
+
}
|
|
567
|
+
function sameText(a, b) {
|
|
568
|
+
return comparable(a) === comparable(b);
|
|
569
|
+
}
|
|
742
570
|
/**
|
|
743
|
-
*
|
|
744
|
-
*
|
|
745
|
-
*
|
|
746
|
-
*
|
|
571
|
+
* Whether two readings are the same prompt to answer: its kind, its wording,
|
|
572
|
+
* its options' labels and — when both readings have one — what it asks approval
|
|
573
|
+
* for. The cursor (`isDefault`, the `❯` in the approval block) is not compared:
|
|
574
|
+
* moving it does not make it another prompt.
|
|
747
575
|
*/
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
576
|
+
function samePromptTarget(target, now) {
|
|
577
|
+
if (target.type !== now.type || !sameText(target.question, now.question))
|
|
578
|
+
return false;
|
|
579
|
+
if (target.approvalTarget !== undefined && now.approvalTarget !== undefined) {
|
|
580
|
+
if (!sameText(target.approvalTarget, now.approvalTarget))
|
|
581
|
+
return false;
|
|
582
|
+
}
|
|
583
|
+
if (target.type === 'multiple_choice' && now.type === 'multiple_choice') {
|
|
584
|
+
if (target.options.length !== now.options.length)
|
|
585
|
+
return false;
|
|
586
|
+
return target.options.every((option, i) => sameText(option.label, now.options[i].label));
|
|
756
587
|
}
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* The re-check an answer makes once it owns the session's input after another
|
|
592
|
+
* writer (Issue #3952): the caller still acts (Auto-Yes's `stillCurrent`), and
|
|
593
|
+
* a fresh capture still shows the prompt the answer was decided for — the one
|
|
594
|
+
* read off the caller's frame, else the caller's `promptData`, else any
|
|
595
|
+
* answerable prompt. Returns that fresh reading, or null when it does not.
|
|
596
|
+
*/
|
|
597
|
+
async function answerTargetStillOnScreen(params) {
|
|
598
|
+
if (params.stillCurrent && !params.stillCurrent())
|
|
599
|
+
return null;
|
|
600
|
+
const now = readAnswerablePrompt(params.cliToolId, await (0, tmux_1.capturePane)(params.sessionName, GUARD_CAPTURE_LINES));
|
|
601
|
+
if (now === null)
|
|
602
|
+
return null;
|
|
603
|
+
const target = (params.frame !== undefined ? readAnswerablePrompt(params.cliToolId, params.frame) : null)
|
|
604
|
+
?? params.promptData
|
|
605
|
+
?? null;
|
|
606
|
+
return target === null || samePromptTarget(target, now) ? now : null;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* The caller's last look before the first key (review P1-2, P1-b): asked right
|
|
610
|
+
* before it, whether or not anything was read again — a guard's capture or the
|
|
611
|
+
* lock's admission is an await the contract can change across.
|
|
612
|
+
*/
|
|
613
|
+
function stillAllowedNow(params) {
|
|
614
|
+
return params.stillAllowedAtSend === undefined || params.stillAllowedAtSend();
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Run an answer's keys as the session's input writer (Issue #3952): a send in
|
|
618
|
+
* progress is waited out, and the prompt is read again after it. The keys are
|
|
619
|
+
* built from that fresh reading (review P1-1: the cursor may have moved), and
|
|
620
|
+
* the caller's `stillAllowedAtSend` is asked again right before the first key
|
|
621
|
+
* (review P1-2: the contract may have changed during the wait). Refused, the
|
|
622
|
+
* answer throws {@link PromptAnswerNotDeliveredError} with nothing typed.
|
|
623
|
+
*/
|
|
624
|
+
async function sendAsInputWriter(params, readMark, send) {
|
|
625
|
+
let reread = null;
|
|
626
|
+
const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(params.sessionName, readMark, async () => {
|
|
627
|
+
reread = await answerTargetStillOnScreen(params);
|
|
628
|
+
return reread !== null;
|
|
629
|
+
}, async (ticket) => {
|
|
630
|
+
// Review P1-b: always, wait or no wait — see `stillAllowedNow`.
|
|
631
|
+
if (!stillAllowedNow(params))
|
|
632
|
+
return 'answer-withheld';
|
|
633
|
+
// Review P2: every key of the answer goes out only while its ticket is
|
|
634
|
+
// current; a session replaced part-way gets none of the rest.
|
|
635
|
+
let lost = false;
|
|
636
|
+
const owned = () => {
|
|
637
|
+
if (ticket.isCurrent())
|
|
638
|
+
return true;
|
|
639
|
+
lost = true;
|
|
640
|
+
return false;
|
|
641
|
+
};
|
|
642
|
+
const callerStillCurrent = params.stillCurrent;
|
|
643
|
+
const keys = {
|
|
644
|
+
stillCurrent: () => owned() && (callerStillCurrent === undefined || callerStillCurrent()),
|
|
645
|
+
assertOwned: (keysSent) => {
|
|
646
|
+
if (owned())
|
|
647
|
+
return;
|
|
648
|
+
if (keysSent)
|
|
649
|
+
throw new prompt_answer_errors_1.PromptAnswerInputLostError(params.sessionName);
|
|
650
|
+
throw new prompt_answer_errors_1.PromptAnswerNotDeliveredError('input-lock-lost', params.sessionName);
|
|
651
|
+
},
|
|
652
|
+
};
|
|
653
|
+
try {
|
|
654
|
+
return await send(reread, keys);
|
|
655
|
+
}
|
|
656
|
+
catch (error) {
|
|
657
|
+
// The joined `stillCurrent` said no because of the ticket, not the
|
|
658
|
+
// caller: say which, as `assertOwned` does.
|
|
659
|
+
if (lost && error instanceof prompt_answer_errors_1.PromptAnswerAbortedError) {
|
|
660
|
+
if (error.keysSent)
|
|
661
|
+
throw new prompt_answer_errors_1.PromptAnswerInputLostError(params.sessionName);
|
|
662
|
+
throw new prompt_answer_errors_1.PromptAnswerNotDeliveredError('input-lock-lost', params.sessionName);
|
|
663
|
+
}
|
|
664
|
+
throw error;
|
|
665
|
+
}
|
|
666
|
+
});
|
|
667
|
+
if (!outcome.answered)
|
|
668
|
+
throw new prompt_answer_errors_1.PromptAnswerNotDeliveredError(outcome.reason, params.sessionName);
|
|
669
|
+
if (outcome.value !== undefined)
|
|
670
|
+
throw new prompt_answer_errors_1.PromptAnswerNotDeliveredError(outcome.value, params.sessionName);
|
|
757
671
|
}
|
|
758
|
-
exports.PromptAnswerAbortedError = PromptAnswerAbortedError;
|
|
759
672
|
/**
|
|
760
673
|
* What the tmux call that failed did (Issue #3880), when the error came from
|
|
761
674
|
* the transport (`TmuxSendError`, by name: test doubles of `./tmux/tmux` need
|
|
@@ -803,12 +716,15 @@ function withKeysSent(error, touch) {
|
|
|
803
716
|
/** Stop here when the caller's `stillCurrent` says no (Issue #3706). */
|
|
804
717
|
function assertStillCurrent(stillCurrent, keysSent) {
|
|
805
718
|
if (stillCurrent && !stillCurrent())
|
|
806
|
-
throw new PromptAnswerAbortedError(keysSent);
|
|
719
|
+
throw new prompt_answer_errors_1.PromptAnswerAbortedError(keysSent);
|
|
807
720
|
}
|
|
808
721
|
/**
|
|
809
722
|
* `sendSpecialKeys`, asking `stillCurrent` between the keys when the caller
|
|
810
723
|
* gave one (Issue #3706). Without it the call is exactly the old two-argument
|
|
811
|
-
* one
|
|
724
|
+
* one. Issue #3952 (review P2, fourth contract): every answer typed as the
|
|
725
|
+
* session's input writer gives one — its ticket's check, joined with Auto-Yes's
|
|
726
|
+
* generation when there is one — so a manual answer's keys stop too when the
|
|
727
|
+
* session is replaced between them.
|
|
812
728
|
*/
|
|
813
729
|
async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent, touch) {
|
|
814
730
|
if (!stillCurrent) {
|
|
@@ -841,7 +757,7 @@ async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent, touc
|
|
|
841
757
|
// By name rather than `instanceof`: test doubles of `./tmux/tmux` need not
|
|
842
758
|
// export the class.
|
|
843
759
|
if (error instanceof Error && error.name === 'SpecialKeysAbortedError') {
|
|
844
|
-
throw new PromptAnswerAbortedError(true);
|
|
760
|
+
throw new prompt_answer_errors_1.PromptAnswerAbortedError(true);
|
|
845
761
|
}
|
|
846
762
|
if (touch && Math.max(delivered, keysDeliveredOf(error)) > 0)
|
|
847
763
|
touch.touched = true;
|
|
@@ -872,6 +788,16 @@ function keysDeliveredOf(error) {
|
|
|
872
788
|
* A failure after a key of the answer reached the pane carries `keysSent: true`
|
|
873
789
|
* (Issue #3839), and a transport failure its `answerDelivery` (Issue #3880);
|
|
874
790
|
* see {@link withKeysSent}.
|
|
791
|
+
*
|
|
792
|
+
* Issue #3952: every answer that sends an Enter — the cursor arms, the text arm
|
|
793
|
+
* with its Enter, the checkbox arm — types as the session's input writer
|
|
794
|
+
* (`instance-input-lock`), from its first key to its last, so a message send
|
|
795
|
+
* cannot type between the answer's text and its Enter, and an answer waits for
|
|
796
|
+
* a send in progress and is read again after it. An `answer_only` digit sends
|
|
797
|
+
* no Enter and is typed as before.
|
|
798
|
+
*
|
|
799
|
+
* @throws {PromptAnswerNotDeliveredError} when the answer waited for another
|
|
800
|
+
* writer and was then not typed
|
|
875
801
|
*/
|
|
876
802
|
async function sendPromptAnswer(params) {
|
|
877
803
|
const touch = { touched: false };
|
|
@@ -885,6 +811,7 @@ async function sendPromptAnswer(params) {
|
|
|
885
811
|
/** {@link sendPromptAnswer}, noting in `touch` each key that reached the pane. */
|
|
886
812
|
async function sendPromptAnswerKeys(params, touch) {
|
|
887
813
|
const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber, stillCurrent } = params;
|
|
814
|
+
const readMark = params.readMark ?? (0, instance_input_lock_1.instanceInputReadMark)();
|
|
888
815
|
// Issue #2755: Command Code's checkbox question, before every guard below.
|
|
889
816
|
// Its answer is a SET (`"1,3"`), which none of them can read — `/^\d+$/` is
|
|
890
817
|
// how all three ask "is this a number?", so a set would be judged as free
|
|
@@ -894,7 +821,14 @@ async function sendPromptAnswerKeys(params, touch) {
|
|
|
894
821
|
// a two-stage confirm, not a digit and an Enter.
|
|
895
822
|
const multiSelect = readMultiSelectRequest(params);
|
|
896
823
|
if (multiSelect !== null) {
|
|
897
|
-
await
|
|
824
|
+
await sendAsInputWriter(params, readMark, async (reread, keys) => {
|
|
825
|
+
// Review P1-1: the toggles come from the ticks on the screen they go
|
|
826
|
+
// to — read again after a wait — not from the reading the request saw.
|
|
827
|
+
const shown = reread === null ? multiSelect.promptData : reread;
|
|
828
|
+
if (shown.type !== 'multiple_choice' || shown.multiSelect !== true)
|
|
829
|
+
return 'target-changed';
|
|
830
|
+
await sendCommandCodeMultiSelectAnswer(sessionName, shown, multiSelect.wanted, keys.stillCurrent, touch, keys.assertOwned);
|
|
831
|
+
});
|
|
898
832
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
899
833
|
return;
|
|
900
834
|
}
|
|
@@ -935,39 +869,45 @@ async function sendPromptAnswerKeys(params, touch) {
|
|
|
935
869
|
&& /^\d+$/.test(answer);
|
|
936
870
|
if (isCursorNavMultiChoice) {
|
|
937
871
|
const targetNum = parseInt(answer, 10);
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
872
|
+
/**
|
|
873
|
+
* The keys for the answer on a screen read as `shown`. Issue #3952 review
|
|
874
|
+
* P1-1: called again with the prompt as read under the input lock after a
|
|
875
|
+
* wait, so the offset is from where the cursor IS — a cursor that moved
|
|
876
|
+
* while the answer waited would otherwise turn "2" into a bare Enter on 1.
|
|
877
|
+
*/
|
|
878
|
+
const cursorKeys = (shown) => {
|
|
879
|
+
let defaultNum;
|
|
880
|
+
let mcOptions = null;
|
|
881
|
+
if (shown?.type === 'multiple_choice') {
|
|
882
|
+
// Primary path: use fresh promptData
|
|
883
|
+
mcOptions = shown.options;
|
|
884
|
+
const defaultOption = mcOptions.find(o => o.isDefault);
|
|
885
|
+
defaultNum = defaultOption?.number ?? 1;
|
|
886
|
+
}
|
|
887
|
+
else {
|
|
888
|
+
// Fallback path (Issue #287): promptData is undefined or type mismatch, use fallback fields
|
|
889
|
+
defaultNum = fallbackDefaultOptionNumber ?? 1;
|
|
890
|
+
}
|
|
891
|
+
const offset = targetNum - defaultNum;
|
|
892
|
+
// Detect multi-select (checkbox) prompts by checking for [ ] in option labels.
|
|
893
|
+
// Multi-select prompts require: Space to toggle checkbox -> navigate to "Next" -> Enter.
|
|
894
|
+
// Single-select prompts require: navigate to option -> Enter.
|
|
895
|
+
// Note: multi-select detection is only possible when promptData succeeded (mcOptions available).
|
|
896
|
+
const isMultiSelect = mcOptions !== null && (0, prompt_answer_semantic_1.hasCheckboxOptions)(mcOptions);
|
|
897
|
+
if (isMultiSelect && mcOptions !== null) {
|
|
898
|
+
// Multi-select: toggle checkbox, then navigate to "Next" and submit
|
|
899
|
+
const checkboxCount = mcOptions.filter(o => (0, prompt_answer_semantic_1.hasCheckboxOptions)([o])).length;
|
|
900
|
+
const keys = [
|
|
901
|
+
...buildNavigationKeys(offset), // 1. Navigate to target option
|
|
902
|
+
'Space', // 2. Toggle checkbox
|
|
903
|
+
];
|
|
904
|
+
// 3. Navigate to "Next" button (positioned right after all checkbox options)
|
|
905
|
+
const downToNext = checkboxCount - targetNum + 1;
|
|
906
|
+
keys.push(...buildNavigationKeys(downToNext));
|
|
907
|
+
// 4. Enter to submit
|
|
908
|
+
keys.push('Enter');
|
|
909
|
+
return keys;
|
|
910
|
+
}
|
|
971
911
|
// Single-select: navigate and Enter to select
|
|
972
912
|
const navigationKeys = buildNavigationKeys(offset);
|
|
973
913
|
// [Issue #807] Claude Code v2.x AskUserQuestion picker: when selecting the
|
|
@@ -978,29 +918,65 @@ async function sendPromptAnswerKeys(params, touch) {
|
|
|
978
918
|
// the Up/Down navigation already engages the cursor, so no extra nudge is
|
|
979
919
|
// needed. Old-format numbered prompts (isAskUserQuestion unset) keep their
|
|
980
920
|
// exact prior key sequence, so their response behavior is unchanged.
|
|
981
|
-
const isAskUserQuestionPicker =
|
|
982
|
-
&&
|
|
983
|
-
|
|
921
|
+
const isAskUserQuestionPicker = shown?.type === 'multiple_choice'
|
|
922
|
+
&& shown.isAskUserQuestion === true;
|
|
923
|
+
return (isAskUserQuestionPicker && offset === 0)
|
|
984
924
|
? ['Down', 'Up', 'Enter']
|
|
985
925
|
: [...navigationKeys, 'Enter'];
|
|
986
|
-
|
|
987
|
-
|
|
926
|
+
};
|
|
927
|
+
await sendAsInputWriter(params, readMark, async (reread, writer) => {
|
|
928
|
+
// A re-read that is not a choice list says nothing about the cursor:
|
|
929
|
+
// the keys cannot be placed, so none are typed.
|
|
930
|
+
if (reread !== null && reread.type !== 'multiple_choice')
|
|
931
|
+
return 'target-changed';
|
|
932
|
+
const keys = cursorKeys(reread ?? promptData);
|
|
933
|
+
writer.assertOwned(false);
|
|
934
|
+
await sendSpecialKeysWhileCurrent(sessionName, keys, writer.stillCurrent, touch);
|
|
935
|
+
});
|
|
988
936
|
}
|
|
989
937
|
else {
|
|
990
|
-
// Standard CLI prompt: send text + Enter (y/n, Approve?, etc.)
|
|
991
|
-
await (0, tmux_1.sendKeys)(sessionName, answer, false);
|
|
992
|
-
// Issue #3839: the text is on the pane; a failed Enter after it says so.
|
|
993
|
-
if (answer !== '')
|
|
994
|
-
touch.touched = true;
|
|
995
938
|
// Issue #616: Resolve submitMode and determine whether to suppress Enter
|
|
996
939
|
const resolvedSubmitMode = resolveSubmitMode(params, dialog);
|
|
997
|
-
|
|
998
|
-
//
|
|
999
|
-
await
|
|
1000
|
-
// Issue #
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
940
|
+
const typeText = async () => {
|
|
941
|
+
// Standard CLI prompt: send text + Enter (y/n, Approve?, etc.)
|
|
942
|
+
await (0, tmux_1.sendKeys)(sessionName, answer, false);
|
|
943
|
+
// Issue #3839: the text is on the pane; a failed Enter after it says so.
|
|
944
|
+
if (answer !== '')
|
|
945
|
+
touch.touched = true;
|
|
946
|
+
};
|
|
947
|
+
if (shouldSuppressEnter(params, resolvedSubmitMode, dialog)) {
|
|
948
|
+
// Issue #3952: one digit and no Enter — nothing a send could split, so
|
|
949
|
+
// not a writer of the session's input. Review P1-b: the caller's last
|
|
950
|
+
// look is still taken right before it (the guard above may have awaited
|
|
951
|
+
// a capture since the caller's own look).
|
|
952
|
+
if (!stillAllowedNow(params))
|
|
953
|
+
throw new prompt_answer_errors_1.PromptAnswerNotDeliveredError('answer-withheld', sessionName);
|
|
954
|
+
await typeText();
|
|
955
|
+
}
|
|
956
|
+
else {
|
|
957
|
+
// Issue #3952: text, wait and Enter as one writer, so no send's body can
|
|
958
|
+
// be typed in the wait and submitted by this Enter.
|
|
959
|
+
await sendAsInputWriter(params, readMark, async (reread, writer) => {
|
|
960
|
+
// Review P1-a: free text read again after a wait is judged on that
|
|
961
|
+
// reading — a field still there, and the cursor still on it (#2573 /
|
|
962
|
+
// #2584) — or the Enter after it confirms whatever row the cursor
|
|
963
|
+
// moved to. A refusal here types nothing, as the one before the wait.
|
|
964
|
+
if (reread !== null) {
|
|
965
|
+
const onScreen = { ...params, promptData: reread };
|
|
966
|
+
assertFreeTextHasATextField(onScreen);
|
|
967
|
+
assertFreeTextCursorIsOnTheField(onScreen);
|
|
968
|
+
}
|
|
969
|
+
writer.assertOwned(false);
|
|
970
|
+
await typeText();
|
|
971
|
+
// Wait a moment for the input to be processed
|
|
972
|
+
await new Promise(resolve => setTimeout(resolve, cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS));
|
|
973
|
+
// Issue #3706: the text is typed; the Enter that submits it is not.
|
|
974
|
+
assertStillCurrent(stillCurrent, true);
|
|
975
|
+
// Review P2: nor by a session that replaced this one in the wait.
|
|
976
|
+
writer.assertOwned(answer !== '');
|
|
977
|
+
// Send Enter
|
|
978
|
+
await (0, tmux_1.sendKeys)(sessionName, '', true);
|
|
979
|
+
});
|
|
1004
980
|
}
|
|
1005
981
|
}
|
|
1006
982
|
// Issue #405: Invalidate cache after sending prompt answer
|