commandmate 0.49.1 → 0.49.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +246 -243
- package/.next/app-path-routes-manifest.json +18 -17
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +4 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +10 -10
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +18 -17
- package/.next/server/chunks/1308.js +1 -0
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/3801.js +8 -8
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4490.js +1 -0
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5350.js +212 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/7926.js +1 -0
- package/.next/server/chunks/8581.js +15 -15
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +89 -88
- package/.next/server/chunks/8918.js +3 -3
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9702.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-675ba6b21844dc3b.js → 2407-87ec01332344ec2b.js} +1 -1
- package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +56 -5
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +17 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +14 -8
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +4 -1
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +146 -8
- package/dist/cli/commands/report.d.ts +7 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +19 -6
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +29 -5
- package/dist/cli/commands/respond.d.ts +2 -2
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +40 -37
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +8 -4
- package/dist/cli/commands/task.d.ts +22 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +26 -18
- package/dist/cli/commands/wait-instance.d.ts +9 -1
- package/dist/cli/commands/wait-instance.d.ts.map +1 -1
- package/dist/cli/commands/wait-instance.js +15 -0
- package/dist/cli/commands/wait-poll-state.d.ts +18 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.d.ts +2 -1
- package/dist/cli/commands/wait-verify.d.ts.map +1 -1
- package/dist/cli/commands/wait-verify.js +5 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +37 -13
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +1 -0
- package/dist/cli/types/api-responses.d.ts +55 -1
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client-deadline.d.ts +28 -0
- package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
- package/dist/cli/utils/api-client-deadline.js +46 -0
- package/dist/cli/utils/api-client-errors.d.ts +118 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +210 -0
- package/dist/cli/utils/api-client.d.ts +33 -109
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +202 -227
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +1 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +7 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.d.ts +25 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +10 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +9 -0
- package/dist/server/locales/ja/worktree.json +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +5 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/claude.js +8 -2
- package/dist/server/src/lib/cli-tools/codex.js +7 -4
- package/dist/server/src/lib/cli-tools/command-code.js +14 -18
- package/dist/server/src/lib/cli-tools/copilot.js +159 -28
- package/dist/server/src/lib/cli-tools/gemini.js +10 -2
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +162 -8
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +57 -14
- package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +143 -187
- package/dist/server/src/lib/cli-tools/vibe-local.js +91 -2
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +114 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
- package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
- package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
- package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
- package/dist/server/src/lib/db/relay-bind-db.js +88 -167
- package/dist/server/src/lib/db/relay-db-base.js +20 -0
- package/dist/server/src/lib/db/relay-db-count.js +49 -0
- package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
- package/dist/server/src/lib/db/relay-db-hold.js +250 -0
- package/dist/server/src/lib/db/relay-db.js +33 -92
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/prompt-answer-errors.js +76 -2
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery.js +359 -79
- package/dist/server/src/lib/relay/relay-messages.js +13 -0
- package/dist/server/src/lib/relay/relay-system-line.js +28 -15
- package/dist/server/src/lib/relay/types.js +14 -2
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
- package/dist/server/src/lib/session/claude-session.js +26 -7
- package/dist/server/src/lib/session/current-output-builder.js +7 -3
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +47 -2
- package/dist/server/src/lib/session/prompt-submit-receipt.js +224 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +16 -3
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/send-attempt-state.js +177 -2
- package/dist/server/src/lib/session/send-attempt-types.js +10 -1
- package/dist/server/src/lib/session/send-user-message.js +80 -8
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +17 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +6 -28
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.2.json +49 -0
- package/release-notes/0.49.3.json +52 -0
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3773.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9198.js +0 -144
- package/.next/static/chunks/3931-1a1abab16248f14d.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-ce17ffa77f39608e.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +0 -1
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
- /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
|
@@ -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
|
*
|
|
@@ -335,7 +361,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
335
361
|
});
|
|
336
362
|
}
|
|
337
363
|
const launchedAt = Date.now();
|
|
338
|
-
|
|
364
|
+
// Issue #3981: in one writer's turn of the input lock; the readiness
|
|
365
|
+
// wait below stays outside it.
|
|
366
|
+
await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
|
|
339
367
|
// Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
|
|
340
368
|
await this.waitForReady(sessionName);
|
|
341
369
|
// Issue #1763: subscribe once the server is up. Health-checked first, so
|
|
@@ -496,12 +524,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
496
524
|
* @param imagePath - Absolute path to an attachment, if there is one
|
|
497
525
|
* @returns Whether the message was posted **and** read back
|
|
498
526
|
*/
|
|
499
|
-
async trySendViaServer(target, message, imagePath) {
|
|
527
|
+
async trySendViaServer(target, message, imagePath, trace) {
|
|
500
528
|
const outcome = await this.dispatchViaServer(target, message, imagePath);
|
|
501
529
|
if (outcome === 'delivered')
|
|
502
530
|
return true;
|
|
503
531
|
if (outcome !== 'skipped')
|
|
504
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;
|
|
505
537
|
return false;
|
|
506
538
|
}
|
|
507
539
|
/**
|
|
@@ -653,10 +685,24 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
653
685
|
* `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, must not
|
|
654
686
|
* become a pane that cannot be sent to.
|
|
655
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
|
+
*
|
|
656
694
|
* @param worktreeId - Worktree ID
|
|
657
695
|
* @param message - Message to send
|
|
658
696
|
*/
|
|
659
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) {
|
|
660
706
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
661
707
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
662
708
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
@@ -669,14 +715,27 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
669
715
|
// typing the message into a shell prompt. The relaunch reserves a port and
|
|
670
716
|
// re-attaches, so the server path is available again by the time it is
|
|
671
717
|
// tried. `sendMessageWithImage` reaches this through its own fallback.
|
|
672
|
-
|
|
673
|
-
|
|
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)) {
|
|
674
729
|
// Issue #405: the transcript grew, so the cached capture is stale — the
|
|
675
730
|
// same reason the keystroke path invalidates below.
|
|
676
731
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
677
732
|
return;
|
|
678
733
|
}
|
|
679
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);
|
|
680
739
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
681
740
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
682
741
|
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
@@ -684,6 +743,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
684
743
|
message,
|
|
685
744
|
cliToolId: 'opencode',
|
|
686
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 },
|
|
687
748
|
});
|
|
688
749
|
// Issue #405: Invalidate cache after sending message
|
|
689
750
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -691,8 +752,96 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
691
752
|
}
|
|
692
753
|
catch (error) {
|
|
693
754
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
694
|
-
|
|
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;
|
|
762
|
+
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
763
|
+
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
|
|
764
|
+
}
|
|
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)));
|
|
695
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');
|
|
696
845
|
}
|
|
697
846
|
/**
|
|
698
847
|
* opencode can attach an image — sometimes (Issue #2035).
|
|
@@ -721,7 +870,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
721
870
|
*
|
|
722
871
|
* The fallback is that same degraded body, reached whenever the server route
|
|
723
872
|
* does not apply, and it is deliberately routed back through
|
|
724
|
-
* {@link sendMessage}
|
|
873
|
+
* {@link sendMessage}'s body (`sendMessageAfterDispatch`, carrying whether
|
|
874
|
+
* the image dispatch ended `unknown` — Issue #4040) rather than
|
|
875
|
+
* `sendMessageWithSubmitVerification`: the
|
|
725
876
|
* reason the image could not be attached is usually "no session yet", and by
|
|
726
877
|
* the time the text is sent that can already have changed. Going through
|
|
727
878
|
* `sendMessage` gives the text one honest attempt at the API before the
|
|
@@ -736,12 +887,15 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
736
887
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
737
888
|
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
|
|
738
889
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
739
|
-
|
|
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)) {
|
|
740
894
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
741
895
|
return;
|
|
742
896
|
}
|
|
743
897
|
logger.info('opencode-image-degraded-to-path', { worktreeId, instanceId: instanceId ?? this.id });
|
|
744
|
-
await this.
|
|
898
|
+
await this.sendMessageAfterDispatch(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId, trace);
|
|
745
899
|
}
|
|
746
900
|
/**
|
|
747
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
|
+
}
|
|
@@ -44,8 +44,16 @@ const legacy_session_alias_1 = require("../tmux/legacy-session-alias");
|
|
|
44
44
|
const SESSION_NAME_PREFIX = 'mcbd-';
|
|
45
45
|
/** Shape of a session-name namespace: 8 lowercase hex digits (Issue #2866). */
|
|
46
46
|
exports.SESSION_NAMESPACE_PATTERN = /^[0-9a-f]{8}$/;
|
|
47
|
-
/**
|
|
48
|
-
|
|
47
|
+
/**
|
|
48
|
+
* CLI tool ids, longest first, so a longer id is never read as a shorter one.
|
|
49
|
+
*
|
|
50
|
+
* Read when called, not when this module loads (Issue #3981): modules loaded
|
|
51
|
+
* early (`session-starting-state`) import this one, and a module-load read of
|
|
52
|
+
* `CLI_TOOL_IDS` reaches a test's getter mock before it can answer.
|
|
53
|
+
*/
|
|
54
|
+
function cliToolIdsLongestFirst() {
|
|
55
|
+
return [...types_1.CLI_TOOL_IDS].sort((a, b) => b.length - a.length);
|
|
56
|
+
}
|
|
49
57
|
/**
|
|
50
58
|
* The namespace this process names its sessions with, or null (legacy names).
|
|
51
59
|
*
|
|
@@ -150,7 +158,7 @@ function parseSessionName(name) {
|
|
|
150
158
|
namespace = body.slice(0, dash);
|
|
151
159
|
body = body.slice(dash + 1);
|
|
152
160
|
}
|
|
153
|
-
const cliToolId =
|
|
161
|
+
const cliToolId = cliToolIdsLongestFirst().find((id) => body.startsWith(`${id}-`));
|
|
154
162
|
if (!cliToolId)
|
|
155
163
|
return null;
|
|
156
164
|
const rest = body.slice(cliToolId.length + 1);
|
|
@@ -10,11 +10,13 @@ exports.withoutTrailingBlankRows = withoutTrailingBlankRows;
|
|
|
10
10
|
exports.findPasteTokens = findPasteTokens;
|
|
11
11
|
exports.readSubmitComposer = readSubmitComposer;
|
|
12
12
|
exports.classifySubmit = classifySubmit;
|
|
13
|
+
exports.classifySubmitWithRule = classifySubmitWithRule;
|
|
13
14
|
exports.isSubmitted = isSubmitted;
|
|
14
15
|
exports.classifyPasteLanded = classifyPasteLanded;
|
|
15
16
|
exports.compactText = compactText;
|
|
16
17
|
const composer_spec_1 = require("./composer-spec");
|
|
17
18
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
19
|
+
const composer_own_text_1 = require("../detection/tools/opencode/composer-own-text");
|
|
18
20
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
19
21
|
/**
|
|
20
22
|
* Version-resilient pasted-text placeholder.
|
|
@@ -38,6 +40,13 @@ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
|
|
|
38
40
|
* substitution, so a genuinely-submitted message never fails spuriously.
|
|
39
41
|
*/
|
|
40
42
|
const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
|
|
43
|
+
/**
|
|
44
|
+
* opencode's empty-buffer placeholder on a box row's own text (Issue #4067):
|
|
45
|
+
* `OPENCODE_IDLE_COMPOSER_PATTERN` with the gutter already removed by
|
|
46
|
+
* `readOpenCodeComposerOwnRows`. Start-anchored like that pattern, so the
|
|
47
|
+
* phrase quoted inside a typed body is not taken for it.
|
|
48
|
+
*/
|
|
49
|
+
const OPENCODE_OWN_PLACEHOLDER = /^Ask anything(?:\.\.\.|\u2026)/;
|
|
41
50
|
/**
|
|
42
51
|
* Prompt input-line markers across the marker-drawing TUIs.
|
|
43
52
|
* claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
|
|
@@ -94,17 +103,26 @@ exports.VERIFY_WINDOW_LINES = 12;
|
|
|
94
103
|
*/
|
|
95
104
|
function readComposer(reader, lines, windowLines) {
|
|
96
105
|
if (reader === 'opencode-box') {
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
// Each buffer row's own text: gutter removed and cut at the box's right
|
|
107
|
+
// edge (Issue #4067), so the sidebar drawn on the same rows (#2047/#2095 —
|
|
108
|
+
// its working directory starts with `/`) is never read as the body. The
|
|
109
|
+
// same cut as the send readiness (`isOpenCodeComposerReady`).
|
|
110
|
+
const box = (0, composer_own_text_1.readOpenCodeComposerBox)(lines);
|
|
111
|
+
if (box === null)
|
|
99
112
|
return { kind: 'absent' };
|
|
113
|
+
const { rows } = box;
|
|
114
|
+
// An overlay over the box (its bottom border cut in two): its rows are read
|
|
115
|
+
// to the border's far end, and the reading is marked so B and F do not
|
|
116
|
+
// stand on it (review of #4067).
|
|
117
|
+
const obscured = box.obscured ? { obscured: true } : {};
|
|
100
118
|
// The placeholder is painted only while the buffer is empty, and only
|
|
101
|
-
// inside the box —
|
|
102
|
-
if (rows.some((row) =>
|
|
103
|
-
return { kind: 'empty' };
|
|
104
|
-
const first = rows.
|
|
119
|
+
// inside the box (#1883) — read on the row's own text, which is inside it.
|
|
120
|
+
if (rows.some((row) => OPENCODE_OWN_PLACEHOLDER.test(row)))
|
|
121
|
+
return { kind: 'empty', ...obscured };
|
|
122
|
+
const first = rows.find((row) => row.length > 0);
|
|
105
123
|
if (first === undefined)
|
|
106
|
-
return { kind: 'empty' };
|
|
107
|
-
return { kind: 'text', text: first, rows };
|
|
124
|
+
return { kind: 'empty', ...obscured };
|
|
125
|
+
return { kind: 'text', text: first, rows, ...obscured };
|
|
108
126
|
}
|
|
109
127
|
if (reader !== 'input-line-marker')
|
|
110
128
|
return { kind: 'absent' };
|
|
@@ -431,6 +449,11 @@ function readSubmitComposer(output, cliToolId, reader, lines, windowLines, messa
|
|
|
431
449
|
* pre-#1501 permissive default, so normal sends never spuriously fail) —
|
|
432
450
|
* except in a codex composer above the read window -> indeterminate
|
|
433
451
|
* (Issue #3906).
|
|
452
|
+
* None of B–F holds for opencode's box with an overlay drawn over it (its
|
|
453
|
+
* bottom border cut in two) -> indeterminate (`B-obscured` when nothing is
|
|
454
|
+
* seen, `F-obscured` for any text — the body, a token or a `/…` included;
|
|
455
|
+
* review of #4067): what the box holds under the overlay is not seen, and an
|
|
456
|
+
* Enter or a clear would go to the overlay.
|
|
434
457
|
*
|
|
435
458
|
* C–F are scoped to the composer only, so the user-message echo that a TUI
|
|
436
459
|
* prints into its history above the prompt never causes a false verdict.
|
|
@@ -452,6 +475,15 @@ function readSubmitComposer(output, cliToolId, reader, lines, windowLines, messa
|
|
|
452
475
|
* the tool's own, so every existing three-argument caller is unchanged.
|
|
453
476
|
*/
|
|
454
477
|
function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
|
|
478
|
+
return classifySubmitWithRule(output, cliToolId, message, composerSpec).state;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* {@link classifySubmit} with the rule that decided the frame (Issue #4035).
|
|
482
|
+
* The sender logs the rule with every verdict, and treats a `submitted` from B
|
|
483
|
+
* or F — the screen saying only "the body is not in the composer" — as weaker
|
|
484
|
+
* evidence than A on a tool whose own hook reports the prompt.
|
|
485
|
+
*/
|
|
486
|
+
function classifySubmitWithRule(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
|
|
455
487
|
const clean = (0, cli_patterns_1.stripAnsi)(output);
|
|
456
488
|
const lines = withoutTrailingBlankRows(clean.split('\n'));
|
|
457
489
|
const windowLines = lines.slice(-exports.VERIFY_WINDOW_LINES);
|
|
@@ -461,34 +493,45 @@ function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_
|
|
|
461
493
|
// pinned to the bottom of the pane, and widening it to opencode's whole
|
|
462
494
|
// frame would match `esc interrupt` printed inside a reply.
|
|
463
495
|
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
464
|
-
return 'submitted';
|
|
496
|
+
return { state: 'submitted', rule: 'A' };
|
|
465
497
|
}
|
|
466
498
|
const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines, message);
|
|
467
499
|
// B. No composer visible (scrolled off / dialog / still starting), or the
|
|
468
500
|
// composer is empty => the message left the box => submitted.
|
|
501
|
+
// Not on opencode's box with an overlay drawn over it (review of #4067):
|
|
502
|
+
// nothing seen there is not the box being empty -> indeterminate.
|
|
469
503
|
if (composer.kind !== 'text') {
|
|
470
|
-
|
|
504
|
+
if (composer.kind === 'empty' && composer.obscured)
|
|
505
|
+
return { state: 'indeterminate', rule: 'B-obscured' };
|
|
506
|
+
return { state: 'submitted', rule: composer.kind === 'absent' ? 'B-absent' : 'B-empty' };
|
|
471
507
|
}
|
|
508
|
+
// Text in opencode's box under an overlay (review of #4067): the reading
|
|
509
|
+
// runs to the border's far end, the overlay's text included, so none of
|
|
510
|
+
// C–F is read from it. C/D would resend Enter and E clear the line — keys
|
|
511
|
+
// that would go to the palette or picker on top, not to the box ->
|
|
512
|
+
// indeterminate (no Enter, no clear; read again).
|
|
513
|
+
if (composer.obscured)
|
|
514
|
+
return { state: 'indeterminate', rule: 'F-obscured' };
|
|
472
515
|
// C. A paste placeholder is still folded into the composer => body is there.
|
|
473
516
|
if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row) || findPasteTokens(row).tokens.length > 0)) {
|
|
474
|
-
return 'pending';
|
|
517
|
+
return { state: 'pending', rule: 'C' };
|
|
475
518
|
}
|
|
476
519
|
// D. The typed body is still sitting in the composer => resend Enter.
|
|
477
520
|
if (inputMatchesBody(composer.text, message)) {
|
|
478
|
-
return 'pending';
|
|
521
|
+
return { state: 'pending', rule: 'D' };
|
|
479
522
|
}
|
|
480
523
|
// E. A different slash command is in the composer => a completion popup
|
|
481
524
|
// replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
|
|
482
525
|
// some TUIs paint on an empty composer are never mistaken for this.)
|
|
483
526
|
if (REPLACEMENT_COMMAND_PATTERN.test(composer.text)) {
|
|
484
|
-
return 'replaced';
|
|
527
|
+
return { state: 'replaced', rule: 'E' };
|
|
485
528
|
}
|
|
486
529
|
// F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
|
|
487
530
|
// submitted, preserving the pre-#1501 permissive default. Not for a codex
|
|
488
531
|
// composer above the window (Issue #3906): before #3906 that frame was
|
|
489
532
|
// read as no composer at all; text there that is not the body says
|
|
490
533
|
// neither that the message left nor that Enter would send it.
|
|
491
|
-
return composer.outsideWindow ? 'indeterminate' : 'submitted';
|
|
534
|
+
return composer.outsideWindow ? { state: 'indeterminate', rule: 'F-outside' } : { state: 'submitted', rule: 'F' };
|
|
492
535
|
}
|
|
493
536
|
/**
|
|
494
537
|
* Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The shared sender's pure reads of a captured composer (Issue #4056: split out
|
|
4
|
+
* of `submit-verified-sender.ts`). No tmux, no keys, no logging.
|
|
5
|
+
*
|
|
6
|
+
* Imports nothing from `submit-verified-sender.ts`.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.describeComposer = describeComposer;
|
|
10
|
+
exports.composerHoldsText = composerHoldsText;
|
|
11
|
+
exports.composerShowsForeignPasteToken = composerShowsForeignPasteToken;
|
|
12
|
+
exports.visibleTypedBody = visibleTypedBody;
|
|
13
|
+
exports.codexComposerShowsWholeBody = codexComposerShowsWholeBody;
|
|
14
|
+
exports.needsPromptReport = needsPromptReport;
|
|
15
|
+
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
16
|
+
const submit_composer_read_1 = require("./submit-composer-read");
|
|
17
|
+
function describeComposer(output, cliToolId, composerSpec, message) {
|
|
18
|
+
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
19
|
+
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
20
|
+
if (composer.kind === 'absent')
|
|
21
|
+
return 'no composer on screen';
|
|
22
|
+
if (composer.kind === 'empty')
|
|
23
|
+
return 'an empty composer';
|
|
24
|
+
const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
|
|
25
|
+
return JSON.stringify(text);
|
|
26
|
+
}
|
|
27
|
+
/** Whether the composer in `output` holds any text at all, read as the sender reads it. */
|
|
28
|
+
function composerHoldsText(output, cliToolId, composerSpec, message) {
|
|
29
|
+
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
30
|
+
return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
|
|
31
|
+
.kind === 'text');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Whether the composer shows a paste placeholder whose count is not this body's
|
|
35
|
+
* (Issue #3945): one counting fewer or more, or more than one placeholder.
|
|
36
|
+
*/
|
|
37
|
+
function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
|
|
38
|
+
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
39
|
+
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
40
|
+
if (composer.kind !== 'text')
|
|
41
|
+
return false;
|
|
42
|
+
if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
|
|
43
|
+
return false;
|
|
44
|
+
return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The part of a typed body the composer reader can see (Issue #3366).
|
|
48
|
+
*
|
|
49
|
+
* The codex reader takes the composer as one run of non-blank rows, so a blank
|
|
50
|
+
* line inside the body ends what it returns: what it can show is the body up to
|
|
51
|
+
* its first blank line after the first non-blank one. Leading blank lines are
|
|
52
|
+
* kept — they are drawn as composer rows of their own and compact to nothing.
|
|
53
|
+
*/
|
|
54
|
+
function visibleTypedBody(message) {
|
|
55
|
+
const lines = message.split('\n');
|
|
56
|
+
const first = lines.findIndex((line) => line.trim() !== '');
|
|
57
|
+
if (first < 0)
|
|
58
|
+
return '';
|
|
59
|
+
const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
|
|
60
|
+
return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
|
|
61
|
+
}
|
|
62
|
+
/** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
|
|
63
|
+
function codexComposerShowsWholeBody(output, message, composerSpec) {
|
|
64
|
+
const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
|
|
65
|
+
const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
|
|
66
|
+
return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Whether a verdict is one the agent's own report must back (Issue #4035):
|
|
70
|
+
* `submitted` from B or F — the screen saying only that the body is not in the
|
|
71
|
+
* composer. A (generating) stands on its own. A body starting with `/` or `!`
|
|
72
|
+
* is run by the TUI itself, which is not measured to report it as a prompt.
|
|
73
|
+
*/
|
|
74
|
+
function needsPromptReport(state, rule, message) {
|
|
75
|
+
if (state !== 'submitted' || rule === 'A')
|
|
76
|
+
return false;
|
|
77
|
+
return !/^\s*[/!]/.test(message);
|
|
78
|
+
}
|