commandmate 0.42.1 → 0.43.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 +144 -144
- package/.next/app-path-routes-manifest.json +23 -23
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- 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.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 +103 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.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.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_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_client-reference-manifest.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_client-reference-manifest.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 -1
- 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_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 +3 -1
- 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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_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_client-reference-manifest.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_client-reference-manifest.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]/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 -103
- 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 +3 -1
- 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 +3 -1
- 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 +3 -1
- 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 -103
- 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 +104 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_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 +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 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_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_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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- 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 +23 -23
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +4 -4
- package/.next/server/chunks/1990.js +1 -1
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/22.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +4 -3
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/252.js +1 -1
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -1
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4207.js +3 -3
- package/.next/server/chunks/434.js +1 -1
- package/.next/server/chunks/5064.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/5742.js +1 -1
- package/.next/server/chunks/5775.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6491.js +103 -0
- package/.next/server/chunks/6661.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +1 -1
- package/.next/server/chunks/7491.js +3 -0
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8583.js +1 -1
- package/.next/server/chunks/8673.js +6 -6
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +4 -3
- package/.next/server/chunks/8918.js +5 -5
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/{8052.js → 9353.js} +4 -2
- package/.next/server/chunks/9390.js +3 -0
- package/.next/server/chunks/9627.js +4 -4
- package/.next/server/chunks/964.js +1 -1
- package/.next/server/chunks/967.js +1 -0
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-21fbf12d753b8d4d.js → 2407-940df9b11fadafc6.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
- package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
- package/.next/static/chunks/app/{layout-8ff4c7c08ef1f621.js → layout-057c850cd0df978e.js} +1 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
- package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +3 -3
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +23 -149
- package/dist/cli/commands/reply.d.ts +40 -0
- package/dist/cli/commands/reply.d.ts.map +1 -0
- package/dist/cli/commands/reply.js +133 -0
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +9 -0
- package/dist/cli/commands/wait.d.ts +5 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +10 -1
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +13 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -0
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/reply-ledger.d.ts +95 -0
- package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
- package/dist/cli/utils/reply-ledger.js +187 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
- package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
- package/dist/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
- package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
- package/dist/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +5 -1
- package/dist/lib/detection/tools/verified-against.d.ts +15 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +17 -1
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +14 -1
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/locales/en/worktree.json +44 -14
- package/dist/server/locales/ja/worktree.json +44 -14
- package/dist/server/server.js +23 -0
- package/dist/server/src/config/cli-tool-timing-config.js +19 -1
- package/dist/server/src/config/detection-evidence-config.js +3 -0
- package/dist/server/src/config/schedule-config.js +55 -1
- package/dist/server/src/lib/auto-yes-poller.js +47 -4
- package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
- package/dist/server/src/lib/cli-tools/base.js +6 -2
- package/dist/server/src/lib/cli-tools/command-code.js +55 -1
- package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
- package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
- package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
- package/dist/server/src/lib/cli-tools/index.js +3 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
- package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
- package/dist/server/src/lib/cli-tools/opencode.js +29 -5
- package/dist/server/src/lib/cli-tools/types.js +5 -1
- package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/cmate-validator.js +13 -1
- package/dist/server/src/lib/db/worktree-db.js +1 -1
- package/dist/server/src/lib/detection/cli-patterns.js +78 -2
- package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
- package/dist/server/src/lib/detection/status-detector.js +10 -1
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
- package/dist/server/src/lib/detection/tools/registry.js +2 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
- package/dist/server/src/lib/detection/upstream-faults.js +8 -0
- package/dist/server/src/lib/detection/version-probes.js +14 -1
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
- package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
- package/dist/server/src/lib/hooks/sources/registry.js +2 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
- package/dist/server/src/lib/job-executor.js +2 -1
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
- package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
- package/dist/server/src/lib/relay/relay-delivery.js +4 -1
- package/dist/server/src/lib/session/agent-event-state.js +24 -0
- package/dist/server/src/lib/session/claude-executor.js +184 -10
- package/dist/server/src/lib/session/current-output-builder.js +27 -3
- package/dist/server/src/lib/session/send-user-message.js +4 -0
- package/dist/server/src/lib/session/structured-prompt.js +54 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
- package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
- package/dist/server/src/lib/tmux/tmux.js +48 -2
- package/dist/server/src/lib/verification/env-clean-gate.js +228 -9
- package/dist/server/src/lib/verification/env-snapshot.js +65 -1
- package/dist/server/src/types/cli-tool-contracts.js +10 -2
- package/dist/types/cli-tool-contracts.d.ts +16 -5
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/cli-tool-contracts.js +10 -2
- package/package.json +2 -1
- package/release-notes/0.42.2.json +20 -0
- package/release-notes/0.43.0.json +130 -0
- package/scripts/hooks/cmate-agent-event.sh +14 -0
- package/scripts/opencode-v2/launch.sh +226 -0
- package/.next/server/chunks/4443.js +0 -3
- package/.next/server/chunks/5164.js +0 -1
- package/.next/server/chunks/650.js +0 -1
- package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
- package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
- package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
- package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
- package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
- package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-3c946bd2875391fd.js +0 -1
- /package/.next/static/{3M_S0B7dhEDdVE2XSJz1Y → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
- /package/.next/static/{3M_S0B7dhEDdVE2XSJz1Y → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Shared between response-poller.ts and API routes
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = void 0;
|
|
7
|
+
exports.findOpencodeV2DialogTitle = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = exports.OPENCODE_V2_THINKING_PATTERN = exports.OPENCODE_V2_FOOTER_PATTERN = exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_TRAILED_STATUS_BAR_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_EFFORT_PICKER_FOOTER_PATTERN = exports.CODEX_PICKER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_TRUST_QUESTION_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
8
|
+
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_V2_SKIP_PATTERNS = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
11
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
@@ -17,6 +17,7 @@ exports.findOpenCodeChromeStart = findOpenCodeChromeStart;
|
|
|
17
17
|
exports.findOpenCodeUserEchoEnd = findOpenCodeUserEchoEnd;
|
|
18
18
|
exports.findOpenCodeComposerRows = findOpenCodeComposerRows;
|
|
19
19
|
exports.stripOpenCodeGutter = stripOpenCodeGutter;
|
|
20
|
+
exports.isOpencodeV2ComposerVisible = isOpencodeV2ComposerVisible;
|
|
20
21
|
exports.readCopilotStatusBar = readCopilotStatusBar;
|
|
21
22
|
exports.findCopilotChromeStart = findCopilotChromeStart;
|
|
22
23
|
exports.isCopilotSelectionFrame = isCopilotSelectionFrame;
|
|
@@ -1498,6 +1499,68 @@ exports.OPENCODE_SKIP_PATTERNS = [
|
|
|
1498
1499
|
exports.OPENCODE_FOOTER_STATUS_PATTERN,
|
|
1499
1500
|
exports.PASTED_TEXT_PATTERN,
|
|
1500
1501
|
];
|
|
1502
|
+
// =============================================================================
|
|
1503
|
+
// OpenCode V2 (`opencode2`, Issue #2934)
|
|
1504
|
+
// =============================================================================
|
|
1505
|
+
//
|
|
1506
|
+
// A separate tool id from `opencode` (Epic #2370, decision 1). Its TUI is drawn
|
|
1507
|
+
// by the same toolkit and many rows look alike, but v1's constants are v1's:
|
|
1508
|
+
// they are left exactly as they are, and v2 names its own here so a change on
|
|
1509
|
+
// either side cannot move the other. Phase 1 reads only what the send path and
|
|
1510
|
+
// the fallback status reader need; the approval dialog (`Always allow`, the
|
|
1511
|
+
// reverse of v1's `Allow always`), the completion row and the session tabs are
|
|
1512
|
+
// Phase 3's.
|
|
1513
|
+
/**
|
|
1514
|
+
* OpenCode V2's empty composer: the input box's `┃` gutter with the
|
|
1515
|
+
* `Ask anything…` placeholder on the same row (2.0.18 draws U+2026; the ASCII
|
|
1516
|
+
* `...` is accepted too, as for v1 since #2915).
|
|
1517
|
+
*
|
|
1518
|
+
* Measured on 2.0.18 at 80x200 (2026-09-28):
|
|
1519
|
+
* ` ┃ Ask anything… "Fix broken tests"`. Match against the ANSI-stripped
|
|
1520
|
+
* frame BEFORE `stripBoxDrawing`, which removes the gutter this anchors on.
|
|
1521
|
+
*/
|
|
1522
|
+
exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = /^[^\S\n]*[\u2502\u2503][^\S\n]*Ask anything(?:\.\.\.|\u2026)/m;
|
|
1523
|
+
/**
|
|
1524
|
+
* OpenCode V2's footer, which ends in `ctrl+p commands` on every frame the
|
|
1525
|
+
* TUI draws (before a turn: `<path>:<branch> shift+tab agents ctrl+p commands`;
|
|
1526
|
+
* after one: `<path>:<branch> 8.8K (1%) ctrl+p commands`, 2.0.18).
|
|
1527
|
+
*
|
|
1528
|
+
* Proof that the TUI — and so its composer — is on screen, NOT that it is idle:
|
|
1529
|
+
* a running turn keeps the footer.
|
|
1530
|
+
*/
|
|
1531
|
+
exports.OPENCODE_V2_FOOTER_PATTERN = /ctrl\+p commands/;
|
|
1532
|
+
/**
|
|
1533
|
+
* OpenCode V2 working indicator: the footer's `esc interrupt` hint, drawn only
|
|
1534
|
+
* while a turn is running (2.0.18).
|
|
1535
|
+
*/
|
|
1536
|
+
exports.OPENCODE_V2_THINKING_PATTERN = /esc interrupt/;
|
|
1537
|
+
/**
|
|
1538
|
+
* Whether OpenCode V2's composer is on screen, so a send may type into it
|
|
1539
|
+
* (Issue #2934, D6): the gutter-anchored placeholder, or the footer.
|
|
1540
|
+
*
|
|
1541
|
+
* @param text - ANSI-stripped capture, box drawing intact
|
|
1542
|
+
*/
|
|
1543
|
+
function isOpencodeV2ComposerVisible(text) {
|
|
1544
|
+
return exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test(text) || exports.OPENCODE_V2_FOOTER_PATTERN.test(text);
|
|
1545
|
+
}
|
|
1546
|
+
/**
|
|
1547
|
+
* The OpenCode V2 dialog title row and its reader (Issue #2971) live in a
|
|
1548
|
+
* browser-safe leaf since Issue #2983, because the chat surface's dialog card
|
|
1549
|
+
* reads the same row to decide whether v2's model keys may close the dialog
|
|
1550
|
+
* first. Re-exported here so every server-side caller keeps one import site.
|
|
1551
|
+
*/
|
|
1552
|
+
var dialog_title_1 = require("./tools/opencode-v2/dialog-title");
|
|
1553
|
+
Object.defineProperty(exports, "OPENCODE_V2_DIALOG_TITLE_PATTERN", { enumerable: true, get: function () { return dialog_title_1.OPENCODE_V2_DIALOG_TITLE_PATTERN; } });
|
|
1554
|
+
Object.defineProperty(exports, "findOpencodeV2DialogTitle", { enumerable: true, get: function () { return dialog_title_1.findOpencodeV2DialogTitle; } });
|
|
1555
|
+
/** OpenCode V2 rows that are chrome, never reply content. */
|
|
1556
|
+
exports.OPENCODE_V2_SKIP_PATTERNS = [
|
|
1557
|
+
exports.OPENCODE_SEPARATOR_PATTERN,
|
|
1558
|
+
exports.OPENCODE_V2_FOOTER_PATTERN,
|
|
1559
|
+
exports.OPENCODE_V2_THINKING_PATTERN,
|
|
1560
|
+
/Ask anything(?:\.\.\.|\u2026)/,
|
|
1561
|
+
/^Build\s+·/,
|
|
1562
|
+
exports.PASTED_TEXT_PATTERN,
|
|
1563
|
+
];
|
|
1501
1564
|
/**
|
|
1502
1565
|
* Copilot prompt pattern (Issue #545)
|
|
1503
1566
|
* Copilot CLI shows "❯" followed by cursor/text hint:
|
|
@@ -2669,6 +2732,9 @@ function detectThinking(cliToolId, content) {
|
|
|
2669
2732
|
case 'command-code':
|
|
2670
2733
|
result = exports.COMMAND_CODE_THINKING_PATTERN.test(content);
|
|
2671
2734
|
break;
|
|
2735
|
+
case 'opencode-v2':
|
|
2736
|
+
result = exports.OPENCODE_V2_THINKING_PATTERN.test(content);
|
|
2737
|
+
break;
|
|
2672
2738
|
default:
|
|
2673
2739
|
result = exports.CLAUDE_THINKING_PATTERN.test(content);
|
|
2674
2740
|
}
|
|
@@ -2787,6 +2853,16 @@ function getCliToolPatterns(cliToolId) {
|
|
|
2787
2853
|
thinkingPattern: exports.COMMAND_CODE_THINKING_PATTERN,
|
|
2788
2854
|
skipPatterns: [...exports.COMMAND_CODE_SKIP_PATTERNS],
|
|
2789
2855
|
};
|
|
2856
|
+
// Issue #2934: OpenCode V2's own constants (see OPENCODE_V2_* above). The
|
|
2857
|
+
// separator row is the same half-block rule v1 draws, so v1's pattern is
|
|
2858
|
+
// reused as a value; nothing of v1's is changed.
|
|
2859
|
+
case 'opencode-v2':
|
|
2860
|
+
return {
|
|
2861
|
+
promptPattern: exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN,
|
|
2862
|
+
separatorPattern: exports.OPENCODE_SEPARATOR_PATTERN,
|
|
2863
|
+
thinkingPattern: exports.OPENCODE_V2_THINKING_PATTERN,
|
|
2864
|
+
skipPatterns: [...exports.OPENCODE_V2_SKIP_PATTERNS],
|
|
2865
|
+
};
|
|
2790
2866
|
default:
|
|
2791
2867
|
// Default to Claude patterns
|
|
2792
2868
|
return getCliToolPatterns('claude');
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
* @see Issue #1784, Phase 2 of the model/effort visibility series
|
|
63
63
|
*/
|
|
64
64
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
65
|
+
exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_EFFORT_ROW_PATTERN = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
|
|
66
66
|
exports.resolveEffortToken = resolveEffortToken;
|
|
67
67
|
exports.extractModelInfo = extractModelInfo;
|
|
68
68
|
exports.deriveEffortFromModelId = deriveEffortFromModelId;
|
|
@@ -288,14 +288,83 @@ function readCodexFooter(line) {
|
|
|
288
288
|
* literal-anchored parts, and the greedy prefix class is disjoint from `\S`.
|
|
289
289
|
*/
|
|
290
290
|
exports.CLAUDE_STARTUP_BANNER_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+with\s+(minimal|low|medium|high|xhigh)\s+effort\b/i;
|
|
291
|
+
/**
|
|
292
|
+
* The startup banner as claude 2.1.28x draws it: `<model> · <plan>` with no
|
|
293
|
+
* effort clause (Issue #2955).
|
|
294
|
+
*
|
|
295
|
+
* Measured on claude 2.1.284 (`tests/fixtures/claude-session-start-2955/`):
|
|
296
|
+
* `▝▜██████▀ Sonnet 5.5 · Claude Max`
|
|
297
|
+
* The effort moved off this row to a right-aligned one of its own
|
|
298
|
+
* ({@link CLAUDE_EFFORT_ROW_PATTERN}). Issue #3023 measured on 2.1.285 that
|
|
299
|
+
* this is the shape at the model's DEFAULT effort only: a non-default effort
|
|
300
|
+
* brings the clause back (`Opus 5.5 with xhigh effort · Claude Max`), which
|
|
301
|
+
* {@link CLAUDE_STARTUP_BANNER_PATTERN} reads
|
|
302
|
+
* (`tests/fixtures/claude-effort-default-3023/`).
|
|
303
|
+
*
|
|
304
|
+
* Without the `with … effort` anchor, a box-framed table row containing ` · `
|
|
305
|
+
* would read as a banner — the reason #2361 declined to widen
|
|
306
|
+
* {@link CLAUDE_STARTUP_BANNER_PATTERN}. The anchor here is the plan instead:
|
|
307
|
+
* the separator must be followed by `Claude <Plan>`, the spelling measured on
|
|
308
|
+
* 2.1.284. `API Usage Billing` is deliberately NOT accepted yet: the only frames
|
|
309
|
+
* that carry it are #2361's 2.1.263 Haiku banners, and
|
|
310
|
+
* `model-info-claude-switch-2361.test.ts` pins those as an honest unknown
|
|
311
|
+
* (`fullscreen-after-clear`). The hook's `SessionStart` names the model on
|
|
312
|
+
* those sessions. `·` is excluded from the model group so the lazy
|
|
313
|
+
* match stops at the first separator, and a label still carrying `with …
|
|
314
|
+
* effort` (a truncated old-format banner) is refused by the caller.
|
|
315
|
+
*
|
|
316
|
+
* Tried only after the old pattern, so a 2.1.232-shaped line keeps its effort.
|
|
317
|
+
*/
|
|
318
|
+
exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F·]*?)\s+·\s+Claude\s+[A-Za-z]+\b/;
|
|
319
|
+
/**
|
|
320
|
+
* The right-aligned effort row claude 2.1.28x draws under its banner
|
|
321
|
+
* (Issue #2955): `◐ medium · /effort`.
|
|
322
|
+
*
|
|
323
|
+
* Anchored on the trailing `· /effort` hint, which is chrome and nothing a
|
|
324
|
+
* reply would end a line with; the leading glyph is any one non-space
|
|
325
|
+
* character (the dial changes with the level). The word goes through
|
|
326
|
+
* {@link resolveEffortToken}, so anything outside the known levels reads as no
|
|
327
|
+
* effort rather than as a guess.
|
|
328
|
+
*
|
|
329
|
+
* The row is drawn on the first frame only; after the first turn it is gone
|
|
330
|
+
* (Issue #3023), so a later frame reads the model and no effort.
|
|
331
|
+
*/
|
|
332
|
+
exports.CLAUDE_EFFORT_ROW_PATTERN = /^\s*\S\s+([A-Za-z]+)\s+·\s+\/effort\s*$/;
|
|
291
333
|
function readClaudeBanner(line) {
|
|
292
334
|
const match = exports.CLAUDE_STARTUP_BANNER_PATTERN.exec(line);
|
|
293
|
-
if (
|
|
335
|
+
if (match) {
|
|
336
|
+
const model = match[1].trim();
|
|
337
|
+
if (!isPlausibleModelLabel(model))
|
|
338
|
+
return null;
|
|
339
|
+
return { model, effort: resolveEffortToken(match[2]) };
|
|
340
|
+
}
|
|
341
|
+
// Issue #2955: the 2.1.28x shape, no effort on the row.
|
|
342
|
+
const current = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN.exec(line);
|
|
343
|
+
if (!current)
|
|
294
344
|
return null;
|
|
295
|
-
const model =
|
|
296
|
-
if (!isPlausibleModelLabel(model))
|
|
345
|
+
const model = current[1].trim();
|
|
346
|
+
if (/\swith\s/i.test(model) || !isPlausibleModelLabel(model))
|
|
297
347
|
return null;
|
|
298
|
-
return { model, effort:
|
|
348
|
+
return { model, effort: null };
|
|
349
|
+
}
|
|
350
|
+
function readClaudeEffortRow(line) {
|
|
351
|
+
const match = exports.CLAUDE_EFFORT_ROW_PATTERN.exec(line);
|
|
352
|
+
if (!match)
|
|
353
|
+
return null;
|
|
354
|
+
const effort = resolveEffortToken(match[1]);
|
|
355
|
+
return effort === null ? null : { model: null, effort };
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The banner, with the effort filled from the 2.1.28x effort row when the
|
|
359
|
+
* banner itself names none (Issue #2955). The row is consulted only for a
|
|
360
|
+
* banner that was read, so it never supplies an effort on its own.
|
|
361
|
+
*/
|
|
362
|
+
function readClaudeBannerWithEffort(captureText) {
|
|
363
|
+
const banner = scanFromEnd(captureText, readClaudeBanner);
|
|
364
|
+
if (!banner || banner.effort !== null)
|
|
365
|
+
return banner;
|
|
366
|
+
const row = scanFromEnd(captureText, readClaudeEffortRow);
|
|
367
|
+
return row ? { model: banner.model, effort: row.effort } : banner;
|
|
299
368
|
}
|
|
300
369
|
/**
|
|
301
370
|
* Reads `<model>[ with <effort> effort]` off the line Claude prints when the
|
|
@@ -341,7 +410,10 @@ function readClaudeBanner(line) {
|
|
|
341
410
|
* Billing`), so {@link CLAUDE_STARTUP_BANNER_PATTERN} does not read it and
|
|
342
411
|
* the confirmation line is what publishes the model there. The banner
|
|
343
412
|
* pattern is deliberately not widened: without the `with … effort` anchor
|
|
344
|
-
* a box-framed table row containing ` · ` would read as a banner.
|
|
413
|
+
* a box-framed table row containing ` · ` would read as a banner. (#2955
|
|
414
|
+
* added a second, plan-anchored pattern for the 2.1.28x banner —
|
|
415
|
+
* {@link CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN} — which accepts
|
|
416
|
+
* `· Claude <Plan>` only, so this Haiku row is still not read.)
|
|
345
417
|
* - **`/fast` prints `⎿ ↯ Fast mode ON · model set to Opus 5 · $10/$50 per
|
|
346
418
|
* Mtok` and is a model switch** (`PostModelSwitch` reported
|
|
347
419
|
* `claude-fable-5-1` → `claude-opus-5[1m]` on the same keypress). It is NOT
|
|
@@ -747,7 +819,7 @@ function extractModelInfo(cliToolId, captureText) {
|
|
|
747
819
|
// hooks name the model on `SessionStart` alone — `/model` fires none of
|
|
748
820
|
// the events CommandMate registers — so on a switch the pane is the only
|
|
749
821
|
// channel that hears it.
|
|
750
|
-
return (
|
|
822
|
+
return (readClaudeBannerWithEffort(captureText) ??
|
|
751
823
|
scanFromEnd(captureText, readClaudeModelSwitchLine) ??
|
|
752
824
|
unknown());
|
|
753
825
|
case 'antigravity':
|
|
@@ -31,6 +31,7 @@ exports.detectSessionStatus = detectSessionStatus;
|
|
|
31
31
|
const status_reason_1 = require("./status-reason");
|
|
32
32
|
const frame_1 = require("./tools/frame");
|
|
33
33
|
const registry_1 = require("./tools/registry");
|
|
34
|
+
const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
|
|
34
35
|
var status_reason_2 = require("./status-reason");
|
|
35
36
|
Object.defineProperty(exports, "STATUS_REASON", { enumerable: true, get: function () { return status_reason_2.STATUS_REASON; } });
|
|
36
37
|
/**
|
|
@@ -139,7 +140,15 @@ Object.defineProperty(exports, "STATUS_CHECK_LINE_COUNT", { enumerable: true, ge
|
|
|
139
140
|
*/
|
|
140
141
|
function detectSessionStatus(output, cliToolId, lastOutputTimestamp) {
|
|
141
142
|
const frame = (0, frame_1.normalizeFrame)(output);
|
|
142
|
-
const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, {
|
|
143
|
+
const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, {
|
|
144
|
+
lastOutputTimestamp,
|
|
145
|
+
// Issue #2991: the same presence reading Auto-Yes and History use, so an
|
|
146
|
+
// unvouched numbered list is not `waiting` here either (and therefore
|
|
147
|
+
// neither `isPromptWaiting` nor a send refusal). Consulted only by tools
|
|
148
|
+
// that set `requireVouchedPrompt`; `legacy` tools and non-`multiple_choice`
|
|
149
|
+
// prompts come back `present: true` regardless.
|
|
150
|
+
isPromptVouched: (prompt) => (0, auto_yes_dialog_gate_1.evaluateDialogPresence)(cliToolId, prompt.promptData?.type, output).present,
|
|
151
|
+
});
|
|
143
152
|
return {
|
|
144
153
|
status: verdict.status,
|
|
145
154
|
confidence: verdict.confidence,
|
|
@@ -155,10 +155,11 @@ exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
|
|
|
155
155
|
* | `Press space to select or enter to save for next conversation` | `/experimental` | 1st |
|
|
156
156
|
* | `Press space to select or enter to save` | `/experimental` (0.155.1) | 1st |
|
|
157
157
|
* | `left/right group · enter edit shortcut · … · esc close` | `/keymap` | 2nd |
|
|
158
|
+
* | `enter continue · esc skip` | update offer (0.157.1, Issue #3020) | 2nd |
|
|
158
159
|
*
|
|
159
160
|
* No `/g` (keeps `.test()` stateless) and no nested quantifiers (ReDoS-safe).
|
|
160
161
|
*/
|
|
161
|
-
exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back)/i;
|
|
162
|
+
exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back|skip)/i;
|
|
162
163
|
const INITIAL_SGR = { bold: false, dim: false, fg: null };
|
|
163
164
|
/**
|
|
164
165
|
* Apply one SGR parameter list to the running attribute state.
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2 screen detector — the fallback reader (Issue #2934, Phase 1).
|
|
4
|
+
*
|
|
5
|
+
* OpenCode V2's state comes from its server's SSE stream
|
|
6
|
+
* (`@/lib/hooks/sources/opencode-v2`); this module is what decides when that
|
|
7
|
+
* stream is not there (a pane launched `--standalone`, a subscription that has
|
|
8
|
+
* not reattached yet). It reads, in this order:
|
|
9
|
+
*
|
|
10
|
+
* - the approval dialog's button strip (`Allow once Always allow Reject`)
|
|
11
|
+
* → `waiting` (Issue #2965);
|
|
12
|
+
* - the question form's key hints (`↑↓ select enter submit esc dismiss`)
|
|
13
|
+
* → `waiting` (Issue #2965);
|
|
14
|
+
* - a dialog's title row (`Select variant … esc`, the model / variant
|
|
15
|
+
* pickers, Commands, Sessions, Select agent) anywhere on the pane
|
|
16
|
+
* → `waiting` (Issue #2971);
|
|
17
|
+
* - the footer's `esc interrupt` hint → `running`;
|
|
18
|
+
* - the completion row (`Build · <model> · 3.5s · 11.2 tok/s`) as the last
|
|
19
|
+
* transcript row → `ready` (Issue #2965);
|
|
20
|
+
* - the gutter-anchored empty composer (`┃ Ask anything…`) → `ready`;
|
|
21
|
+
* - otherwise the footer without that hint (`… 8.6K (1%) ctrl+p commands`,
|
|
22
|
+
* the frame after a turn, whose composer is a bare gutter) → `ready`.
|
|
23
|
+
*
|
|
24
|
+
* Both dialogs are drawn INSIDE the composer's `┃` gutter and replace the
|
|
25
|
+
* footer altogether (measured on 2.0.18, 80x200, 2026-09-29:
|
|
26
|
+
* `tests/fixtures/opencode-v2-live-2945/permission-required.txt` /
|
|
27
|
+
* `question.txt`), so before #2965 they reached the floor as `running` /
|
|
28
|
+
* `default` — an unclassified frame, which is what wrote the "could not parse
|
|
29
|
+
* it" row into the chat while the structured layer held the very approval.
|
|
30
|
+
*
|
|
31
|
+
* v1's opencode detector is deliberately not reused: its dialog rule keys on
|
|
32
|
+
* v1's wording (`Allow always`, the reverse word order) and would misread v2.
|
|
33
|
+
*
|
|
34
|
+
* `detectDialog` (Issue #2984) reads the same three surfaces for the Auto-Yes
|
|
35
|
+
* gate (`polling/auto-yes-dialog-gate`), measured on 2.0.18 at 80x200
|
|
36
|
+
* (2026-09-29, `tests/fixtures/opencode-v2-dialogs-2984/`): the approval strip
|
|
37
|
+
* (`keys` — a typed digit leaves it open), the question form (`numbered`,
|
|
38
|
+
* `answer_only` — a typed `2` alone submitted `Blue`) and a dialog title
|
|
39
|
+
* (`keys` — a digit goes into the filter). v2's approvals and questions are
|
|
40
|
+
* still answered through the agent's own API (#2945); what the gate needs from
|
|
41
|
+
* this module is the NO — an agent's reply that quotes a `❯ 1. Yes` dialog is
|
|
42
|
+
* none of the three, so Auto-Yes does not type into the composer for it.
|
|
43
|
+
*
|
|
44
|
+
* @module lib/detection/tools/opencode-v2/detect
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.opencodeV2StatusDetector = exports.OPENCODE_V2_PERMISSION_OPTIONS = exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = exports.OPENCODE_V2_QUESTION_PATTERN = exports.OPENCODE_V2_PERMISSION_PATTERN = exports.VERIFIED_AGAINST = void 0;
|
|
48
|
+
exports.endsWithTurnComplete = endsWithTurnComplete;
|
|
49
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
50
|
+
const status_reason_1 = require("../../status-reason");
|
|
51
|
+
const run_detection_1 = require("../run-detection");
|
|
52
|
+
const verified_against_1 = require("../verified-against");
|
|
53
|
+
exports.VERIFIED_AGAINST = verified_against_1.OPENCODE_V2_VERIFIED_AGAINST;
|
|
54
|
+
/**
|
|
55
|
+
* The approval dialog's button strip, on the composer's own `┃` gutter:
|
|
56
|
+
* `┃ Allow once Always allow Reject ctrl+f fullscreen ⇆ select enter con…`
|
|
57
|
+
* (2.0.18). The gutter anchor keeps the same words reaching the pane inside a
|
|
58
|
+
* reply from being read as a dialog, as v1's `OPENCODE_PERMISSION_PATTERN`
|
|
59
|
+
* does; the word order is v2's own (`Always allow`, not v1's `Allow always`).
|
|
60
|
+
*/
|
|
61
|
+
exports.OPENCODE_V2_PERMISSION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*Allow once[^\S\n]{2,}Always allow[^\S\n]{2,}Reject\b/m;
|
|
62
|
+
/**
|
|
63
|
+
* The question form's key hints, on the composer's gutter:
|
|
64
|
+
* `┃ ↑↓ select enter submit esc dismiss` (2.0.18, below the numbered
|
|
65
|
+
* choices and `Type your own answer`).
|
|
66
|
+
*/
|
|
67
|
+
exports.OPENCODE_V2_QUESTION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*↑↓ select[^\S\n]+enter submit[^\S\n]+esc dismiss\b/m;
|
|
68
|
+
/**
|
|
69
|
+
* The row that closes a finished turn: `Build · <model> · 3.5s · 11.2 tok/s`
|
|
70
|
+
* (2.0.18). Transcript rows carry no gutter; the composer's model bar
|
|
71
|
+
* (`┃ Build · <model> OpenCode Zen`) does and has no duration, so neither it
|
|
72
|
+
* nor v1's `▣` row matches. A duration is required — the row without one is not
|
|
73
|
+
* a completion (the lesson v1's #1893 learned).
|
|
74
|
+
*/
|
|
75
|
+
exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = /^[^\S\n│┃]*[A-Za-z][\w-]*(?: [\w-]+)* · [^\n]+? · \d+(?:\.\d+)?(?:ms|s|m(?: \d+s)?)(?: · [\d.]+ tok\/s)?[^\S\n]*$/;
|
|
76
|
+
/** The approval strip's buttons, in the order it draws them (2.0.18). */
|
|
77
|
+
exports.OPENCODE_V2_PERMISSION_OPTIONS = ['Allow once', 'Always allow', 'Reject'];
|
|
78
|
+
/** A row of the composer's gutter (`┃ …`). The question form is drawn entirely on it. */
|
|
79
|
+
const GUTTER_ROW_PATTERN = /^[^\S\n]*[│┃]/;
|
|
80
|
+
/** One choice of the question form: `┃ 1. Red` (2.0.18). */
|
|
81
|
+
const QUESTION_OPTION_ROW_PATTERN = /^[^\S\n]*[│┃][^\S\n]*(\d+)\.[^\S\n]+(\S.*?)[^\S\n]*$/;
|
|
82
|
+
/**
|
|
83
|
+
* The question form as a dialog (Issue #2984): the choices on the gutter rows
|
|
84
|
+
* above its key hints, numbered 1..n without a gap. `null` when the hints row
|
|
85
|
+
* is not in the status window or fewer than two choices can be read.
|
|
86
|
+
*
|
|
87
|
+
* `numbered` / `answer_only` because that is what the form does with a digit:
|
|
88
|
+
* measured on 2.0.18, typing `2` with no Enter submitted `Blue`
|
|
89
|
+
* (`tests/fixtures/opencode-v2-dialogs-2984/question-answered-by-digit.txt`).
|
|
90
|
+
*/
|
|
91
|
+
function readQuestionDialog(frame) {
|
|
92
|
+
if (!exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines))
|
|
93
|
+
return null;
|
|
94
|
+
const lines = frame.contentLines;
|
|
95
|
+
let hints = -1;
|
|
96
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
97
|
+
if (exports.OPENCODE_V2_QUESTION_PATTERN.test(lines[i])) {
|
|
98
|
+
hints = i;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (hints < 0)
|
|
103
|
+
return null;
|
|
104
|
+
const options = [];
|
|
105
|
+
for (let i = hints - 1; i >= 0 && GUTTER_ROW_PATTERN.test(lines[i]); i--) {
|
|
106
|
+
const match = QUESTION_OPTION_ROW_PATTERN.exec(lines[i]);
|
|
107
|
+
if (match)
|
|
108
|
+
options.unshift(`${match[1]}. ${match[2]}`);
|
|
109
|
+
}
|
|
110
|
+
if (options.length < 2)
|
|
111
|
+
return null;
|
|
112
|
+
if (!options.every((option, index) => option.startsWith(`${index + 1}. `)))
|
|
113
|
+
return null;
|
|
114
|
+
return { kind: 'question', options, answerMode: 'numbered', submitMode: 'answer_only' };
|
|
115
|
+
}
|
|
116
|
+
/** Rows below the transcript that are chrome: gutter padding, the model bar, the rule, the footer, the version. */
|
|
117
|
+
function isChromeRow(line) {
|
|
118
|
+
if (/^[\s│┃╹▀]*$/.test(line))
|
|
119
|
+
return true;
|
|
120
|
+
// The composer's model bar: gutter, then `<Agent> · <model> <provider>` with no second `·`.
|
|
121
|
+
if (/^[^\S\n]*[│┃][^\S\n]*[A-Za-z][\w-]* · [^·\n]+$/.test(line))
|
|
122
|
+
return true;
|
|
123
|
+
if (cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(line))
|
|
124
|
+
return true;
|
|
125
|
+
return /^\s*\d+\.\d+\.\d+\s*$/.test(line);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Whether the last transcript row — the first row above the composer's chrome —
|
|
129
|
+
* is the completion row. Only the LAST row counts: the completion row of an
|
|
130
|
+
* earlier turn stays on the pane behind the next turn and behind a dialog.
|
|
131
|
+
*/
|
|
132
|
+
function endsWithTurnComplete(frame) {
|
|
133
|
+
const lines = frame.contentLines;
|
|
134
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
135
|
+
if (isChromeRow(lines[i]))
|
|
136
|
+
continue;
|
|
137
|
+
return exports.OPENCODE_V2_TURN_COMPLETE_PATTERN.test(lines[i]);
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
exports.opencodeV2StatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
142
|
+
tool: 'opencode-v2',
|
|
143
|
+
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
144
|
+
// Issue #2991: every v2 dialog is recognised by `beforePrompt` below, so a
|
|
145
|
+
// numbered list that reaches the generic parser is text in a reply (the UAT
|
|
146
|
+
// frame: `❯ 1. Yes / 2. No` quoted in the answer). Unvouched by
|
|
147
|
+
// `detectDialog`, it is not published as `waiting` — which had left the
|
|
148
|
+
// session refusing every send with nothing on screen to answer.
|
|
149
|
+
requireVouchedPrompt: true,
|
|
150
|
+
// Issue #2965: the two dialogs, ahead of everything. Each is the agent
|
|
151
|
+
// blocked on a human whatever else is on the pane — the question frame keeps
|
|
152
|
+
// the previous turn's completion row above it — and ahead of the generic
|
|
153
|
+
// numbered-list parser too, because the question's `1. Red / 2. Blue` is
|
|
154
|
+
// driven by ↑↓ + Enter (hence `hasActivePrompt: false` and a reason from
|
|
155
|
+
// `SELECTION_LIST_REASONS`, which draws the arrow keys instead of offering to
|
|
156
|
+
// type a number). Issue #2984 measured that a typed digit also commits it,
|
|
157
|
+
// with no Enter — see `detectDialog` below.
|
|
158
|
+
beforePrompt(frame) {
|
|
159
|
+
if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
|
|
160
|
+
return {
|
|
161
|
+
status: 'waiting',
|
|
162
|
+
confidence: 'high',
|
|
163
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
|
|
164
|
+
hasActivePrompt: false,
|
|
165
|
+
evidence: 'positive',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines)) {
|
|
169
|
+
return {
|
|
170
|
+
status: 'waiting',
|
|
171
|
+
confidence: 'high',
|
|
172
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
|
|
173
|
+
hasActivePrompt: false,
|
|
174
|
+
evidence: 'positive',
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// Issue #2971: a dialog opened over the composer keeps the footer (and
|
|
178
|
+
// often the placeholder) on screen, so every rule below read it as `ready`
|
|
179
|
+
// and `wait` completed a turn that never started. Its title row sits ~150
|
|
180
|
+
// rows above the bottom of an 80x200 pane, outside `lastLines`, so the
|
|
181
|
+
// whole frame is read. The reason is v1's (#2112): the same kind of
|
|
182
|
+
// overlay, driven by ↑↓ + Enter and closed with `esc` — no number answers
|
|
183
|
+
// it, hence `hasActivePrompt: false`.
|
|
184
|
+
if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
|
|
185
|
+
return {
|
|
186
|
+
status: 'waiting',
|
|
187
|
+
confidence: 'high',
|
|
188
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
|
|
189
|
+
hasActivePrompt: false,
|
|
190
|
+
evidence: 'positive',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
},
|
|
195
|
+
afterThinking(frame) {
|
|
196
|
+
if ((0, cli_patterns_1.detectThinking)('opencode-v2', frame.lastLines)) {
|
|
197
|
+
return {
|
|
198
|
+
status: 'running',
|
|
199
|
+
confidence: 'high',
|
|
200
|
+
reason: status_reason_1.STATUS_REASON.THINKING_INDICATOR,
|
|
201
|
+
hasActivePrompt: false,
|
|
202
|
+
evidence: 'positive',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Issue #2965: the completion row as the last transcript row, with no
|
|
206
|
+
// `esc interrupt` (ruled out just above) — a finished turn, whether or not
|
|
207
|
+
// the footer made it into the capture.
|
|
208
|
+
if (endsWithTurnComplete(frame)) {
|
|
209
|
+
return {
|
|
210
|
+
status: 'ready',
|
|
211
|
+
confidence: 'high',
|
|
212
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
|
|
213
|
+
hasActivePrompt: false,
|
|
214
|
+
evidence: 'positive',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// The placeholder against the ANSI-stripped frame with its box drawing
|
|
218
|
+
// intact (the pattern anchors on the `┃` gutter). The footer is on every
|
|
219
|
+
// frame, and the running hint was ruled out just above.
|
|
220
|
+
if (cli_patterns_1.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test((0, cli_patterns_1.stripAnsi)(frame.raw)) ||
|
|
221
|
+
cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(frame.lastLines)) {
|
|
222
|
+
return {
|
|
223
|
+
status: 'ready',
|
|
224
|
+
confidence: 'high',
|
|
225
|
+
reason: status_reason_1.STATUS_REASON.INPUT_PROMPT,
|
|
226
|
+
hasActivePrompt: false,
|
|
227
|
+
evidence: 'positive',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
},
|
|
232
|
+
// Issue #2984: the seam the Auto-Yes gate and `respond` read. The same three
|
|
233
|
+
// rules `beforePrompt` reports `waiting` on, in the same order, so the gate
|
|
234
|
+
// and the status API agree about which frames carry a dialog.
|
|
235
|
+
//
|
|
236
|
+
// The strip and the question form are anchored on the composer's `┃` gutter,
|
|
237
|
+
// which `stripBoxDrawing` removes: on the spelling the Auto-Yes poller judges
|
|
238
|
+
// they answer `null` (v1's #1893 precedent). For Auto-Yes `null` and `keys`
|
|
239
|
+
// both send nothing, and the question form never reaches the gate anyway —
|
|
240
|
+
// it draws no `❯` for the generic parser to key on.
|
|
241
|
+
detectDialog(frame) {
|
|
242
|
+
if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
|
|
243
|
+
return { kind: 'permission', options: exports.OPENCODE_V2_PERMISSION_OPTIONS, answerMode: 'keys' };
|
|
244
|
+
}
|
|
245
|
+
const question = readQuestionDialog(frame);
|
|
246
|
+
if (question !== null)
|
|
247
|
+
return question;
|
|
248
|
+
if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
|
|
249
|
+
return { kind: 'picker', options: [], answerMode: 'keys' };
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
},
|
|
253
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode V2's dialog title row — a pure, dependency-free leaf (Issue #2983).
|
|
4
|
+
*
|
|
5
|
+
* Moved out of `cli-patterns.ts` (which re-exports both names) so a client
|
|
6
|
+
* component can read the same row the detector reads without pulling the
|
|
7
|
+
* logger and the tool registry into the browser bundle: the chat surface's
|
|
8
|
+
* dialog card draws v2's model keys only while one of these dialogs is open,
|
|
9
|
+
* because each of those keys closes the dialog with `Escape` before it is sent.
|
|
10
|
+
*
|
|
11
|
+
* @module lib/detection/tools/opencode-v2/dialog-title
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = void 0;
|
|
15
|
+
exports.findOpencodeV2DialogTitle = findOpencodeV2DialogTitle;
|
|
16
|
+
/**
|
|
17
|
+
* The title row of an OpenCode V2 dialog opened over the composer: the model
|
|
18
|
+
* picker (`ctrl+x m`), the variant picker it opens next, the Commands palette
|
|
19
|
+
* (`ctrl+p`), Sessions (`ctrl+x l`) and Select agent (`ctrl+x a`) — Issue #2971.
|
|
20
|
+
*
|
|
21
|
+
* Measured on 2.0.18 at 80x200 (2026-09-29,
|
|
22
|
+
* `tests/fixtures/opencode-v2-live-2971/`): every one of them opens with a row
|
|
23
|
+
* ` <Title> esc`, the dismiss hint
|
|
24
|
+
* right-aligned after a wide gap, with no `┃` gutter in front. The row BELOW it
|
|
25
|
+
* is the filter (`Search`, or whatever was typed into it) and changes; the
|
|
26
|
+
* title row does not. The footer (`… ctrl+p commands`) stays drawn under every
|
|
27
|
+
* one of them, which is why the footer alone cannot say the composer is free.
|
|
28
|
+
*
|
|
29
|
+
* Not matched: the running footer (`esc interrupt ctrl+p commands`, `esc` not
|
|
30
|
+
* last) and the question form's `┃ ↑↓ select enter submit esc dismiss`
|
|
31
|
+
* (gutter, `esc` not last). Match against the ANSI-stripped frame; the title
|
|
32
|
+
* sits far above the 15-line status window (row 52 of 200), so pass the whole
|
|
33
|
+
* capture.
|
|
34
|
+
*/
|
|
35
|
+
exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = /^[^\S\n]*[^\s\u2502\u2503\u2579\u2580][^\n]*?[^\S\n]{8,}esc[^\S\n]*$/m;
|
|
36
|
+
/**
|
|
37
|
+
* The title of the OpenCode V2 dialog open on the pane (`Select variant`), or
|
|
38
|
+
* `null` when none is (Issue #2971). A send must not type while one is open:
|
|
39
|
+
* the text lands in the dialog's filter, not in the composer.
|
|
40
|
+
*
|
|
41
|
+
* @param text - ANSI-stripped capture of the whole pane
|
|
42
|
+
*/
|
|
43
|
+
function findOpencodeV2DialogTitle(text) {
|
|
44
|
+
const match = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN.exec(text);
|
|
45
|
+
if (match === null)
|
|
46
|
+
return null;
|
|
47
|
+
return match[0].trim().replace(/\s+esc$/, '');
|
|
48
|
+
}
|
|
@@ -18,6 +18,7 @@ const detect_3 = require("./codex/detect");
|
|
|
18
18
|
const detect_4 = require("./command-code/detect");
|
|
19
19
|
const detect_5 = require("./copilot/detect");
|
|
20
20
|
const detect_6 = require("./opencode/detect");
|
|
21
|
+
const detect_7 = require("./opencode-v2/detect");
|
|
21
22
|
const run_detection_1 = require("./run-detection");
|
|
22
23
|
const verified_against_1 = require("./verified-against");
|
|
23
24
|
/**
|
|
@@ -43,6 +44,7 @@ const DETECTORS = {
|
|
|
43
44
|
opencode: detect_6.opencodeStatusDetector,
|
|
44
45
|
antigravity: detect_1.antigravityStatusDetector,
|
|
45
46
|
'command-code': detect_4.commandCodeStatusDetector,
|
|
47
|
+
'opencode-v2': detect_7.opencodeV2StatusDetector,
|
|
46
48
|
gemini: geminiStatusDetector,
|
|
47
49
|
'vibe-local': vibeLocalStatusDetector,
|
|
48
50
|
};
|
|
@@ -99,6 +99,15 @@ function runToolDetection(spec, frame, context = {}) {
|
|
|
99
99
|
// and let the chain continue to the tool's running/idle branches.
|
|
100
100
|
promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
|
|
101
101
|
}
|
|
102
|
+
else if (spec.requireVouchedPrompt && context.isPromptVouched?.(promptDetection) === false) {
|
|
103
|
+
// Issue #2991: a numbered list the tool's own dialog rules do not vouch
|
|
104
|
+
// for — the agent's reply quoting `❯ 1. Yes / 2. No`. Auto-Yes (#2984)
|
|
105
|
+
// and History (#2457) already refuse it; publishing `waiting` for it
|
|
106
|
+
// left the session unanswerable (no dialog to answer) and unwritable (the
|
|
107
|
+
// send guard refused every message). Neutralised the same way as the
|
|
108
|
+
// stale block above, so the tool's own branches decide the status.
|
|
109
|
+
promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
|
|
110
|
+
}
|
|
102
111
|
else {
|
|
103
112
|
return {
|
|
104
113
|
status: 'waiting',
|