commandmate 0.49.2 → 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 +241 -234
- package/.next/app-path-routes-manifest.json +19 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- 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 -2
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.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_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 +19 -18
- package/.next/server/chunks/1308.js +1 -0
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -2
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -1
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3801.js +7 -7
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4490.js +1 -0
- package/.next/server/chunks/4911.js +1 -1
- package/.next/server/chunks/4936.js +1 -1
- package/.next/server/chunks/5209.js +2 -2
- 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 +1 -1
- 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-07a237575e1ceb9e.js → 2407-87ec01332344ec2b.js} +1 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.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-4f64316957b0a8e5.js → layout-b9d8aef70e4f17b2.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
- 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/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +2 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +142 -5
- 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 +9 -2
- 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/types/api-responses.d.ts +52 -0
- 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 +3 -133
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +30 -257
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +7 -0
- package/dist/server/locales/ja/worktree.json +7 -0
- package/dist/server/src/lib/cli-tools/claude.js +8 -2
- package/dist/server/src/lib/cli-tools/command-code.js +7 -15
- package/dist/server/src/lib/cli-tools/copilot.js +154 -25
- package/dist/server/src/lib/cli-tools/opencode.js +157 -6
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +41 -8
- 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 +94 -295
- package/dist/server/src/lib/cli-tools/vibe-local.js +87 -0
- 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/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/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/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/claude-session.js +4 -1
- package/dist/server/src/lib/session/current-output-builder.js +7 -5
- package/dist/server/src/lib/session/instance-input-lock.js +47 -2
- package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
- package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/send-attempt-state.js +130 -3
- package/dist/server/src/lib/session/send-user-message.js +78 -7
- package/dist/server/src/lib/session/structured-prompt.js +12 -7
- package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
- package/dist/server/src/lib/session-key-sender.js +6 -1
- package/package.json +1 -1
- package/release-notes/0.49.3.json +52 -0
- package/.next/server/chunks/1062.js +0 -1
- package/.next/server/chunks/110.js +0 -1
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3756.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/9198.js +0 -144
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.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/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
- /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
- /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
|
@@ -131,25 +131,26 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
131
131
|
};
|
|
132
132
|
})();
|
|
133
133
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
134
|
-
exports.PROMPT_REPORT_WAIT_MS = exports.LITERAL_SEND_MAX_BYTES = exports.isSubmitted = exports.classifySubmitWithRule = 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;
|
|
135
135
|
exports.clearComposerBeforeSend = clearComposerBeforeSend;
|
|
136
136
|
exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
|
|
137
137
|
const childProcess = __importStar(require("child_process"));
|
|
138
138
|
const tmux_1 = require("../tmux/tmux");
|
|
139
139
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
140
140
|
const composer_spec_1 = require("./composer-spec");
|
|
141
|
-
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
142
141
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
143
|
-
const logger_1 = require("../../lib/logger");
|
|
144
142
|
const global_state_1 = require("../../lib/global-state");
|
|
145
143
|
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
146
144
|
Object.defineProperty(exports, "recheckComposerBeforeInput", { enumerable: true, get: function () { return composer_clear_1.recheckComposerBeforeInput; } });
|
|
147
145
|
const prompt_submit_receipt_1 = require("../../lib/session/prompt-submit-receipt");
|
|
148
|
-
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
149
146
|
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
150
147
|
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
151
148
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
152
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");
|
|
153
154
|
// Issue #3963: the composer reads moved to `submit-composer-read`; re-exported
|
|
154
155
|
// so every caller and test keeps importing them from here.
|
|
155
156
|
var submit_composer_read_2 = require("./submit-composer-read");
|
|
@@ -157,45 +158,15 @@ Object.defineProperty(exports, "classifyPasteLanded", { enumerable: true, get: f
|
|
|
157
158
|
Object.defineProperty(exports, "classifySubmit", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmit; } });
|
|
158
159
|
Object.defineProperty(exports, "classifySubmitWithRule", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmitWithRule; } });
|
|
159
160
|
Object.defineProperty(exports, "isSubmitted", { enumerable: true, get: function () { return submit_composer_read_2.isSubmitted; } });
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
* piece of unbracketed input (`12288 mod 1022` = the 24 bytes that arrived of a
|
|
170
|
-
* 12 KB brief), so a body is only safe as keystrokes while it fits in a single
|
|
171
|
-
* read. Half the smallest read measured leaves room for multi-byte text and for
|
|
172
|
-
* a platform whose reads are shorter.
|
|
173
|
-
*/
|
|
174
|
-
exports.LITERAL_SEND_MAX_BYTES = 512;
|
|
175
|
-
/**
|
|
176
|
-
* How often the composer is read while a pasted body is expected to appear in
|
|
177
|
-
* it. Claude, codex, Command Code and agy all drew the pasted body within
|
|
178
|
-
* 60 ms of `paste-buffer` on a 12 KB brief.
|
|
179
|
-
*/
|
|
180
|
-
const PASTE_LANDED_POLL_MS = 100;
|
|
181
|
-
/** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
|
|
182
|
-
const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
|
|
183
|
-
/**
|
|
184
|
-
* How often the composer is read while a TYPED body is expected to appear in it
|
|
185
|
-
* (Issue #3366). codex draws a burst of keystrokes all at once when the burst
|
|
186
|
-
* ends, so the poll only decides how late after that moment Enter goes in.
|
|
187
|
-
*/
|
|
188
|
-
const TYPED_BODY_POLL_MS = 50;
|
|
189
|
-
/**
|
|
190
|
-
* Composer reads before a typed body that has not appeared is abandoned (5 s).
|
|
191
|
-
*
|
|
192
|
-
* codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
|
|
193
|
-
* per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
|
|
194
|
-
* so this is roughly twice the slowest draw measured, for a loaded machine.
|
|
195
|
-
*/
|
|
196
|
-
const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
|
|
197
|
-
/** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
|
|
198
|
-
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; } });
|
|
199
170
|
/**
|
|
200
171
|
* Makes each send's tmux paste buffer name unique within this process — on
|
|
201
172
|
* `globalThis` (Issue #3945 review #11): tmux buffers are server-wide, and a
|
|
@@ -204,29 +175,10 @@ const PASTE_COMMAND_TIMEOUT_MS = 5000;
|
|
|
204
175
|
* `load-buffer` overwriting the first before its `paste-buffer`).
|
|
205
176
|
*/
|
|
206
177
|
const pasteBufferSeq = (0, global_state_1.getOrInitGlobal)('__submitPasteBufferSeq', () => ({ last: 0 }));
|
|
207
|
-
/**
|
|
208
|
-
* Rows read for the re-check under the input lock (Issue #3945). The same
|
|
209
|
-
* capture `clearComposer` takes for its first read, so on a tool that clears
|
|
210
|
-
* before sending that read is the re-check's frame and no extra read is made.
|
|
211
|
-
*/
|
|
212
|
-
const RECHECK_CAPTURE_LINES = 200;
|
|
213
|
-
/** How often a send waiting out a carried paste mark reads the composer (Issue #3945). */
|
|
214
|
-
const CARRIED_MARK_POLL_MS = 200;
|
|
215
|
-
/** Default bounded recovery Enters (each read back) before giving up (throwing). */
|
|
216
|
-
const DEFAULT_VERIFY_ATTEMPTS = 4;
|
|
217
|
-
/**
|
|
218
|
-
* How long a B/F verdict on a session's first prompt waits for the agent's own
|
|
219
|
-
* report of it (Issue #4035). Claude 2.1.314 reported the first prompt 0.66–0.74 s
|
|
220
|
-
* after the send began in all 29 submitted first sends measured; an unsent body
|
|
221
|
-
* was drawn into the composer 0.9–1.7 s after its Enter.
|
|
222
|
-
*/
|
|
223
|
-
exports.PROMPT_REPORT_WAIT_MS = 5000;
|
|
224
|
-
/** How often the report and the composer are looked at during that wait. */
|
|
225
|
-
const PROMPT_REPORT_POLL_MS = 100;
|
|
226
178
|
/** Run one tmux command, optionally feeding it `input` on stdin. */
|
|
227
179
|
function runTmux(args, input) {
|
|
228
180
|
return new Promise((resolve, reject) => {
|
|
229
|
-
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) => {
|
|
230
182
|
if (error) {
|
|
231
183
|
reject(error);
|
|
232
184
|
return;
|
|
@@ -281,7 +233,7 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
|
|
|
281
233
|
}
|
|
282
234
|
if (!ticket.isCurrent()) {
|
|
283
235
|
await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
|
|
284
|
-
assertInputOwner(ticket, cliToolId, 'paste-buffer', false);
|
|
236
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'paste-buffer', false);
|
|
285
237
|
}
|
|
286
238
|
// Issue #3953: the send's stamp, as the typed branch takes it — after
|
|
287
239
|
// `load-buffer` (up to its timeout), right before the body reaches the pane.
|
|
@@ -304,16 +256,6 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
|
|
|
304
256
|
}
|
|
305
257
|
}
|
|
306
258
|
/** The composer's first row, for an error message a person has to act on. */
|
|
307
|
-
function describeComposer(output, cliToolId, composerSpec, message) {
|
|
308
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
309
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
310
|
-
if (composer.kind === 'absent')
|
|
311
|
-
return 'no composer on screen';
|
|
312
|
-
if (composer.kind === 'empty')
|
|
313
|
-
return 'an empty composer';
|
|
314
|
-
const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
|
|
315
|
-
return JSON.stringify(text);
|
|
316
|
-
}
|
|
317
259
|
/**
|
|
318
260
|
* Take a body that did not arrive intact back out of the composer, best effort.
|
|
319
261
|
*
|
|
@@ -330,7 +272,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
330
272
|
// no longer current means another writer owns the composer now, and what it
|
|
331
273
|
// holds is that writer's.
|
|
332
274
|
if (!ticket.isCurrent()) {
|
|
333
|
-
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 });
|
|
334
276
|
return false;
|
|
335
277
|
}
|
|
336
278
|
try {
|
|
@@ -343,7 +285,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
343
285
|
return false;
|
|
344
286
|
}
|
|
345
287
|
catch (clearError) {
|
|
346
|
-
logger.error('paste-withdraw-failed', {
|
|
288
|
+
submit_verified_sender_shared_1.logger.error('paste-withdraw-failed', {
|
|
347
289
|
sessionName,
|
|
348
290
|
cliToolId,
|
|
349
291
|
error: clearError instanceof Error ? clearError.message : String(clearError),
|
|
@@ -351,23 +293,6 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
|
|
|
351
293
|
return false;
|
|
352
294
|
}
|
|
353
295
|
}
|
|
354
|
-
/**
|
|
355
|
-
* Throw unless `ticket` still owns the composer (Issue #3945 stage 3). Called
|
|
356
|
-
* right before every key a send sends — body, paste, each Enter — so work still
|
|
357
|
-
* in flight after its ownership ended cannot reach the next owner's composer.
|
|
358
|
-
*
|
|
359
|
-
* @param typed - Whether any of the body may already be in the composer, which
|
|
360
|
-
* decides how the failure classifies (`not-sent` before the body only).
|
|
361
|
-
*/
|
|
362
|
-
function assertInputOwner(ticket, cliToolId, step, typed) {
|
|
363
|
-
if (ticket.isCurrent())
|
|
364
|
-
return;
|
|
365
|
-
logger.error('input-lock-lost', { sessionName: ticket.sessionName, cliToolId, step, generation: ticket.generation });
|
|
366
|
-
if (!typed) {
|
|
367
|
-
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
|
|
368
|
-
}
|
|
369
|
-
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; part of the message may be in its composer (Issue #3945).`);
|
|
370
|
-
}
|
|
371
296
|
/**
|
|
372
297
|
* Hold off typing while a carried paste mark is fresh (Issue #3945 stage 4).
|
|
373
298
|
*
|
|
@@ -384,7 +309,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
384
309
|
const mark = (0, instance_input_lock_1.getCarriedPasteMark)(sessionName);
|
|
385
310
|
if (mark === null)
|
|
386
311
|
return false;
|
|
387
|
-
logger.warn('carried-paste-mark-wait', {
|
|
312
|
+
submit_verified_sender_shared_1.logger.warn('carried-paste-mark-wait', {
|
|
388
313
|
sessionName,
|
|
389
314
|
cliToolId,
|
|
390
315
|
originGeneration: mark.originGeneration,
|
|
@@ -392,13 +317,13 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
392
317
|
remainingMs: mark.expiresAt - Date.now(),
|
|
393
318
|
});
|
|
394
319
|
while (Date.now() < mark.expiresAt) {
|
|
395
|
-
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())));
|
|
396
321
|
if (!composer.clearBeforeSend)
|
|
397
322
|
continue;
|
|
398
|
-
assertInputOwner(ticket, cliToolId, 'the carried paste wait', false);
|
|
323
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the carried paste wait', false);
|
|
399
324
|
let frame;
|
|
400
325
|
try {
|
|
401
|
-
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);
|
|
402
327
|
}
|
|
403
328
|
catch {
|
|
404
329
|
// The re-check after the wait decides about a pane that cannot be read.
|
|
@@ -411,7 +336,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
411
336
|
beforePass: () => ticket.isCurrent(),
|
|
412
337
|
});
|
|
413
338
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
414
|
-
logger.warn('carried-paste-withdrawn', {
|
|
339
|
+
submit_verified_sender_shared_1.logger.warn('carried-paste-withdrawn', {
|
|
415
340
|
sessionName,
|
|
416
341
|
cliToolId,
|
|
417
342
|
originGeneration: mark.originGeneration,
|
|
@@ -422,12 +347,6 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
|
|
|
422
347
|
(0, instance_input_lock_1.clearExpiredCarriedPasteMark)(ticket);
|
|
423
348
|
return true;
|
|
424
349
|
}
|
|
425
|
-
/** Whether the composer in `output` holds any text at all, read as the sender reads it. */
|
|
426
|
-
function composerHoldsText(output, cliToolId, composerSpec, message) {
|
|
427
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
428
|
-
return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
|
|
429
|
-
.kind === 'text');
|
|
430
|
-
}
|
|
431
350
|
/**
|
|
432
351
|
* Wait until the composer shows the whole pasted body; decide whether Enter
|
|
433
352
|
* may be pressed (Issue #2464).
|
|
@@ -469,20 +388,20 @@ async function confirmPasteLanded(params) {
|
|
|
469
388
|
let lateAfterMs = null;
|
|
470
389
|
try {
|
|
471
390
|
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
472
|
-
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));
|
|
473
392
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
474
393
|
state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
|
|
475
394
|
if (state === 'landed' || state === 'mismatch')
|
|
476
395
|
break;
|
|
477
396
|
}
|
|
478
397
|
if (state === 'unseen' && composer.clearBeforeSend) {
|
|
479
|
-
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);
|
|
480
399
|
for (let attempt = 1; attempt <= observeAttempts; attempt++) {
|
|
481
|
-
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));
|
|
482
401
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
483
402
|
state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
|
|
484
403
|
if (state !== 'unseen') {
|
|
485
|
-
lateAfterMs = attempt * PASTE_LANDED_POLL_MS;
|
|
404
|
+
lateAfterMs = attempt * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS;
|
|
486
405
|
break;
|
|
487
406
|
}
|
|
488
407
|
}
|
|
@@ -494,18 +413,18 @@ async function confirmPasteLanded(params) {
|
|
|
494
413
|
if (readError === null && lateAfterMs === null && state === 'landed')
|
|
495
414
|
return;
|
|
496
415
|
if (readError === null && state === 'unseen' && !composer.clearBeforeSend) {
|
|
497
|
-
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') });
|
|
498
417
|
return;
|
|
499
418
|
}
|
|
500
419
|
const bytes = Buffer.byteLength(message, 'utf8');
|
|
501
420
|
const lineCount = message.split('\n').length;
|
|
502
|
-
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';
|
|
503
422
|
const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
|
|
504
423
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
505
424
|
const mayStillArrive = readError !== null || state === 'unseen' || state === 'pasting' || !withdrawn;
|
|
506
425
|
if (mayStillArrive)
|
|
507
426
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
508
|
-
logger.error('paste-not-landed', {
|
|
427
|
+
submit_verified_sender_shared_1.logger.error('paste-not-landed', {
|
|
509
428
|
sessionName,
|
|
510
429
|
cliToolId,
|
|
511
430
|
state,
|
|
@@ -520,50 +439,15 @@ async function confirmPasteLanded(params) {
|
|
|
520
439
|
const what = readError !== null
|
|
521
440
|
? `the composer could not be read while the paste was checked (${readError})`
|
|
522
441
|
: lateAfterMs !== null
|
|
523
|
-
? `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})`
|
|
524
443
|
: state === 'mismatch'
|
|
525
444
|
? `the composer does not hold the message as sent (it shows ${shown})`
|
|
526
445
|
: state === 'pasting'
|
|
527
|
-
? `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})`
|
|
528
447
|
: `the message never appeared in the composer (${shown})`;
|
|
529
448
|
throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
|
|
530
449
|
'Enter was not pressed, so nothing was submitted (Issue #2464).');
|
|
531
450
|
}
|
|
532
|
-
/**
|
|
533
|
-
* Whether the composer shows a paste placeholder whose count is not this body's
|
|
534
|
-
* (Issue #3945): one counting fewer or more, or more than one placeholder.
|
|
535
|
-
*/
|
|
536
|
-
function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
|
|
537
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
538
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
539
|
-
if (composer.kind !== 'text')
|
|
540
|
-
return false;
|
|
541
|
-
if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
|
|
542
|
-
return false;
|
|
543
|
-
return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* The part of a typed body the composer reader can see (Issue #3366).
|
|
547
|
-
*
|
|
548
|
-
* The codex reader takes the composer as one run of non-blank rows, so a blank
|
|
549
|
-
* line inside the body ends what it returns: what it can show is the body up to
|
|
550
|
-
* its first blank line after the first non-blank one. Leading blank lines are
|
|
551
|
-
* kept — they are drawn as composer rows of their own and compact to nothing.
|
|
552
|
-
*/
|
|
553
|
-
function visibleTypedBody(message) {
|
|
554
|
-
const lines = message.split('\n');
|
|
555
|
-
const first = lines.findIndex((line) => line.trim() !== '');
|
|
556
|
-
if (first < 0)
|
|
557
|
-
return '';
|
|
558
|
-
const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
|
|
559
|
-
return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
|
|
560
|
-
}
|
|
561
|
-
/** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
|
|
562
|
-
function codexComposerShowsWholeBody(output, message, composerSpec) {
|
|
563
|
-
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
564
|
-
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
565
|
-
return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
|
|
566
|
-
}
|
|
567
451
|
/**
|
|
568
452
|
* Wait until the composer shows the typed body; only then may Enter be pressed
|
|
569
453
|
* (Issue #3366).
|
|
@@ -589,21 +473,21 @@ function codexComposerShowsWholeBody(output, message, composerSpec) {
|
|
|
589
473
|
*/
|
|
590
474
|
async function confirmTypedBodyLanded(params) {
|
|
591
475
|
const { sessionName, message, cliToolId, composer, attempts, ticket } = params;
|
|
592
|
-
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));
|
|
593
477
|
if (expected === '')
|
|
594
478
|
return;
|
|
595
479
|
let output = '';
|
|
596
480
|
let readError = null;
|
|
597
481
|
try {
|
|
598
482
|
for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
|
|
599
|
-
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));
|
|
600
484
|
output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
601
485
|
// Issue #3906: on codex the whole composer must show the whole body. The
|
|
602
486
|
// extractor's excerpt stops at the first blank row, so its match is only
|
|
603
487
|
// the first paragraph — a five-paragraph body with one paragraph drawn
|
|
604
488
|
// would pass on it — and it cannot reach a body of more than four blocks.
|
|
605
489
|
if (cliToolId === 'codex') {
|
|
606
|
-
if (codexComposerShowsWholeBody(output, message, composer))
|
|
490
|
+
if ((0, submit_verified_sender_composer_1.codexComposerShowsWholeBody)(output, message, composer))
|
|
607
491
|
return;
|
|
608
492
|
continue;
|
|
609
493
|
}
|
|
@@ -616,82 +500,21 @@ async function confirmTypedBodyLanded(params) {
|
|
|
616
500
|
readError = error instanceof Error ? error.message : String(error);
|
|
617
501
|
}
|
|
618
502
|
const bytes = Buffer.byteLength(message, 'utf8');
|
|
619
|
-
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';
|
|
620
504
|
// Issue #3945: a body never seen (codex can draw a burst late), a read that
|
|
621
505
|
// threw, or a withdrawal that was not confirmed may still put text in the
|
|
622
506
|
// composer after this throw — the next send waits that out.
|
|
623
|
-
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);
|
|
624
508
|
const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
|
|
625
509
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
626
510
|
const mayStillArrive = !seen || !withdrawn;
|
|
627
511
|
if (mayStillArrive)
|
|
628
512
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
629
|
-
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 });
|
|
630
514
|
throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
|
|
631
|
-
`${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. ` +
|
|
632
516
|
'Enter was not pressed, so nothing was submitted (Issue #3366).');
|
|
633
517
|
}
|
|
634
|
-
/**
|
|
635
|
-
* Whether a verdict is one the agent's own report must back (Issue #4035):
|
|
636
|
-
* `submitted` from B or F — the screen saying only that the body is not in the
|
|
637
|
-
* composer. A (generating) stands on its own. A body starting with `/` or `!`
|
|
638
|
-
* is run by the TUI itself, which is not measured to report it as a prompt.
|
|
639
|
-
*/
|
|
640
|
-
function needsPromptReport(state, rule, message) {
|
|
641
|
-
if (state !== 'submitted' || rule === 'A')
|
|
642
|
-
return false;
|
|
643
|
-
return !/^\s*[/!]/.test(message);
|
|
644
|
-
}
|
|
645
|
-
/**
|
|
646
|
-
* Watch a session's first prompt until the agent reports it (Issue #4035).
|
|
647
|
-
*
|
|
648
|
-
* Reads the hook record and the composer every {@link PROMPT_REPORT_POLL_MS}
|
|
649
|
-
* until `deadline`, without pressing anything. The deadline is the send's, not
|
|
650
|
-
* the call's: a send that waits again after a resent Enter gets only what is
|
|
651
|
-
* left of its {@link PROMPT_REPORT_WAIT_MS} (it holds the input lock meanwhile).
|
|
652
|
-
*
|
|
653
|
-
* - the agent reported the prompt — `received`;
|
|
654
|
-
* - the screen changes its verdict — generating (A), or the body drawn into
|
|
655
|
-
* the composer after all (C/D, `pending`: the caller resends Enter, as for
|
|
656
|
-
* any typed-but-unsent body), or a completion (E) — `screen`, with the frame;
|
|
657
|
-
* - neither, to the end — `unreported`: nothing says the message left.
|
|
658
|
-
*/
|
|
659
|
-
async function awaitPromptReport(params) {
|
|
660
|
-
const { sessionName, message, cliToolId, composer, enteredAt, deadline } = params;
|
|
661
|
-
let rule = params.rule;
|
|
662
|
-
while (Date.now() < deadline) {
|
|
663
|
-
await new Promise((resolve) => setTimeout(resolve, PROMPT_REPORT_POLL_MS));
|
|
664
|
-
if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) === 'received')
|
|
665
|
-
return { verdict: 'received' };
|
|
666
|
-
const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
|
|
667
|
-
const verdict = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
|
|
668
|
-
if (verdict.state !== 'submitted' || verdict.rule === 'A')
|
|
669
|
-
return { verdict: 'screen', ...verdict, output };
|
|
670
|
-
rule = verdict.rule;
|
|
671
|
-
}
|
|
672
|
-
if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) === 'received')
|
|
673
|
-
return { verdict: 'received' };
|
|
674
|
-
return { verdict: 'unreported', rule };
|
|
675
|
-
}
|
|
676
|
-
/**
|
|
677
|
-
* Say so when the pre-send clear finds the body this session last reported
|
|
678
|
-
* submitted (Issue #4035): that body never reached the agent, and the send that
|
|
679
|
-
* said `sent` for it was wrong. The instance's `lastSend` is turned
|
|
680
|
-
* `indeterminate` (the send now running records its own outcome after it).
|
|
681
|
-
*/
|
|
682
|
-
function reportSubmittedBodyInComposer(sessionName, cliToolId, composerText, cleared) {
|
|
683
|
-
if (composerText === '' || !(0, prompt_submit_receipt_1.matchesSubmittedBody)(sessionName, composerText))
|
|
684
|
-
return;
|
|
685
|
-
const target = (0, prompt_submit_receipt_1.getPromptSubmitTarget)(sessionName);
|
|
686
|
-
if (target !== null)
|
|
687
|
-
(0, send_attempt_state_1.markLastSendDiscarded)({ ...target, instanceId: target.instanceId ?? target.cliToolId });
|
|
688
|
-
logger.warn('pre-send-found-submitted-body', {
|
|
689
|
-
sessionName,
|
|
690
|
-
cliToolId,
|
|
691
|
-
cleared,
|
|
692
|
-
length: composerText.length,
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
518
|
/**
|
|
696
519
|
* Empty the composer before the body is typed into it (Issue #1880).
|
|
697
520
|
*
|
|
@@ -750,10 +573,10 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
750
573
|
...(ticket !== undefined ? { beforePass: () => ticket.isCurrent() } : {}),
|
|
751
574
|
});
|
|
752
575
|
if (ticket !== undefined)
|
|
753
|
-
assertInputOwner(ticket, cliToolId, 'the pre-send clear', false);
|
|
754
|
-
reportSubmittedBodyInComposer(sessionName, cliToolId, result.discardedText, result.state !== 'content');
|
|
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);
|
|
755
578
|
if (result.state === 'content') {
|
|
756
|
-
logger.error('pre-send-composer-clear-failed', {
|
|
579
|
+
submit_verified_sender_shared_1.logger.error('pre-send-composer-clear-failed', {
|
|
757
580
|
sessionName,
|
|
758
581
|
cliToolId,
|
|
759
582
|
passes: result.passes,
|
|
@@ -767,7 +590,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
767
590
|
// The only record of what was thrown away. `remainingText` is the FINAL
|
|
768
591
|
// read and is empty on this path by definition, which is why clearComposer
|
|
769
592
|
// reports `discardedText` separately.
|
|
770
|
-
logger.warn('pre-send-composer-cleared', {
|
|
593
|
+
submit_verified_sender_shared_1.logger.warn('pre-send-composer-cleared', {
|
|
771
594
|
sessionName,
|
|
772
595
|
cliToolId,
|
|
773
596
|
passes: result.passes,
|
|
@@ -803,11 +626,18 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
|
|
|
803
626
|
* when the composer was not free in time (nothing typed).
|
|
804
627
|
*/
|
|
805
628
|
async function sendMessageWithSubmitVerification(params) {
|
|
806
|
-
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
|
+
});
|
|
807
637
|
}
|
|
808
638
|
async function sendUnderInputLock(params, ticket) {
|
|
809
|
-
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;
|
|
810
|
-
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);
|
|
811
641
|
// -1. Issue #3945 (review-1 #4): every send re-reads the pane once it owns
|
|
812
642
|
// the composer, whether or not it queued — the prompt guard and the
|
|
813
643
|
// tool's readiness wait ran before the lock, and a dialog can open in the
|
|
@@ -821,26 +651,30 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
821
651
|
if (await waitOutCarriedPaste(sessionName, cliToolId, composer, ticket)) {
|
|
822
652
|
frame = await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, cliToolId);
|
|
823
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 });
|
|
824
659
|
// 0. Empty the composer first (Issue #1880). The body below is typed at the
|
|
825
660
|
// TUI's current cursor position, so anything already in the box would be
|
|
826
661
|
// spliced into it. Throws for a claude composer that could not be emptied.
|
|
827
|
-
await clearComposerBeforeSend(sessionName, cliToolId, composer, {
|
|
828
|
-
|
|
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) {
|
|
829
668
|
// 1'. A body that would reach the TUI as more than one pty read is pasted
|
|
830
669
|
// as ONE bracketed paste, and Enter waits until the composer shows all
|
|
831
670
|
// of it (Issue #2464). Typed, Claude Code would keep only its last read.
|
|
832
671
|
const pastedAt = Date.now();
|
|
833
|
-
assertInputOwner(ticket, cliToolId, 'the paste', false);
|
|
672
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the paste', false);
|
|
834
673
|
try {
|
|
835
674
|
await pasteBody(sessionName, message, ticket, cliToolId);
|
|
836
675
|
}
|
|
837
676
|
catch (error) {
|
|
838
|
-
|
|
839
|
-
// refused input boundary (Issue #3992) or a failed `load-buffer` (Issue
|
|
840
|
-
// #4011, `not-started`), both before `paste-buffer`: a mark then would
|
|
841
|
-
// only hold the next send off for nothing.
|
|
842
|
-
const notStarted = error?.delivery === 'not-started';
|
|
843
|
-
if (!(0, instance_input_lock_1.isInputBoundaryRefusal)(error) && !notStarted)
|
|
677
|
+
if ((0, submit_verified_sender_report_1.pasteFailureMayHaveTyped)(error))
|
|
844
678
|
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
845
679
|
throw error;
|
|
846
680
|
}
|
|
@@ -862,7 +696,7 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
862
696
|
// nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
|
|
863
697
|
// built in `lib/tmux/key-sequence.ts`, which carries the table.
|
|
864
698
|
const typedAt = Date.now();
|
|
865
|
-
assertInputOwner(ticket, cliToolId, 'the body', false);
|
|
699
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the body', false);
|
|
866
700
|
// Issue #3953: the send's stamp is taken here — after the lock, the carried
|
|
867
701
|
// mark, the re-check and the clear, right before the body's first key — so a
|
|
868
702
|
// previous turn that ended during any of them is older than this send.
|
|
@@ -883,7 +717,7 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
883
717
|
// means waiting until the body is drawn (Issue #3366): an Enter pressed
|
|
884
718
|
// while codex still holds the keystrokes as a paste burst becomes a
|
|
885
719
|
// newline, and the body stays unsent. The fixed wait stays as a floor.
|
|
886
|
-
if (
|
|
720
|
+
if ((0, submit_verified_sender_report_1.shouldAwaitTypedBody)(awaitTypedBody, cliToolId)) {
|
|
887
721
|
await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts, ticket });
|
|
888
722
|
}
|
|
889
723
|
const remaining = textInputWaitMs - (Date.now() - typedAt);
|
|
@@ -895,7 +729,7 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
895
729
|
// Issue #4035: the agent's own report of the prompt counts from here.
|
|
896
730
|
const enteredAt = Date.now();
|
|
897
731
|
for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
|
|
898
|
-
assertInputOwner(ticket, cliToolId, 'Enter', true);
|
|
732
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'Enter', true);
|
|
899
733
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
900
734
|
if (i < submitEnterCount - 1) {
|
|
901
735
|
await new Promise((resolve) => setTimeout(resolve, interEnterWaitMs));
|
|
@@ -915,19 +749,21 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
915
749
|
for (let attempt = 0; attempt <= attempts; attempt++) {
|
|
916
750
|
await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
|
|
917
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');
|
|
918
756
|
let { state, rule } = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
|
|
919
|
-
const receipt =
|
|
920
|
-
? (0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt)
|
|
921
|
-
: 'not-required';
|
|
757
|
+
const receipt = (0, submit_verified_sender_report_1.promptReceiptFor)({ state, rule, message, sessionName, cliToolId, enteredAt, target });
|
|
922
758
|
// Issue #4035: every verdict names the rule that gave it, so a send reported
|
|
923
759
|
// `sent` can be traced to what the screen showed.
|
|
924
|
-
logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
|
|
760
|
+
submit_verified_sender_shared_1.logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
|
|
925
761
|
if (receipt === 'awaited') {
|
|
926
762
|
// Issue #4035: the screen says only that the body is not in the composer,
|
|
927
763
|
// on a session that has not reported a prompt yet. Watch, without Enter,
|
|
928
764
|
// until the agent reports it or the composer shows the body after all.
|
|
929
|
-
promptReportDeadline ??= Date.now() +
|
|
930
|
-
const watched = await awaitPromptReport({
|
|
765
|
+
promptReportDeadline ??= Date.now() + submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS;
|
|
766
|
+
const watched = await (0, submit_verified_sender_report_1.awaitPromptReport)({
|
|
931
767
|
sessionName,
|
|
932
768
|
message,
|
|
933
769
|
cliToolId,
|
|
@@ -935,37 +771,13 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
935
771
|
enteredAt,
|
|
936
772
|
rule,
|
|
937
773
|
deadline: promptReportDeadline,
|
|
774
|
+
ticket,
|
|
775
|
+
...(target !== undefined ? { target } : {}),
|
|
938
776
|
});
|
|
939
|
-
|
|
940
|
-
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
941
|
-
logger.error('submit-not-confirmed:prompt-unreported', {
|
|
942
|
-
sessionName,
|
|
943
|
-
cliToolId,
|
|
944
|
-
attempt,
|
|
945
|
-
rule: watched.rule,
|
|
946
|
-
waitedMs: exports.PROMPT_REPORT_WAIT_MS,
|
|
947
|
-
});
|
|
948
|
-
throw new Error(`Message submit could not be confirmed for session ${sessionName}: the composer did not show the body ` +
|
|
949
|
-
`(rule ${watched.rule}) but the agent did not report the prompt within ${exports.PROMPT_REPORT_WAIT_MS}ms ` +
|
|
950
|
-
'(Issue #4035).');
|
|
951
|
-
}
|
|
952
|
-
if (watched.verdict === 'received') {
|
|
953
|
-
logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
|
|
954
|
-
state = 'submitted';
|
|
955
|
-
}
|
|
956
|
-
else {
|
|
957
|
-
({ state, rule, output } = watched);
|
|
958
|
-
logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt: 'awaited' });
|
|
959
|
-
}
|
|
777
|
+
({ state, rule, output } = (0, submit_verified_sender_report_1.settleAwaitedPromptReport)({ watched, sessionName, cliToolId, attempt, rule, output, target }));
|
|
960
778
|
}
|
|
961
779
|
if (state === 'submitted') {
|
|
962
|
-
|
|
963
|
-
// for the next send's clear. One the agent reported did leave, and the same
|
|
964
|
-
// text back in the composer is claude restoring it (Esc), the history (↑),
|
|
965
|
-
// or a person typing it — not a send that never arrived.
|
|
966
|
-
if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) !== 'received') {
|
|
967
|
-
(0, prompt_submit_receipt_1.noteSubmittedBody)(sessionName, message);
|
|
968
|
-
}
|
|
780
|
+
(0, submit_verified_sender_report_1.rememberScreenOnlySubmit)({ sessionName, cliToolId, enteredAt, message, ticket, target });
|
|
969
781
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
970
782
|
return;
|
|
971
783
|
}
|
|
@@ -980,56 +792,43 @@ async function sendUnderInputLock(params, ticket) {
|
|
|
980
792
|
await (0, tmux_1.clearInputLine)(sessionName);
|
|
981
793
|
}
|
|
982
794
|
else {
|
|
983
|
-
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 });
|
|
984
796
|
}
|
|
985
797
|
}
|
|
986
798
|
catch (clearError) {
|
|
987
|
-
|
|
988
|
-
sessionName,
|
|
989
|
-
cliToolId,
|
|
990
|
-
error: clearError instanceof Error ? clearError.message : String(clearError),
|
|
991
|
-
});
|
|
799
|
+
(0, submit_verified_sender_report_1.logClearInputFailed)(sessionName, cliToolId, clearError);
|
|
992
800
|
}
|
|
993
801
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
994
|
-
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 });
|
|
995
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.`);
|
|
996
804
|
}
|
|
997
805
|
// state === 'pending' / 'indeterminate' after the final read-back: give up below.
|
|
998
806
|
if (attempt === attempts)
|
|
999
807
|
break;
|
|
1000
|
-
|
|
1001
|
-
// show the body, so another Enter could submit whatever it does show.
|
|
1002
|
-
if (state === 'indeterminate') {
|
|
1003
|
-
logger.warn('submit-not-confirmed:composer-unreadable', { sessionName, cliToolId, attempt });
|
|
808
|
+
if ((0, submit_verified_sender_report_1.holdsResendEnter)({ state, output, sessionName, cliToolId, message, composer, attempt }))
|
|
1004
809
|
continue;
|
|
1005
|
-
}
|
|
1006
|
-
// Issue #3945 (review #1): a paste placeholder that does not count this
|
|
1007
|
-
// body is not this body. It can only be a paste that arrived after the
|
|
1008
|
-
// initial Enter (a carried send's, past its mark), and another Enter would
|
|
1009
|
-
// submit it. One that counts exactly this body cannot be told apart: that
|
|
1010
|
-
// Enter is the accepted gap (LATE_TOKEN_AFTER_ENTER_SAME_COUNT in the tests).
|
|
1011
|
-
if (composerShowsForeignPasteToken(output, cliToolId, message, composer)) {
|
|
1012
|
-
logger.warn('submit-not-confirmed:foreign-paste-token', { sessionName, cliToolId, attempt });
|
|
1013
|
-
continue;
|
|
1014
|
-
}
|
|
1015
810
|
// Issue #4035: the Enter thought lost may only have been late — the agent
|
|
1016
811
|
// reporting the prompt now means it went, and another Enter would land on an
|
|
1017
812
|
// empty composer, or on a dialog that the prompt just opened.
|
|
1018
|
-
|
|
1019
|
-
|
|
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 });
|
|
1020
819
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
1021
820
|
return;
|
|
1022
821
|
}
|
|
1023
822
|
// state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
|
|
1024
|
-
logger.warn('submit-not-confirmed:resending-enter', {
|
|
823
|
+
submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:resending-enter', {
|
|
1025
824
|
sessionName,
|
|
1026
825
|
cliToolId,
|
|
1027
826
|
attempt,
|
|
1028
827
|
});
|
|
1029
|
-
assertInputOwner(ticket, cliToolId, 'a resent Enter', true);
|
|
828
|
+
(0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'a resent Enter', true);
|
|
1030
829
|
await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
|
|
1031
830
|
}
|
|
1032
831
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
1033
|
-
logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
|
|
832
|
+
submit_verified_sender_shared_1.logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
|
|
1034
833
|
throw new Error(`Message submit could not be confirmed for session ${sessionName} after ${attempts} attempts (typed but unsent)`);
|
|
1035
834
|
}
|