commandmate 0.44.2 → 0.44.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +149 -149
- package/.next/app-path-routes-manifest.json +21 -21
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/react-loadable-manifest.json +0 -6
- 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.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.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.js +2 -2
- 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.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.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.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +2 -2
- 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_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.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.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_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.js +2 -2
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- 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.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_client-reference-manifest.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.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_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_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_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_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_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.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_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.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.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_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 -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 +3 -3
- 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 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_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.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +21 -21
- package/.next/server/chunks/1191.js +2 -2
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +2 -0
- package/.next/server/chunks/1789.js +1 -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/2460.js +1 -1
- package/.next/server/chunks/2710.js +1 -1
- package/.next/server/chunks/2908.js +1 -1
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +1 -1
- package/.next/server/chunks/3718.js +1 -1
- package/.next/server/chunks/4207.js +2 -2
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/4672.js +5 -0
- package/.next/server/chunks/{9353.js → 4718.js} +2 -2
- package/.next/server/chunks/4837.js +14 -0
- package/.next/server/chunks/5048.js +1 -1
- package/.next/server/chunks/5209.js +1 -0
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5625.js +25 -0
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +3 -3
- package/.next/server/chunks/7491.js +2 -2
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -1
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +7 -7
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +2 -2
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +6 -6
- package/.next/server/chunks/9731.js +3 -3
- 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/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
- package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-06d35bb1aa02de80.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
- package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
- package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-0d1750b833f5cc3e.js} +1 -1
- package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/static/css/057f64a65726c439.css +1 -0
- package/.next/trace +13 -13
- package/dist/cli/commands/ask.d.ts.map +1 -1
- package/dist/cli/commands/ask.js +120 -119
- package/dist/cli/commands/attach.d.ts +94 -0
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +145 -7
- package/dist/cli/commands/auto-yes.js +1 -1
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +3 -5
- package/dist/cli/commands/command-target.d.ts +23 -0
- package/dist/cli/commands/command-target.d.ts.map +1 -0
- package/dist/cli/commands/command-target.js +25 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +41 -2
- package/dist/cli/commands/message-dispatch.d.ts +36 -0
- package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
- package/dist/cli/commands/message-dispatch.js +63 -0
- package/dist/cli/commands/reply.d.ts.map +1 -1
- package/dist/cli/commands/reply.js +2 -5
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +3 -6
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +149 -146
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +589 -431
- package/dist/cli/types/api-responses.d.ts +159 -27
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/api-responses.js +4 -2
- package/dist/cli/utils/api-client.d.ts +25 -5
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +87 -55
- package/dist/cli/utils/server-url.d.ts +1 -0
- package/dist/cli/utils/server-url.d.ts.map +1 -1
- package/dist/cli/utils/server-url.js +7 -0
- package/dist/config/uat-isolation.d.ts +140 -0
- package/dist/config/uat-isolation.d.ts.map +1 -0
- package/dist/config/uat-isolation.js +246 -0
- package/dist/lib/global-state.d.ts +12 -0
- package/dist/lib/global-state.d.ts.map +1 -0
- package/dist/lib/global-state.js +16 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
- package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/lib/session/prompt-view.d.ts +26 -3
- package/dist/lib/session/prompt-view.d.ts.map +1 -1
- package/dist/lib/session/prompt-view.js +26 -3
- package/dist/lib/session/status-evidence-type.d.ts +16 -0
- package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
- package/dist/lib/session/status-evidence-type.js +2 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
- package/dist/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/locales/en/worktree.json +3 -1
- package/dist/server/locales/ja/worktree.json +3 -1
- package/dist/server/src/cli/types/api-responses.js +4 -2
- package/dist/server/src/config/cli-tool-timing-config.js +1 -6
- package/dist/server/src/config/uat-isolation.js +246 -0
- package/dist/server/src/lib/assistant-response-saver.js +62 -3
- package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
- package/dist/server/src/lib/auto-yes-poller.js +450 -160
- package/dist/server/src/lib/auto-yes-state.js +2 -2
- package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
- package/dist/server/src/lib/cli-tools/base.js +151 -0
- package/dist/server/src/lib/cli-tools/codex.js +44 -80
- package/dist/server/src/lib/cli-tools/command-code.js +24 -56
- package/dist/server/src/lib/cli-tools/copilot.js +25 -67
- package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
- package/dist/server/src/lib/cli-tools/gemini.js +23 -73
- package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
- package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
- package/dist/server/src/lib/cli-tools/opencode.js +21 -85
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
- package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
- package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
- package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
- package/dist/server/src/lib/detection/prompt-detector.js +2 -35
- package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
- package/dist/server/src/lib/detection/selection-shape.js +32 -520
- package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
- package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
- package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
- package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
- package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
- package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
- package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
- package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
- package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
- package/dist/server/src/lib/detection/tools/context-above.js +20 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
- package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
- package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
- package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
- package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
- package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
- package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
- package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
- package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
- package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
- package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
- package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
- package/dist/server/src/lib/global-state.js +16 -0
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
- package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
- package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
- package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
- package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
- package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
- package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
- package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
- package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
- package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
- package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
- package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
- package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
- package/dist/server/src/lib/hooks/sources/registry.js +3 -2
- package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
- package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
- package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
- package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
- package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
- package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
- package/dist/server/src/lib/polling/response-checker.js +641 -1142
- package/dist/server/src/lib/polling/response-dedup.js +3 -4
- package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
- package/dist/server/src/lib/polling/response-poller-core.js +54 -20
- package/dist/server/src/lib/polling/startup-screen.js +142 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
- package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
- package/dist/server/src/lib/prompt-answer-sender.js +5 -4
- package/dist/server/src/lib/push/failure-episode-state.js +2 -2
- package/dist/server/src/lib/push/notification-dedup.js +3 -4
- package/dist/server/src/lib/push/prompt-card-state.js +2 -2
- package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
- package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
- package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
- package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -2
- package/dist/server/src/lib/relay/relay-readiness.js +38 -1
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +16 -0
- package/dist/server/src/lib/schedule-manager.js +8 -10
- package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
- package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
- package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
- package/dist/server/src/lib/session/agent-event-model.js +562 -0
- package/dist/server/src/lib/session/agent-event-record.js +10 -0
- package/dist/server/src/lib/session/agent-event-state.js +106 -1854
- package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
- package/dist/server/src/lib/session/agent-event-turn.js +811 -0
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
- package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
- package/dist/server/src/lib/session/claude-executor.js +45 -5
- package/dist/server/src/lib/session/claude-session.js +21 -65
- package/dist/server/src/lib/session/cli-session.js +17 -0
- package/dist/server/src/lib/session/current-output-builder.js +450 -1103
- package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
- package/dist/server/src/lib/session/current-output-types.js +9 -0
- package/dist/server/src/lib/session/detection-divergence.js +55 -0
- package/dist/server/src/lib/session/global-session-constants.js +2 -13
- package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
- package/dist/server/src/lib/session/layer-disagreement.js +2 -2
- package/dist/server/src/lib/session/opencode-session-store.js +2 -1
- package/dist/server/src/lib/session/prompt-view.js +26 -3
- package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
- package/dist/server/src/lib/session/provisional-turn.js +3 -1
- package/dist/server/src/lib/session/send-user-message.js +1 -1
- package/dist/server/src/lib/session/session-starting-state.js +4 -6
- package/dist/server/src/lib/session/status-evidence-type.js +2 -0
- package/dist/server/src/lib/session/status-evidence.js +2 -2
- package/dist/server/src/lib/session/structured-status-merge.js +335 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
- package/dist/server/src/lib/session-cleanup.js +1 -5
- package/dist/server/src/lib/skills/install-plan.js +2 -1
- package/dist/server/src/lib/skills/snapshot-store.js +2 -2
- package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
- package/dist/server/src/lib/timer-manager.js +6 -8
- package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
- package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
- package/dist/server/src/lib/tmux/session-hooks.js +2 -1
- package/dist/server/src/lib/tmux/session-status-options.js +3 -3
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
- package/dist/server/src/lib/tmux/tmux.js +33 -59
- package/dist/server/src/lib/tui-accumulator.js +2 -2
- package/dist/server/src/lib/version-checker.js +6 -6
- package/dist/server/src/lib/ws-server.js +47 -11
- package/docs/en/user-guide/webapp-guide.md +27 -3
- package/package.json +1 -1
- package/release-notes/0.44.3.json +82 -0
- package/scripts/hooks/cmate-agent-event.sh +18 -0
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/4372.js +0 -5
- package/.next/server/chunks/6474.js +0 -14
- package/.next/server/chunks/967.js +0 -1
- package/.next/server/chunks/9798.js +0 -2
- package/.next/server/chunks/9882.js +0 -25
- package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
- package/.next/static/css/38070d879efa1371.css +0 -1
- package/dist/server/src/lib/cli-tools/index.js +0 -41
- package/dist/server/src/lib/polling/global-session-poller.js +0 -140
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
- /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gemini pattern constants moved out of `../../cli-patterns.ts`
|
|
4
|
+
* (Issue #3217). `cli-patterns.ts` re-exports every public name.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Gemini interactive REPL prompt pattern
|
|
10
|
+
* Gemini CLI shows a `>` or `❯` prompt when waiting for user input in interactive mode.
|
|
11
|
+
*
|
|
12
|
+
* Two branches (Issue #386):
|
|
13
|
+
* - Branch 1: `^[>❯]\s*$` -- bare prompt character (empty input line)
|
|
14
|
+
* - Branch 2: `^\s*[>❯]\s+Type your message.*$` -- new-format prompt with placeholder text
|
|
15
|
+
* (e.g., " > Type your message or @path/to/file"). Leading whitespace is allowed
|
|
16
|
+
* because tmux capture-pane output may include padding.
|
|
17
|
+
*
|
|
18
|
+
* Branch 2 requires "Type your message" after the indicator to avoid false positives
|
|
19
|
+
* on quoted response lines (e.g., "> some quoted text").
|
|
20
|
+
*
|
|
21
|
+
* @see CLAUDE_PROMPT_PATTERN for similar dual-format matching approach
|
|
22
|
+
*/
|
|
23
|
+
// [S4-5] /g flag prohibited: would make test() stateful
|
|
24
|
+
exports.GEMINI_PROMPT_PATTERN = /^[>❯]\s*$|^\s*[>❯]\s+Type your message.*$/m;
|
|
25
|
+
/**
|
|
26
|
+
* Gemini thinking/processing pattern
|
|
27
|
+
* Gemini CLI shows braille spinner characters and status text while processing.
|
|
28
|
+
*/
|
|
29
|
+
exports.GEMINI_THINKING_PATTERN = /[\u2800-\u28FF]|Thinking\.\.\./;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* `normalizeFrame` reads it, and the detector modules import `normalizeFrame`,
|
|
7
7
|
* so going through `registry.ts` would close an import cycle. Each detector
|
|
8
8
|
* declares the same object as its `ToolDetectorSpec.liveRegion`, and
|
|
9
|
-
* `
|
|
9
|
+
* `live-region-markers.test.ts` holds the two to identity.
|
|
10
10
|
*
|
|
11
11
|
* `gemini` and `vibe-local` have no measured frames and no declaration: their
|
|
12
12
|
* frames carry the whole-frame region, which is the pre-#3183 reading.
|
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
11
11
|
exports.opencodeStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
12
12
|
exports.readIdleEvidence = readIdleEvidence;
|
|
13
13
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
14
|
+
const verdicts_1 = require("../verdicts");
|
|
14
15
|
const status_reason_1 = require("../../status-reason");
|
|
15
16
|
const opencode_modal_overlay_1 = require("../../opencode-modal-overlay");
|
|
16
17
|
const prompt_1 = require("./prompt");
|
|
@@ -126,23 +127,11 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
126
127
|
// `wait` still stops for it (`isSelectionListActive` → exit 10) and the UI
|
|
127
128
|
// renders NavigationButtons, which send exactly the keys the strip takes.
|
|
128
129
|
if (cli_patterns_1.OPENCODE_PERMISSION_PATTERN.test(frame.lastLines)) {
|
|
129
|
-
return
|
|
130
|
-
status: 'waiting',
|
|
131
|
-
confidence: 'high',
|
|
132
|
-
reason: status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
|
|
133
|
-
hasActivePrompt: false,
|
|
134
|
-
evidence: 'positive',
|
|
135
|
-
};
|
|
130
|
+
return (0, verdicts_1.positiveVerdict)('waiting', status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT);
|
|
136
131
|
}
|
|
137
132
|
// A. Check footer for processing indicator ("esc interrupt" replaces "ctrl+t variants..." during processing)
|
|
138
133
|
if (cli_patterns_1.OPENCODE_PROCESSING_INDICATOR.test(frame.lastLines)) {
|
|
139
|
-
return
|
|
140
|
-
status: 'running',
|
|
141
|
-
confidence: 'high',
|
|
142
|
-
reason: status_reason_1.STATUS_REASON.OPENCODE_PROCESSING_INDICATOR,
|
|
143
|
-
hasActivePrompt: false,
|
|
144
|
-
evidence: 'positive',
|
|
145
|
-
};
|
|
134
|
+
return (0, verdicts_1.positiveVerdict)('running', status_reason_1.STATUS_REASON.OPENCODE_PROCESSING_INDICATOR);
|
|
146
135
|
}
|
|
147
136
|
const { candidates, lastIndex } = findContentEnd(frame);
|
|
148
137
|
if (lastIndex < 0)
|
|
@@ -152,13 +141,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
152
141
|
.slice(Math.max(0, lastIndex - thinking_constants_1.THINKING_TAIL_LINE_COUNT + 1), lastIndex + 1)
|
|
153
142
|
.join('\n');
|
|
154
143
|
if ((0, cli_patterns_1.detectThinking)('opencode', contentThinkingWindow)) {
|
|
155
|
-
return
|
|
156
|
-
status: 'running',
|
|
157
|
-
confidence: 'high',
|
|
158
|
-
reason: status_reason_1.STATUS_REASON.THINKING_INDICATOR,
|
|
159
|
-
hasActivePrompt: false,
|
|
160
|
-
evidence: 'positive',
|
|
161
|
-
};
|
|
144
|
+
return (0, verdicts_1.positiveVerdict)('running', status_reason_1.STATUS_REASON.THINKING_INDICATOR);
|
|
162
145
|
}
|
|
163
146
|
// C. Check content area for selection list (Issue #473: fuzzy-search list detection)
|
|
164
147
|
// Selection list header ("Select model"/"Select provider") may be far above the
|
|
@@ -167,13 +150,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
167
150
|
.slice(Math.max(0, lastIndex - frame_1.STATUS_CHECK_LINE_COUNT + 1), lastIndex + 1)
|
|
168
151
|
.join('\n');
|
|
169
152
|
if (cli_patterns_1.OPENCODE_SELECTION_LIST_PATTERN.test(candidates.join('\n'))) {
|
|
170
|
-
return
|
|
171
|
-
status: 'waiting',
|
|
172
|
-
confidence: 'high',
|
|
173
|
-
reason: status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
|
|
174
|
-
hasActivePrompt: false,
|
|
175
|
-
evidence: 'positive',
|
|
176
|
-
};
|
|
153
|
+
return (0, verdicts_1.positiveVerdict)('waiting', status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST);
|
|
177
154
|
}
|
|
178
155
|
// C2. A modal overlay painted over the transcript (Issue #2112).
|
|
179
156
|
//
|
|
@@ -208,13 +185,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
208
185
|
// production caller of `detectSessionStatus` passes the `capture-pane -e`
|
|
209
186
|
// bytes (`lib/tmux/tmux.ts` always passes `-e`).
|
|
210
187
|
if ((0, opencode_modal_overlay_1.detectOpenCodeModalOverlay)(frame.raw) !== null) {
|
|
211
|
-
return
|
|
212
|
-
status: 'waiting',
|
|
213
|
-
confidence: 'high',
|
|
214
|
-
reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
|
|
215
|
-
hasActivePrompt: false,
|
|
216
|
-
evidence: 'positive',
|
|
217
|
-
};
|
|
188
|
+
return (0, verdicts_1.positiveVerdict)('waiting', status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY);
|
|
218
189
|
}
|
|
219
190
|
// D. Check last few content lines for the finished-turn marker.
|
|
220
191
|
//
|
|
@@ -227,13 +198,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
227
198
|
// through to the heuristics rather than claiming a completion that never
|
|
228
199
|
// happened, which is what design rule D1 asks for.
|
|
229
200
|
if (cli_patterns_1.OPENCODE_TURN_COMPLETE_PATTERN.test(contentCheckWindow)) {
|
|
230
|
-
return
|
|
231
|
-
status: 'ready',
|
|
232
|
-
confidence: 'high',
|
|
233
|
-
reason: status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
|
|
234
|
-
hasActivePrompt: false,
|
|
235
|
-
evidence: 'positive',
|
|
236
|
-
};
|
|
201
|
+
return (0, verdicts_1.positiveVerdict)('ready', status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE);
|
|
237
202
|
}
|
|
238
203
|
// E. Idle composer (Issue #473 found the row; Issue #1883 made it positive).
|
|
239
204
|
//
|
|
@@ -257,13 +222,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
257
222
|
.slice(Math.max(0, lastIndex - frame_1.STATUS_CHECK_LINE_COUNT + 1), lastIndex + 1)
|
|
258
223
|
.join('\n');
|
|
259
224
|
if (cli_patterns_1.OPENCODE_IDLE_COMPOSER_PATTERN.test(composerWindow)) {
|
|
260
|
-
return
|
|
261
|
-
status: 'ready',
|
|
262
|
-
confidence: 'high',
|
|
263
|
-
reason: status_reason_1.STATUS_REASON.INPUT_PROMPT,
|
|
264
|
-
hasActivePrompt: false,
|
|
265
|
-
evidence: 'positive',
|
|
266
|
-
};
|
|
225
|
+
return (0, verdicts_1.positiveVerdict)('ready', status_reason_1.STATUS_REASON.INPUT_PROMPT);
|
|
267
226
|
}
|
|
268
227
|
return null;
|
|
269
228
|
},
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenCode pattern constants and helpers moved out of `../../cli-patterns.ts`
|
|
4
|
+
* (Issue #3217 I-3). `cli-patterns.ts` re-exports every public name.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_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 = void 0;
|
|
8
|
+
exports.findOpenCodeChromeStart = findOpenCodeChromeStart;
|
|
9
|
+
exports.findOpenCodeUserEchoEnd = findOpenCodeUserEchoEnd;
|
|
10
|
+
exports.findOpenCodeComposerRows = findOpenCodeComposerRows;
|
|
11
|
+
exports.stripOpenCodeGutter = stripOpenCodeGutter;
|
|
12
|
+
const pasted_text_1 = require("../../shared/pasted-text");
|
|
13
|
+
/**
|
|
14
|
+
* OpenCode prompt pattern (Issue #379)
|
|
15
|
+
* OpenCode TUI shows "Ask anything..." in the input area when waiting for user input.
|
|
16
|
+
* Unlike Claude/Codex (which use > or ❯), OpenCode uses a text-based prompt indicator.
|
|
17
|
+
*/
|
|
18
|
+
exports.OPENCODE_PROMPT_PATTERN = /Ask anything(?:\.\.\.|\u2026)/;
|
|
19
|
+
/**
|
|
20
|
+
* OpenCode idle composer pattern (Issue #1883).
|
|
21
|
+
*
|
|
22
|
+
* The `Ask anything...` placeholder as opencode actually draws it: **inside the
|
|
23
|
+
* input box**, behind the box's own gutter (`\u2503`, or `\u2502` on a lighter
|
|
24
|
+
* border style). Two measured facts make that row positive evidence that the
|
|
25
|
+
* composer is empty, rather than the mere absence of a busy marker (design
|
|
26
|
+
* principle D1 in `docs/design/multi-agent-state-architecture.md`):
|
|
27
|
+
*
|
|
28
|
+
* - opencode paints the placeholder **only while the input buffer is empty**.
|
|
29
|
+
* The first typed character replaces the whole row — measured live on
|
|
30
|
+
* opencode 1.18.20, pane 80x200 (`opencode-live-1883/composer-residual.txt`
|
|
31
|
+
* holds `\u2503 echo PREFILLED` where the idle frame holds the placeholder).
|
|
32
|
+
* - the gutter says the row belongs to the input box. `Ask anything...` printed
|
|
33
|
+
* in a response body has no gutter, and reading that as an idle composer is
|
|
34
|
+
* the "the phrase is on screen somewhere" inference D1 forbids.
|
|
35
|
+
*
|
|
36
|
+
* **Match this against the ANSI-stripped frame BEFORE {@link stripBoxDrawing}**,
|
|
37
|
+
* which strips the very gutter this pattern anchors on.
|
|
38
|
+
*
|
|
39
|
+
* The whitespace runs are `[^\S\n]` (horizontal only) on purpose: plain `\s`
|
|
40
|
+
* crosses newlines under the `m` flag, which let the gutter of one row pair up
|
|
41
|
+
* with the phrase several rows below it and matched frames that hold no
|
|
42
|
+
* composer at all (measured on `phrase-in-response.txt`).
|
|
43
|
+
*
|
|
44
|
+
* {@link OPENCODE_PROMPT_PATTERN} stays as it is: `response-checker` and
|
|
45
|
+
* `OPENCODE_SKIP_PATTERNS` want the bare phrase wherever it lands, because they
|
|
46
|
+
* are deleting the row from an extracted response, not judging a session.
|
|
47
|
+
*
|
|
48
|
+
* opencode 1.18.31 以降は見本文を U+2026(`…`)で描く。ASCII の `...` も実行ファイルに
|
|
49
|
+
* 残っているので両方を受け付ける(Issue #2915、2026-09-28 に実行ファイルから確認)。
|
|
50
|
+
*/
|
|
51
|
+
exports.OPENCODE_IDLE_COMPOSER_PATTERN = /^[^\S\n]*[\u2502\u2503][^\S\n]*Ask anything(?:\.\.\.|\u2026)/m;
|
|
52
|
+
/**
|
|
53
|
+
* OpenCode prompt pattern after response completion (Issue #379)
|
|
54
|
+
* Shows "tab agents ctrl+p commands" in the TUI status bar after a response finishes.
|
|
55
|
+
* Used as extraction stop condition in response-poller.ts [D2-003].
|
|
56
|
+
*/
|
|
57
|
+
exports.OPENCODE_PROMPT_AFTER_RESPONSE = /tab agents\s+ctrl\+p commands/;
|
|
58
|
+
/**
|
|
59
|
+
* OpenCode thinking/processing pattern (Issue #379)
|
|
60
|
+
* OpenCode TUI shows "Thinking:" prefix while the Ollama model is generating a response.
|
|
61
|
+
* Used by detectThinking() to determine if the tool is actively processing.
|
|
62
|
+
*/
|
|
63
|
+
exports.OPENCODE_THINKING_PATTERN = /Thinking:/;
|
|
64
|
+
/**
|
|
65
|
+
* OpenCode loading indicator pattern (Issue #379)
|
|
66
|
+
* Shows a series of 4+ filled square characters (U+2B1D) during initial loading/model warm-up.
|
|
67
|
+
* Filtered from response extraction via OPENCODE_SKIP_PATTERNS.
|
|
68
|
+
*/
|
|
69
|
+
exports.OPENCODE_LOADING_PATTERN = /\u2B1D{4,}/;
|
|
70
|
+
/**
|
|
71
|
+
* OpenCode's Build summary LINE, in either of the two forms it is drawn in
|
|
72
|
+
* (Issue #379, corrected by Issue #1893).
|
|
73
|
+
*
|
|
74
|
+
* **This is a line filter, not completion evidence.** It matches
|
|
75
|
+
* `▣ <Action> · <model>` with the duration OPTIONAL, and opencode 1.18 draws
|
|
76
|
+
* that duration-less form on a step that is still in flight -- so a frame this
|
|
77
|
+
* pattern matches may be mid-turn, waiting on a permission dialog, or aborted.
|
|
78
|
+
* Use {@link OPENCODE_TURN_COMPLETE_PATTERN} to decide that a turn has finished.
|
|
79
|
+
*
|
|
80
|
+
* The docstring that stood here until #1893 claimed the opposite ("short
|
|
81
|
+
* responses may omit the timing portion"). Measured against opencode 1.18.21 at
|
|
82
|
+
* the production 80x200 geometry, that is wrong in both directions:
|
|
83
|
+
*
|
|
84
|
+
* - a 2.3-second answer still carries its duration
|
|
85
|
+
* (`▣ Build · GPT-5.6 Luna · 2.3s`, `opencode-live-1893/turn-complete-short.txt`),
|
|
86
|
+
* so no completed turn needs the duration-less branch;
|
|
87
|
+
* - the duration-less form is what opencode leaves on screen while a tool call
|
|
88
|
+
* waits for permission and after a rejected one
|
|
89
|
+
* (`opencode-live-1893/permission-bash.txt`, `…/turn-aborted-no-duration.txt`).
|
|
90
|
+
*
|
|
91
|
+
* Kept loose because three callers want the LINE rather than the verdict:
|
|
92
|
+
* `tui-accumulator.ts`, `response-cleaner.ts` and `polling/response-checker.ts`
|
|
93
|
+
* all use it to drop the summary row from an extracted response, and the
|
|
94
|
+
* mid-step row has to be dropped too. #1911 removed the one caller that used it
|
|
95
|
+
* as a turn BOUNDARY rather than a line filter (the "second-to-last ▣" anchor,
|
|
96
|
+
* replaced by {@link findOpenCodeUserEchoEnd}); the name is left alone because
|
|
97
|
+
* the remaining three callers all want the line.
|
|
98
|
+
*/
|
|
99
|
+
exports.OPENCODE_RESPONSE_COMPLETE = /\u25A3\s+\w+\s+·\s+\S+(?:\s+·\s+(?:[\d]+h\s*)?(?:[\d]+m\s*)?[\d.]+s)?/;
|
|
100
|
+
/**
|
|
101
|
+
* OpenCode's finished-turn marker: the Build summary line WITH its duration
|
|
102
|
+
* (Issue #1893).
|
|
103
|
+
*
|
|
104
|
+
* `▣ Build · GPT-5.6 Luna · 5.2s`. This is the one tool-specific completion
|
|
105
|
+
* marker design rule D1 recognises today
|
|
106
|
+
* (`docs/design/multi-agent-state-architecture.md` §4 D1 decision 1, item 1),
|
|
107
|
+
* and the duration is the whole of what makes it positive evidence: opencode
|
|
108
|
+
* prints the same row without a duration while a step is still open, which is
|
|
109
|
+
* how a session parked on a permission dialog was published as
|
|
110
|
+
* `ready`/`opencode_response_complete` (#1893) and how `isOpenCodeComplete`
|
|
111
|
+
* saved the dialog body as if it were an answer.
|
|
112
|
+
*
|
|
113
|
+
* The model segment is `[^·\n]+` rather than `\S+` because real model names
|
|
114
|
+
* carry spaces (`GPT-5.6 Luna`): with `\S+` the optional-duration group of
|
|
115
|
+
* {@link OPENCODE_RESPONSE_COMPLETE} could never reach the duration on a
|
|
116
|
+
* two-word model, so "with duration" and "without duration" were the same match
|
|
117
|
+
* there. Excluding the middle dot rather than allowing anything keeps the
|
|
118
|
+
* quantifier unable to swallow its own delimiter (no nested/ambiguous
|
|
119
|
+
* quantifier -- ReDoS safe), and `.`/`[^·\n]` never cross a line without the
|
|
120
|
+
* `m` flag, so the duration has to be on the marker's own row.
|
|
121
|
+
*
|
|
122
|
+
* Durations observed: `2.3s`, `5.2s`, `45.2s`; the `Nh`/`Nm` prefixes are
|
|
123
|
+
* inherited from the #379 pattern and kept for long turns.
|
|
124
|
+
*/
|
|
125
|
+
exports.OPENCODE_TURN_COMPLETE_PATTERN = /\u25A3\s+\w+\s+·\s+[^·\n]+·\s+(?:\d+h\s*)?(?:\d+m\s*)?[\d.]+s/;
|
|
126
|
+
/**
|
|
127
|
+
* OpenCode's permission dialog, anchored on its button row (Issue #1893).
|
|
128
|
+
*
|
|
129
|
+
* opencode 1.18 asks for tool permission with a bottom-anchored box whose last
|
|
130
|
+
* interactive row is a horizontal button strip:
|
|
131
|
+
*
|
|
132
|
+
* ```
|
|
133
|
+
* ┃ △ Permission required
|
|
134
|
+
* ┃ # Shell command
|
|
135
|
+
* ┃ $ ls -la
|
|
136
|
+
* ┃ Allow once Allow always Reject ctrl+f fullscreen ⇆ select enter con
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* Nothing in the detection layer saw it before #1893: it carries no number, no
|
|
140
|
+
* `(y/n)`, and no "press enter to confirm" footer, so `detectPrompt` answers
|
|
141
|
+
* `isPrompt: false` and the status detector fell through to the Build marker
|
|
142
|
+
* above it. The row is matched as POSITIVE evidence that a decision is pending
|
|
143
|
+
* (design rule D1) -- it is the affordance itself, not the absence of a busy
|
|
144
|
+
* marker.
|
|
145
|
+
*
|
|
146
|
+
* **Match this against the ANSI-stripped frame BEFORE {@link stripBoxDrawing}**,
|
|
147
|
+
* exactly like {@link OPENCODE_IDLE_COMPOSER_PATTERN}: the leading `┃` (or
|
|
148
|
+
* `│` on a lighter border style) is what says the row belongs to the dialog box
|
|
149
|
+
* rather than to a response body that happens to quote the labels -- the
|
|
150
|
+
* "the phrase is on screen somewhere" inference #1883 had to remove.
|
|
151
|
+
*
|
|
152
|
+
* Deliberately NOT anchored on:
|
|
153
|
+
*
|
|
154
|
+
* - `enter confirm`, which is truncated to `enter con` at opencode's own 80
|
|
155
|
+
* column layout (measured);
|
|
156
|
+
* - `△ Permission required` alone, which is a heading rather than an
|
|
157
|
+
* affordance and survives in the fullscreen (`ctrl+f`) view whose key handling
|
|
158
|
+
* was not measured.
|
|
159
|
+
*
|
|
160
|
+
* The three labels are the same for the `bash` and the `edit` dialog (measured:
|
|
161
|
+
* `permission-bash.txt`, `permission-edit.txt`), and the strip is repainted away
|
|
162
|
+
* the moment the dialog is answered, so a matched row is never scrollback
|
|
163
|
+
* (`turn-aborted-no-duration.txt` holds no `Allow once`).
|
|
164
|
+
*
|
|
165
|
+
* The whitespace runs are `[^\S\n]` (horizontal only) for the reason #1883
|
|
166
|
+
* documents: plain `\s` crosses newlines under the `m` flag and would pair a
|
|
167
|
+
* gutter on one row with labels several rows below it.
|
|
168
|
+
*/
|
|
169
|
+
exports.OPENCODE_PERMISSION_PATTERN = /^[^\S\n]*[\u2502\u2503][^\S\n]*Allow once[^\S\n]+Allow always[^\S\n]+Reject\b/m;
|
|
170
|
+
/**
|
|
171
|
+
* OpenCode's busy footer, in BOTH of the spellings it is drawn in (Issue #379,
|
|
172
|
+
* widened by Issue #1894).
|
|
173
|
+
*
|
|
174
|
+
* opencode 1.18 needs Escape TWICE to abort a turn, and the first press does not
|
|
175
|
+
* abort anything -- it re-labels the footer:
|
|
176
|
+
*
|
|
177
|
+
* ```
|
|
178
|
+
* ⬝⬝⬝⬝⬝⬝⬝⬝ esc interrupt 6.5K (1%) · $0.00 ctrl+p commands
|
|
179
|
+
* ⬝■■■■■■⬝ esc again to interrupt 7.2K (1%) · $0.00 ctrl+p commands
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* Measured on opencode 1.18.21 at the production 80x200 geometry, sampling the
|
|
183
|
+
* footer every ~360 ms after a single Escape: the second spelling is up from
|
|
184
|
+
* 0.31 s to 4.71 s and the row is back to `esc interrupt` at 5.07 s -- a
|
|
185
|
+
* five-second window, exactly as long as the second-press deadline
|
|
186
|
+
* ({@link OPENCODE_INTERRUPT_SECOND_ESCAPE_DELAY_MS} is sized against it). The
|
|
187
|
+
* generation continues throughout; the turn ran to a natural
|
|
188
|
+
* `▣ Build · GPT-5.6 Luna · 11.3s`, 3 runs out of 3.
|
|
189
|
+
*
|
|
190
|
+
* Before #1894 those five seconds matched nothing at all: `detectSessionStatus`
|
|
191
|
+
* lost branch A and fell through to `running`/`default` while the frame was
|
|
192
|
+
* fresh, and to `ready`/`no_recent_output` once the poller's
|
|
193
|
+
* `lastOutputTimestamp` aged past `STALE_OUTPUT_THRESHOLD_MS` -- both of them
|
|
194
|
+
* `statusEvidence: 'none'`, i.e. a generating session
|
|
195
|
+
* published with no evidence and, on the second path, as FINISHED. That is the
|
|
196
|
+
* "vocabulary changed, so `ready` came back" failure design rule D1 names
|
|
197
|
+
* (`docs/design/multi-agent-state-architecture.md` §4 D1, row #1894), and the
|
|
198
|
+
* row is the same positive busy evidence in either spelling.
|
|
199
|
+
*
|
|
200
|
+
* The optional group is `(?:again to )?` rather than a looser `.*` on purpose:
|
|
201
|
+
* it matches the two measured strings and nothing between an `esc` and an
|
|
202
|
+
* `interrupt` several words apart. Linear, no nested quantifiers -- ReDoS safe.
|
|
203
|
+
*
|
|
204
|
+
* Filtered from response extraction via OPENCODE_SKIP_PATTERNS, which shares
|
|
205
|
+
* this constant: the widened row is dropped from a saved answer for the same
|
|
206
|
+
* reason the narrow one was.
|
|
207
|
+
*/
|
|
208
|
+
exports.OPENCODE_PROCESSING_INDICATOR = /esc (?:again to )?interrupt/;
|
|
209
|
+
/**
|
|
210
|
+
* OpenCode's composer bottom border: ` ╹▀▀▀▀▀▀…` (Issue #1911).
|
|
211
|
+
*
|
|
212
|
+
* `╹` (heavy up) is the corner opencode joins the input box's `┃`
|
|
213
|
+
* gutter to, and the `▀` run is the box's bottom edge. It is the one row of
|
|
214
|
+
* the bottom-anchored chrome that can never appear inside a response body, which
|
|
215
|
+
* makes it the anchor {@link findOpenCodeChromeStart} walks up from.
|
|
216
|
+
*/
|
|
217
|
+
exports.OPENCODE_COMPOSER_BOTTOM_BORDER = /^[^\S\n]*╹▀{4,}/;
|
|
218
|
+
/**
|
|
219
|
+
* A row that belongs to one of opencode's boxes, matched by its own gutter
|
|
220
|
+
* (Issue #1911).
|
|
221
|
+
*
|
|
222
|
+
* opencode draws three different boxes with the same `┃` gutter (`│`
|
|
223
|
+
* on a lighter border style): the echoed USER PROMPT in the transcript, the
|
|
224
|
+
* COMPOSER pinned to the bottom of the pane, and the PERMISSION DIALOG that
|
|
225
|
+
* replaces the composer. Which one a matched row belongs to is decided by where
|
|
226
|
+
* it sits, not by what it says — see {@link findOpenCodeChromeStart} and
|
|
227
|
+
* {@link findOpenCodeUserEchoEnd}.
|
|
228
|
+
*
|
|
229
|
+
* **Match against the ANSI-stripped frame BEFORE {@link stripBoxDrawing}**,
|
|
230
|
+
* which removes the very gutter this anchors on.
|
|
231
|
+
*/
|
|
232
|
+
exports.OPENCODE_GUTTER_ROW_PATTERN = /^[^\S\n]*[│┃]/;
|
|
233
|
+
/**
|
|
234
|
+
* An echoed user prompt row: a gutter row that carries text (Issue #1911).
|
|
235
|
+
*
|
|
236
|
+
* The echo block opencode draws for a submitted message is a blank gutter row,
|
|
237
|
+
* one or more gutter rows holding the message, and another blank gutter row.
|
|
238
|
+
* This matches the middle ones.
|
|
239
|
+
*/
|
|
240
|
+
exports.OPENCODE_USER_ECHO_PATTERN = /^[^\S\n]*[│┃][^\S\n]*\S/;
|
|
241
|
+
/**
|
|
242
|
+
* The status cell of opencode's bottom footer (Issue #1911).
|
|
243
|
+
*
|
|
244
|
+
* Measured at the production 80x200 geometry the footer reads
|
|
245
|
+
* `<cwd> 6.4K (1%) · $ctrl+p` / `commands` while idle and
|
|
246
|
+
* `⬝⬝⬝⬝⬝⬝⬝⬝ esc interrupt 6.3K (1%) · $0.00 ctrl+p commands` while running:
|
|
247
|
+
* a context-usage cell followed by the cost sigil. Neither
|
|
248
|
+
* {@link OPENCODE_PROMPT_AFTER_RESPONSE} (`tab agents ctrl+p commands`, which
|
|
249
|
+
* opencode only prints on the FIRST idle frame, before any turn has run) nor
|
|
250
|
+
* {@link OPENCODE_PROCESSING_INDICATOR} covers the idle form, so this row used
|
|
251
|
+
* to be saved as part of the assistant's reply.
|
|
252
|
+
*
|
|
253
|
+
* This is a SECONDARY net. The cwd that shares the row wraps over up to three
|
|
254
|
+
* further rows that carry no signature at all, so the footer is removed
|
|
255
|
+
* structurally by {@link findOpenCodeChromeStart}; this pattern only catches the
|
|
256
|
+
* signed row when that boundary is not available (e.g. a caller holding a
|
|
257
|
+
* fragment rather than a whole pane).
|
|
258
|
+
*
|
|
259
|
+
* Linear, no nested quantifiers — ReDoS safe.
|
|
260
|
+
*/
|
|
261
|
+
exports.OPENCODE_FOOTER_STATUS_PATTERN = /\d+(?:\.\d+)?[KMGT]?\s+\(\d+%\)\s+·\s+\$/;
|
|
262
|
+
/**
|
|
263
|
+
* Locate the start of opencode's bottom-anchored chrome within a captured pane
|
|
264
|
+
* (Issue #1911).
|
|
265
|
+
*
|
|
266
|
+
* opencode runs in the alternate screen and reserves the last rows of the pane
|
|
267
|
+
* for chrome that is never transcript content:
|
|
268
|
+
*
|
|
269
|
+
* ```
|
|
270
|
+
* ┃ ← composer box (blank rows + model row),
|
|
271
|
+
* ┃ Build · GPT-5.6 Luna … or the permission dialog that replaces it
|
|
272
|
+
* ╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ← composer bottom border
|
|
273
|
+
* /private/tmp/…-share- 6.4K (1%) · $ctrl+p ← footer, cwd wrapped
|
|
274
|
+
* work-github-kewton-… commands over up to three rows
|
|
275
|
+
* ```
|
|
276
|
+
*
|
|
277
|
+
* Everything from the returned index down is chrome. This is the opencode twin
|
|
278
|
+
* of {@link findClaudeChromeStart} and exists for the same reason (#1289): the
|
|
279
|
+
* footer's cwd rows and the composer's model row were reaching saved responses,
|
|
280
|
+
* which is defect 1 of #1911.
|
|
281
|
+
*
|
|
282
|
+
* Found structurally rather than by matching footer text, because the footer's
|
|
283
|
+
* text is opencode's to change and two of its four rows (the cwd continuations)
|
|
284
|
+
* are an arbitrary filesystem path with no signature at all.
|
|
285
|
+
*
|
|
286
|
+
* @param lines - Captured pane lines, ANSI-stripped, box drawing intact.
|
|
287
|
+
* Trailing blank rows are tolerated.
|
|
288
|
+
* @returns Index of the first chrome row, or -1 when no chrome is recognisable.
|
|
289
|
+
*/
|
|
290
|
+
function findOpenCodeChromeStart(lines) {
|
|
291
|
+
let last = lines.length - 1;
|
|
292
|
+
while (last >= 0 && lines[last].trim() === '')
|
|
293
|
+
last--;
|
|
294
|
+
if (last < 0)
|
|
295
|
+
return -1;
|
|
296
|
+
const walkUpGutter = (from) => {
|
|
297
|
+
let top = from;
|
|
298
|
+
while (top - 1 >= 0 && exports.OPENCODE_GUTTER_ROW_PATTERN.test(lines[top - 1]))
|
|
299
|
+
top--;
|
|
300
|
+
return top;
|
|
301
|
+
};
|
|
302
|
+
// The composer's bottom border. Searched from the last row upwards over the
|
|
303
|
+
// WHOLE pane rather than over the few rows the footer occupies: on the boot
|
|
304
|
+
// screen opencode centres the composer under its banner (row ~99 of 200) while
|
|
305
|
+
// the footer stays pinned to the bottom, so a window sized for the footer
|
|
306
|
+
// misses the border entirely (measured, `opencode-live-1883/boot-idle.txt`).
|
|
307
|
+
for (let i = last; i >= 0; i--) {
|
|
308
|
+
if (exports.OPENCODE_COMPOSER_BOTTOM_BORDER.test(lines[i])) {
|
|
309
|
+
return walkUpGutter(i);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// No border: the permission dialog draws over the composer and its own box
|
|
313
|
+
// runs to the last row of the pane (measured, `opencode-live-1893/permission-*.txt`).
|
|
314
|
+
if (exports.OPENCODE_GUTTER_ROW_PATTERN.test(lines[last])) {
|
|
315
|
+
return walkUpGutter(last);
|
|
316
|
+
}
|
|
317
|
+
return -1;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Locate the last row of the NEWEST echoed user prompt in a captured pane
|
|
321
|
+
* (Issue #1911).
|
|
322
|
+
*
|
|
323
|
+
* The turn currently being answered starts on the row after this one, so it is
|
|
324
|
+
* both the extraction anchor (`resolveExtractionStartIndex`'s opencode branch)
|
|
325
|
+
* and the floor the finished-turn marker has to sit below before a frame counts
|
|
326
|
+
* as a completed turn (`isOpenCodeComplete`).
|
|
327
|
+
*
|
|
328
|
+
* Before #1911 the anchor was "the second-to-last `▣ Build` row", which has two
|
|
329
|
+
* measured failure modes: on the first turn of a session there is no second row,
|
|
330
|
+
* so extraction fell back to line 0 and saved the whole pane; and the row it
|
|
331
|
+
* anchors on belongs to the PREVIOUS turn, so the echoed prompt of the current
|
|
332
|
+
* one was always included in the reply.
|
|
333
|
+
*
|
|
334
|
+
* @param lines - Captured pane lines, ANSI-stripped, box drawing intact.
|
|
335
|
+
* @param chromeStart - Result of {@link findOpenCodeChromeStart}; the search
|
|
336
|
+
* stops above it so the composer's and the permission dialog's own gutter rows
|
|
337
|
+
* are never read as an echoed prompt. Pass -1 when no chrome was found.
|
|
338
|
+
* @returns Index of the echo block's last row, or -1 when no echo is on screen
|
|
339
|
+
* (a turn whose head has scrolled out of the alternate-screen pane).
|
|
340
|
+
*/
|
|
341
|
+
function findOpenCodeUserEchoEnd(lines, chromeStart) {
|
|
342
|
+
const limit = chromeStart >= 0 ? chromeStart : lines.length;
|
|
343
|
+
for (let i = limit - 1; i >= 0; i--) {
|
|
344
|
+
if (!exports.OPENCODE_USER_ECHO_PATTERN.test(lines[i]))
|
|
345
|
+
continue;
|
|
346
|
+
// The block's trailing blank gutter row(s) belong to the echo, not to the reply.
|
|
347
|
+
let end = i;
|
|
348
|
+
while (end + 1 < limit && exports.OPENCODE_GUTTER_ROW_PATTERN.test(lines[end + 1]))
|
|
349
|
+
end++;
|
|
350
|
+
return end;
|
|
351
|
+
}
|
|
352
|
+
return -1;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* The rows of opencode's composer that hold the INPUT BUFFER (Issue #1906).
|
|
356
|
+
*
|
|
357
|
+
* opencode has no prompt marker — no `>` / `❯` / `›` anywhere near its input —
|
|
358
|
+
* so "is the message still sitting in the composer?" cannot be asked the way it
|
|
359
|
+
* is asked of every other TUI. What opencode has instead is a box, and the box
|
|
360
|
+
* has a fixed shape, measured at the production 80x200 geometry across every
|
|
361
|
+
* frame in `opencode-live-1883/`, `opencode-live-1893/` and
|
|
362
|
+
* `opencode-live-1906/`:
|
|
363
|
+
*
|
|
364
|
+
* ```
|
|
365
|
+
* ┃ ← buffer rows: blank when empty,
|
|
366
|
+
* ┃ Review the send path. one row per (wrapped) line of the
|
|
367
|
+
* ┃ Check newline handling. typed message, or the
|
|
368
|
+
* ┃ Report findings. `Ask anything...` placeholder on a
|
|
369
|
+
* ┃ session that has not answered yet
|
|
370
|
+
* ┃ Build · GPT-5.6 Luna GitHub Copilot ← the agent/model row, ALWAYS last
|
|
371
|
+
* ╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ← the box's bottom border
|
|
372
|
+
* ```
|
|
373
|
+
*
|
|
374
|
+
* The agent/model row is what makes a naive "any guttered row with text" read
|
|
375
|
+
* wrong: it always carries text, so the composer would never look empty. It is
|
|
376
|
+
* identified structurally — the last gutter row before the border — rather than
|
|
377
|
+
* by matching `Build ·` or a model name, both of which are opencode's to change
|
|
378
|
+
* and neither of which is stable across agents (`Build`, `Plan`, a custom agent).
|
|
379
|
+
*
|
|
380
|
+
* Anchored on the border, not on the bottom of the pane, because opencode
|
|
381
|
+
* centres the whole box under its banner before the first turn (row ~100 of 200)
|
|
382
|
+
* and only pins it to the bottom afterwards — see {@link findOpenCodeChromeStart},
|
|
383
|
+
* whose upward walk this shares.
|
|
384
|
+
*
|
|
385
|
+
* Returns `null` when no composer is on screen at all. That is the permission
|
|
386
|
+
* dialog (it replaces the composer and draws no bottom border — measured,
|
|
387
|
+
* `opencode-live-1893/permission-*.txt`), a full-screen overlay, or a session
|
|
388
|
+
* still starting.
|
|
389
|
+
*
|
|
390
|
+
* @param lines - Captured pane lines, ANSI-stripped, box drawing intact. Must be
|
|
391
|
+
* the WHOLE pane: a tail window sized for the other tools does not contain the
|
|
392
|
+
* box on a pre-first-turn frame.
|
|
393
|
+
* @returns The buffer rows with their gutters intact, or `null` when the
|
|
394
|
+
* composer is not on screen. An empty array means a box with no buffer row,
|
|
395
|
+
* which no measured frame produces.
|
|
396
|
+
*/
|
|
397
|
+
function findOpenCodeComposerRows(lines) {
|
|
398
|
+
let border = -1;
|
|
399
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
400
|
+
if (exports.OPENCODE_COMPOSER_BOTTOM_BORDER.test(lines[i])) {
|
|
401
|
+
border = i;
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (border < 0)
|
|
406
|
+
return null;
|
|
407
|
+
let top = border;
|
|
408
|
+
while (top - 1 >= 0 && exports.OPENCODE_GUTTER_ROW_PATTERN.test(lines[top - 1]))
|
|
409
|
+
top--;
|
|
410
|
+
// `top .. border - 1` are the box's gutter rows; the last of them is the
|
|
411
|
+
// agent/model row, which belongs to the chrome rather than to the buffer.
|
|
412
|
+
const modelRow = border - 1;
|
|
413
|
+
if (modelRow < top)
|
|
414
|
+
return null;
|
|
415
|
+
return lines.slice(top, modelRow);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* A composer row with its gutter (and the padding either side) removed
|
|
419
|
+
* (Issue #1906). Blank for an empty buffer row.
|
|
420
|
+
*/
|
|
421
|
+
function stripOpenCodeGutter(row) {
|
|
422
|
+
return row.replace(exports.OPENCODE_GUTTER_ROW_PATTERN, '').trim();
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* OpenCode TUI selection list pattern (Issue #473, narrowed by Issue #1896).
|
|
426
|
+
*
|
|
427
|
+
* Detects the fuzzy-search picker overlay opencode draws for `/models`,
|
|
428
|
+
* `/providers` and `/connect`, anchored on its HEADER ROW COMPLETE WITH the
|
|
429
|
+
* right-aligned `esc` hatch:
|
|
430
|
+
*
|
|
431
|
+
* ```
|
|
432
|
+
* Select model esc
|
|
433
|
+
*
|
|
434
|
+
* Search
|
|
435
|
+
*
|
|
436
|
+
* Recent
|
|
437
|
+
* ● GPT-5.6 Luna GitHub Copilot
|
|
438
|
+
* ```
|
|
439
|
+
*
|
|
440
|
+
* The `esc` is the picker's own dismiss affordance -- positive evidence that an
|
|
441
|
+
* overlay is open (design rule D1), rather than the presence of two English
|
|
442
|
+
* words somewhere on the pane. Until #1896 the pattern was the bare phrase, and
|
|
443
|
+
* `status-detector.ts` tests it against the WHOLE content area (up to ~200 rows,
|
|
444
|
+
* because the header can sit far above the last row when the list is long), so
|
|
445
|
+
* an agent that merely wrote `Select model to continue:` in its answer parked the
|
|
446
|
+
* session on `waiting` / `opencode_selection_list` for the rest of the session
|
|
447
|
+
* -- measured live on opencode 1.18.21,
|
|
448
|
+
* `opencode-live-1896/select-model-in-response.txt`.
|
|
449
|
+
*
|
|
450
|
+
* Requiring two or more spaces before `esc` is what separates the header row
|
|
451
|
+
* from prose: the picker right-aligns the hatch across the overlay's width
|
|
452
|
+
* (37 spaces in the measured frame), while a sentence that happens to end in
|
|
453
|
+
* "esc" would not.
|
|
454
|
+
*
|
|
455
|
+
* NOT additionally anchored on the `Search` row below the header: its distance
|
|
456
|
+
* from the header is unmeasured for the `Connect a provider` variant (that
|
|
457
|
+
* overlay needs an unconfigured provider to open, which the live probe could not
|
|
458
|
+
* produce without touching the operator's real credentials), and the header's
|
|
459
|
+
* own hatch is already the affordance.
|
|
460
|
+
*
|
|
461
|
+
* The header allowlist is deliberately unchanged, and Issue #2112 kept it that
|
|
462
|
+
* way rather than adding the five headings it found missing (`Select agent`,
|
|
463
|
+
* `Sessions`, `Timeline`, `Commands`, and the palette's). #1896 left the
|
|
464
|
+
* question as "a separate change with its own live frames"; #2046 supplied the
|
|
465
|
+
* frames and the answer they gave is that a WIDER WORD LIST is the wrong shape.
|
|
466
|
+
* Three of those dialogs published `ready` / `opencode_response_complete` — the
|
|
467
|
+
* marker of the previous turn, still on the pane behind the overlay — so the
|
|
468
|
+
* damage was a false COMPLETION, not a missing NavigationButtons row, and no
|
|
469
|
+
* heading added here would have changed that ordering. The fix is a gate ahead
|
|
470
|
+
* of the completion branch that reads the overlay's LAYOUT
|
|
471
|
+
* (`lib/detection/opencode-modal-overlay.ts`, branch C2 of
|
|
472
|
+
* `tools/opencode/detect.ts`), which is also what keeps the prose false
|
|
473
|
+
* positives this pattern was narrowed for from coming back through a longer
|
|
474
|
+
* list.
|
|
475
|
+
*
|
|
476
|
+
* This pattern still runs, and still first: it is the reading that survives ANSI
|
|
477
|
+
* stripping, where the layout rule cannot see anything at all.
|
|
478
|
+
*
|
|
479
|
+
* The whitespace runs are `[^\S\n]` (horizontal only) for the reason Issue #1883
|
|
480
|
+
* documents: plain `\s` crosses newlines under the `m` flag, which would let a
|
|
481
|
+
* header on one row pair up with an `esc` several rows below it.
|
|
482
|
+
*
|
|
483
|
+
* Linear pattern, no nested quantifiers -- ReDoS safe (S4-001).
|
|
484
|
+
*/
|
|
485
|
+
exports.OPENCODE_SELECTION_LIST_PATTERN = /^[^\S\n]*(?:Select[^\S\n]+(?:model|provider)|Connect[^\S\n]+a[^\S\n]+provider)[^\S\n]{2,}esc[^\S\n]*$/m;
|
|
486
|
+
/**
|
|
487
|
+
* OpenCode TUI separator pattern (Issue #379)
|
|
488
|
+
* Matches lines composed entirely of box-drawing / TUI decoration characters.
|
|
489
|
+
* Covers: vertical lines (U+2503), box corners, horizontal lines, and other TUI elements.
|
|
490
|
+
*/
|
|
491
|
+
exports.OPENCODE_SEPARATOR_PATTERN = /^[\u2503\u2579\u25A3\u2580\u2500\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C]+$/;
|
|
492
|
+
/**
|
|
493
|
+
* OpenCode skip patterns for response cleaning (Issue #379)
|
|
494
|
+
* Lines matching any of these patterns are filtered from extracted responses.
|
|
495
|
+
* Includes: TUI separators, loading indicators, Build summary prefix,
|
|
496
|
+
* status bar prompts, processing indicators, input prompt, the footer's
|
|
497
|
+
* context/cost status cell (Issue #1911), and pasted text markers.
|
|
498
|
+
*/
|
|
499
|
+
exports.OPENCODE_SKIP_PATTERNS = [
|
|
500
|
+
exports.OPENCODE_SEPARATOR_PATTERN,
|
|
501
|
+
exports.OPENCODE_LOADING_PATTERN,
|
|
502
|
+
/^Build\s+/,
|
|
503
|
+
exports.OPENCODE_PROMPT_AFTER_RESPONSE,
|
|
504
|
+
exports.OPENCODE_PROCESSING_INDICATOR,
|
|
505
|
+
exports.OPENCODE_PROMPT_PATTERN,
|
|
506
|
+
exports.OPENCODE_FOOTER_STATUS_PATTERN,
|
|
507
|
+
pasted_text_1.PASTED_TEXT_PATTERN,
|
|
508
|
+
];
|