commandmate 0.49.1 → 0.49.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +246 -243
- package/.next/app-path-routes-manifest.json +18 -17
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -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]/resolve/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +4 -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 +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.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 +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.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_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 +10 -10
- 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 +18 -17
- package/.next/server/chunks/1308.js +1 -0
- 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/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/3801.js +8 -8
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4490.js +1 -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/5350.js +212 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/7926.js +1 -0
- package/.next/server/chunks/8581.js +15 -15
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +89 -88
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9702.js +1 -0
- 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-675ba6b21844dc3b.js → 2407-87ec01332344ec2b.js} +1 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.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-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.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-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/resolve/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 +56 -5
- 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 +17 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +14 -8
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +4 -1
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +146 -8
- package/dist/cli/commands/report.d.ts +7 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +19 -6
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +29 -5
- package/dist/cli/commands/respond.d.ts +2 -2
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +40 -37
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +8 -4
- package/dist/cli/commands/task.d.ts +22 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +26 -18
- package/dist/cli/commands/wait-instance.d.ts +9 -1
- package/dist/cli/commands/wait-instance.d.ts.map +1 -1
- package/dist/cli/commands/wait-instance.js +15 -0
- package/dist/cli/commands/wait-poll-state.d.ts +18 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.d.ts +2 -1
- package/dist/cli/commands/wait-verify.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.js +5 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +37 -13
- 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 +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +1 -0
- package/dist/cli/types/api-responses.d.ts +55 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client-deadline.d.ts +28 -0
- package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
- package/dist/cli/utils/api-client-deadline.js +46 -0
- package/dist/cli/utils/api-client-errors.d.ts +118 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +210 -0
- package/dist/cli/utils/api-client.d.ts +33 -109
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +202 -227
- 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 +1 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +7 -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/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.d.ts +25 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +10 -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 +9 -0
- package/dist/server/locales/ja/worktree.json +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +5 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/claude.js +8 -2
- package/dist/server/src/lib/cli-tools/codex.js +7 -4
- package/dist/server/src/lib/cli-tools/command-code.js +14 -18
- package/dist/server/src/lib/cli-tools/copilot.js +159 -28
- package/dist/server/src/lib/cli-tools/gemini.js +10 -2
- 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 +162 -8
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +57 -14
- package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +143 -187
- package/dist/server/src/lib/cli-tools/vibe-local.js +91 -2
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +114 -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/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
- package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
- package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
- package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
- package/dist/server/src/lib/db/relay-bind-db.js +88 -167
- package/dist/server/src/lib/db/relay-db-base.js +20 -0
- package/dist/server/src/lib/db/relay-db-count.js +49 -0
- package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
- package/dist/server/src/lib/db/relay-db-hold.js +250 -0
- package/dist/server/src/lib/db/relay-db.js +33 -92
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/prompt-answer-errors.js +76 -2
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery.js +359 -79
- package/dist/server/src/lib/relay/relay-messages.js +13 -0
- package/dist/server/src/lib/relay/relay-system-line.js +28 -15
- package/dist/server/src/lib/relay/types.js +14 -2
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
- package/dist/server/src/lib/session/claude-session.js +26 -7
- package/dist/server/src/lib/session/current-output-builder.js +7 -3
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +47 -2
- package/dist/server/src/lib/session/prompt-submit-receipt.js +224 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +16 -3
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/send-attempt-state.js +177 -2
- package/dist/server/src/lib/session/send-attempt-types.js +10 -1
- package/dist/server/src/lib/session/send-user-message.js +80 -8
- 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 +17 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +6 -28
- 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.2.json +49 -0
- package/release-notes/0.49.3.json +52 -0
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3773.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9198.js +0 -144
- package/.next/static/chunks/3931-1a1abab16248f14d.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-ce17ffa77f39608e.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.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-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +0 -1
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
|
@@ -89,6 +89,13 @@
|
|
|
89
89
|
* checks it still owns the composer before every key, watches an `unseen`
|
|
90
90
|
* paste a little longer before giving up, and leaves a mark for a body that
|
|
91
91
|
* may still arrive, which the next send waits out ({@link waitOutCarriedPaste}).
|
|
92
|
+
*
|
|
93
|
+
* Issue #4035 is a claude session's first prompt reported sent when it was
|
|
94
|
+
* not. Keys typed right after the prompt appeared were drawn ~1 s later and
|
|
95
|
+
* their Enter was lost, while the read-back still showed the dim placeholder
|
|
96
|
+
* (rule F). On that first prompt a B or F verdict now waits for claude's own
|
|
97
|
+
* `UserPromptSubmit` ({@link awaitPromptReport}), and a later send that clears
|
|
98
|
+
* a body this one called sent says so ({@link reportSubmittedBodyInComposer}).
|
|
92
99
|
*/
|
|
93
100
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
94
101
|
if (k2 === undefined) k2 = k;
|
|
@@ -124,67 +131,42 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
124
131
|
};
|
|
125
132
|
})();
|
|
126
133
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
127
|
-
exports.LITERAL_SEND_MAX_BYTES = exports.isSubmitted = exports.classifySubmit = exports.classifyPasteLanded = exports.recheckComposerBeforeInput = void 0;
|
|
134
|
+
exports.promptUnreportedResendNote = exports.PROMPT_UNREPORTED_RESEND_NOTE = exports.PROMPT_REPORT_WAIT_MS = exports.PROMPT_REPORT_POLL_MS = exports.LITERAL_SEND_MAX_BYTES = exports.INPUT_READINESS_UNDER_LOCK_WAIT_MS = exports.isSubmitted = exports.classifySubmitWithRule = exports.classifySubmit = exports.classifyPasteLanded = exports.recheckComposerBeforeInput = void 0;
|
|
128
135
|
exports.clearComposerBeforeSend = clearComposerBeforeSend;
|
|
129
136
|
exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
|
|
130
137
|
const childProcess = __importStar(require("child_process"));
|
|
131
138
|
const tmux_1 = require("../tmux/tmux");
|
|
132
139
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
133
140
|
const composer_spec_1 = require("./composer-spec");
|
|
134
|
-
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
135
141
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
136
|
-
const logger_1 = require("../../lib/logger");
|
|
137
142
|
const global_state_1 = require("../../lib/global-state");
|
|
138
143
|
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
139
144
|
Object.defineProperty(exports, "recheckComposerBeforeInput", { enumerable: true, get: function () { return composer_clear_1.recheckComposerBeforeInput; } });
|
|
145
|
+
const prompt_submit_receipt_1 = require("../../lib/session/prompt-submit-receipt");
|
|
146
|
+
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
140
147
|
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
141
148
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
142
149
|
const submit_composer_read_1 = require("./submit-composer-read");
|
|
150
|
+
const submit_verified_sender_shared_1 = require("./submit-verified-sender-shared");
|
|
151
|
+
const submit_verified_sender_lock_1 = require("./submit-verified-sender-lock");
|
|
152
|
+
const submit_verified_sender_composer_1 = require("./submit-verified-sender-composer");
|
|
153
|
+
const submit_verified_sender_report_1 = require("./submit-verified-sender-report");
|
|
143
154
|
// Issue #3963: the composer reads moved to `submit-composer-read`; re-exported
|
|
144
155
|
// so every caller and test keeps importing them from here.
|
|
145
156
|
var submit_composer_read_2 = require("./submit-composer-read");
|
|
146
157
|
Object.defineProperty(exports, "classifyPasteLanded", { enumerable: true, get: function () { return submit_composer_read_2.classifyPasteLanded; } });
|
|
147
158
|
Object.defineProperty(exports, "classifySubmit", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmit; } });
|
|
159
|
+
Object.defineProperty(exports, "classifySubmitWithRule", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmitWithRule; } });
|
|
148
160
|
Object.defineProperty(exports, "isSubmitted", { enumerable: true, get: function () { return submit_composer_read_2.isSubmitted; } });
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
* piece of unbracketed input (`12288 mod 1022` = the 24 bytes that arrived of a
|
|
159
|
-
* 12 KB brief), so a body is only safe as keystrokes while it fits in a single
|
|
160
|
-
* read. Half the smallest read measured leaves room for multi-byte text and for
|
|
161
|
-
* a platform whose reads are shorter.
|
|
162
|
-
*/
|
|
163
|
-
exports.LITERAL_SEND_MAX_BYTES = 512;
|
|
164
|
-
/**
|
|
165
|
-
* How often the composer is read while a pasted body is expected to appear in
|
|
166
|
-
* it. Claude, codex, Command Code and agy all drew the pasted body within
|
|
167
|
-
* 60 ms of `paste-buffer` on a 12 KB brief.
|
|
168
|
-
*/
|
|
169
|
-
const PASTE_LANDED_POLL_MS = 100;
|
|
170
|
-
/** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
|
|
171
|
-
const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
|
|
172
|
-
/**
|
|
173
|
-
* How often the composer is read while a TYPED body is expected to appear in it
|
|
174
|
-
* (Issue #3366). codex draws a burst of keystrokes all at once when the burst
|
|
175
|
-
* ends, so the poll only decides how late after that moment Enter goes in.
|
|
176
|
-
*/
|
|
177
|
-
const TYPED_BODY_POLL_MS = 50;
|
|
178
|
-
/**
|
|
179
|
-
* Composer reads before a typed body that has not appeared is abandoned (5 s).
|
|
180
|
-
*
|
|
181
|
-
* codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
|
|
182
|
-
* per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
|
|
183
|
-
* so this is roughly twice the slowest draw measured, for a loaded machine.
|
|
184
|
-
*/
|
|
185
|
-
const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
|
|
186
|
-
/** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
|
|
187
|
-
const PASTE_COMMAND_TIMEOUT_MS = 5000;
|
|
161
|
+
// Issue #4056: the constants, option types and helpers moved to
|
|
162
|
+
// `submit-verified-sender-*.ts`; the public ones are re-exported from here.
|
|
163
|
+
var submit_verified_sender_shared_2 = require("./submit-verified-sender-shared");
|
|
164
|
+
Object.defineProperty(exports, "INPUT_READINESS_UNDER_LOCK_WAIT_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.INPUT_READINESS_UNDER_LOCK_WAIT_MS; } });
|
|
165
|
+
Object.defineProperty(exports, "LITERAL_SEND_MAX_BYTES", { enumerable: true, get: function () { return submit_verified_sender_shared_2.LITERAL_SEND_MAX_BYTES; } });
|
|
166
|
+
Object.defineProperty(exports, "PROMPT_REPORT_POLL_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_REPORT_POLL_MS; } });
|
|
167
|
+
Object.defineProperty(exports, "PROMPT_REPORT_WAIT_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_REPORT_WAIT_MS; } });
|
|
168
|
+
Object.defineProperty(exports, "PROMPT_UNREPORTED_RESEND_NOTE", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_UNREPORTED_RESEND_NOTE; } });
|
|
169
|
+
Object.defineProperty(exports, "promptUnreportedResendNote", { enumerable: true, get: function () { return submit_verified_sender_shared_2.promptUnreportedResendNote; } });
|
|
188
170
|
/**
|
|
189
171
|
* Makes each send's tmux paste buffer name unique within this process — on
|
|
190
172
|
* `globalThis` (Issue #3945 review #11): tmux buffers are server-wide, and a
|
|
@@ -193,20 +175,10 @@ const PASTE_COMMAND_TIMEOUT_MS = 5000;
|
|
|
193
175
|
* `load-buffer` overwriting the first before its `paste-buffer`).
|
|
194
176
|
*/
|
|
195
177
|
const pasteBufferSeq = (0, global_state_1.getOrInitGlobal)('__submitPasteBufferSeq', () => ({ last: 0 }));
|
|
196
|
-
/**
|
|
197
|
-
* Rows read for the re-check under the input lock (Issue #3945). The same
|
|
198
|
-
* capture `clearComposer` takes for its first read, so on a tool that clears
|
|
199
|
-
* before sending that read is the re-check's frame and no extra read is made.
|
|
200
|
-
*/
|
|
201
|
-
const RECHECK_CAPTURE_LINES = 200;
|
|
202
|
-
/** How often a send waiting out a carried paste mark reads the composer (Issue #3945). */
|
|
203
|
-
const CARRIED_MARK_POLL_MS = 200;
|
|
204
|
-
/** Default bounded recovery Enters (each read back) before giving up (throwing). */
|
|
205
|
-
const DEFAULT_VERIFY_ATTEMPTS = 4;
|
|
206
178
|
/** Run one tmux command, optionally feeding it `input` on stdin. */
|
|
207
179
|
function runTmux(args, input) {
|
|
208
180
|
return new Promise((resolve, reject) => {
|
|
209
|
-
const child = childProcess.execFile('tmux', args, { timeout: PASTE_COMMAND_TIMEOUT_MS }, (error) => {
|
|
181
|
+
const child = childProcess.execFile('tmux', args, { timeout: submit_verified_sender_shared_1.PASTE_COMMAND_TIMEOUT_MS }, (error) => {
|
|
210
182
|
if (error) {
|
|
211
183
|
reject(error);
|
|
212
184
|
return;
|
|
@@ -234,6 +206,12 @@ function runTmux(args, input) {
|
|
|
234
206
|
* `load-buffer` ran. A lost ticket drops the buffer and throws before anything
|
|
235
207
|
* reaches the pane (`input lock lost, nothing was typed`).
|
|
236
208
|
*
|
|
209
|
+
* Issue #4011: a failed `load-buffer` throws with `delivery: 'not-started'`
|
|
210
|
+
* (the field `TmuxSendError` carries) — it runs before `paste-buffer`, so none
|
|
211
|
+
* of the body reached the pane, however it failed (an exit status or a timeout).
|
|
212
|
+
* Issue #4031: worded `Failed to load message into tmux buffer` and coded
|
|
213
|
+
* `PASTE_NOT_STARTED_CODE`, so `classifySendFailure` records it `not-sent`.
|
|
214
|
+
*
|
|
237
215
|
* @throws Error when either tmux command fails, or `ticket` lost the composer
|
|
238
216
|
*/
|
|
239
217
|
async function pasteBody(sessionName, message, ticket, cliToolId) {
|
|
@@ -245,11 +223,17 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
|
|
|
245
223
|
catch (error) {
|
|
246
224
|
await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
|
|
247
225
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
248
|
-
|
|
226
|
+
// Issue #4031: its own wording and code, apart from `paste-buffer`'s
|
|
227
|
+
// failure below (whose body may be on the pane), so the send is recorded
|
|
228
|
+
// `not-sent` with or without a bound relay.
|
|
229
|
+
throw Object.assign(new Error(`Failed to load message into tmux buffer: ${errorMessage}`), {
|
|
230
|
+
delivery: 'not-started',
|
|
231
|
+
code: send_attempt_types_1.PASTE_NOT_STARTED_CODE,
|
|
232
|
+
});
|
|
249
233
|
}
|
|
250
234
|
if (!ticket.isCurrent()) {
|
|
251
235
|
await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
|
|
252
|
-
assertInputOwner(ticket, cliToolId, 'paste-buffer', false);
|
|
236
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'paste-buffer', false);
|
|
253
237
|
}
|
|
254
238
|
// Issue #3953: the send's stamp, as the typed branch takes it — after
|
|
255
239
|
// `load-buffer` (up to its timeout), right before the body reaches the pane.
|
|
@@ -272,16 +256,6 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
|
|
|
272
256
|
}
|
|
273
257
|
}
|
|
274
258
|
/** The composer's first row, for an error message a person has to act on. */
|
|
275
|
-
function describeComposer(output, cliToolId, composerSpec, message) {
|
|
276
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
277
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
278
|
-
if (composer.kind === 'absent')
|
|
279
|
-
return 'no composer on screen';
|
|
280
|
-
if (composer.kind === 'empty')
|
|
281
|
-
return 'an empty composer';
|
|
282
|
-
const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
|
|
283
|
-
return JSON.stringify(text);
|
|
284
|
-
}
|
|
285
259
|
/**
|
|
286
260
|
* Take a body that did not arrive intact back out of the composer, best effort.
|
|
287
261
|
*
|
|
@@ -298,7 +272,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
298
272
|
// no longer current means another writer owns the composer now, and what it
|
|
299
273
|
// holds is that writer's.
|
|
300
274
|
if (!ticket.isCurrent()) {
|
|
301
|
-
logger.error('paste-withdraw-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
|
|
275
|
+
submit_verified_sender_shared_1.logger.error('paste-withdraw-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
|
|
302
276
|
return false;
|
|
303
277
|
}
|
|
304
278
|
try {
|
|
@@ -311,7 +285,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
311
285
|
return false;
|
|
312
286
|
}
|
|
313
287
|
catch (clearError) {
|
|
314
|
-
logger.error('paste-withdraw-failed', {
|
|
288
|
+
submit_verified_sender_shared_1.logger.error('paste-withdraw-failed', {
|
|
315
289
|
sessionName,
|
|
316
290
|
cliToolId,
|
|
317
291
|
error: clearError instanceof Error ? clearError.message : String(clearError),
|
|
@@ -319,23 +293,6 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
319
293
|
return false;
|
|
320
294
|
}
|
|
321
295
|
}
|
|
322
|
-
/**
|
|
323
|
-
* Throw unless `ticket` still owns the composer (Issue #3945 stage 3). Called
|
|
324
|
-
* right before every key a send sends — body, paste, each Enter — so work still
|
|
325
|
-
* in flight after its ownership ended cannot reach the next owner's composer.
|
|
326
|
-
*
|
|
327
|
-
* @param typed - Whether any of the body may already be in the composer, which
|
|
328
|
-
* decides how the failure classifies (`not-sent` before the body only).
|
|
329
|
-
*/
|
|
330
|
-
function assertInputOwner(ticket, cliToolId, step, typed) {
|
|
331
|
-
if (ticket.isCurrent())
|
|
332
|
-
return;
|
|
333
|
-
logger.error('input-lock-lost', { sessionName: ticket.sessionName, cliToolId, step, generation: ticket.generation });
|
|
334
|
-
if (!typed) {
|
|
335
|
-
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
|
|
336
|
-
}
|
|
337
|
-
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; part of the message may be in its composer (Issue #3945).`);
|
|
338
|
-
}
|
|
339
296
|
/**
|
|
340
297
|
* Hold off typing while a carried paste mark is fresh (Issue #3945 stage 4).
|
|
341
298
|
*
|
|
@@ -352,7 +309,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
352
309
|
const mark = (0, instance_input_lock_1.getCarriedPasteMark)(sessionName);
|
|
353
310
|
if (mark === null)
|
|
354
311
|
return false;
|
|
355
|
-
logger.warn('carried-paste-mark-wait', {
|
|
312
|
+
submit_verified_sender_shared_1.logger.warn('carried-paste-mark-wait', {
|
|
356
313
|
sessionName,
|
|
357
314
|
cliToolId,
|
|
358
315
|
originGeneration: mark.originGeneration,
|
|
@@ -360,13 +317,13 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
360
317
|
remainingMs: mark.expiresAt - Date.now(),
|
|
361
318
|
});
|
|
362
319
|
while (Date.now() < mark.expiresAt) {
|
|
363
|
-
await new Promise((resolve) => setTimeout(resolve, Math.min(CARRIED_MARK_POLL_MS, mark.expiresAt - Date.now())));
|
|
320
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(submit_verified_sender_shared_1.CARRIED_MARK_POLL_MS, mark.expiresAt - Date.now())));
|
|
364
321
|
if (!composer.clearBeforeSend)
|
|
365
322
|
continue;
|
|
366
|
-
assertInputOwner(ticket, cliToolId, 'the carried paste wait', false);
|
|
323
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the carried paste wait', false);
|
|
367
324
|
let frame;
|
|
368
325
|
try {
|
|
369
|
-
frame = await (0, tmux_1.capturePane)(sessionName, RECHECK_CAPTURE_LINES);
|
|
326
|
+
frame = await (0, tmux_1.capturePane)(sessionName, submit_verified_sender_shared_1.RECHECK_CAPTURE_LINES);
|
|
370
327
|
}
|
|
371
328
|
catch {
|
|
372
329
|
// The re-check after the wait decides about a pane that cannot be read.
|
|
@@ -379,7 +336,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
379
336
|
beforePass: () => ticket.isCurrent(),
|
|
380
337
|
});
|
|
381
338
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
382
|
-
logger.warn('carried-paste-withdrawn', {
|
|
339
|
+
submit_verified_sender_shared_1.logger.warn('carried-paste-withdrawn', {
|
|
383
340
|
sessionName,
|
|
384
341
|
cliToolId,
|
|
385
342
|
originGeneration: mark.originGeneration,
|
|
@@ -390,12 +347,6 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
390
347
|
(0, instance_input_lock_1.clearExpiredCarriedPasteMark)(ticket);
|
|
391
348
|
return true;
|
|
392
349
|
}
|
|
393
|
-
/** Whether the composer in `output` holds any text at all, read as the sender reads it. */
|
|
394
|
-
function composerHoldsText(output, cliToolId, composerSpec, message) {
|
|
395
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
396
|
-
return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
|
|
397
|
-
.kind === 'text');
|
|
398
|
-
}
|
|
399
350
|
/**
|
|
400
351
|
* Wait until the composer shows the whole pasted body; decide whether Enter
|
|
401
352
|
* may be pressed (Issue #2464).
|
|
@@ -437,20 +388,20 @@ async function confirmPasteLanded(params) {
|
|
|
437
388
|
let lateAfterMs = null;
|
|
438
389
|
try {
|
|
439
390
|
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
440
|
-
await new Promise((resolve) => setTimeout(resolve, PASTE_LANDED_POLL_MS));
|
|
391
|
+
await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS));
|
|
441
392
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
442
393
|
state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
|
|
443
394
|
if (state === 'landed' || state === 'mismatch')
|
|
444
395
|
break;
|
|
445
396
|
}
|
|
446
397
|
if (state === 'unseen' && composer.clearBeforeSend) {
|
|
447
|
-
const observeAttempts = Math.ceil(instance_input_lock_1.LATE_PASTE_OBSERVE_MS / PASTE_LANDED_POLL_MS);
|
|
398
|
+
const observeAttempts = Math.ceil(instance_input_lock_1.LATE_PASTE_OBSERVE_MS / submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS);
|
|
448
399
|
for (let attempt = 1; attempt <= observeAttempts; attempt++) {
|
|
449
|
-
await new Promise((resolve) => setTimeout(resolve, PASTE_LANDED_POLL_MS));
|
|
400
|
+
await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS));
|
|
450
401
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
451
402
|
state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
|
|
452
403
|
if (state !== 'unseen') {
|
|
453
|
-
lateAfterMs = attempt * PASTE_LANDED_POLL_MS;
|
|
404
|
+
lateAfterMs = attempt * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS;
|
|
454
405
|
break;
|
|
455
406
|
}
|
|
456
407
|
}
|
|
@@ -462,18 +413,18 @@ async function confirmPasteLanded(params) {
|
|
|
462
413
|
if (readError === null && lateAfterMs === null && state === 'landed')
|
|
463
414
|
return;
|
|
464
415
|
if (readError === null && state === 'unseen' && !composer.clearBeforeSend) {
|
|
465
|
-
logger.warn('paste-landed-unverified', { sessionName, cliToolId, bytes: Buffer.byteLength(message, 'utf8') });
|
|
416
|
+
submit_verified_sender_shared_1.logger.warn('paste-landed-unverified', { sessionName, cliToolId, bytes: Buffer.byteLength(message, 'utf8') });
|
|
466
417
|
return;
|
|
467
418
|
}
|
|
468
419
|
const bytes = Buffer.byteLength(message, 'utf8');
|
|
469
420
|
const lineCount = message.split('\n').length;
|
|
470
|
-
const shown = readError === null ? describeComposer(output, cliToolId, composer, message) : 'an unreadable pane';
|
|
421
|
+
const shown = readError === null ? (0, submit_verified_sender_composer_1.describeComposer)(output, cliToolId, composer, message) : 'an unreadable pane';
|
|
471
422
|
const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
|
|
472
423
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
473
424
|
const mayStillArrive = readError !== null || state === 'unseen' || state === 'pasting' || !withdrawn;
|
|
474
425
|
if (mayStillArrive)
|
|
475
426
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
476
|
-
logger.error('paste-not-landed', {
|
|
427
|
+
submit_verified_sender_shared_1.logger.error('paste-not-landed', {
|
|
477
428
|
sessionName,
|
|
478
429
|
cliToolId,
|
|
479
430
|
state,
|
|
@@ -488,50 +439,15 @@ async function confirmPasteLanded(params) {
|
|
|
488
439
|
const what = readError !== null
|
|
489
440
|
? `the composer could not be read while the paste was checked (${readError})`
|
|
490
441
|
: lateAfterMs !== null
|
|
491
|
-
? `the paste appeared ${lateAfterMs}ms after the ${attempts * PASTE_LANDED_POLL_MS}ms check and was taken back out (the composer showed ${shown})`
|
|
442
|
+
? `the paste appeared ${lateAfterMs}ms after the ${attempts * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS}ms check and was taken back out (the composer showed ${shown})`
|
|
492
443
|
: state === 'mismatch'
|
|
493
444
|
? `the composer does not hold the message as sent (it shows ${shown})`
|
|
494
445
|
: state === 'pasting'
|
|
495
|
-
? `the paste had not finished arriving after ${attempts * PASTE_LANDED_POLL_MS}ms (the composer shows ${shown})`
|
|
446
|
+
? `the paste had not finished arriving after ${attempts * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS}ms (the composer shows ${shown})`
|
|
496
447
|
: `the message never appeared in the composer (${shown})`;
|
|
497
448
|
throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
|
|
498
449
|
'Enter was not pressed, so nothing was submitted (Issue #2464).');
|
|
499
450
|
}
|
|
500
|
-
/**
|
|
501
|
-
* Whether the composer shows a paste placeholder whose count is not this body's
|
|
502
|
-
* (Issue #3945): one counting fewer or more, or more than one placeholder.
|
|
503
|
-
*/
|
|
504
|
-
function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
|
|
505
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
506
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
507
|
-
if (composer.kind !== 'text')
|
|
508
|
-
return false;
|
|
509
|
-
if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
|
|
510
|
-
return false;
|
|
511
|
-
return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
|
|
512
|
-
}
|
|
513
|
-
/**
|
|
514
|
-
* The part of a typed body the composer reader can see (Issue #3366).
|
|
515
|
-
*
|
|
516
|
-
* The codex reader takes the composer as one run of non-blank rows, so a blank
|
|
517
|
-
* line inside the body ends what it returns: what it can show is the body up to
|
|
518
|
-
* its first blank line after the first non-blank one. Leading blank lines are
|
|
519
|
-
* kept — they are drawn as composer rows of their own and compact to nothing.
|
|
520
|
-
*/
|
|
521
|
-
function visibleTypedBody(message) {
|
|
522
|
-
const lines = message.split('\n');
|
|
523
|
-
const first = lines.findIndex((line) => line.trim() !== '');
|
|
524
|
-
if (first < 0)
|
|
525
|
-
return '';
|
|
526
|
-
const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
|
|
527
|
-
return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
|
|
528
|
-
}
|
|
529
|
-
/** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
|
|
530
|
-
function codexComposerShowsWholeBody(output, message, composerSpec) {
|
|
531
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
532
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
533
|
-
return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
|
|
534
|
-
}
|
|
535
451
|
/**
|
|
536
452
|
* Wait until the composer shows the typed body; only then may Enter be pressed
|
|
537
453
|
* (Issue #3366).
|
|
@@ -557,21 +473,21 @@ function codexComposerShowsWholeBody(output, message, composerSpec) {
|
|
|
557
473
|
*/
|
|
558
474
|
async function confirmTypedBodyLanded(params) {
|
|
559
475
|
const { sessionName, message, cliToolId, composer, attempts, ticket } = params;
|
|
560
|
-
const expected = (0, submit_composer_read_1.compactText)(visibleTypedBody(message));
|
|
476
|
+
const expected = (0, submit_composer_read_1.compactText)((0, submit_verified_sender_composer_1.visibleTypedBody)(message));
|
|
561
477
|
if (expected === '')
|
|
562
478
|
return;
|
|
563
479
|
let output = '';
|
|
564
480
|
let readError = null;
|
|
565
481
|
try {
|
|
566
482
|
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
567
|
-
await new Promise((resolve) => setTimeout(resolve, TYPED_BODY_POLL_MS));
|
|
483
|
+
await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.TYPED_BODY_POLL_MS));
|
|
568
484
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
569
485
|
// Issue #3906: on codex the whole composer must show the whole body. The
|
|
570
486
|
// extractor's excerpt stops at the first blank row, so its match is only
|
|
571
487
|
// the first paragraph — a five-paragraph body with one paragraph drawn
|
|
572
488
|
// would pass on it — and it cannot reach a body of more than four blocks.
|
|
573
489
|
if (cliToolId === 'codex') {
|
|
574
|
-
if (codexComposerShowsWholeBody(output, message, composer))
|
|
490
|
+
if ((0, submit_verified_sender_composer_1.codexComposerShowsWholeBody)(output, message, composer))
|
|
575
491
|
return;
|
|
576
492
|
continue;
|
|
577
493
|
}
|
|
@@ -584,19 +500,19 @@ async function confirmTypedBodyLanded(params) {
|
|
|
584
500
|
readError = error instanceof Error ? error.message : String(error);
|
|
585
501
|
}
|
|
586
502
|
const bytes = Buffer.byteLength(message, 'utf8');
|
|
587
|
-
const shown = readError === null ? describeComposer(output, cliToolId, composer, message) : 'an unreadable pane';
|
|
503
|
+
const shown = readError === null ? (0, submit_verified_sender_composer_1.describeComposer)(output, cliToolId, composer, message) : 'an unreadable pane';
|
|
588
504
|
// Issue #3945: a body never seen (codex can draw a burst late), a read that
|
|
589
505
|
// threw, or a withdrawal that was not confirmed may still put text in the
|
|
590
506
|
// composer after this throw — the next send waits that out.
|
|
591
|
-
const seen = readError === null && composerHoldsText(output, cliToolId, composer, message);
|
|
507
|
+
const seen = readError === null && (0, submit_verified_sender_composer_1.composerHoldsText)(output, cliToolId, composer, message);
|
|
592
508
|
const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
|
|
593
509
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
594
510
|
const mayStillArrive = !seen || !withdrawn;
|
|
595
511
|
if (mayStillArrive)
|
|
596
512
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
597
|
-
logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown, readError, carried: mayStillArrive });
|
|
513
|
+
submit_verified_sender_shared_1.logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown, readError, carried: mayStillArrive });
|
|
598
514
|
throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
|
|
599
|
-
`${attempts * TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
|
|
515
|
+
`${attempts * submit_verified_sender_shared_1.TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
|
|
600
516
|
'Enter was not pressed, so nothing was submitted (Issue #3366).');
|
|
601
517
|
}
|
|
602
518
|
/**
|
|
@@ -657,9 +573,10 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
657
573
|
...(ticket !== undefined ? { beforePass: () => ticket.isCurrent() } : {}),
|
|
658
574
|
});
|
|
659
575
|
if (ticket !== undefined)
|
|
660
|
-
assertInputOwner(ticket, cliToolId, 'the pre-send clear', false);
|
|
576
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the pre-send clear', false);
|
|
577
|
+
(0, submit_verified_sender_report_1.reportSubmittedBodyInComposer)(sessionName, cliToolId, result.discardedText, result.state !== 'content', options.target);
|
|
661
578
|
if (result.state === 'content') {
|
|
662
|
-
logger.error('pre-send-composer-clear-failed', {
|
|
579
|
+
submit_verified_sender_shared_1.logger.error('pre-send-composer-clear-failed', {
|
|
663
580
|
sessionName,
|
|
664
581
|
cliToolId,
|
|
665
582
|
passes: result.passes,
|
|
@@ -673,7 +590,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
673
590
|
// The only record of what was thrown away. `remainingText` is the FINAL
|
|
674
591
|
// read and is empty on this path by definition, which is why clearComposer
|
|
675
592
|
// reports `discardedText` separately.
|
|
676
|
-
logger.warn('pre-send-composer-cleared', {
|
|
593
|
+
submit_verified_sender_shared_1.logger.warn('pre-send-composer-cleared', {
|
|
677
594
|
sessionName,
|
|
678
595
|
cliToolId,
|
|
679
596
|
passes: result.passes,
|
|
@@ -709,11 +626,18 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
709
626
|
* when the composer was not free in time (nothing typed).
|
|
710
627
|
*/
|
|
711
628
|
async function sendMessageWithSubmitVerification(params) {
|
|
712
|
-
await (0, instance_input_lock_1.withInstanceInputLock)(params.sessionName, (ticket) =>
|
|
629
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(params.sessionName, (ticket) => {
|
|
630
|
+
// Issue #4065: the body's generation, told to the request before any key
|
|
631
|
+
// (and kept by it if the send throws). The same ticket when this joins the
|
|
632
|
+
// send service's outer lock (claude / codex), so it is told once more,
|
|
633
|
+
// with the same number.
|
|
634
|
+
(0, instance_input_lock_1.noteInputTicket)(ticket);
|
|
635
|
+
return sendUnderInputLock(params, ticket);
|
|
636
|
+
});
|
|
713
637
|
}
|
|
714
638
|
async function sendUnderInputLock(params, ticket) {
|
|
715
|
-
const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = DEFAULT_TYPED_BODY_ATTEMPTS, } = params;
|
|
716
|
-
const submitEnterCount = params
|
|
639
|
+
const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = submit_verified_sender_shared_1.DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = submit_verified_sender_shared_1.DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = submit_verified_sender_shared_1.DEFAULT_TYPED_BODY_ATTEMPTS, target, } = params;
|
|
640
|
+
const submitEnterCount = (0, submit_verified_sender_report_1.resolveSubmitEnterCount)(params, composer);
|
|
717
641
|
// -1. Issue #3945 (review-1 #4): every send re-reads the pane once it owns
|
|
718
642
|
// the composer, whether or not it queued — the prompt guard and the
|
|
719
643
|
// tool's readiness wait ran before the lock, and a dialog can open in the
|
|
@@ -727,24 +651,30 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
727
651
|
if (await waitOutCarriedPaste(sessionName, cliToolId, composer, ticket)) {
|
|
728
652
|
frame = await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, cliToolId);
|
|
729
653
|
}
|
|
654
|
+
// Issue #4040: the tool's readiness, asked again of that same newest frame.
|
|
655
|
+
// A dialog was refused just above (and is, at once, on every re-read); this
|
|
656
|
+
// refuses a pane that went back to loading, or still shows the picker of the
|
|
657
|
+
// send before, after the tool's own wait said "ready".
|
|
658
|
+
frame = await (0, submit_verified_sender_lock_1.awaitReadyUnderLock)(params.readiness, frame, { sessionName, cliToolId, ticket });
|
|
730
659
|
// 0. Empty the composer first (Issue #1880). The body below is typed at the
|
|
731
660
|
// TUI's current cursor position, so anything already in the box would be
|
|
732
661
|
// spliced into it. Throws for a claude composer that could not be emptied.
|
|
733
|
-
await clearComposerBeforeSend(sessionName, cliToolId, composer, {
|
|
734
|
-
|
|
662
|
+
await clearComposerBeforeSend(sessionName, cliToolId, composer, {
|
|
663
|
+
initialCapture: frame,
|
|
664
|
+
ticket,
|
|
665
|
+
...(target !== undefined ? { target } : {}),
|
|
666
|
+
});
|
|
667
|
+
if (Buffer.byteLength(message, 'utf8') > submit_verified_sender_shared_1.LITERAL_SEND_MAX_BYTES) {
|
|
735
668
|
// 1'. A body that would reach the TUI as more than one pty read is pasted
|
|
736
669
|
// as ONE bracketed paste, and Enter waits until the composer shows all
|
|
737
670
|
// of it (Issue #2464). Typed, Claude Code would keep only its last read.
|
|
738
671
|
const pastedAt = Date.now();
|
|
739
|
-
assertInputOwner(ticket, cliToolId, 'the paste', false);
|
|
672
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the paste', false);
|
|
740
673
|
try {
|
|
741
674
|
await pasteBody(sessionName, message, ticket, cliToolId);
|
|
742
675
|
}
|
|
743
676
|
catch (error) {
|
|
744
|
-
|
|
745
|
-
// refused input boundary (Issue #3992), which stops before `paste-buffer`:
|
|
746
|
-
// a mark then would only hold the next send off for nothing.
|
|
747
|
-
if (!(0, instance_input_lock_1.isInputBoundaryRefusal)(error))
|
|
677
|
+
if ((0, submit_verified_sender_report_1.pasteFailureMayHaveTyped)(error))
|
|
748
678
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
749
679
|
throw error;
|
|
750
680
|
}
|
|
@@ -766,7 +696,7 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
766
696
|
// nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
|
|
767
697
|
// built in `lib/tmux/key-sequence.ts`, which carries the table.
|
|
768
698
|
const typedAt = Date.now();
|
|
769
|
-
assertInputOwner(ticket, cliToolId, 'the body', false);
|
|
699
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the body', false);
|
|
770
700
|
// Issue #3953: the send's stamp is taken here — after the lock, the carried
|
|
771
701
|
// mark, the re-check and the clear, right before the body's first key — so a
|
|
772
702
|
// previous turn that ended during any of them is older than this send.
|
|
@@ -787,7 +717,7 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
787
717
|
// means waiting until the body is drawn (Issue #3366): an Enter pressed
|
|
788
718
|
// while codex still holds the keystrokes as a paste burst becomes a
|
|
789
719
|
// newline, and the body stays unsent. The fixed wait stays as a floor.
|
|
790
|
-
if (
|
|
720
|
+
if ((0, submit_verified_sender_report_1.shouldAwaitTypedBody)(awaitTypedBody, cliToolId)) {
|
|
791
721
|
await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts, ticket });
|
|
792
722
|
}
|
|
793
723
|
const remaining = textInputWaitMs - (Date.now() - typedAt);
|
|
@@ -796,8 +726,10 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
796
726
|
}
|
|
797
727
|
}
|
|
798
728
|
// 3. Submit as a separate command (double Enter for vibe-local's IME mode).
|
|
729
|
+
// Issue #4035: the agent's own report of the prompt counts from here.
|
|
730
|
+
const enteredAt = Date.now();
|
|
799
731
|
for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
|
|
800
|
-
assertInputOwner(ticket, cliToolId, 'Enter', true);
|
|
732
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'Enter', true);
|
|
801
733
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
802
734
|
if (i < submitEnterCount - 1) {
|
|
803
735
|
await new Promise((resolve) => setTimeout(resolve, interEnterWaitMs));
|
|
@@ -812,11 +744,40 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
812
744
|
// was reported "could not be confirmed" — a sent message as exit 99. The
|
|
813
745
|
// last read sends nothing: no Enter goes out that is not read back.
|
|
814
746
|
const attempts = Math.max(1, verifyAttempts);
|
|
747
|
+
// Issue #4035: one wait for the agent's report per send, however many reads.
|
|
748
|
+
let promptReportDeadline = null;
|
|
815
749
|
for (let attempt = 0; attempt <= attempts; attempt++) {
|
|
816
750
|
await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
|
|
817
|
-
|
|
818
|
-
|
|
751
|
+
let output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
752
|
+
// Issue #4048: a frame read after the session was replaced is the new
|
|
753
|
+
// process's, and so would be its hooks — neither says anything about this
|
|
754
|
+
// send, whose Enter went to the old one (indeterminate, not `not-sent`).
|
|
755
|
+
(0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the read-back');
|
|
756
|
+
let { state, rule } = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
|
|
757
|
+
const receipt = (0, submit_verified_sender_report_1.promptReceiptFor)({ state, rule, message, sessionName, cliToolId, enteredAt, target });
|
|
758
|
+
// Issue #4035: every verdict names the rule that gave it, so a send reported
|
|
759
|
+
// `sent` can be traced to what the screen showed.
|
|
760
|
+
submit_verified_sender_shared_1.logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
|
|
761
|
+
if (receipt === 'awaited') {
|
|
762
|
+
// Issue #4035: the screen says only that the body is not in the composer,
|
|
763
|
+
// on a session that has not reported a prompt yet. Watch, without Enter,
|
|
764
|
+
// until the agent reports it or the composer shows the body after all.
|
|
765
|
+
promptReportDeadline ??= Date.now() + submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS;
|
|
766
|
+
const watched = await (0, submit_verified_sender_report_1.awaitPromptReport)({
|
|
767
|
+
sessionName,
|
|
768
|
+
message,
|
|
769
|
+
cliToolId,
|
|
770
|
+
composer,
|
|
771
|
+
enteredAt,
|
|
772
|
+
rule,
|
|
773
|
+
deadline: promptReportDeadline,
|
|
774
|
+
ticket,
|
|
775
|
+
...(target !== undefined ? { target } : {}),
|
|
776
|
+
});
|
|
777
|
+
({ state, rule, output } = (0, submit_verified_sender_report_1.settleAwaitedPromptReport)({ watched, sessionName, cliToolId, attempt, rule, output, target }));
|
|
778
|
+
}
|
|
819
779
|
if (state === 'submitted') {
|
|
780
|
+
(0, submit_verified_sender_report_1.rememberScreenOnlySubmit)({ sessionName, cliToolId, enteredAt, message, ticket, target });
|
|
820
781
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
821
782
|
return;
|
|
822
783
|
}
|
|
@@ -831,48 +792,43 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
831
792
|
await (0, tmux_1.clearInputLine)(sessionName);
|
|
832
793
|
}
|
|
833
794
|
else {
|
|
834
|
-
logger.error('submit-clear-input-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
|
|
795
|
+
submit_verified_sender_shared_1.logger.error('submit-clear-input-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
|
|
835
796
|
}
|
|
836
797
|
}
|
|
837
798
|
catch (clearError) {
|
|
838
|
-
|
|
839
|
-
sessionName,
|
|
840
|
-
cliToolId,
|
|
841
|
-
error: clearError instanceof Error ? clearError.message : String(clearError),
|
|
842
|
-
});
|
|
799
|
+
(0, submit_verified_sender_report_1.logClearInputFailed)(sessionName, cliToolId, clearError);
|
|
843
800
|
}
|
|
844
801
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
845
|
-
logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
|
|
802
|
+
submit_verified_sender_shared_1.logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
|
|
846
803
|
throw new Error(`Message was replaced by a TUI autocompletion for session ${sessionName}; the input no longer matches the sent text. Cleared the input line without submitting to avoid executing a different command.`);
|
|
847
804
|
}
|
|
848
805
|
// state === 'pending' / 'indeterminate' after the final read-back: give up below.
|
|
849
806
|
if (attempt === attempts)
|
|
850
807
|
break;
|
|
851
|
-
|
|
852
|
-
// show the body, so another Enter could submit whatever it does show.
|
|
853
|
-
if (state === 'indeterminate') {
|
|
854
|
-
logger.warn('submit-not-confirmed:composer-unreadable', { sessionName, cliToolId, attempt });
|
|
855
|
-
continue;
|
|
856
|
-
}
|
|
857
|
-
// Issue #3945 (review #1): a paste placeholder that does not count this
|
|
858
|
-
// body is not this body. It can only be a paste that arrived after the
|
|
859
|
-
// initial Enter (a carried send's, past its mark), and another Enter would
|
|
860
|
-
// submit it. One that counts exactly this body cannot be told apart: that
|
|
861
|
-
// Enter is the accepted gap (LATE_TOKEN_AFTER_ENTER_SAME_COUNT in the tests).
|
|
862
|
-
if (composerShowsForeignPasteToken(output, cliToolId, message, composer)) {
|
|
863
|
-
logger.warn('submit-not-confirmed:foreign-paste-token', { sessionName, cliToolId, attempt });
|
|
808
|
+
if ((0, submit_verified_sender_report_1.holdsResendEnter)({ state, output, sessionName, cliToolId, message, composer, attempt }))
|
|
864
809
|
continue;
|
|
810
|
+
// Issue #4035: the Enter thought lost may only have been late — the agent
|
|
811
|
+
// reporting the prompt now means it went, and another Enter would land on an
|
|
812
|
+
// empty composer, or on a dialog that the prompt just opened.
|
|
813
|
+
// Issue #4048: a report read after the session was replaced (during the
|
|
814
|
+
// wait above, say) may be the new generation's own prompt — this send is
|
|
815
|
+
// then indeterminate, never confirmed by it.
|
|
816
|
+
if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt, target) === 'received') {
|
|
817
|
+
(0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the prompt report check');
|
|
818
|
+
submit_verified_sender_shared_1.logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
|
|
819
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
820
|
+
return;
|
|
865
821
|
}
|
|
866
822
|
// state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
|
|
867
|
-
logger.warn('submit-not-confirmed:resending-enter', {
|
|
823
|
+
submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:resending-enter', {
|
|
868
824
|
sessionName,
|
|
869
825
|
cliToolId,
|
|
870
826
|
attempt,
|
|
871
827
|
});
|
|
872
|
-
assertInputOwner(ticket, cliToolId, 'a resent Enter', true);
|
|
828
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'a resent Enter', true);
|
|
873
829
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
874
830
|
}
|
|
875
831
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
876
|
-
logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
|
|
832
|
+
submit_verified_sender_shared_1.logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
|
|
877
833
|
throw new Error(`Message submit could not be confirmed for session ${sessionName} after ${attempts} attempts (typed but unsent)`);
|
|
878
834
|
}
|