commandmate 0.49.2 → 0.50.0
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 +476 -423
- package/.next/app-path-routes-manifest.json +28 -21
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +40 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -103
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/[relayId]/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +4 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/[id]/role-defaults/route_client-reference-manifest.js +1 -0
- 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.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roles/[id]/route.js +1 -0
- package/.next/server/app/api/roles/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/roles/route.js +1 -0
- package/.next/server/app/api/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/agent-role-defaults/route_client-reference-manifest.js +1 -0
- 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.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 +3 -3
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/roles/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/roles/settle/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -104
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +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 +1 -103
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.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.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.js +2 -2
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +10 -10
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +28 -21
- package/.next/server/chunks/1184.js +5 -0
- package/.next/server/chunks/1501.js +5 -5
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1957.js +2 -2
- package/.next/server/chunks/1990.js +103 -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/2819.js +1 -0
- package/.next/server/chunks/2897.js +1 -1
- package/.next/server/chunks/3042.js +2 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3294.js +3 -0
- package/.next/server/chunks/3417.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3505.js +2 -6
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3801.js +7 -7
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/454.js +1 -0
- package/.next/server/chunks/4645.js +1 -0
- package/.next/server/chunks/4911.js +1 -1
- package/.next/server/chunks/5209.js +2 -2
- package/.next/server/chunks/5350.js +216 -0
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6009.js +12 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +2 -2
- package/.next/server/chunks/6569.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +4 -4
- package/.next/server/chunks/696.js +3 -0
- package/.next/server/chunks/7023.js +3 -3
- package/.next/server/chunks/7083.js +1 -0
- package/.next/server/chunks/741.js +1 -0
- package/.next/server/chunks/7662.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8143.js +33 -0
- package/.next/server/chunks/8581.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -1
- package/.next/server/chunks/8807.js +181 -93
- package/.next/server/chunks/8918.js +3 -105
- package/.next/server/chunks/8955.js +1 -0
- package/.next/server/chunks/9169.js +1 -0
- package/.next/server/chunks/923.js +1 -0
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9627.js +9 -9
- package/.next/server/chunks/973.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/2314-2c9d587a27e8f731.js +1 -0
- package/.next/static/chunks/2407-ee881c99e218975b.js +1 -0
- package/.next/static/chunks/3931-24d7e245a93feb25.js +1 -0
- package/.next/static/chunks/4548-9afa02fd18afa6c7.js +1 -0
- package/.next/static/chunks/{5794-7975b8e51e731b19.js → 5794-38b3b504b3d97e04.js} +1 -1
- package/.next/static/chunks/{6966-d8dc6032410ffaba.js → 6966-dbfa4a43397f8c6d.js} +1 -1
- package/.next/static/chunks/7090-28e83f5a0efdb3b4.js +1 -0
- package/.next/static/chunks/7229.016d007c467a3600.js +1 -0
- package/.next/static/chunks/{8407-35bbfc84793d7004.js → 8407-dd6a8062fc449899.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/release-notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/relays/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/agent-role-defaults/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/templates/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/roles/settle/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/layout-7bf800fcc5e025b1.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/more/{page-ff5af5ca48774c89.js → page-e8f5780f6e4fb657.js} +1 -1
- package/.next/static/chunks/app/{page-b4863bfe0452e09d.js → page-869f353a4ac4e15b.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/repositories/page-bedb505687010f18.js +1 -0
- package/.next/static/chunks/app/review/page-87c4a9b0de50fa80.js +1 -0
- package/.next/static/chunks/app/sessions/{page-c6eb7c02db2f4c80.js → page-82ca46793789fce4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-476063c3571b81dd.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-570eb79fbbd1a934.js +1 -0
- package/.next/static/chunks/{webpack-838df0273b03af19.js → webpack-16b1a3143fa42ca0.js} +1 -1
- package/.next/static/css/d4f2c9522cf1b449.css +1 -0
- package/.next/static/z4d8-5MaLkoD-4EhueZwk/_buildManifest.js +1 -0
- package/.next/trace +14 -13
- package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
- package/.next/types/app/api/repositories/[id]/role-defaults/route.ts +347 -0
- package/.next/types/app/api/roles/[id]/route.ts +347 -0
- package/.next/types/app/api/roles/route.ts +347 -0
- package/.next/types/app/api/settings/agent-role-defaults/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/roles/settle/route.ts +347 -0
- package/.next/types/routes.d.ts +8 -1
- package/.next/types/validator.ts +63 -0
- package/dist/cli/commands/instances.d.ts +1 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +290 -33
- package/dist/cli/commands/message-dispatch.d.ts +25 -3
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
- package/dist/cli/commands/message-dispatch.js +26 -6
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +2 -1
- package/dist/cli/commands/relays.d.ts +7 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +179 -6
- package/dist/cli/commands/report.d.ts +7 -2
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +19 -6
- package/dist/cli/commands/respond-strict.d.ts.map +1 -1
- package/dist/cli/commands/respond-strict.js +9 -2
- package/dist/cli/commands/roles.d.ts +11 -0
- package/dist/cli/commands/roles.d.ts.map +1 -0
- package/dist/cli/commands/roles.js +392 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +526 -38
- package/dist/cli/commands/task.d.ts +22 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +26 -18
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +91 -3
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/types/api-responses.d.ts +106 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +38 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +15 -1
- package/dist/cli/utils/agent-instances.d.ts +29 -1
- package/dist/cli/utils/agent-instances.d.ts.map +1 -1
- package/dist/cli/utils/agent-instances.js +67 -7
- package/dist/cli/utils/agent-roles.d.ts +75 -0
- package/dist/cli/utils/agent-roles.d.ts.map +1 -0
- package/dist/cli/utils/agent-roles.js +238 -0
- package/dist/cli/utils/api-client-deadline.d.ts +28 -0
- package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
- package/dist/cli/utils/api-client-deadline.js +46 -0
- package/dist/cli/utils/api-client-errors.d.ts +140 -0
- package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
- package/dist/cli/utils/api-client-errors.js +222 -0
- package/dist/cli/utils/api-client.d.ts +9 -131
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +43 -258
- package/dist/cli/utils/role-failure.d.ts +31 -0
- package/dist/cli/utils/role-failure.d.ts.map +1 -0
- package/dist/cli/utils/role-failure.js +90 -0
- package/dist/cli/utils/role-input.d.ts +16 -0
- package/dist/cli/utils/role-input.d.ts.map +1 -0
- package/dist/cli/utils/role-input.js +78 -0
- package/dist/cli/utils/security-logger.d.ts +17 -0
- package/dist/cli/utils/security-logger.d.ts.map +1 -1
- package/dist/cli/utils/security-logger.js +44 -5
- package/dist/lib/cli-tools/types.d.ts +6 -0
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +16 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +16 -0
- package/dist/lib/session/send-attempt-types.d.ts +4 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.d.ts +22 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.js +32 -2
- package/dist/server/locales/en/worktree.json +30 -4
- package/dist/server/locales/ja/worktree.json +30 -4
- package/dist/server/src/config/safe-directory.js +30 -0
- package/dist/server/src/lib/agent-roles/adapters.js +174 -0
- package/dist/server/src/lib/agent-roles/artifacts.js +638 -0
- package/dist/server/src/lib/agent-roles/composition.js +222 -0
- package/dist/server/src/lib/agent-roles/fingerprint.js +21 -0
- package/dist/server/src/lib/agent-roles/jsonc.js +85 -0
- package/dist/server/src/lib/agent-roles/launch-errors.js +58 -0
- package/dist/server/src/lib/agent-roles/pane-env.js +63 -0
- package/dist/server/src/lib/agent-roles/resolve.js +375 -0
- package/dist/server/src/lib/agent-roles/toml-basic.js +140 -0
- package/dist/server/src/lib/agent-roles/unicode.js +16 -0
- package/dist/server/src/lib/agent-roles/validation.js +61 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +39 -6
- package/dist/server/src/lib/cli-tools/base.js +63 -5
- package/dist/server/src/lib/cli-tools/claude-auto-default-nudge.js +141 -0
- package/dist/server/src/lib/cli-tools/claude.js +15 -3
- package/dist/server/src/lib/cli-tools/codex.js +134 -21
- package/dist/server/src/lib/cli-tools/command-code.js +28 -13
- package/dist/server/src/lib/cli-tools/copilot.js +189 -31
- package/dist/server/src/lib/cli-tools/gemini.js +37 -3
- package/dist/server/src/lib/cli-tools/launch-answer-skips.js +76 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +10 -0
- package/dist/server/src/lib/cli-tools/opencode.js +214 -12
- package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
- package/dist/server/src/lib/cli-tools/submit-composer-read.js +65 -12
- package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +94 -295
- package/dist/server/src/lib/cli-tools/vibe-local.js +111 -0
- package/dist/server/src/lib/db/agent-instances-db.js +53 -0
- package/dist/server/src/lib/db/agent-roles-db.js +409 -0
- package/dist/server/src/lib/db/agent-session-cost-sampler.js +3 -2
- package/dist/server/src/lib/db/chat-db.js +14 -1
- package/dist/server/src/lib/db/db-instance.js +84 -2
- package/dist/server/src/lib/db/migrations/index.js +6 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
- package/dist/server/src/lib/db/migrations/v64-agent-roles.js +123 -0
- package/dist/server/src/lib/db/migrations/v65-agent-instance-creation-keys.js +42 -0
- package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
- package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
- package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
- package/dist/server/src/lib/db/relay-bind-db.js +88 -167
- package/dist/server/src/lib/db/relay-db-base.js +20 -0
- package/dist/server/src/lib/db/relay-db-count.js +49 -0
- package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
- package/dist/server/src/lib/db/relay-db-hold.js +250 -0
- package/dist/server/src/lib/db/relay-db.js +68 -92
- package/dist/server/src/lib/detection/cli-patterns.js +13 -3
- package/dist/server/src/lib/detection/model-info-extractor.js +1 -1
- package/dist/server/src/lib/detection/tools/claude/patterns.js +76 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +5 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +5 -1
- package/dist/server/src/lib/detection/tools/codex/patterns.js +52 -2
- package/dist/server/src/lib/detection/tools/codex/prompt.js +23 -3
- package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +30 -15
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +268 -7
- package/dist/server/src/lib/detection/tools/opencode/readiness.js +71 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +51 -15
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +195 -11
- package/dist/server/src/lib/detection/tools/run-detection.js +5 -2
- package/dist/server/src/lib/detection/tools/verified-against.js +16 -0
- package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +92 -0
- package/dist/server/src/lib/git/git-common-dir.js +192 -0
- package/dist/server/src/lib/hooks/hook-settings-generator.js +8 -2
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +31 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +31 -8
- package/dist/server/src/lib/hooks/sources/opencode/client.js +20 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +208 -35
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +117 -2
- package/dist/server/src/lib/job-executor.js +18 -1
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +58 -4
- package/dist/server/src/lib/polling/response-checker.js +32 -7
- package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
- package/dist/server/src/lib/relay/relay-delivery-block.js +150 -0
- package/dist/server/src/lib/relay/relay-delivery.js +416 -79
- package/dist/server/src/lib/relay/relay-messages.js +13 -0
- package/dist/server/src/lib/relay/relay-system-line.js +28 -15
- package/dist/server/src/lib/relay/types.js +14 -2
- package/dist/server/src/lib/response-cleaner.js +13 -3
- package/dist/server/src/lib/response-extractor.js +38 -3
- package/dist/server/src/lib/session/agent-session-lifecycle.js +9 -1
- package/dist/server/src/lib/session/claude-executor.js +13 -1
- package/dist/server/src/lib/session/claude-session.js +113 -14
- package/dist/server/src/lib/session/current-output-builder.js +7 -5
- package/dist/server/src/lib/session/instance-input-lock.js +140 -6
- package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
- package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
- package/dist/server/src/lib/session/respond-target.js +82 -0
- package/dist/server/src/lib/session/role-launch.js +722 -0
- package/dist/server/src/lib/session/send-attempt-state.js +137 -3
- package/dist/server/src/lib/session/send-user-message.js +84 -7
- package/dist/server/src/lib/session/session-generation-archive.js +7 -8
- package/dist/server/src/lib/session/session-launch-flight.js +33 -1
- package/dist/server/src/lib/session/structured-prompt.js +12 -7
- package/dist/server/src/lib/session/worktree-session-reconcile.js +15 -0
- package/dist/server/src/lib/session-key-sender.js +6 -1
- package/dist/server/src/lib/test-run-detection.js +53 -0
- package/dist/server/src/lib/tmux/read-mode.js +4 -0
- package/dist/server/src/lib/tmux/session-hook-scripts.js +36 -4
- package/dist/server/src/lib/tui-accumulator.js +14 -5
- package/dist/server/src/lib/verification/env-clean-gate.js +117 -12
- package/dist/server/src/lib/verification/gate-runner.js +9 -8
- package/dist/server/src/lib/verification/verify-config.js +32 -2
- package/dist/server/src/types/agent-roles.js +56 -0
- package/dist/types/agent-roles.d.ts +351 -0
- package/dist/types/agent-roles.d.ts.map +1 -0
- package/dist/types/agent-roles.js +56 -0
- package/docs/en/user-guide/webapp-guide.md +16 -0
- package/package.json +2 -1
- package/release-notes/0.49.3.json +52 -0
- package/release-notes/0.50.0.json +113 -0
- package/.next/server/chunks/1062.js +0 -1
- package/.next/server/chunks/110.js +0 -1
- package/.next/server/chunks/2422.js +0 -1
- package/.next/server/chunks/3756.js +0 -1
- package/.next/server/chunks/4936.js +0 -1
- package/.next/server/chunks/5630.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6119.js +0 -1
- package/.next/server/chunks/6808.js +0 -4
- package/.next/server/chunks/7491.js +0 -3
- package/.next/server/chunks/9198.js +0 -144
- package/.next/server/chunks/9360.js +0 -2
- package/.next/server/chunks/9584.js +0 -1
- package/.next/static/chunks/2407-07a237575e1ceb9e.js +0 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +0 -1
- package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +0 -1
- package/.next/static/chunks/7229.7f0f5a7032b612b4.js +0 -1
- package/.next/static/chunks/8165-263172c17ae8e8c3.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/repositories/page-71f5a5ac29b0370d.js +0 -1
- package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
- package/.next/static/css/c1e307d05daf93b6.css +0 -1
- package/.next/static/yGatWDsS532awSs51kXyd/_buildManifest.js +0 -1
- /package/.next/static/{yGatWDsS532awSs51kXyd → z4d8-5MaLkoD-4EhueZwk}/_ssgManifest.js +0 -0
|
@@ -52,6 +52,11 @@ const terminal_keys_1 = require("../../types/terminal-keys");
|
|
|
52
52
|
const tmux_1 = require("../tmux/tmux");
|
|
53
53
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
54
54
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
55
|
+
const opencode_modal_overlay_1 = require("../detection/opencode-modal-overlay");
|
|
56
|
+
const readiness_1 = require("../detection/tools/opencode/readiness");
|
|
57
|
+
const status_detector_1 = require("../detection/status-detector");
|
|
58
|
+
const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
|
|
59
|
+
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
55
60
|
const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
56
61
|
const opencode_config_1 = require("./opencode-config");
|
|
57
62
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
@@ -66,6 +71,7 @@ const image_extensions_1 = require("../../config/image-extensions");
|
|
|
66
71
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
67
72
|
const runtime_1 = require("../../lib/hooks/sources/opencode/runtime");
|
|
68
73
|
const ports_1 = require("../../lib/hooks/sources/opencode/ports");
|
|
74
|
+
const role_launch_1 = require("../../lib/session/role-launch");
|
|
69
75
|
const launch_settings_1 = require("../../lib/hooks/sources/opencode/launch-settings");
|
|
70
76
|
const client_1 = require("../../lib/hooks/sources/opencode/client");
|
|
71
77
|
const subscription_1 = require("../../lib/hooks/sources/opencode/subscription");
|
|
@@ -110,6 +116,47 @@ exports.OPENCODE_READY_MAX_ATTEMPTS = 60;
|
|
|
110
116
|
* in the frame regardless of this number. Matches copilot's 50.
|
|
111
117
|
*/
|
|
112
118
|
const OPENCODE_READY_CAPTURE_LINES = 50;
|
|
119
|
+
/**
|
|
120
|
+
* How long a send that has to fall back to the keyboard waits for the input
|
|
121
|
+
* box (Issue #4040) — the same 15 s as gemini's and codex's send waits. The
|
|
122
|
+
* launch window (`OPENCODE_READY_*`, 30 s) is the launch's; a send arrives
|
|
123
|
+
* after it, and a pane still not up 15 s later is refused as `not-sent`
|
|
124
|
+
* rather than typed into.
|
|
125
|
+
*/
|
|
126
|
+
const OPENCODE_PROMPT_WAIT_TIMEOUT_MS = 15000;
|
|
127
|
+
/** Interval between the send's readiness polls (Issue #4040). */
|
|
128
|
+
const OPENCODE_PROMPT_POLL_INTERVAL_MS = 500;
|
|
129
|
+
/**
|
|
130
|
+
* Whether {@link OpenCodeTool}'s keyboard-fallback wait counts this frame
|
|
131
|
+
* towards giving up on a dialog (Issue #4084): an active prompt, or opencode's
|
|
132
|
+
* `waiting` without one (its permission strip, pickers, palette and overlays
|
|
133
|
+
* answer with keys, #1896) — and never a turn being generated. There is no
|
|
134
|
+
* folder-trust dialog here to leave out: this wait answers none.
|
|
135
|
+
*/
|
|
136
|
+
function isOpenCodeWaitDialog(status) {
|
|
137
|
+
if ((0, status_detector_1.isGeneratingStatus)(status))
|
|
138
|
+
return false;
|
|
139
|
+
return status.hasActivePrompt || status.status === 'waiting';
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* What held the pane when the wait for the input box ran out (Issue #4161), for the
|
|
143
|
+
* refusal `send` reports. Names the screen only: nothing captured goes into it. A
|
|
144
|
+
* dialog here is one read too briefly to be confirmed.
|
|
145
|
+
*
|
|
146
|
+
* @param output - The last capture; null when the last read failed
|
|
147
|
+
*/
|
|
148
|
+
function describeOpenCodePaneHold(output) {
|
|
149
|
+
if (output === null)
|
|
150
|
+
return 'the pane could not be read';
|
|
151
|
+
switch ((0, readiness_1.readOpenCodeNotReadyScreen)(output)) {
|
|
152
|
+
case 'dialog':
|
|
153
|
+
return 'a dialog or overlay is open: answer it in the terminal';
|
|
154
|
+
case 'input-box-holds-text':
|
|
155
|
+
return 'the input box still holds text';
|
|
156
|
+
default:
|
|
157
|
+
return 'no input box on the pane: opencode may still be starting';
|
|
158
|
+
}
|
|
159
|
+
}
|
|
113
160
|
/**
|
|
114
161
|
* Waits before each read-back of a message just posted to the server (#2035).
|
|
115
162
|
*
|
|
@@ -328,6 +375,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
328
375
|
? plannedCommand
|
|
329
376
|
: (0, opencode_session_store_1.withOpencodeResumedSession)(plannedCommand, resumeSessionId);
|
|
330
377
|
if (resumeSessionId !== null) {
|
|
378
|
+
// Issue #4115 (§6.4): a role that changed goes on in this conversation; it is told.
|
|
379
|
+
(0, role_launch_1.noteLaunchResumedConversation)(target);
|
|
331
380
|
logger.info('opencode-session-resumed', {
|
|
332
381
|
worktreeId,
|
|
333
382
|
instanceId: instanceId ?? this.id,
|
|
@@ -369,6 +418,11 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
369
418
|
throw new Error(`Failed to start OpenCode session: ${errorMessage}`);
|
|
370
419
|
}
|
|
371
420
|
}
|
|
421
|
+
/** Issue #4115: `GET /config`, the evidence that the server read the role (§14). */
|
|
422
|
+
async readServerConfig(worktreeId, _worktreePath, instanceId) {
|
|
423
|
+
const port = (0, ports_1.getAssignedOpencodePort)((0, runtime_1.opencodeTarget)(worktreeId, instanceId));
|
|
424
|
+
return port === null ? null : (0, client_1.fetchOpencodeConfig)(port);
|
|
425
|
+
}
|
|
372
426
|
/**
|
|
373
427
|
* Wait until opencode has painted something only opencode paints.
|
|
374
428
|
*
|
|
@@ -382,9 +436,10 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
382
436
|
*
|
|
383
437
|
* ## What counts as evidence
|
|
384
438
|
*
|
|
385
|
-
* `
|
|
386
|
-
* placeholder **behind the input box's gutter
|
|
387
|
-
* purpose; it is the same
|
|
439
|
+
* `findOpenCodeIdleComposer` (Issue #1883, by position since Issue #4209) — the
|
|
440
|
+
* `Ask anything...` placeholder **behind the input box's gutter, in the box over
|
|
441
|
+
* its bottom border**. Not reimplemented here on purpose; it is the same
|
|
442
|
+
* positive-evidence row `status-detector` reads.
|
|
388
443
|
*
|
|
389
444
|
* The copilot hazard that #1907 hit does not reach opencode, and this was
|
|
390
445
|
* checked rather than assumed. Removing copilot's blind sleep exposed the
|
|
@@ -403,6 +458,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
403
458
|
* operator's config, which is the same line codex's launch draws at its
|
|
404
459
|
* hooks-review dialog (#1760).
|
|
405
460
|
*
|
|
461
|
+
* A modal overlay is the third (Issue #4104): the palette hides `Ask anything`
|
|
462
|
+
* too when it opens before the wait has seen the box, and its heading is not
|
|
463
|
+
* on that allowlist. Measured on 1.18.35: 30 s here for a send that was then
|
|
464
|
+
* refused in 2 s. The overlay is opencode's own painting, and the TUI is a
|
|
465
|
+
* client of its server, so the stream attach below still finds the server up
|
|
466
|
+
* (#1908). It ends the wait only once confirmed, as the send's own wait does
|
|
467
|
+
* ({@link waitForPrompt}), so a palette closed sooner still ends on the box. A
|
|
468
|
+
* wrong reading costs nothing typed: the send's wait reads the pane itself.
|
|
469
|
+
* The rectangle needs the SGR, so the raw capture is what is read.
|
|
470
|
+
*
|
|
406
471
|
* ## On failure
|
|
407
472
|
*
|
|
408
473
|
* Returns false and lets the launch continue, exactly as the sleep did: a
|
|
@@ -413,11 +478,14 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
413
478
|
* @returns Whether readiness evidence was seen inside the window
|
|
414
479
|
*/
|
|
415
480
|
async waitForReady(sessionName) {
|
|
481
|
+
const overlay = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
416
482
|
for (let attempt = 0; attempt < exports.OPENCODE_READY_MAX_ATTEMPTS; attempt++) {
|
|
417
483
|
try {
|
|
418
|
-
const
|
|
484
|
+
const frame = await (0, tmux_1.capturePane)(sessionName, OPENCODE_READY_CAPTURE_LINES);
|
|
485
|
+
const output = (0, cli_patterns_1.stripAnsi)(frame);
|
|
419
486
|
// Do NOT stripBoxDrawing() this frame: the gutter is the anchor.
|
|
420
|
-
|
|
487
|
+
// Issue #4209: by position — the placeholder in the box over its border.
|
|
488
|
+
if ((0, cli_patterns_1.findOpenCodeIdleComposer)(output) !== null) {
|
|
421
489
|
logger.info('opencode-composer-detected', { attempt });
|
|
422
490
|
return true;
|
|
423
491
|
}
|
|
@@ -425,9 +493,15 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
425
493
|
logger.info('opencode-overlay-detected', { attempt });
|
|
426
494
|
return true;
|
|
427
495
|
}
|
|
496
|
+
if (overlay.observe((0, opencode_modal_overlay_1.detectOpenCodeModalOverlay)(frame) !== null)) {
|
|
497
|
+
logger.info('opencode-launch-dialog-confirmed', { attempt, reads: overlay.reads });
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
428
500
|
}
|
|
429
501
|
catch {
|
|
430
|
-
// Capture may fail while the pane is still coming up - keep polling
|
|
502
|
+
// Capture may fail while the pane is still coming up - keep polling.
|
|
503
|
+
// Not an overlay read: the run restarts.
|
|
504
|
+
overlay.reset();
|
|
431
505
|
}
|
|
432
506
|
await new Promise((resolve) => setTimeout(resolve, exports.OPENCODE_READY_POLL_INTERVAL_MS));
|
|
433
507
|
}
|
|
@@ -498,12 +572,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
498
572
|
* @param imagePath - Absolute path to an attachment, if there is one
|
|
499
573
|
* @returns Whether the message was posted **and** read back
|
|
500
574
|
*/
|
|
501
|
-
async trySendViaServer(target, message, imagePath) {
|
|
575
|
+
async trySendViaServer(target, message, imagePath, trace) {
|
|
502
576
|
const outcome = await this.dispatchViaServer(target, message, imagePath);
|
|
503
577
|
if (outcome === 'delivered')
|
|
504
578
|
return true;
|
|
505
579
|
if (outcome !== 'skipped')
|
|
506
580
|
(0, instance_input_lock_1.noteDispatchFailed)(outcome);
|
|
581
|
+
// Issue #4040: an `unknown` dispatch may have delivered the message, so a
|
|
582
|
+
// keyboard fallback that then refuses must not report the send `not-sent`.
|
|
583
|
+
if (outcome === 'unknown' && trace !== undefined)
|
|
584
|
+
trace.unknown = true;
|
|
507
585
|
return false;
|
|
508
586
|
}
|
|
509
587
|
/**
|
|
@@ -655,10 +733,24 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
655
733
|
* `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, must not
|
|
656
734
|
* become a pane that cannot be sent to.
|
|
657
735
|
*
|
|
736
|
+
* Issue #4040: that keyboard path now waits for an empty input box first
|
|
737
|
+
* (`waitForPrompt`, and again under the input lock) and refuses as
|
|
738
|
+
* `not-sent` / `prompt-not-ready` when none comes up — unless the server
|
|
739
|
+
* dispatch before it ended `unknown`, in which case the refusal stays
|
|
740
|
+
* `indeterminate`. A `delivered` send neither waits nor types.
|
|
741
|
+
*
|
|
658
742
|
* @param worktreeId - Worktree ID
|
|
659
743
|
* @param message - Message to send
|
|
660
744
|
*/
|
|
661
745
|
async sendMessage(worktreeId, message, instanceId) {
|
|
746
|
+
await this.sendMessageAfterDispatch(worktreeId, message, instanceId, { unknown: false });
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* {@link sendMessage}'s body, carrying whether a server dispatch earlier in
|
|
750
|
+
* the same send ended `unknown` (Issue #4040): {@link sendMessageWithImage}'s
|
|
751
|
+
* image dispatch is one, and its path fallback comes back through here.
|
|
752
|
+
*/
|
|
753
|
+
async sendMessageAfterDispatch(worktreeId, message, instanceId, trace) {
|
|
662
754
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
663
755
|
// Issue #2070: the pane exists, but does the AGENT? An agent that quit,
|
|
664
756
|
// updated itself or crashed leaves its tmux session behind, and the send
|
|
@@ -671,14 +763,27 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
671
763
|
// typing the message into a shell prompt. The relaunch reserves a port and
|
|
672
764
|
// re-attaches, so the server path is available again by the time it is
|
|
673
765
|
// tried. `sendMessageWithImage` reaches this through its own fallback.
|
|
674
|
-
|
|
675
|
-
|
|
766
|
+
//
|
|
767
|
+
// Issue #4040: when that fallback follows an `unknown` image dispatch, a
|
|
768
|
+
// refusal here (`SESSION_STARTING`, a pane that is gone) typed nothing but
|
|
769
|
+
// does not make the send as a whole safe to resend either.
|
|
770
|
+
try {
|
|
771
|
+
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
|
|
772
|
+
}
|
|
773
|
+
catch (error) {
|
|
774
|
+
throw this.keepUnknownDispatch(error, trace, sessionName) ?? error;
|
|
775
|
+
}
|
|
776
|
+
if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message, undefined, trace)) {
|
|
676
777
|
// Issue #405: the transcript grew, so the cached capture is stale — the
|
|
677
778
|
// same reason the keystroke path invalidates below.
|
|
678
779
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
679
780
|
return;
|
|
680
781
|
}
|
|
681
782
|
try {
|
|
783
|
+
// Issue #4040: the keyboard fallback types only into an input box that is
|
|
784
|
+
// up and empty — the first send to a new pane always lands here (no
|
|
785
|
+
// session id yet), as does every send of a pane with no live server.
|
|
786
|
+
await this.waitForPrompt(sessionName);
|
|
682
787
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
683
788
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
684
789
|
await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
|
|
@@ -686,6 +791,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
686
791
|
message,
|
|
687
792
|
cliToolId: 'opencode',
|
|
688
793
|
composer: this.describeComposer(),
|
|
794
|
+
// Issue #4040: the same test, of the newest frame read under the input lock.
|
|
795
|
+
readiness: { label: 'OpenCode', isReady: readiness_1.isOpenCodeComposerReady },
|
|
689
796
|
});
|
|
690
797
|
// Issue #405: Invalidate cache after sending message
|
|
691
798
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
@@ -693,10 +800,100 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
693
800
|
}
|
|
694
801
|
catch (error) {
|
|
695
802
|
const errorMessage = (0, errors_1.getErrorMessage)(error);
|
|
803
|
+
// Issue #4040: the keyboard typed nothing (no ready input box — or any
|
|
804
|
+
// other refusal before the first key: a dialog, the lock), but the server
|
|
805
|
+
// dispatch before it may have delivered the message, so the send as a
|
|
806
|
+
// whole stays unknown rather than "safe to resend".
|
|
807
|
+
const kept = this.keepUnknownDispatch(error, trace, sessionName);
|
|
808
|
+
if (kept)
|
|
809
|
+
throw kept;
|
|
696
810
|
// Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
|
|
697
811
|
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
|
|
698
812
|
}
|
|
699
813
|
}
|
|
814
|
+
/**
|
|
815
|
+
* The error a refusal with nothing typed becomes after a server dispatch of
|
|
816
|
+
* the same send ended `unknown` (Issue #4040): the message may already be
|
|
817
|
+
* there, so `classifySendFailure` must read the send as indeterminate.
|
|
818
|
+
*
|
|
819
|
+
* @returns the wrapped error, or `null` when the dispatch was not `unknown`
|
|
820
|
+
* or the refusal is not a `not-sent` one (the caller throws its own)
|
|
821
|
+
*/
|
|
822
|
+
keepUnknownDispatch(error, trace, sessionName) {
|
|
823
|
+
if (!trace.unknown)
|
|
824
|
+
return null;
|
|
825
|
+
const refusal = (0, send_attempt_state_1.classifySendFailure)(error);
|
|
826
|
+
if (refusal.state !== 'not-sent')
|
|
827
|
+
return null;
|
|
828
|
+
logger.warn('opencode-send-not-typed-after-unknown-dispatch', { sessionName, reason: refusal.reason });
|
|
829
|
+
return new Error(`Failed to send message to OpenCode: the keyboard fallback typed nothing (${refusal.reason}), ` +
|
|
830
|
+
'but an earlier server dispatch may have delivered the message (Issue #4040)', { cause: error });
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Wait for an empty input box before the keyboard fallback types (Issue #4040).
|
|
834
|
+
*
|
|
835
|
+
* {@link isOpenCodeComposerReady} is the test: the box on screen, empty, and
|
|
836
|
+
* no dialog or overlay over it (the `Connect a provider` overlay included —
|
|
837
|
+
* every option on it writes credentials, so it is never typed into).
|
|
838
|
+
*
|
|
839
|
+
* A dialog or overlay ({@link isOpenCodeWaitDialog}) does not keep the send
|
|
840
|
+
* here for the whole window behind a choice only a person can make — but
|
|
841
|
+
* since Issue #4084 it ends the wait only once confirmed: seen on 2 reads in a
|
|
842
|
+
* row spanning {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}, the count copilot's wait
|
|
843
|
+
* uses (#4067). It used to end the wait on one read, so a frame mid-paint
|
|
844
|
+
* could cut the wait short. A confirmed dialog is refused at once on the
|
|
845
|
+
* wait's own reads, as the shared sender's re-check under the lock would have
|
|
846
|
+
* refused it: `prompt-waiting` when the detector reports an active prompt,
|
|
847
|
+
* otherwise `prompt-not-ready` (opencode's permission strip, pickers and
|
|
848
|
+
* palette read as `waiting` without `hasActivePrompt`, #1896). A dialog that
|
|
849
|
+
* opens after the wait is still refused under the input lock on one read. No
|
|
850
|
+
* capture is waited for past the window: one still running at the deadline
|
|
851
|
+
* is not used.
|
|
852
|
+
*
|
|
853
|
+
* @throws Error (`OpenCode prompt not ready`) when the box did not come up
|
|
854
|
+
* within {@link OPENCODE_PROMPT_WAIT_TIMEOUT_MS}, or a dialog without an
|
|
855
|
+
* active prompt was confirmed; nothing was typed
|
|
856
|
+
* @throws Error coded `prompt-waiting` ({@link confirmedDialogRefusal}) for a
|
|
857
|
+
* confirmed dialog the detector reads as an active prompt; nothing was typed
|
|
858
|
+
*/
|
|
859
|
+
async waitForPrompt(sessionName) {
|
|
860
|
+
const deadline = Date.now() + OPENCODE_PROMPT_WAIT_TIMEOUT_MS;
|
|
861
|
+
const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
|
|
862
|
+
let lastOutput = null;
|
|
863
|
+
while (Date.now() < deadline) {
|
|
864
|
+
let refusal = null;
|
|
865
|
+
try {
|
|
866
|
+
const output = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, OPENCODE_READY_CAPTURE_LINES), deadline);
|
|
867
|
+
lastOutput = output;
|
|
868
|
+
if (output === null)
|
|
869
|
+
break;
|
|
870
|
+
if ((0, readiness_1.isOpenCodeComposerReady)(output))
|
|
871
|
+
return;
|
|
872
|
+
const status = (0, status_detector_1.detectSessionStatus)(output, 'opencode');
|
|
873
|
+
if (dialog.observe(isOpenCodeWaitDialog(status))) {
|
|
874
|
+
logger.warn('opencode-prompt-wait-dialog', { sessionName, reads: dialog.reads, reason: status.reason });
|
|
875
|
+
refusal = status.hasActivePrompt
|
|
876
|
+
? (0, prompt_wait_dialog_1.confirmedDialogRefusal)(sessionName, 'OpenCode')
|
|
877
|
+
: new Error(`OpenCode prompt not ready: a dialog or overlay (${status.reason}) stayed up for ` +
|
|
878
|
+
`${prompt_wait_dialog_1.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms before sending; nothing was typed (Issue #4084)`);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
catch (error) {
|
|
882
|
+
// Capture may fail - continue polling. Not a dialog read: the run restarts.
|
|
883
|
+
lastOutput = null;
|
|
884
|
+
dialog.reset();
|
|
885
|
+
logger.debug('opencode-prompt-capture-failed', { sessionName, error: (0, errors_1.getErrorMessage)(error) });
|
|
886
|
+
}
|
|
887
|
+
if (refusal)
|
|
888
|
+
throw refusal;
|
|
889
|
+
const remaining = deadline - Date.now();
|
|
890
|
+
if (remaining <= 0)
|
|
891
|
+
break;
|
|
892
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(OPENCODE_PROMPT_POLL_INTERVAL_MS, remaining)));
|
|
893
|
+
}
|
|
894
|
+
logger.info('opencode-prompt-not-detected');
|
|
895
|
+
throw new Error(`OpenCode prompt not ready: timed out waiting for the input prompt before sending (${describeOpenCodePaneHold(lastOutput)})`);
|
|
896
|
+
}
|
|
700
897
|
/**
|
|
701
898
|
* opencode can attach an image — sometimes (Issue #2035).
|
|
702
899
|
*
|
|
@@ -724,7 +921,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
724
921
|
*
|
|
725
922
|
* The fallback is that same degraded body, reached whenever the server route
|
|
726
923
|
* does not apply, and it is deliberately routed back through
|
|
727
|
-
* {@link sendMessage}
|
|
924
|
+
* {@link sendMessage}'s body (`sendMessageAfterDispatch`, carrying whether
|
|
925
|
+
* the image dispatch ended `unknown` — Issue #4040) rather than
|
|
926
|
+
* `sendMessageWithSubmitVerification`: the
|
|
728
927
|
* reason the image could not be attached is usually "no session yet", and by
|
|
729
928
|
* the time the text is sent that can already have changed. Going through
|
|
730
929
|
* `sendMessage` gives the text one honest attempt at the API before the
|
|
@@ -739,12 +938,15 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
739
938
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
740
939
|
await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
|
|
741
940
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
742
|
-
|
|
941
|
+
// Issue #4040: one trace for the whole send, so an `unknown` image dispatch
|
|
942
|
+
// is not forgotten when the path fallback's own dispatch is refused.
|
|
943
|
+
const trace = { unknown: false };
|
|
944
|
+
if (await this.trySendViaServer(target, message, imagePath, trace)) {
|
|
743
945
|
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
744
946
|
return;
|
|
745
947
|
}
|
|
746
948
|
logger.info('opencode-image-degraded-to-path', { worktreeId, instanceId: instanceId ?? this.id });
|
|
747
|
-
await this.
|
|
949
|
+
await this.sendMessageAfterDispatch(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId, trace);
|
|
748
950
|
}
|
|
749
951
|
/**
|
|
750
952
|
* Kill OpenCode session with graceful shutdown.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Giving up on a dialog in a tool's own prompt wait — the wait before the
|
|
4
|
+
* input lock (Issue #4067 for copilot, Issue #4084 for opencode and
|
|
5
|
+
* vibe-local).
|
|
6
|
+
*
|
|
7
|
+
* A dialog waits for a person, so the wait does not sit out its whole window
|
|
8
|
+
* (15 s) behind it. But a frame caught mid-paint can read as a dialog once, so
|
|
9
|
+
* one read is not enough: the dialog has to be seen on
|
|
10
|
+
* {@link PROMPT_WAIT_DIALOG_CONFIRM_READS} reads in a row spanning
|
|
11
|
+
* {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}. A read without a dialog, or a capture
|
|
12
|
+
* that failed, starts the run again.
|
|
13
|
+
*
|
|
14
|
+
* What counts as a dialog is each tool's own test (copilot excludes its
|
|
15
|
+
* folder-trust dialog and a drawn composer; opencode counts `waiting` without
|
|
16
|
+
* `hasActivePrompt`; nobody counts a Working frame). This module only counts.
|
|
17
|
+
*
|
|
18
|
+
* Only the wait's screen reading is confirmed this way. The prompt guard at
|
|
19
|
+
* the service entry (which also reads the hooks' structured record) and the
|
|
20
|
+
* re-check under the input lock still decide on one read.
|
|
21
|
+
*
|
|
22
|
+
* @module lib/cli-tools/prompt-wait-dialog
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = void 0;
|
|
26
|
+
exports.createDialogConfirmation = createDialogConfirmation;
|
|
27
|
+
exports.readBeforeDeadline = readBeforeDeadline;
|
|
28
|
+
exports.confirmedDialogRefusal = confirmedDialogRefusal;
|
|
29
|
+
const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
|
|
30
|
+
/** How long a dialog has to stay up before a prompt wait gives up on it. */
|
|
31
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = 2000;
|
|
32
|
+
/** On how many reads in a row (both thresholds must hold). */
|
|
33
|
+
exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = 2;
|
|
34
|
+
/** A fresh, empty run. */
|
|
35
|
+
function createDialogConfirmation() {
|
|
36
|
+
let since = null;
|
|
37
|
+
let reads = 0;
|
|
38
|
+
return {
|
|
39
|
+
observe(isDialog, now = Date.now()) {
|
|
40
|
+
if (!isDialog) {
|
|
41
|
+
since = null;
|
|
42
|
+
reads = 0;
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
since ??= now;
|
|
46
|
+
reads++;
|
|
47
|
+
return reads >= exports.PROMPT_WAIT_DIALOG_CONFIRM_READS && now - since >= exports.PROMPT_WAIT_DIALOG_CONFIRM_MS;
|
|
48
|
+
},
|
|
49
|
+
reset() {
|
|
50
|
+
since = null;
|
|
51
|
+
reads = 0;
|
|
52
|
+
},
|
|
53
|
+
get reads() {
|
|
54
|
+
return reads;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run `read` (a capture), but stop waiting for it at `deadline` (Issue #4084):
|
|
60
|
+
* a capture that is still running then (tmux's own time-out is 5 s) does not
|
|
61
|
+
* stretch the wait past its window, and the frame it returns late is not used.
|
|
62
|
+
*
|
|
63
|
+
* The clock is checked again once the race has answered, as the wait under the
|
|
64
|
+
* input lock does (`awaitReadyUnderLock`): when the capture's completion is
|
|
65
|
+
* handled before the deadline's timer, the race answers with a frame read past
|
|
66
|
+
* the deadline, and that frame is not used either (nor a failure that late).
|
|
67
|
+
*
|
|
68
|
+
* @returns what `read` returned, or `null` when the deadline came first
|
|
69
|
+
* @throws what `read` threw, when it threw before the deadline
|
|
70
|
+
*/
|
|
71
|
+
async function readBeforeDeadline(read, deadline) {
|
|
72
|
+
const remaining = deadline - Date.now();
|
|
73
|
+
if (remaining <= 0)
|
|
74
|
+
return null;
|
|
75
|
+
let timer;
|
|
76
|
+
const reading = read();
|
|
77
|
+
// A late failure is nobody's to handle once the deadline has answered.
|
|
78
|
+
reading.catch(() => undefined);
|
|
79
|
+
let result;
|
|
80
|
+
try {
|
|
81
|
+
result = await Promise.race([
|
|
82
|
+
reading,
|
|
83
|
+
new Promise((resolve) => {
|
|
84
|
+
timer = setTimeout(() => resolve(null), remaining);
|
|
85
|
+
}),
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (Date.now() > deadline)
|
|
90
|
+
return null;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
if (timer !== undefined)
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
}
|
|
97
|
+
// Answered past the deadline, whichever settled first: the wait is over.
|
|
98
|
+
if (Date.now() > deadline)
|
|
99
|
+
return null;
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The `prompt-waiting` refusal of a dialog a prompt wait confirmed (Issue
|
|
104
|
+
* #4084), worded and coded as the re-check under the input lock words it
|
|
105
|
+
* (`recheckComposerBeforeInput`), which is what `classifySendFailure` and the
|
|
106
|
+
* send service read. Nothing has been typed. Refused on the wait's own reads,
|
|
107
|
+
* without reading the pane once more.
|
|
108
|
+
*
|
|
109
|
+
* The wording must not say "prompt not ready": the classifier matches that
|
|
110
|
+
* first.
|
|
111
|
+
*/
|
|
112
|
+
function confirmedDialogRefusal(sessionName, label) {
|
|
113
|
+
return Object.assign(new Error(`A prompt dialog stayed open in session ${sessionName} for ${exports.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms ` +
|
|
114
|
+
`while the ${label} input prompt was awaited (re-checked under the input lock); nothing was typed (Issue #4084).`), { code: send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE });
|
|
115
|
+
}
|
|
@@ -16,6 +16,9 @@ exports.classifyPasteLanded = classifyPasteLanded;
|
|
|
16
16
|
exports.compactText = compactText;
|
|
17
17
|
const composer_spec_1 = require("./composer-spec");
|
|
18
18
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
19
|
+
const composer_own_text_1 = require("../detection/tools/opencode/composer-own-text");
|
|
20
|
+
const patterns_1 = require("../detection/tools/opencode/patterns");
|
|
21
|
+
const thinking_constants_1 = require("../../config/thinking-constants");
|
|
19
22
|
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
20
23
|
/**
|
|
21
24
|
* Version-resilient pasted-text placeholder.
|
|
@@ -39,6 +42,13 @@ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
|
|
|
39
42
|
* substitution, so a genuinely-submitted message never fails spuriously.
|
|
40
43
|
*/
|
|
41
44
|
const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
|
|
45
|
+
/**
|
|
46
|
+
* opencode's empty-buffer placeholder on a box row's own text (Issue #4067):
|
|
47
|
+
* `OPENCODE_IDLE_COMPOSER_PATTERN` with the gutter already removed by
|
|
48
|
+
* `readOpenCodeComposerOwnRows`. Start-anchored like that pattern, so the
|
|
49
|
+
* phrase quoted inside a typed body is not taken for it.
|
|
50
|
+
*/
|
|
51
|
+
const OPENCODE_OWN_PLACEHOLDER = /^Ask anything(?:\.\.\.|\u2026)/;
|
|
42
52
|
/**
|
|
43
53
|
* Prompt input-line markers across the marker-drawing TUIs.
|
|
44
54
|
* claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
|
|
@@ -95,17 +105,26 @@ exports.VERIFY_WINDOW_LINES = 12;
|
|
|
95
105
|
*/
|
|
96
106
|
function readComposer(reader, lines, windowLines) {
|
|
97
107
|
if (reader === 'opencode-box') {
|
|
98
|
-
|
|
99
|
-
|
|
108
|
+
// Each buffer row's own text: gutter removed and cut at the box's right
|
|
109
|
+
// edge (Issue #4067), so the sidebar drawn on the same rows (#2047/#2095 —
|
|
110
|
+
// its working directory starts with `/`) is never read as the body. The
|
|
111
|
+
// same cut as the send readiness (`isOpenCodeComposerReady`).
|
|
112
|
+
const box = (0, composer_own_text_1.readOpenCodeComposerBox)(lines);
|
|
113
|
+
if (box === null)
|
|
100
114
|
return { kind: 'absent' };
|
|
115
|
+
const { rows } = box;
|
|
116
|
+
// An overlay over the box (its bottom border cut in two): its rows are read
|
|
117
|
+
// to the border's far end, and the reading is marked so B and F do not
|
|
118
|
+
// stand on it (review of #4067).
|
|
119
|
+
const obscured = box.obscured ? { obscured: true } : {};
|
|
101
120
|
// The placeholder is painted only while the buffer is empty, and only
|
|
102
|
-
// inside the box —
|
|
103
|
-
if (rows.some((row) =>
|
|
104
|
-
return { kind: 'empty' };
|
|
105
|
-
const first = rows.
|
|
121
|
+
// inside the box (#1883) — read on the row's own text, which is inside it.
|
|
122
|
+
if (rows.some((row) => OPENCODE_OWN_PLACEHOLDER.test(row)))
|
|
123
|
+
return { kind: 'empty', ...obscured };
|
|
124
|
+
const first = rows.find((row) => row.length > 0);
|
|
106
125
|
if (first === undefined)
|
|
107
|
-
return { kind: 'empty' };
|
|
108
|
-
return { kind: 'text', text: first, rows };
|
|
126
|
+
return { kind: 'empty', ...obscured };
|
|
127
|
+
return { kind: 'text', text: first, rows, ...obscured };
|
|
109
128
|
}
|
|
110
129
|
if (reader !== 'input-line-marker')
|
|
111
130
|
return { kind: 'absent' };
|
|
@@ -432,6 +451,11 @@ function readSubmitComposer(output, cliToolId, reader, lines, windowLines, messa
|
|
|
432
451
|
* pre-#1501 permissive default, so normal sends never spuriously fail) —
|
|
433
452
|
* except in a codex composer above the read window -> indeterminate
|
|
434
453
|
* (Issue #3906).
|
|
454
|
+
* None of B–F holds for opencode's box with an overlay drawn over it (its
|
|
455
|
+
* bottom border cut in two) -> indeterminate (`B-obscured` when nothing is
|
|
456
|
+
* seen, `F-obscured` for any text — the body, a token or a `/…` included;
|
|
457
|
+
* review of #4067): what the box holds under the overlay is not seen, and an
|
|
458
|
+
* Enter or a clear would go to the overlay.
|
|
435
459
|
*
|
|
436
460
|
* C–F are scoped to the composer only, so the user-message echo that a TUI
|
|
437
461
|
* prints into its history above the prompt never causes a false verdict.
|
|
@@ -467,18 +491,29 @@ function classifySubmitWithRule(output, cliToolId, message, composerSpec = (0, c
|
|
|
467
491
|
const windowLines = lines.slice(-exports.VERIFY_WINDOW_LINES);
|
|
468
492
|
const windowStr = windowLines.join('\n');
|
|
469
493
|
// A. Actively generating a response => the message was accepted. Read from the
|
|
470
|
-
// tail window for every tool: each one's busy marker lives in a
|
|
471
|
-
// pinned to the bottom of the pane
|
|
472
|
-
//
|
|
473
|
-
if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
494
|
+
// tail window for every tool but opencode: each one's busy marker lives in a
|
|
495
|
+
// status bar pinned to the bottom of the pane. opencode's is read by position
|
|
496
|
+
// instead ({@link isOpenCodeGenerating}).
|
|
497
|
+
if (cliToolId === 'opencode' ? isOpenCodeGenerating(lines) : (0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
|
|
474
498
|
return { state: 'submitted', rule: 'A' };
|
|
475
499
|
}
|
|
476
500
|
const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines, message);
|
|
477
501
|
// B. No composer visible (scrolled off / dialog / still starting), or the
|
|
478
502
|
// composer is empty => the message left the box => submitted.
|
|
503
|
+
// Not on opencode's box with an overlay drawn over it (review of #4067):
|
|
504
|
+
// nothing seen there is not the box being empty -> indeterminate.
|
|
479
505
|
if (composer.kind !== 'text') {
|
|
506
|
+
if (composer.kind === 'empty' && composer.obscured)
|
|
507
|
+
return { state: 'indeterminate', rule: 'B-obscured' };
|
|
480
508
|
return { state: 'submitted', rule: composer.kind === 'absent' ? 'B-absent' : 'B-empty' };
|
|
481
509
|
}
|
|
510
|
+
// Text in opencode's box under an overlay (review of #4067): the reading
|
|
511
|
+
// runs to the border's far end, the overlay's text included, so none of
|
|
512
|
+
// C–F is read from it. C/D would resend Enter and E clear the line — keys
|
|
513
|
+
// that would go to the palette or picker on top, not to the box ->
|
|
514
|
+
// indeterminate (no Enter, no clear; read again).
|
|
515
|
+
if (composer.obscured)
|
|
516
|
+
return { state: 'indeterminate', rule: 'F-obscured' };
|
|
482
517
|
// C. A paste placeholder is still folded into the composer => body is there.
|
|
483
518
|
if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row) || findPasteTokens(row).tokens.length > 0)) {
|
|
484
519
|
return { state: 'pending', rule: 'C' };
|
|
@@ -500,6 +535,24 @@ function classifySubmitWithRule(output, cliToolId, message, composerSpec = (0, c
|
|
|
500
535
|
// neither that the message left nor that Enter would send it.
|
|
501
536
|
return composer.outsideWindow ? { state: 'indeterminate', rule: 'F-outside' } : { state: 'submitted', rule: 'F' };
|
|
502
537
|
}
|
|
538
|
+
/**
|
|
539
|
+
* Rule A of {@link classifySubmitWithRule} for opencode (Issue #4209): a
|
|
540
|
+
* `Thinking:` row read by the position rules the status detector's thinking
|
|
541
|
+
* step and branch B read (`../detection/tools/opencode/detect.ts`), which the
|
|
542
|
+
* poller's save also reads — the spinner's progress row under the composer's
|
|
543
|
+
* bottom border, or a `Thinking:` row at the end of the still-open turn.
|
|
544
|
+
*
|
|
545
|
+
* Before #4209 this was `/Thinking:/` anywhere in the 12-row tail window, which
|
|
546
|
+
* holds the footer's cwd: with a cwd of `/tmp/Thinking:demo` a body still unsent
|
|
547
|
+
* in the box read as `submitted`, so Enter was never pressed again and the send
|
|
548
|
+
* was reported as done. The busy hint (`esc interrupt`) is still not read here,
|
|
549
|
+
* as before: a reply may print it.
|
|
550
|
+
*
|
|
551
|
+
* @param lines - The ANSI-stripped pane, box drawing intact, trailing blank rows dropped
|
|
552
|
+
*/
|
|
553
|
+
function isOpenCodeGenerating(lines) {
|
|
554
|
+
return (0, patterns_1.isOpenCodeThinkingBelowComposer)(lines) || (0, patterns_1.isOpenCodeThinkingInOpenTurn)(lines, thinking_constants_1.THINKING_TAIL_LINE_COUNT);
|
|
555
|
+
}
|
|
503
556
|
/**
|
|
504
557
|
* Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
|
|
505
558
|
* A `replaced` verdict is NOT "submitted", so this returns false for it too.
|