commandmate 0.49.0 → 0.49.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +251 -248
- package/.next/app-path-routes-manifest.json +22 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +144 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +22 -21
- package/.next/server/chunks/1062.js +1 -0
- package/.next/server/chunks/{936.js → 110.js} +1 -1
- package/.next/server/chunks/1501.js +5 -4
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2897.js +1 -0
- package/.next/server/chunks/3417.js +1 -0
- package/.next/server/chunks/3505.js +1 -1
- package/.next/server/chunks/{4280.js → 3756.js} +1 -1
- package/.next/server/chunks/3801.js +31 -0
- package/.next/server/chunks/4911.js +1 -0
- package/.next/server/chunks/4936.js +1 -0
- package/.next/server/chunks/5209.js +2 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/{9130.js → 5630.js} +1 -1
- package/.next/server/chunks/610.js +1 -0
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6808.js +4 -0
- package/.next/server/chunks/7023.js +14 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +8 -8
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +63 -53
- package/.next/server/chunks/8918.js +103 -1
- package/.next/server/chunks/9198.js +144 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-07a237575e1ceb9e.js} +1 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
- package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
- package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
- package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
- package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
- package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
- package/.next/static/chunks/app/sessions/page-c6eb7c02db2f4c80.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +1 -0
- package/.next/static/css/c1e307d05daf93b6.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +233 -17
- package/dist/cli/commands/attach.d.ts +4 -1
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +19 -7
- package/dist/cli/commands/command-target.d.ts +7 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -1
- package/dist/cli/commands/command-target.js +10 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +38 -2
- package/dist/cli/commands/message-dispatch.d.ts +39 -5
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +100 -8
- package/dist/cli/commands/relays.d.ts +26 -2
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +70 -5
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +22 -5
- package/dist/cli/commands/respond.d.ts +12 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +83 -18
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +14 -8
- package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
- package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
- package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
- package/dist/cli/commands/wait-instance.d.ts +29 -0
- package/dist/cli/commands/wait-instance.d.ts.map +1 -0
- package/dist/cli/commands/wait-instance.js +56 -0
- package/dist/cli/commands/wait-notices.d.ts +87 -0
- package/dist/cli/commands/wait-notices.d.ts.map +1 -0
- package/dist/cli/commands/wait-notices.js +301 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
- package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
- package/dist/cli/commands/wait-poll-state.d.ts +136 -0
- package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
- package/dist/cli/commands/wait-poll-state.js +6 -0
- package/dist/cli/commands/wait-timing.d.ts +46 -0
- package/dist/cli/commands/wait-timing.d.ts.map +1 -0
- package/dist/cli/commands/wait-timing.js +99 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
- package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
- package/dist/cli/commands/wait-turn-boundary.js +427 -0
- package/dist/cli/commands/wait-verify.d.ts +51 -0
- package/dist/cli/commands/wait-verify.d.ts.map +1 -0
- package/dist/cli/commands/wait-verify.js +128 -0
- package/dist/cli/commands/wait.d.ts +6 -105
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +240 -968
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +3 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +24 -1
- package/dist/cli/types/api-responses.d.ts +49 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +69 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +226 -18
- package/dist/cli/utils/follow-up-command.d.ts +38 -0
- package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
- package/dist/cli/utils/follow-up-command.js +57 -0
- package/dist/cli/utils/reply-ledger.d.ts +80 -1
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.js +147 -2
- package/dist/cli/utils/server-capabilities.d.ts +18 -0
- package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
- package/dist/cli/utils/server-capabilities.js +36 -3
- package/dist/cli/utils/session-target.d.ts +1 -1
- package/dist/cli/utils/session-target.d.ts.map +1 -1
- package/dist/cli/utils/session-target.js +3 -0
- package/dist/cli/utils/verify-runner.d.ts +7 -0
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +51 -15
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +11 -3
- package/dist/lib/session/send-attempt-types.d.ts +48 -1
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/session/send-attempt-types.js +18 -1
- package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
- package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
- package/dist/lib/verification/session-kill-ledger.js +174 -0
- package/dist/server/locales/en/worktree.json +20 -3
- package/dist/server/locales/ja/worktree.json +20 -3
- package/dist/server/src/config/cli-tool-timing-config.js +1 -7
- package/dist/server/src/lib/auto-yes-poller.js +54 -11
- package/dist/server/src/lib/cli-tools/antigravity.js +45 -9
- package/dist/server/src/lib/cli-tools/base.js +39 -0
- package/dist/server/src/lib/cli-tools/codex.js +67 -15
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
- package/dist/server/src/lib/cli-tools/command-code.js +7 -3
- package/dist/server/src/lib/cli-tools/copilot.js +125 -33
- package/dist/server/src/lib/cli-tools/gemini.js +37 -10
- package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
- package/dist/server/src/lib/cli-tools/opencode.js +60 -15
- package/dist/server/src/lib/cli-tools/session-name.js +11 -3
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +590 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +512 -620
- package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
- package/dist/server/src/lib/db/db-migration-path.js +63 -2
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
- package/dist/server/src/lib/db/migrations/runner.js +37 -4
- package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
- package/dist/server/src/lib/db/relay-bind-db.js +437 -0
- package/dist/server/src/lib/db/relay-db.js +59 -96
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
- package/dist/server/src/lib/detection/upstream-faults.js +40 -6
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
- package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
- package/dist/server/src/lib/polling/response-checker.js +7 -5
- package/dist/server/src/lib/prompt-answer-errors.js +362 -0
- package/dist/server/src/lib/prompt-answer-sender.js +264 -288
- package/dist/server/src/lib/push/failure-episode-state.js +4 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
- package/dist/server/src/lib/realtime-snippet.js +54 -0
- package/dist/server/src/lib/relay/relay-bind.js +294 -0
- package/dist/server/src/lib/relay/relay-boot.js +51 -0
- package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
- package/dist/server/src/lib/relay/relay-delivery.js +134 -220
- package/dist/server/src/lib/relay/relay-messages.js +39 -4
- package/dist/server/src/lib/relay/relay-overlap.js +92 -0
- package/dist/server/src/lib/relay/relay-system-line.js +3 -2
- package/dist/server/src/lib/relay/types.js +12 -1
- package/dist/server/src/lib/session/agent-event-state.js +4 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +23 -0
- package/dist/server/src/lib/session/claude-session.js +59 -8
- package/dist/server/src/lib/session/composer-clear.js +54 -1
- package/dist/server/src/lib/session/current-output-builder.js +26 -8
- package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
- package/dist/server/src/lib/session/instance-input-lock.js +664 -0
- package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
- package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
- package/dist/server/src/lib/session/send-attempt-state.js +65 -0
- package/dist/server/src/lib/session/send-attempt-types.js +18 -1
- package/dist/server/src/lib/session/send-user-message.js +84 -14
- package/dist/server/src/lib/session/session-launch-flight.js +243 -0
- package/dist/server/src/lib/session/session-starting-state.js +40 -4
- package/dist/server/src/lib/session/structured-prompt.js +12 -9
- package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
- package/dist/server/src/lib/session-cleanup.js +32 -0
- package/dist/server/src/lib/session-key-sender.js +0 -27
- package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
- package/dist/server/src/lib/verification/env-snapshot.js +11 -2
- package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
- package/package.json +5 -1
- package/release-notes/0.49.1.json +66 -0
- package/release-notes/0.49.2.json +49 -0
- package/.next/server/chunks/1210.js +0 -1
- package/.next/server/chunks/1945.js +0 -14
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/4194.js +0 -67
- package/.next/server/chunks/5845.js +0 -1
- package/.next/server/chunks/720.js +0 -103
- package/.next/server/chunks/7604.js +0 -2
- package/.next/server/chunks/9540.js +0 -1
- package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
- package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
- package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
- package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
- package/.next/static/chunks/9079-987939d231704218.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
- package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
- package/.next/static/css/db8959555c3d9c96.css +0 -1
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
- /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
|
@@ -24,6 +24,7 @@ exports.judgeCopilotModelSwitch = judgeCopilotModelSwitch;
|
|
|
24
24
|
const base_1 = require("./base");
|
|
25
25
|
const tmux_1 = require("../tmux/tmux");
|
|
26
26
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
27
|
+
const composer_clear_1 = require("../../lib/session/composer-clear");
|
|
27
28
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
28
29
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
29
30
|
const copilot_executable_1 = require("./copilot-executable");
|
|
@@ -37,6 +38,7 @@ const logger_1 = require("../../lib/logger");
|
|
|
37
38
|
const install_hints_1 = require("./install-hints");
|
|
38
39
|
const launch_window_1 = require("./launch-window");
|
|
39
40
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
41
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
40
42
|
const logger = (0, logger_1.createLogger)('cli-tools/copilot');
|
|
41
43
|
/** Interval for polling prompt detection */
|
|
42
44
|
const COPILOT_POLL_INTERVAL_MS = 1000;
|
|
@@ -224,6 +226,33 @@ function judgeCopilotModelSwitch(before, output, modelName) {
|
|
|
224
226
|
return { kind: 'pending' };
|
|
225
227
|
}
|
|
226
228
|
/** The pane's bottom non-blank row, squeezed, for an error message a person reads. */
|
|
229
|
+
/**
|
|
230
|
+
* Throw unless `ticket` still owns the composer (Issue #3945): right before a
|
|
231
|
+
* key this module types itself, so a send whose session was replaced while it
|
|
232
|
+
* waited cannot type into the new one.
|
|
233
|
+
*/
|
|
234
|
+
function assertCopilotInputOwner(ticket, step) {
|
|
235
|
+
if (ticket.isCurrent())
|
|
236
|
+
return;
|
|
237
|
+
throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Type `text` + Enter as the composer's owner. A failure that may have put part
|
|
241
|
+
* of it on the pane (anything but a `send-keys` tmux never started,
|
|
242
|
+
* `TmuxSendError.delivery`) leaves the carried paste mark, as the shared
|
|
243
|
+
* sender's typed body does (review-2): the next send waits out what may still
|
|
244
|
+
* be drawn.
|
|
245
|
+
*/
|
|
246
|
+
async function typeLeavingMarkOnFailure(sessionName, text, ticket) {
|
|
247
|
+
try {
|
|
248
|
+
await (0, tmux_1.sendKeys)(sessionName, text, true);
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
if (error?.delivery !== 'not-started')
|
|
252
|
+
(0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
227
256
|
function describeBottomRow(output) {
|
|
228
257
|
const lines = (0, cli_patterns_1.stripAnsi)(output).split('\n');
|
|
229
258
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
@@ -351,8 +380,9 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
351
380
|
// leaves it (`cli-tools/launch-window`).
|
|
352
381
|
(0, launch_window_1.beginLaunchWindow)(sessionName);
|
|
353
382
|
try {
|
|
354
|
-
// Start Copilot CLI in interactive mode
|
|
355
|
-
|
|
383
|
+
// Start Copilot CLI in interactive mode. Issue #3981: in one writer's
|
|
384
|
+
// turn of the input lock; the readiness wait below stays outside it.
|
|
385
|
+
await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
|
|
356
386
|
// Issue #1907: no blind sleep before this. The 4-second one that used to
|
|
357
387
|
// sit here was a guess at how long copilot takes to paint (measured on
|
|
358
388
|
// 1.0.80: banner at ~1.3 s, folder-trust dialog at ~2.5 s), and it was
|
|
@@ -397,15 +427,25 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
397
427
|
* `waiting`, and the send guard refuses a `waiting` session for as long as
|
|
398
428
|
* that entry lives.
|
|
399
429
|
*
|
|
430
|
+
* Issue #3952: the digit is typed as the composer's writer. A send that holds
|
|
431
|
+
* the composer is waited out, and the dialog is read again after it: when it
|
|
432
|
+
* is gone nothing is typed and false comes back, so the caller looks again on
|
|
433
|
+
* its next poll. Inside the selection-list branch's lock it joins that lock.
|
|
434
|
+
*
|
|
400
435
|
* @param sessionName - tmux session name
|
|
401
436
|
* @param output - ANSI-stripped pane capture
|
|
437
|
+
* @param readMark - {@link instanceInputReadMark} taken before `output` was read
|
|
402
438
|
* @returns True when the dialog was found and answered
|
|
403
439
|
*/
|
|
404
|
-
async answerFolderTrustDialog(sessionName, output) {
|
|
440
|
+
async answerFolderTrustDialog(sessionName, output, readMark) {
|
|
405
441
|
if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
|
|
406
442
|
return false;
|
|
407
443
|
}
|
|
408
|
-
await (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false);
|
|
444
|
+
const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => (0, cli_patterns_1.isCopilotFolderTrustDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))), () => (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false));
|
|
445
|
+
if (!outcome.answered) {
|
|
446
|
+
logger.info('copilot-folder-trust-answer-skipped', { reason: outcome.reason });
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
409
449
|
(0, launch_window_1.recordLaunchDialogPress)(sessionName);
|
|
410
450
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
411
451
|
logger.info('copilot-folder-trust-answered');
|
|
@@ -477,6 +517,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
477
517
|
let trustDialogHandled = false;
|
|
478
518
|
for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
|
|
479
519
|
try {
|
|
520
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
480
521
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
481
522
|
const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
482
523
|
// Check if copilot's own composer is on screen
|
|
@@ -484,7 +525,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
484
525
|
logger.info('copilot-prompt-detected');
|
|
485
526
|
return;
|
|
486
527
|
}
|
|
487
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
528
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
488
529
|
trustDialogHandled = true;
|
|
489
530
|
}
|
|
490
531
|
}
|
|
@@ -541,6 +582,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
541
582
|
let output = '';
|
|
542
583
|
while (Date.now() - startTime < timeoutMs) {
|
|
543
584
|
try {
|
|
585
|
+
const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
|
|
544
586
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
|
|
545
587
|
output = (0, cli_patterns_1.stripAnsi)(rawOutput);
|
|
546
588
|
if (this.isReadyFor(until, output)) {
|
|
@@ -555,7 +597,7 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
555
597
|
// "Yes, and remember this folder" and writes the operator's
|
|
556
598
|
// machine-global ~/.copilot/config.json. Answer it here for the same
|
|
557
599
|
// reason the launch path does, rather than leaving the worse outcome.
|
|
558
|
-
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
|
|
600
|
+
if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
|
|
559
601
|
trustDialogHandled = true;
|
|
560
602
|
}
|
|
561
603
|
}
|
|
@@ -641,19 +683,48 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
641
683
|
// same pane when the tool is gone; costs one `capture-pane` when it is not.
|
|
642
684
|
await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: true });
|
|
643
685
|
try {
|
|
644
|
-
// Verify Copilot is at prompt state before sending
|
|
645
|
-
await this.waitForPrompt(sessionName);
|
|
646
686
|
// Check if this is a slash command that triggers a selection list
|
|
647
687
|
const slashCmd = this.extractSlashCommand(message);
|
|
648
688
|
if (slashCmd && SELECTION_LIST_COMMANDS.has(slashCmd)) {
|
|
649
689
|
// For selection list commands: send text + Enter, then wait for
|
|
650
690
|
// the selection list to appear. Do NOT send additional input after.
|
|
651
|
-
|
|
652
|
-
|
|
691
|
+
//
|
|
692
|
+
// Issue #3945: this types into the composer without the shared sender,
|
|
693
|
+
// so it takes the instance's input lock itself — from the readiness
|
|
694
|
+
// read (fresh, under the lock) to the picker that answers it — and
|
|
695
|
+
// waits out a carried paste mark first, as a normal send does.
|
|
696
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async (ticket) => {
|
|
697
|
+
await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
|
|
698
|
+
// review-2: a composer that never came up (a dialog, an unreadable
|
|
699
|
+
// pane, a time-out) is not typed into. The shared sender's re-check
|
|
700
|
+
// then refuses on the same terms right before the keys: a dialog is
|
|
701
|
+
// `prompt-waiting`, a pane that cannot be read `recheck-failed`.
|
|
702
|
+
const prompt = await this.waitForPrompt(sessionName);
|
|
703
|
+
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
704
|
+
if (!prompt.ready) {
|
|
705
|
+
// review-3: neither the request nor the pane goes into the message.
|
|
706
|
+
// `classifySendFailure` reads the wording, and its "may have been
|
|
707
|
+
// typed" rules come first — a body or a screen saying `submit could
|
|
708
|
+
// not be confirmed` would turn this refusal into `indeterminate`.
|
|
709
|
+
logger.warn('copilot-selection-list-not-sent:prompt-not-ready', {
|
|
710
|
+
command: slashCmd,
|
|
711
|
+
bottomRow: describeBottomRow(prompt.output),
|
|
712
|
+
});
|
|
713
|
+
throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
|
|
714
|
+
'so the selection-list command was not sent; nothing was typed');
|
|
715
|
+
}
|
|
716
|
+
assertCopilotInputOwner(ticket, 'the selection-list command');
|
|
717
|
+
// Issue #3953: the send's stamp, as the shared sender takes it.
|
|
718
|
+
(0, instance_input_lock_1.noteInputStart)();
|
|
719
|
+
await typeLeavingMarkOnFailure(sessionName, message, ticket);
|
|
720
|
+
await this.waitForSelectionList(sessionName);
|
|
721
|
+
});
|
|
653
722
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
654
723
|
logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
|
|
655
724
|
return;
|
|
656
725
|
}
|
|
726
|
+
// Verify Copilot is at prompt state before sending
|
|
727
|
+
await this.waitForPrompt(sessionName);
|
|
657
728
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
658
729
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
659
730
|
// Copilot's own text-input / post-Enter delays are preserved. The selection
|
|
@@ -672,7 +743,8 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
672
743
|
}
|
|
673
744
|
catch (error) {
|
|
674
745
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
675
|
-
|
|
746
|
+
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
747
|
+
throw new Error(`Failed to send message to Copilot: ${errorMessage}`, { cause: error });
|
|
676
748
|
}
|
|
677
749
|
}
|
|
678
750
|
/**
|
|
@@ -731,32 +803,52 @@ class CopilotTool extends base_1.BaseCLITool {
|
|
|
731
803
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
732
804
|
await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: false });
|
|
733
805
|
try {
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
`(bottom row: ${describeBottomRow(idle.output)})`);
|
|
738
|
-
}
|
|
739
|
-
const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
|
|
740
|
-
// Send /model <modelName> command with Enter. An argument means an
|
|
741
|
-
// in-place switch, never a picker (Issue #1895).
|
|
742
|
-
await (0, tmux_1.sendKeys)(sessionName, `/model ${modelName}`, true);
|
|
743
|
-
const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
|
|
744
|
-
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
745
|
-
if (verdict.kind === 'rejected') {
|
|
746
|
-
logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
|
|
747
|
-
throw new Error(`copilot refused it: ${verdict.reason}`);
|
|
748
|
-
}
|
|
749
|
-
if (verdict.kind === 'pending') {
|
|
750
|
-
logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
|
|
751
|
-
throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms ` +
|
|
752
|
-
`(bottom row: ${verdict.bottomRow}); the switch may still take effect, and nothing further was typed`);
|
|
753
|
-
}
|
|
754
|
-
logger.info('copilot-model-switched', { model: modelName });
|
|
806
|
+
// Issue #3945: `/model` is typed into the composer, so it is one writer's
|
|
807
|
+
// turn like the selection-list branch — from the idle read to the answer.
|
|
808
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, (ticket) => this.switchModelUnderInputLock(sessionName, modelName, ticket));
|
|
755
809
|
}
|
|
756
810
|
catch (error) {
|
|
757
811
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
758
|
-
|
|
812
|
+
// Issue #3952: the re-check's `code` is kept, so the caller records a
|
|
813
|
+
// dialog or an unreadable pane as such rather than as a refused model.
|
|
814
|
+
const code = error?.code;
|
|
815
|
+
throw Object.assign(new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`), typeof code === 'string' ? { code } : {});
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
/** {@link sendModelCommand}'s keys and waits, as the composer's only writer (Issue #3945). */
|
|
819
|
+
async switchModelUnderInputLock(sessionName, modelName, ticket) {
|
|
820
|
+
// A previous send's body may still arrive (review-1 #5): `/model` waits it
|
|
821
|
+
// out like a normal send, and the idle read below is the one after the wait.
|
|
822
|
+
await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
|
|
823
|
+
const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
|
|
824
|
+
if (!idle.ready) {
|
|
825
|
+
// The pane's text goes to the log, not the message: the message is read by
|
|
826
|
+
// `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
|
|
827
|
+
logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
|
|
828
|
+
throw new Error(`copilot did not become idle within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms, so /model was not sent`);
|
|
829
|
+
}
|
|
830
|
+
const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
|
|
831
|
+
// Issue #3952: "idle, so no dialog" holds for the frame that was read, not
|
|
832
|
+
// for the moment the keys go out. The pane is read once more right before
|
|
833
|
+
// them, as every send is: a dialog is `prompt-waiting`, a pane that cannot
|
|
834
|
+
// be read `recheck-failed`, and nothing is typed in either case.
|
|
835
|
+
await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
|
|
836
|
+
// Send /model <modelName> command with Enter. An argument means an
|
|
837
|
+
// in-place switch, never a picker (Issue #1895).
|
|
838
|
+
assertCopilotInputOwner(ticket, '/model');
|
|
839
|
+
await typeLeavingMarkOnFailure(sessionName, `/model ${modelName}`, ticket);
|
|
840
|
+
const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
|
|
841
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
842
|
+
if (verdict.kind === 'rejected') {
|
|
843
|
+
logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
|
|
844
|
+
throw new Error(`copilot refused it: ${verdict.reason}`);
|
|
845
|
+
}
|
|
846
|
+
if (verdict.kind === 'pending') {
|
|
847
|
+
logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
|
|
848
|
+
throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms; ` +
|
|
849
|
+
'the switch may still take effect, and nothing further was typed');
|
|
759
850
|
}
|
|
851
|
+
logger.info('copilot-model-switched', { model: modelName });
|
|
760
852
|
}
|
|
761
853
|
/**
|
|
762
854
|
* Poll until `/model <modelName>` has answered (Issue #2623).
|
|
@@ -25,6 +25,7 @@ const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
|
25
25
|
const errors_1 = require("../../lib/errors");
|
|
26
26
|
const launch_dialog_1 = require("./launch-dialog");
|
|
27
27
|
const launch_window_1 = require("./launch-window");
|
|
28
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
28
29
|
const logger = (0, logger_1.createLogger)('cli-tools/gemini');
|
|
29
30
|
/** Wait for Gemini CLI to initialize after launch (banner + auth + dialog) */
|
|
30
31
|
const GEMINI_INIT_WAIT_MS = 6000;
|
|
@@ -106,7 +107,12 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
106
107
|
// trust dialog is this launch's to answer; the Auto-Yes poller leaves it.
|
|
107
108
|
(0, launch_window_1.beginLaunchWindow)(sessionName);
|
|
108
109
|
try {
|
|
109
|
-
|
|
110
|
+
// Issue #3975: the launch line is one writer's turn, so a send's body
|
|
111
|
+
// already in the pane is not run as part of it. Only the keys: the
|
|
112
|
+
// waits below stay outside the lock, where a send waiting for the
|
|
113
|
+
// prompt cannot be held behind them.
|
|
114
|
+
// Issue #3981: through the one launch-key writer every tool shares.
|
|
115
|
+
await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
|
|
110
116
|
// Wait for Gemini to initialize (minimum wait for banner/auth)
|
|
111
117
|
await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
|
|
112
118
|
// Poll until Gemini interactive prompt is ready
|
|
@@ -139,6 +145,8 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
139
145
|
const loggedDecisions = new Set();
|
|
140
146
|
for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
|
|
141
147
|
try {
|
|
148
|
+
// Issue #3975: taken before the read the trust Enter is decided on.
|
|
149
|
+
const readMark = (0, instance_input_lock_1.instanceInputLaunchReadMark)();
|
|
142
150
|
const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
|
|
143
151
|
// Strip ANSI escape codes before pattern matching
|
|
144
152
|
// (Gemini TUI uses 24-bit color codes that break regex matching)
|
|
@@ -152,14 +160,26 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
152
160
|
if (!trustDialogHandled) {
|
|
153
161
|
const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, output);
|
|
154
162
|
if (decision.action === 'press') {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
+
// Issue #3975: the Enter as an `exclusive` writer, so it never lands
|
|
164
|
+
// inside a send's body, paste or Enter; a send that came between
|
|
165
|
+
// the read and the lock makes the dialog be read again first.
|
|
166
|
+
const pressed = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
|
|
167
|
+
const again = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT)));
|
|
168
|
+
return again.action === 'press' && again.key === decision.key;
|
|
169
|
+
}, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key), { mode: 'exclusive' });
|
|
170
|
+
if (pressed.answered) {
|
|
171
|
+
trustDialogHandled = true;
|
|
172
|
+
trustPressedAt = Date.now();
|
|
173
|
+
// Issue #3790: the poller leaves the answered dialog alone even if
|
|
174
|
+
// the window closes before gemini redraws it.
|
|
175
|
+
(0, launch_window_1.recordLaunchDialogPress)(sessionName, trustPressedAt);
|
|
176
|
+
logger.info('auto-trusted-folder-for-gemini');
|
|
177
|
+
// Continue polling for prompt after trust dialog
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Not answered this poll; the next one reads the screen again.
|
|
181
|
+
logger.info('gemini-trust-answer-skipped', { sessionName, reason: pressed.reason });
|
|
182
|
+
}
|
|
163
183
|
}
|
|
164
184
|
else {
|
|
165
185
|
const warning = (0, launch_dialog_1.launchDialogWarning)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, decision);
|
|
@@ -188,6 +208,9 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
188
208
|
/**
|
|
189
209
|
* Wait for Gemini prompt before sending a message.
|
|
190
210
|
* Used by sendMessage to ensure Gemini is ready to accept input.
|
|
211
|
+
*
|
|
212
|
+
* @throws Error (`Gemini prompt not ready`) when the prompt did not appear
|
|
213
|
+
* within {@link GEMINI_PROMPT_WAIT_TIMEOUT_MS}; nothing was typed
|
|
191
214
|
*/
|
|
192
215
|
async waitForPrompt(sessionName) {
|
|
193
216
|
const startTime = Date.now();
|
|
@@ -206,7 +229,10 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
206
229
|
}
|
|
207
230
|
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
208
231
|
}
|
|
232
|
+
// Issue #3981: give up without typing, as codex does. Sending anyway put the
|
|
233
|
+
// body into whatever held the pane (a dialog, a slow start, a shell).
|
|
209
234
|
logger.info('gemini-prompt-not-detected');
|
|
235
|
+
throw new Error('Gemini prompt not ready: timed out waiting for the input prompt before sending');
|
|
210
236
|
}
|
|
211
237
|
/**
|
|
212
238
|
* Send a message to Gemini interactive session
|
|
@@ -239,7 +265,8 @@ class GeminiTool extends base_1.BaseCLITool {
|
|
|
239
265
|
}
|
|
240
266
|
catch (error) {
|
|
241
267
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
242
|
-
|
|
268
|
+
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
269
|
+
throw new Error(`Failed to send message to Gemini: ${errorMessage}`, { cause: error });
|
|
243
270
|
}
|
|
244
271
|
}
|
|
245
272
|
/**
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The keys a launch types into its pane, in one writer's turn (Issue #3981).
|
|
4
|
+
*
|
|
5
|
+
* #3975 put gemini's and claude's launch lines under the instance input lock;
|
|
6
|
+
* the other seven launch sites, and claude's `unset CLAUDECODE` before its
|
|
7
|
+
* line, still typed with no lock, so a send holding the composer could have
|
|
8
|
+
* them land in the middle of its body, paste or Enter. Every launch now types
|
|
9
|
+
* through {@link typeLaunchLines}: one `exclusive` turn for all of its lines
|
|
10
|
+
* (R2 of `session-launch-flight`), joined when the launcher already holds the
|
|
11
|
+
* lock (codex relaunching inside a send). The init polls and readiness waits
|
|
12
|
+
* that follow stay outside (#3975), so a send waiting for the prompt is never
|
|
13
|
+
* held behind them.
|
|
14
|
+
*
|
|
15
|
+
* @module lib/cli-tools/launch-keys
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.typeLaunchLines = typeLaunchLines;
|
|
19
|
+
const tmux_1 = require("../tmux/tmux");
|
|
20
|
+
const instance_input_lock_1 = require("../session/instance-input-lock");
|
|
21
|
+
/**
|
|
22
|
+
* Type `steps` into `sessionName` as one `exclusive` writer, in order.
|
|
23
|
+
*
|
|
24
|
+
* @param sessionName - tmux session name
|
|
25
|
+
* @param steps - Lines (typed with Enter) and self-typing steps
|
|
26
|
+
* @throws Whatever `withInstanceInputLock` throws when not admitted; nothing was typed then
|
|
27
|
+
*/
|
|
28
|
+
async function typeLaunchLines(sessionName, steps) {
|
|
29
|
+
await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async () => {
|
|
30
|
+
for (const step of steps) {
|
|
31
|
+
if (typeof step === 'string') {
|
|
32
|
+
await (0, tmux_1.sendKeys)(sessionName, step, true);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
await step();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -235,7 +235,10 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
|
|
|
235
235
|
if (port === null) {
|
|
236
236
|
logger.warn('opencode-v2-launch-without-server', { worktreeId, instanceId });
|
|
237
237
|
}
|
|
238
|
-
|
|
238
|
+
// Issue #3981: in one writer's turn of the input lock; the readiness
|
|
239
|
+
// wait below stays outside it.
|
|
240
|
+
const launchCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath });
|
|
241
|
+
await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
|
|
239
242
|
await this.waitForReady(sessionName);
|
|
240
243
|
await (0, runtime_1.attachOpencodeV2EventStream)(target);
|
|
241
244
|
logger.info('started-opencode-v2-session');
|
|
@@ -313,7 +316,8 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
|
|
|
313
316
|
logger.info('sent-message-to-opencode-v2-session');
|
|
314
317
|
}
|
|
315
318
|
catch (error) {
|
|
316
|
-
|
|
319
|
+
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
320
|
+
throw new Error(`Failed to send message to OpenCode V2: ${(0, errors_1.getErrorMessage)(error)}`, { cause: error });
|
|
317
321
|
}
|
|
318
322
|
}
|
|
319
323
|
/**
|
|
@@ -78,6 +78,7 @@ const opencode_executable_1 = require("./opencode-executable");
|
|
|
78
78
|
const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
|
|
79
79
|
const launch_screen_1 = require("../../lib/session/launch-screen");
|
|
80
80
|
const errors_1 = require("../../lib/errors");
|
|
81
|
+
const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
|
|
81
82
|
const logger = (0, logger_1.createLogger)('cli-tools/opencode');
|
|
82
83
|
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
83
84
|
/** OpenCode TUI graceful exit command [D1-006] */
|
|
@@ -334,7 +335,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
334
335
|
});
|
|
335
336
|
}
|
|
336
337
|
const launchedAt = Date.now();
|
|
337
|
-
|
|
338
|
+
// Issue #3981: in one writer's turn of the input lock; the readiness
|
|
339
|
+
// wait below stays outside it.
|
|
340
|
+
await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
|
|
338
341
|
// Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
|
|
339
342
|
await this.waitForReady(sessionName);
|
|
340
343
|
// Issue #1763: subscribe once the server is up. Health-checked first, so
|
|
@@ -478,17 +481,42 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
478
481
|
* and it is logged as `opencode-send-unverified` so it is visible rather than
|
|
479
482
|
* inferred.
|
|
480
483
|
*
|
|
484
|
+
* ## Issue #3957: the dispatch boundary
|
|
485
|
+
*
|
|
486
|
+
* This path types no key, so it reports no input start. Right before the
|
|
487
|
+
* POST it notes a `dispatch` boundary instead (`noteDispatchStart`), which a
|
|
488
|
+
* relay-bound send records as its lower bound — and which can refuse, in
|
|
489
|
+
* which case nothing is posted and the refusal propagates past the catch
|
|
490
|
+
* below. When the POST does not end delivered, the caller is told whether
|
|
491
|
+
* nothing exists (`not_sent`: a POST the server refused — Issue #3992 — or a
|
|
492
|
+
* `404` on the read-back) or it cannot be said (`unknown`: a POST that got no
|
|
493
|
+
* answer or an unexpected 2xx, a body that read back different, an exhausted
|
|
494
|
+
* ladder), BEFORE the keyboard fallback runs.
|
|
495
|
+
*
|
|
481
496
|
* @param target - The instance
|
|
482
497
|
* @param message - The body, sent verbatim
|
|
483
498
|
* @param imagePath - Absolute path to an attachment, if there is one
|
|
484
499
|
* @returns Whether the message was posted **and** read back
|
|
485
500
|
*/
|
|
486
501
|
async trySendViaServer(target, message, imagePath) {
|
|
502
|
+
const outcome = await this.dispatchViaServer(target, message, imagePath);
|
|
503
|
+
if (outcome === 'delivered')
|
|
504
|
+
return true;
|
|
505
|
+
if (outcome !== 'skipped')
|
|
506
|
+
(0, instance_input_lock_1.noteDispatchFailed)(outcome);
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* {@link trySendViaServer}'s body, telling apart a route that was never tried
|
|
511
|
+
* (`skipped`) from a dispatch that did not deliver (Issue #3957).
|
|
512
|
+
*/
|
|
513
|
+
async dispatchViaServer(target, message, imagePath) {
|
|
487
514
|
const instanceId = target.instanceId ?? target.cliToolId;
|
|
515
|
+
let dispatched = false;
|
|
488
516
|
try {
|
|
489
517
|
const port = (0, ports_1.getAssignedOpencodePort)(target);
|
|
490
518
|
if (port === null)
|
|
491
|
-
return
|
|
519
|
+
return 'skipped';
|
|
492
520
|
// The same three preconditions the abort path checks (#2034): a port with
|
|
493
521
|
// a live subscription behind it, and a session this instance owns. The
|
|
494
522
|
// liveness check is what keeps a squatter on a remembered port from being
|
|
@@ -501,7 +529,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
501
529
|
port,
|
|
502
530
|
liveness: liveness.state,
|
|
503
531
|
});
|
|
504
|
-
return
|
|
532
|
+
return 'skipped';
|
|
505
533
|
}
|
|
506
534
|
// Null on a pane that has not run a turn yet — the gate learns the session
|
|
507
535
|
// from the first frame that names it. That first send goes over the
|
|
@@ -513,7 +541,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
513
541
|
instanceId,
|
|
514
542
|
port,
|
|
515
543
|
});
|
|
516
|
-
return
|
|
544
|
+
return 'skipped';
|
|
517
545
|
}
|
|
518
546
|
const parts = [{ type: 'text', text: message }];
|
|
519
547
|
if (imagePath !== undefined) {
|
|
@@ -535,10 +563,20 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
535
563
|
// §20.5). Null when nothing is configured, and the request body is then
|
|
536
564
|
// byte-identical to the pre-#2048 one.
|
|
537
565
|
const selection = (0, launch_settings_1.opencodePromptSelection)((0, launch_settings_1.getOpencodeLaunchSettings)(target));
|
|
538
|
-
|
|
539
|
-
|
|
566
|
+
// Issue #3957: the boundary, right before the POST. A refusal throws and
|
|
567
|
+
// nothing is posted.
|
|
568
|
+
(0, instance_input_lock_1.noteDispatchStart)();
|
|
569
|
+
dispatched = true;
|
|
570
|
+
// Issue #3992: a POST the server refused (a non-2xx, an unknown route's
|
|
571
|
+
// `200 text/html`) sent nothing. One that got no answer, or an unexpected
|
|
572
|
+
// 2xx, may still have created the message, so it stays unknown.
|
|
573
|
+
const dispatch = await (0, client_1.sendOpencodePrompt)(port, sessionId, messageId, parts, selection);
|
|
574
|
+
if (dispatch === 'rejected')
|
|
575
|
+
return 'not_sent';
|
|
576
|
+
if (dispatch === 'unknown')
|
|
577
|
+
return 'unknown';
|
|
540
578
|
const verified = await this.verifyPostedMessage(port, sessionId, messageId, message);
|
|
541
|
-
if (
|
|
579
|
+
if (verified !== 'found') {
|
|
542
580
|
logger.warn('opencode-send-unverified', {
|
|
543
581
|
worktreeId: target.worktreeId,
|
|
544
582
|
instanceId,
|
|
@@ -547,7 +585,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
547
585
|
messageId,
|
|
548
586
|
hasImage: imagePath !== undefined,
|
|
549
587
|
});
|
|
550
|
-
return
|
|
588
|
+
return verified === 'missing' ? 'not_sent' : 'unknown';
|
|
551
589
|
}
|
|
552
590
|
logger.info('opencode-send-delivered-via-api', {
|
|
553
591
|
worktreeId: target.worktreeId,
|
|
@@ -557,9 +595,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
557
595
|
messageId,
|
|
558
596
|
hasImage: imagePath !== undefined,
|
|
559
597
|
});
|
|
560
|
-
return
|
|
598
|
+
return 'delivered';
|
|
561
599
|
}
|
|
562
600
|
catch (error) {
|
|
601
|
+
// Issue #3957: the relay refused the boundary — nothing was posted, and
|
|
602
|
+
// nothing may be typed either.
|
|
603
|
+
if ((0, instance_input_lock_1.isInputBoundaryRefusal)(error))
|
|
604
|
+
throw error;
|
|
563
605
|
// Nothing above is allowed to take the send down: the keystroke route is
|
|
564
606
|
// still there and is what runs when this answers false.
|
|
565
607
|
logger.warn('opencode-send-api-failed', {
|
|
@@ -567,7 +609,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
567
609
|
instanceId,
|
|
568
610
|
error: (0, errors_1.getErrorMessage)(error),
|
|
569
611
|
});
|
|
570
|
-
return
|
|
612
|
+
return dispatched ? 'unknown' : 'skipped';
|
|
571
613
|
}
|
|
572
614
|
}
|
|
573
615
|
/**
|
|
@@ -581,7 +623,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
581
623
|
* — so the check is that the sent body is *among* the text parts, not that it
|
|
582
624
|
* is the only one.
|
|
583
625
|
*
|
|
584
|
-
* @returns
|
|
626
|
+
* @returns `found` once the body was found; `missing` on a `404`; `mismatch`
|
|
627
|
+
* when a message exists under the id with other text; `unknown` after the
|
|
628
|
+
* ladder (Issue #3957 tells the last three apart)
|
|
585
629
|
*/
|
|
586
630
|
async verifyPostedMessage(port, sessionId, messageId, message) {
|
|
587
631
|
for (const waitMs of exports.OPENCODE_SEND_READBACK_DELAYS_MS) {
|
|
@@ -589,14 +633,14 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
589
633
|
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
590
634
|
const readback = await (0, client_1.readOpencodeUserMessage)(port, sessionId, messageId);
|
|
591
635
|
if (readback.kind === 'found')
|
|
592
|
-
return readback.texts.includes(message);
|
|
636
|
+
return readback.texts.includes(message) ? 'found' : 'mismatch';
|
|
593
637
|
// A `404` is the server saying the message does not exist, which does not
|
|
594
638
|
// become truer by asking again — the measured cause is a part the server
|
|
595
639
|
// could not resolve, and it discards the whole message when that happens.
|
|
596
640
|
if (readback.kind === 'missing')
|
|
597
|
-
return
|
|
641
|
+
return 'missing';
|
|
598
642
|
}
|
|
599
|
-
return
|
|
643
|
+
return 'unknown';
|
|
600
644
|
}
|
|
601
645
|
/**
|
|
602
646
|
* Send a message to OpenCode interactive session
|
|
@@ -649,7 +693,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
649
693
|
}
|
|
650
694
|
catch (error) {
|
|
651
695
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
652
|
-
|
|
696
|
+
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
697
|
+
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
|
|
653
698
|
}
|
|
654
699
|
}
|
|
655
700
|
/**
|
|
@@ -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);
|