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
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* [SEC4-001].
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.CopilotTool = exports.COPILOT_EXIT_COMMAND = void 0;
|
|
20
|
+
exports.CopilotTool = exports.COPILOT_EXIT_COMMAND = exports.COPILOT_DIALOG_CONFIRM_MS = void 0;
|
|
21
21
|
exports.isCopilotStartupLoading = isCopilotStartupLoading;
|
|
22
22
|
exports.readCopilotModelSwitchOutcomes = readCopilotModelSwitchOutcomes;
|
|
23
23
|
exports.judgeCopilotModelSwitch = judgeCopilotModelSwitch;
|
|
@@ -25,7 +25,10 @@ const base_1 = require("./base");
|
|
|
25
25
|
const tmux_1 = require("../tmux/tmux");
|
|
26
26
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
27
27
|
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
28
|
+
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
29
|
+
const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
|
|
28
30
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
31
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
29
32
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
30
33
|
const copilot_executable_1 = require("./copilot-executable");
|
|
31
34
|
const copilot_constants_1 = require("../../config/copilot-constants");
|
|
@@ -46,6 +49,19 @@ const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
|
46
49
|
const COPILOT_INIT_MAX_ATTEMPTS = 30;
|
|
47
50
|
/** Timeout for waiting for prompt before sending a message */
|
|
48
51
|
const COPILOT_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
52
|
+
/**
|
|
53
|
+
* How long a dialog has to stay up in {@link CopilotTool.waitForPrompt} before
|
|
54
|
+
* the wait gives up on it (Issue #4067), on {@link PROMPT_WAIT_DIALOG_CONFIRM_READS}
|
|
55
|
+
* reads in a row.
|
|
56
|
+
*
|
|
57
|
+
* A dialog waits for a person, so waiting out the 15 s (or `/model`'s 30 s)
|
|
58
|
+
* window behind it only delays the refusal — and the picker and `/model` wait
|
|
59
|
+
* holding the instance's input lock, so Auto-Yes and other writers wait too.
|
|
60
|
+
* Both thresholds must hold, so a frame caught mid-paint that reads as a
|
|
61
|
+
* dialog once does not refuse a send. The count is shared with opencode's and
|
|
62
|
+
* vibe-local's waits (Issue #4084, {@link createDialogConfirmation}).
|
|
63
|
+
*/
|
|
64
|
+
exports.COPILOT_DIALOG_CONFIRM_MS = prompt_wait_dialog_1.PROMPT_WAIT_DIALOG_CONFIRM_MS;
|
|
49
65
|
/**
|
|
50
66
|
* Copilot CLI slash commands that open a picker.
|
|
51
67
|
*
|
|
@@ -263,6 +279,36 @@ function describeBottomRow(output) {
|
|
|
263
279
|
}
|
|
264
280
|
return 'an empty pane';
|
|
265
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Re-read the pane and throw `recheckComposerBeforeInput`'s `prompt-waiting`
|
|
284
|
+
* refusal when a dialog is open (Issue #4040). Any other outcome — no dialog,
|
|
285
|
+
* or a re-read that failed — returns, so the caller's own refusal stands.
|
|
286
|
+
*/
|
|
287
|
+
async function rethrowIfDialogOpen(sessionName) {
|
|
288
|
+
try {
|
|
289
|
+
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (error.code === send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE)
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Refuse as `prompt-waiting` after {@link CopilotTool.waitForPrompt} saw a
|
|
298
|
+
* dialog stay up for {@link COPILOT_DIALOG_CONFIRM_MS} (Issue #4067), with the
|
|
299
|
+
* re-check's `code` and the wording `classifySendFailure` reads as
|
|
300
|
+
* `prompt-waiting`. Nothing has been typed.
|
|
301
|
+
*
|
|
302
|
+
* Refused on the wait's own reads, without reading the pane once more: those
|
|
303
|
+
* reads already confirmed the dialog, and another capture (tmux's own time-out
|
|
304
|
+
* is 5 s) would keep the picker and `/model` holding the instance's input lock
|
|
305
|
+
* past the confirmation time (review of #4067).
|
|
306
|
+
*/
|
|
307
|
+
function refuseConfirmedDialog(sessionName) {
|
|
308
|
+
logger.warn('input-recheck-prompt-waiting', { sessionName, cliToolId: 'copilot', confirmedMs: exports.COPILOT_DIALOG_CONFIRM_MS });
|
|
309
|
+
throw Object.assign(new Error(`A prompt dialog stayed open in session ${sessionName} for ${exports.COPILOT_DIALOG_CONFIRM_MS}ms ` +
|
|
310
|
+
'while the copilot composer was awaited (re-checked under the input lock); nothing was typed (Issue #4067).'), { code: send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE });
|
|
311
|
+
}
|
|
266
312
|
/**
|
|
267
313
|
* Copilot CLI tool implementation
|
|
268
314
|
* Manages GitHub Copilot interactive sessions using tmux
|
|
@@ -548,17 +594,18 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
548
594
|
* `❯` at column 0 while it is Working, the loop captures BEFORE its first
|
|
549
595
|
* sleep, and `COPILOT_PROMPT_PATTERN` matches immediately. A whole
|
|
550
596
|
* `sendMessage` measured 338 ms end to end, verification included.
|
|
551
|
-
* - **Composer gone — a dialog is up: the full 15 s
|
|
552
|
-
*
|
|
553
|
-
* the
|
|
554
|
-
* which is single-line, so a four-line message arrived as
|
|
555
|
-
* `ping oneping twoping three…`.
|
|
597
|
+
* - **Composer gone — a dialog is up: the full 15 s.** Measured against a
|
|
598
|
+
* session parked on copilot's own `Asked user …` question: until Issue #4040
|
|
599
|
+
* the send then went ahead, and the body was typed into the QUESTION's input
|
|
600
|
+
* line, which is single-line, so a four-line message arrived as
|
|
601
|
+
* `ping oneping twoping three…`. Now the window expiring refuses the send.
|
|
556
602
|
*
|
|
557
603
|
* That second case is #559's objection, and it is real — but it is not a
|
|
558
604
|
* reason to skip this method, because skipping it is what produced the same
|
|
559
|
-
* outcome in 0 ms instead of 15 s.
|
|
560
|
-
*
|
|
561
|
-
* `isPromptWaiting` (#1708/#1737) and
|
|
605
|
+
* outcome in 0 ms instead of 15 s. The layer above refuses most dialogs
|
|
606
|
+
* first: `sendUserMessage` and the terminal route both consult
|
|
607
|
+
* `isPromptWaiting` (#1708/#1737), and the shared sender re-reads the pane
|
|
608
|
+
* under the input lock (#3945).
|
|
562
609
|
*
|
|
563
610
|
* Issue #2623 adds a third case, measured on 1.0.85: **composer on screen,
|
|
564
611
|
* copilot still starting — until loading ends (3–4.5 s).** The composer is drawn
|
|
@@ -567,23 +614,44 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
567
614
|
* used to end this wait in 0 ms right there, which is how `send --model` on a
|
|
568
615
|
* session it had just started typed a body that never ran.
|
|
569
616
|
*
|
|
570
|
-
* Timing out
|
|
571
|
-
*
|
|
617
|
+
* Timing out logs and returns `ready: false`; every caller reads it and types
|
|
618
|
+
* nothing then — the normal send since Issue #4040 (it used to drop the result
|
|
619
|
+
* and send anyway), the selection-list branch and {@link sendModelCommand}.
|
|
620
|
+
*
|
|
621
|
+
* Issue #4067: a dialog does not wait out the window. A frame the shared
|
|
622
|
+
* sender's re-check would refuse (`detectSessionStatus().hasActivePrompt`,
|
|
623
|
+
* {@link recheckComposerBeforeInput}) on {@link PROMPT_WAIT_DIALOG_CONFIRM_READS}
|
|
624
|
+
* reads in a row spanning {@link COPILOT_DIALOG_CONFIRM_MS} returns
|
|
625
|
+
* `ready: false, dialog: true`, and every caller refuses it as
|
|
626
|
+
* `prompt-waiting`. Not counted: the folder-trust dialog (answered above,
|
|
627
|
+
* #1886), and a frame with the composer drawn — `idle` waits through a
|
|
628
|
+
* Working turn, which keeps `❯` on screen, and that is not a dialog.
|
|
629
|
+
*
|
|
630
|
+
* Issue #4084: no capture is waited for past `timeoutMs` ({@link readBeforeDeadline}):
|
|
631
|
+
* one still running then, or one that answers after it, is not used.
|
|
572
632
|
*
|
|
573
633
|
* @param sessionName - tmux session name
|
|
574
634
|
* @param timeoutMs - Optional timeout in ms (default: COPILOT_PROMPT_WAIT_TIMEOUT_MS)
|
|
575
635
|
* @param until - What counts as ready (Issue #2623, default `composer`)
|
|
576
|
-
* @returns Whether the pane got there,
|
|
636
|
+
* @returns Whether the pane got there, the last frame read (ANSI stripped),
|
|
637
|
+
* and whether it gave up on a dialog (Issue #4067)
|
|
577
638
|
*/
|
|
578
639
|
async waitForPrompt(sessionName, timeoutMs = COPILOT_PROMPT_WAIT_TIMEOUT_MS, until = 'composer') {
|
|
579
|
-
|
|
640
|
+
// Issue #4084: one deadline for the whole wait — a capture still running at
|
|
641
|
+
// it is not waited for, and a frame it returns past it is not used.
|
|
642
|
+
const deadline = Date.now() + timeoutMs;
|
|
580
643
|
const pollInterval = 500;
|
|
581
644
|
let trustDialogHandled = false;
|
|
582
645
|
let output = '';
|
|
583
|
-
|
|
646
|
+
// Issue #4067: the current run of reads that showed a dialog (counted by
|
|
647
|
+
// the helper opencode and vibe-local share, Issue #4084).
|
|
648
|
+
const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
649
|
+
while (Date.now() < deadline) {
|
|
584
650
|
try {
|
|
585
651
|
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
586
|
-
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
652
|
+
const rawOutput = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, 50), deadline);
|
|
653
|
+
if (rawOutput === null)
|
|
654
|
+
break;
|
|
587
655
|
output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
588
656
|
if (this.isReadyFor(until, output)) {
|
|
589
657
|
return { ready: true, output };
|
|
@@ -591,20 +659,28 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
591
659
|
// Issue #1886: `startSession` returns early for a session that already
|
|
592
660
|
// exists, so a pane adopted from outside CommandMate -- or one whose
|
|
593
661
|
// trust dialog nobody answered -- arrives here still sitting on it.
|
|
594
|
-
//
|
|
595
|
-
//
|
|
596
|
-
//
|
|
597
|
-
//
|
|
598
|
-
//
|
|
599
|
-
//
|
|
662
|
+
// Until Issue #4040 the normal send went ahead on a timeout, which
|
|
663
|
+
// typed the message body INTO the dialog; the body's digits are option
|
|
664
|
+
// selections there, so a message containing `2` picks "Yes, and
|
|
665
|
+
// remember this folder" and writes the operator's machine-global
|
|
666
|
+
// ~/.copilot/config.json. The send now refuses instead, but answering
|
|
667
|
+
// it here (as the launch path does) is what lets that send go through.
|
|
600
668
|
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
601
669
|
trustDialogHandled = true;
|
|
602
670
|
}
|
|
671
|
+
if (dialog.observe(this.isRefusableDialog(rawOutput, output))) {
|
|
672
|
+
logger.info('copilot-prompt-wait-dialog', { until, reads: dialog.reads, bottomRow: describeBottomRow(output) });
|
|
673
|
+
return { ready: false, output, dialog: true };
|
|
674
|
+
}
|
|
603
675
|
}
|
|
604
676
|
catch {
|
|
605
|
-
// Capture may fail - continue polling
|
|
677
|
+
// Capture may fail - continue polling. Not a dialog read: the run restarts.
|
|
678
|
+
dialog.reset();
|
|
606
679
|
}
|
|
607
|
-
|
|
680
|
+
const remaining = deadline - Date.now();
|
|
681
|
+
if (remaining <= 0)
|
|
682
|
+
break;
|
|
683
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(pollInterval, remaining)));
|
|
608
684
|
}
|
|
609
685
|
logger.info('copilot-prompt-not-detected', { until, bottomRow: describeBottomRow(output) });
|
|
610
686
|
return { ready: false, output };
|
|
@@ -620,6 +696,32 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
620
696
|
* @param until - What counts as ready
|
|
621
697
|
* @param output - ANSI-stripped pane capture
|
|
622
698
|
*/
|
|
699
|
+
/**
|
|
700
|
+
* {@link isReadyFor}`('composer')` for the shared sender's read under the
|
|
701
|
+
* input lock (Issue #4040). Not `idle`: copilot draws `❯` while Working and
|
|
702
|
+
* takes a body then, as it always has.
|
|
703
|
+
*/
|
|
704
|
+
inputReadiness = {
|
|
705
|
+
label: 'copilot',
|
|
706
|
+
isReady: (frame) => this.isReadyFor('composer', (0, cli_patterns_1.stripAnsi)(frame)),
|
|
707
|
+
};
|
|
708
|
+
/**
|
|
709
|
+
* Whether {@link waitForPrompt} counts this frame towards giving up on a
|
|
710
|
+
* dialog (Issue #4067): the shared sender's re-check would refuse it
|
|
711
|
+
* (`hasActivePrompt`), it is not the folder-trust dialog `waitForPrompt`
|
|
712
|
+
* answers itself (#1886), and no composer is drawn — a Working turn keeps
|
|
713
|
+
* `❯` up and is waited through, not refused.
|
|
714
|
+
*
|
|
715
|
+
* @param rawOutput - The capture as read (ANSI allowed), for the detector
|
|
716
|
+
* @param output - The same capture, ANSI stripped
|
|
717
|
+
*/
|
|
718
|
+
isRefusableDialog(rawOutput, output) {
|
|
719
|
+
if ((0, cli_patterns_1.isCopilotFolderTrustDialog)(output))
|
|
720
|
+
return false;
|
|
721
|
+
if (this.isReadyFor('composer', output))
|
|
722
|
+
return false;
|
|
723
|
+
return (0, status_detector_1.detectSessionStatus)(rawOutput, 'copilot').hasActivePrompt;
|
|
724
|
+
}
|
|
623
725
|
isReadyFor(until, output) {
|
|
624
726
|
if (!cli_patterns_1.COPILOT_PROMPT_PATTERN.test(output))
|
|
625
727
|
return false;
|
|
@@ -700,6 +802,10 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
700
802
|
// then refuses on the same terms right before the keys: a dialog is
|
|
701
803
|
// `prompt-waiting`, a pane that cannot be read `recheck-failed`.
|
|
702
804
|
const prompt = await this.waitForPrompt(sessionName);
|
|
805
|
+
// Issue #4067: a dialog that stayed up is refused at once — the lock
|
|
806
|
+
// is not held for the rest of the window behind it.
|
|
807
|
+
if (prompt.dialog)
|
|
808
|
+
refuseConfirmedDialog(sessionName);
|
|
703
809
|
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
704
810
|
if (!prompt.ready) {
|
|
705
811
|
// review-3: neither the request nor the pane goes into the message.
|
|
@@ -723,8 +829,25 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
723
829
|
logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
|
|
724
830
|
return;
|
|
725
831
|
}
|
|
726
|
-
// Verify Copilot is at prompt state before sending
|
|
727
|
-
|
|
832
|
+
// Verify Copilot is at prompt state before sending. Issue #4040: a
|
|
833
|
+
// composer that never came up is not typed into — refused as the
|
|
834
|
+
// selection-list branch refuses (review-3: neither the body nor the pane
|
|
835
|
+
// goes into the message, which `classifySendFailure` reads).
|
|
836
|
+
const prompt = await this.waitForPrompt(sessionName);
|
|
837
|
+
if (!prompt.ready) {
|
|
838
|
+
// Issue #4067: the wait gave up on a dialog after its confirmation time
|
|
839
|
+
// rather than the whole 15 s window.
|
|
840
|
+
if (prompt.dialog)
|
|
841
|
+
refuseConfirmedDialog(sessionName);
|
|
842
|
+
// A dialog that opened during the wait and is still up is refused as
|
|
843
|
+
// the shared sender's re-check refuses it — `prompt-waiting` (409
|
|
844
|
+
// PROMPT_WAITING), not `prompt-not-ready`. A re-read that fails is
|
|
845
|
+
// left to the refusal below.
|
|
846
|
+
await rethrowIfDialogOpen(sessionName);
|
|
847
|
+
logger.warn('copilot-message-not-sent:prompt-not-ready', { bottomRow: describeBottomRow(prompt.output) });
|
|
848
|
+
throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
|
|
849
|
+
'so the message was not sent; nothing was typed');
|
|
850
|
+
}
|
|
728
851
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
729
852
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
730
853
|
// Copilot's own text-input / post-Enter delays are preserved. The selection
|
|
@@ -736,6 +859,8 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
736
859
|
composer: this.describeComposer(),
|
|
737
860
|
textInputWaitMs: copilot_constants_1.COPILOT_TEXT_INPUT_DELAY_MS,
|
|
738
861
|
verifyDelayMs: copilot_constants_1.COPILOT_SEND_ENTER_DELAY_MS,
|
|
862
|
+
// Issue #4040: the same test, of the newest frame read under the lock.
|
|
863
|
+
readiness: this.inputReadiness,
|
|
739
864
|
});
|
|
740
865
|
// Invalidate cache after sending message
|
|
741
866
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -822,6 +947,10 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
822
947
|
await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
|
|
823
948
|
const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
|
|
824
949
|
if (!idle.ready) {
|
|
950
|
+
// Issue #4067: a dialog is refused after its confirmation time, not after
|
|
951
|
+
// the 30 s window under the lock.
|
|
952
|
+
if (idle.dialog)
|
|
953
|
+
refuseConfirmedDialog(sessionName);
|
|
825
954
|
// The pane's text goes to the log, not the message: the message is read by
|
|
826
955
|
// `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
|
|
827
956
|
logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
|
|
@@ -52,6 +52,10 @@ const terminal_keys_1 = require("../../types/terminal-keys");
|
|
|
52
52
|
const tmux_1 = require("../tmux/tmux");
|
|
53
53
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
54
54
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
55
|
+
const readiness_1 = require("../detection/tools/opencode/readiness");
|
|
56
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
57
|
+
const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
|
|
58
|
+
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
55
59
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
56
60
|
const opencode_config_1 = require("./opencode-config");
|
|
57
61
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
@@ -110,6 +114,28 @@ exports.OPENCODE_READY_MAX_ATTEMPTS = 60;
|
|
|
110
114
|
* in the frame regardless of this number. Matches copilot's 50.
|
|
111
115
|
*/
|
|
112
116
|
const OPENCODE_READY_CAPTURE_LINES = 50;
|
|
117
|
+
/**
|
|
118
|
+
* How long a send that has to fall back to the keyboard waits for the input
|
|
119
|
+
* box (Issue #4040) — the same 15 s as gemini's and codex's send waits. The
|
|
120
|
+
* launch window (`OPENCODE_READY_*`, 30 s) is the launch's; a send arrives
|
|
121
|
+
* after it, and a pane still not up 15 s later is refused as `not-sent`
|
|
122
|
+
* rather than typed into.
|
|
123
|
+
*/
|
|
124
|
+
const OPENCODE_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
125
|
+
/** Interval between the send's readiness polls (Issue #4040). */
|
|
126
|
+
const OPENCODE_PROMPT_POLL_INTERVAL_MS = 500;
|
|
127
|
+
/**
|
|
128
|
+
* Whether {@link OpenCodeTool}'s keyboard-fallback wait counts this frame
|
|
129
|
+
* towards giving up on a dialog (Issue #4084): an active prompt, or opencode's
|
|
130
|
+
* `waiting` without one (its permission strip, pickers, palette and overlays
|
|
131
|
+
* answer with keys, #1896) — and never a turn being generated. There is no
|
|
132
|
+
* folder-trust dialog here to leave out: this wait answers none.
|
|
133
|
+
*/
|
|
134
|
+
function isOpenCodeWaitDialog(status) {
|
|
135
|
+
if ((0, status_detector_1.isGeneratingStatus)(status))
|
|
136
|
+
return false;
|
|
137
|
+
return status.hasActivePrompt || status.status === 'waiting';
|
|
138
|
+
}
|
|
113
139
|
/**
|
|
114
140
|
* Waits before each read-back of a message just posted to the server (#2035).
|
|
115
141
|
*
|
|
@@ -498,12 +524,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
498
524
|
* @param imagePath - Absolute path to an attachment, if there is one
|
|
499
525
|
* @returns Whether the message was posted **and** read back
|
|
500
526
|
*/
|
|
501
|
-
async trySendViaServer(target, message, imagePath) {
|
|
527
|
+
async trySendViaServer(target, message, imagePath, trace) {
|
|
502
528
|
const outcome = await this.dispatchViaServer(target, message, imagePath);
|
|
503
529
|
if (outcome === 'delivered')
|
|
504
530
|
return true;
|
|
505
531
|
if (outcome !== 'skipped')
|
|
506
532
|
(0, instance_input_lock_1.noteDispatchFailed)(outcome);
|
|
533
|
+
// Issue #4040: an `unknown` dispatch may have delivered the message, so a
|
|
534
|
+
// keyboard fallback that then refuses must not report the send `not-sent`.
|
|
535
|
+
if (outcome === 'unknown' && trace !== undefined)
|
|
536
|
+
trace.unknown = true;
|
|
507
537
|
return false;
|
|
508
538
|
}
|
|
509
539
|
/**
|
|
@@ -655,10 +685,24 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
655
685
|
* `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, must not
|
|
656
686
|
* become a pane that cannot be sent to.
|
|
657
687
|
*
|
|
688
|
+
* Issue #4040: that keyboard path now waits for an empty input box first
|
|
689
|
+
* (`waitForPrompt`, and again under the input lock) and refuses as
|
|
690
|
+
* `not-sent` / `prompt-not-ready` when none comes up — unless the server
|
|
691
|
+
* dispatch before it ended `unknown`, in which case the refusal stays
|
|
692
|
+
* `indeterminate`. A `delivered` send neither waits nor types.
|
|
693
|
+
*
|
|
658
694
|
* @param worktreeId - Worktree ID
|
|
659
695
|
* @param message - Message to send
|
|
660
696
|
*/
|
|
661
697
|
async sendMessage(worktreeId, message, instanceId) {
|
|
698
|
+
await this.sendMessageAfterDispatch(worktreeId, message, instanceId, { unknown: false });
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* {@link sendMessage}'s body, carrying whether a server dispatch earlier in
|
|
702
|
+
* the same send ended `unknown` (Issue #4040): {@link sendMessageWithImage}'s
|
|
703
|
+
* image dispatch is one, and its path fallback comes back through here.
|
|
704
|
+
*/
|
|
705
|
+
async sendMessageAfterDispatch(worktreeId, message, instanceId, trace) {
|
|
662
706
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
663
707
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
664
708
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
@@ -671,14 +715,27 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
671
715
|
// typing the message into a shell prompt. The relaunch reserves a port and
|
|
672
716
|
// re-attaches, so the server path is available again by the time it is
|
|
673
717
|
// tried. `sendMessageWithImage` reaches this through its own fallback.
|
|
674
|
-
|
|
675
|
-
|
|
718
|
+
//
|
|
719
|
+
// Issue #4040: when that fallback follows an `unknown` image dispatch, a
|
|
720
|
+
// refusal here (`SESSION_STARTING`, a pane that is gone) typed nothing but
|
|
721
|
+
// does not make the send as a whole safe to resend either.
|
|
722
|
+
try {
|
|
723
|
+
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
|
|
724
|
+
}
|
|
725
|
+
catch (error) {
|
|
726
|
+
throw this.keepUnknownDispatch(error, trace, sessionName) ?? error;
|
|
727
|
+
}
|
|
728
|
+
if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message, undefined, trace)) {
|
|
676
729
|
// Issue #405: the transcript grew, so the cached capture is stale — the
|
|
677
730
|
// same reason the keystroke path invalidates below.
|
|
678
731
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
679
732
|
return;
|
|
680
733
|
}
|
|
681
734
|
try {
|
|
735
|
+
// Issue #4040: the keyboard fallback types only into an input box that is
|
|
736
|
+
// up and empty — the first send to a new pane always lands here (no
|
|
737
|
+
// session id yet), as does every send of a pane with no live server.
|
|
738
|
+
await this.waitForPrompt(sessionName);
|
|
682
739
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
683
740
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
684
741
|
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
@@ -686,6 +743,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
686
743
|
message,
|
|
687
744
|
cliToolId: 'opencode',
|
|
688
745
|
composer: this.describeComposer(),
|
|
746
|
+
// Issue #4040: the same test, of the newest frame read under the input lock.
|
|
747
|
+
readiness: { label: 'OpenCode', isReady: readiness_1.isOpenCodeComposerReady },
|
|
689
748
|
});
|
|
690
749
|
// Issue #405: Invalidate cache after sending message
|
|
691
750
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -693,10 +752,97 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
693
752
|
}
|
|
694
753
|
catch (error) {
|
|
695
754
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
755
|
+
// Issue #4040: the keyboard typed nothing (no ready input box — or any
|
|
756
|
+
// other refusal before the first key: a dialog, the lock), but the server
|
|
757
|
+
// dispatch before it may have delivered the message, so the send as a
|
|
758
|
+
// whole stays unknown rather than "safe to resend".
|
|
759
|
+
const kept = this.keepUnknownDispatch(error, trace, sessionName);
|
|
760
|
+
if (kept)
|
|
761
|
+
throw kept;
|
|
696
762
|
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
697
763
|
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
|
|
698
764
|
}
|
|
699
765
|
}
|
|
766
|
+
/**
|
|
767
|
+
* The error a refusal with nothing typed becomes after a server dispatch of
|
|
768
|
+
* the same send ended `unknown` (Issue #4040): the message may already be
|
|
769
|
+
* there, so `classifySendFailure` must read the send as indeterminate.
|
|
770
|
+
*
|
|
771
|
+
* @returns the wrapped error, or `null` when the dispatch was not `unknown`
|
|
772
|
+
* or the refusal is not a `not-sent` one (the caller throws its own)
|
|
773
|
+
*/
|
|
774
|
+
keepUnknownDispatch(error, trace, sessionName) {
|
|
775
|
+
if (!trace.unknown)
|
|
776
|
+
return null;
|
|
777
|
+
const refusal = (0, send_attempt_state_1.classifySendFailure)(error);
|
|
778
|
+
if (refusal.state !== 'not-sent')
|
|
779
|
+
return null;
|
|
780
|
+
logger.warn('opencode-send-not-typed-after-unknown-dispatch', { sessionName, reason: refusal.reason });
|
|
781
|
+
return new Error(`Failed to send message to OpenCode: the keyboard fallback typed nothing (${refusal.reason}), ` +
|
|
782
|
+
'but an earlier server dispatch may have delivered the message (Issue #4040)', { cause: error });
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Wait for an empty input box before the keyboard fallback types (Issue #4040).
|
|
786
|
+
*
|
|
787
|
+
* {@link isOpenCodeComposerReady} is the test: the box on screen, empty, and
|
|
788
|
+
* no dialog or overlay over it (the `Connect a provider` overlay included —
|
|
789
|
+
* every option on it writes credentials, so it is never typed into).
|
|
790
|
+
*
|
|
791
|
+
* A dialog or overlay ({@link isOpenCodeWaitDialog}) does not keep the send
|
|
792
|
+
* here for the whole window behind a choice only a person can make — but
|
|
793
|
+
* since Issue #4084 it ends the wait only once confirmed: seen on 2 reads in a
|
|
794
|
+
* row spanning {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}, the count copilot's wait
|
|
795
|
+
* uses (#4067). It used to end the wait on one read, so a frame mid-paint
|
|
796
|
+
* could cut the wait short. A confirmed dialog is refused at once on the
|
|
797
|
+
* wait's own reads, as the shared sender's re-check under the lock would have
|
|
798
|
+
* refused it: `prompt-waiting` when the detector reports an active prompt,
|
|
799
|
+
* otherwise `prompt-not-ready` (opencode's permission strip, pickers and
|
|
800
|
+
* palette read as `waiting` without `hasActivePrompt`, #1896). A dialog that
|
|
801
|
+
* opens after the wait is still refused under the input lock on one read. No
|
|
802
|
+
* capture is waited for past the window: one still running at the deadline
|
|
803
|
+
* is not used.
|
|
804
|
+
*
|
|
805
|
+
* @throws Error (`OpenCode prompt not ready`) when the box did not come up
|
|
806
|
+
* within {@link OPENCODE_PROMPT_WAIT_TIMEOUT_MS}, or a dialog without an
|
|
807
|
+
* active prompt was confirmed; nothing was typed
|
|
808
|
+
* @throws Error coded `prompt-waiting` ({@link confirmedDialogRefusal}) for a
|
|
809
|
+
* confirmed dialog the detector reads as an active prompt; nothing was typed
|
|
810
|
+
*/
|
|
811
|
+
async waitForPrompt(sessionName) {
|
|
812
|
+
const deadline = Date.now() + OPENCODE_PROMPT_WAIT_TIMEOUT_MS;
|
|
813
|
+
const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
814
|
+
while (Date.now() < deadline) {
|
|
815
|
+
let refusal = null;
|
|
816
|
+
try {
|
|
817
|
+
const output = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, OPENCODE_READY_CAPTURE_LINES), deadline);
|
|
818
|
+
if (output === null)
|
|
819
|
+
break;
|
|
820
|
+
if ((0, readiness_1.isOpenCodeComposerReady)(output))
|
|
821
|
+
return;
|
|
822
|
+
const status = (0, status_detector_1.detectSessionStatus)(output, 'opencode');
|
|
823
|
+
if (dialog.observe(isOpenCodeWaitDialog(status))) {
|
|
824
|
+
logger.warn('opencode-prompt-wait-dialog', { sessionName, reads: dialog.reads, reason: status.reason });
|
|
825
|
+
refusal = status.hasActivePrompt
|
|
826
|
+
? (0, prompt_wait_dialog_1.confirmedDialogRefusal)(sessionName, 'OpenCode')
|
|
827
|
+
: new Error(`OpenCode prompt not ready: a dialog or overlay (${status.reason}) stayed up for ` +
|
|
828
|
+
`${prompt_wait_dialog_1.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms before sending; nothing was typed (Issue #4084)`);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
catch (error) {
|
|
832
|
+
// Capture may fail - continue polling. Not a dialog read: the run restarts.
|
|
833
|
+
dialog.reset();
|
|
834
|
+
logger.debug('opencode-prompt-capture-failed', { sessionName, error: (0, errors_1.getErrorMessage)(error) });
|
|
835
|
+
}
|
|
836
|
+
if (refusal)
|
|
837
|
+
throw refusal;
|
|
838
|
+
const remaining = deadline - Date.now();
|
|
839
|
+
if (remaining <= 0)
|
|
840
|
+
break;
|
|
841
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(OPENCODE_PROMPT_POLL_INTERVAL_MS, remaining)));
|
|
842
|
+
}
|
|
843
|
+
logger.info('opencode-prompt-not-detected');
|
|
844
|
+
throw new Error('OpenCode prompt not ready: timed out waiting for the input prompt before sending');
|
|
845
|
+
}
|
|
700
846
|
/**
|
|
701
847
|
* opencode can attach an image — sometimes (Issue #2035).
|
|
702
848
|
*
|
|
@@ -724,7 +870,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
724
870
|
*
|
|
725
871
|
* The fallback is that same degraded body, reached whenever the server route
|
|
726
872
|
* does not apply, and it is deliberately routed back through
|
|
727
|
-
* {@link sendMessage}
|
|
873
|
+
* {@link sendMessage}'s body (`sendMessageAfterDispatch`, carrying whether
|
|
874
|
+
* the image dispatch ended `unknown` — Issue #4040) rather than
|
|
875
|
+
* `sendMessageWithSubmitVerification`: the
|
|
728
876
|
* reason the image could not be attached is usually "no session yet", and by
|
|
729
877
|
* the time the text is sent that can already have changed. Going through
|
|
730
878
|
* `sendMessage` gives the text one honest attempt at the API before the
|
|
@@ -739,12 +887,15 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
739
887
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
740
888
|
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
|
|
741
889
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
742
|
-
|
|
890
|
+
// Issue #4040: one trace for the whole send, so an `unknown` image dispatch
|
|
891
|
+
// is not forgotten when the path fallback's own dispatch is refused.
|
|
892
|
+
const trace = { unknown: false };
|
|
893
|
+
if (await this.trySendViaServer(target, message, imagePath, trace)) {
|
|
743
894
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
744
895
|
return;
|
|
745
896
|
}
|
|
746
897
|
logger.info('opencode-image-degraded-to-path', { worktreeId, instanceId: instanceId ?? this.id });
|
|
747
|
-
await this.
|
|
898
|
+
await this.sendMessageAfterDispatch(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId, trace);
|
|
748
899
|
}
|
|
749
900
|
/**
|
|
750
901
|
* Kill OpenCode session with graceful shutdown.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Giving up on a dialog in a tool's own prompt wait — the wait before the
|
|
4
|
+
* input lock (Issue #4067 for copilot, Issue #4084 for opencode and
|
|
5
|
+
* vibe-local).
|
|
6
|
+
*
|
|
7
|
+
* A dialog waits for a person, so the wait does not sit out its whole window
|
|
8
|
+
* (15 s) behind it. But a frame caught mid-paint can read as a dialog once, so
|
|
9
|
+
* one read is not enough: the dialog has to be seen on
|
|
10
|
+
* {@link PROMPT_WAIT_DIALOG_CONFIRM_READS} reads in a row spanning
|
|
11
|
+
* {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}. A read without a dialog, or a capture
|
|
12
|
+
* that failed, starts the run again.
|
|
13
|
+
*
|
|
14
|
+
* What counts as a dialog is each tool's own test (copilot excludes its
|
|
15
|
+
* folder-trust dialog and a drawn composer; opencode counts `waiting` without
|
|
16
|
+
* `hasActivePrompt`; nobody counts a Working frame). This module only counts.
|
|
17
|
+
*
|
|
18
|
+
* Only the wait's screen reading is confirmed this way. The prompt guard at
|
|
19
|
+
* the service entry (which also reads the hooks' structured record) and the
|
|
20
|
+
* re-check under the input lock still decide on one read.
|
|
21
|
+
*
|
|
22
|
+
* @module lib/cli-tools/prompt-wait-dialog
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = void 0;
|
|
26
|
+
exports.createDialogConfirmation = createDialogConfirmation;
|
|
27
|
+
exports.readBeforeDeadline = readBeforeDeadline;
|
|
28
|
+
exports.confirmedDialogRefusal = confirmedDialogRefusal;
|
|
29
|
+
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
30
|
+
/** How long a dialog has to stay up before a prompt wait gives up on it. */
|
|
31
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = 2000;
|
|
32
|
+
/** On how many reads in a row (both thresholds must hold). */
|
|
33
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = 2;
|
|
34
|
+
/** A fresh, empty run. */
|
|
35
|
+
function createDialogConfirmation() {
|
|
36
|
+
let since = null;
|
|
37
|
+
let reads = 0;
|
|
38
|
+
return {
|
|
39
|
+
observe(isDialog, now = Date.now()) {
|
|
40
|
+
if (!isDialog) {
|
|
41
|
+
since = null;
|
|
42
|
+
reads = 0;
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
since ??= now;
|
|
46
|
+
reads++;
|
|
47
|
+
return reads >= exports.PROMPT_WAIT_DIALOG_CONFIRM_READS && now - since >= exports.PROMPT_WAIT_DIALOG_CONFIRM_MS;
|
|
48
|
+
},
|
|
49
|
+
reset() {
|
|
50
|
+
since = null;
|
|
51
|
+
reads = 0;
|
|
52
|
+
},
|
|
53
|
+
get reads() {
|
|
54
|
+
return reads;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run `read` (a capture), but stop waiting for it at `deadline` (Issue #4084):
|
|
60
|
+
* a capture that is still running then (tmux's own time-out is 5 s) does not
|
|
61
|
+
* stretch the wait past its window, and the frame it returns late is not used.
|
|
62
|
+
*
|
|
63
|
+
* The clock is checked again once the race has answered, as the wait under the
|
|
64
|
+
* input lock does (`awaitReadyUnderLock`): when the capture's completion is
|
|
65
|
+
* handled before the deadline's timer, the race answers with a frame read past
|
|
66
|
+
* the deadline, and that frame is not used either (nor a failure that late).
|
|
67
|
+
*
|
|
68
|
+
* @returns what `read` returned, or `null` when the deadline came first
|
|
69
|
+
* @throws what `read` threw, when it threw before the deadline
|
|
70
|
+
*/
|
|
71
|
+
async function readBeforeDeadline(read, deadline) {
|
|
72
|
+
const remaining = deadline - Date.now();
|
|
73
|
+
if (remaining <= 0)
|
|
74
|
+
return null;
|
|
75
|
+
let timer;
|
|
76
|
+
const reading = read();
|
|
77
|
+
// A late failure is nobody's to handle once the deadline has answered.
|
|
78
|
+
reading.catch(() => undefined);
|
|
79
|
+
let result;
|
|
80
|
+
try {
|
|
81
|
+
result = await Promise.race([
|
|
82
|
+
reading,
|
|
83
|
+
new Promise((resolve) => {
|
|
84
|
+
timer = setTimeout(() => resolve(null), remaining);
|
|
85
|
+
}),
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (Date.now() > deadline)
|
|
90
|
+
return null;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
if (timer !== undefined)
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
}
|
|
97
|
+
// Answered past the deadline, whichever settled first: the wait is over.
|
|
98
|
+
if (Date.now() > deadline)
|
|
99
|
+
return null;
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The `prompt-waiting` refusal of a dialog a prompt wait confirmed (Issue
|
|
104
|
+
* #4084), worded and coded as the re-check under the input lock words it
|
|
105
|
+
* (`recheckComposerBeforeInput`), which is what `classifySendFailure` and the
|
|
106
|
+
* send service read. Nothing has been typed. Refused on the wait's own reads,
|
|
107
|
+
* without reading the pane once more.
|
|
108
|
+
*
|
|
109
|
+
* The wording must not say "prompt not ready": the classifier matches that
|
|
110
|
+
* first.
|
|
111
|
+
*/
|
|
112
|
+
function confirmedDialogRefusal(sessionName, label) {
|
|
113
|
+
return Object.assign(new Error(`A prompt dialog stayed open in session ${sessionName} for ${exports.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms ` +
|
|
114
|
+
`while the ${label} input prompt was awaited (re-checked under the input lock); nothing was typed (Issue #4084).`), { code: send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE });
|
|
115
|
+
}
|