commandmate 0.34.0 → 0.35.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 +178 -165
- package/.next/app-path-routes-manifest.json +29 -29
- 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/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/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.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 +1 -1
- 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.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/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/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.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_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/todos/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.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_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]/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_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_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.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.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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_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.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_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_client-reference-manifest.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_client-reference-manifest.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_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/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +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.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +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.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +1 -1
- package/.next/server/app/skills/page.js.nft.json +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 +29 -29
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/{6286.js → 1467.js} +6 -6
- package/.next/server/chunks/1886.js +1 -1
- package/.next/server/chunks/2980.js +1 -1
- package/.next/server/chunks/3077.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3323.js +1 -1
- package/.next/server/chunks/434.js +1 -0
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/450.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/6677.js +3 -3
- package/.next/server/chunks/7075.js +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8728.js +8 -0
- package/.next/server/chunks/8807.js +10 -10
- package/.next/server/chunks/8918.js +5 -5
- package/.next/server/chunks/9123.js +2 -2
- 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/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/2407-b9001cc6041876e1.js +1 -0
- package/.next/static/chunks/{4322-dfd5a7119b5ba4fc.js → 4322-59a7dbd77a7763cc.js} +1 -1
- package/.next/static/chunks/4388-410b1d8ed0d8d98b.js +1 -0
- package/.next/static/chunks/4718-56ebb6e55073ed5e.js +1 -0
- package/.next/static/chunks/{2652-18b8fea64413467e.js → 4809-145884b958e7d9a6.js} +1 -1
- package/.next/static/chunks/app/chat/{page-e60d07c4c79602f0.js → page-609c9a0f5ce44799.js} +1 -1
- package/.next/static/chunks/app/error-c1dc1038d0a84a33.js +1 -0
- package/.next/static/chunks/app/global-error-49f765ecb7fd6527.js +1 -0
- package/.next/static/chunks/app/{layout-4c2f21e3f653ee4c.js → layout-114dc6e93e332392.js} +1 -1
- package/.next/static/chunks/app/more/{page-fc94f86aa881489e.js → page-7c5380e4a7561935.js} +1 -1
- package/.next/static/chunks/app/{page-26a42881c8648cd3.js → page-a4f03c188610c6c8.js} +1 -1
- package/.next/static/chunks/app/repositories/{page-2576158c8420fda0.js → page-a15efb4ce1d1721e.js} +1 -1
- package/.next/static/chunks/app/review/{page-35b99baaf3c93b38.js → page-90ac618489676cbc.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-a3ab6f122ec60d5a.js → page-6486d9a643c1dc6f.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-06799157652e8fa9.js → page-844872df04f52943.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-2f3987e3a131c8d0.js → page-566dfde26d7e63ba.js} +1 -1
- package/.next/static/chunks/app/skills/{page-e70bfcf5ed4e4865.js → page-7859540e8092aace.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-3a58ae66e203f935.js +1 -0
- package/.next/trace +14 -13
- package/README.md +141 -24
- package/dist/cli/commands/remote.d.ts +93 -3
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +232 -9
- package/dist/cli/types/index.d.ts +9 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +11 -1
- package/dist/cli/utils/remote-state.d.ts +32 -0
- package/dist/cli/utils/remote-state.d.ts.map +1 -1
- package/dist/cli/utils/remote-state.js +12 -0
- package/dist/lib/detection/tools/verified-against.d.ts +20 -0
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +20 -0
- package/dist/server/server.js +204 -16
- package/dist/server/src/config/websocket-config.js +67 -0
- package/dist/server/src/lib/auto-yes-poller.js +40 -7
- package/dist/server/src/lib/db/agent-instances-db.js +11 -0
- package/dist/server/src/lib/detection/selection-shape.js +361 -3
- package/dist/server/src/lib/detection/tools/command-code/detect.js +96 -0
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +314 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +20 -0
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +6 -0
- package/dist/server/src/lib/polling/response-checker.js +48 -2
- package/dist/server/src/lib/relay/relay-session-ref.js +15 -8
- package/dist/server/src/lib/ws-server.js +185 -6
- package/package.json +1 -1
- package/public/sw.js +12 -0
- package/.next/server/chunks/1049.js +0 -1
- package/.next/server/chunks/595.js +0 -8
- package/.next/static/chunks/4718-2d9f0397a8f931c4.js +0 -1
- package/.next/static/chunks/8361-0142beb59be2abf3.js +0 -1
- package/.next/static/chunks/app/error-27ab04bce6545dae.js +0 -1
- package/.next/static/chunks/app/global-error-7b761b8e181ffc1f.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-a39ec2a0732d11a6.js +0 -1
- /package/.next/static/{gniPBCKoXtbIOQey8kNcx → 0vChXhzA5YWj3f0D6A-Cn}/_buildManifest.js +0 -0
- /package/.next/static/{gniPBCKoXtbIOQey8kNcx → 0vChXhzA5YWj3f0D6A-Cn}/_ssgManifest.js +0 -0
|
@@ -66,6 +66,8 @@
|
|
|
66
66
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
67
|
exports.DISMISSABLE_PANEL_FOOTER_PATTERN = exports.COMMAND_CODE_SELECTION_LIST_FOOTER = exports.SET_AS_DEFAULT_FOOTER_PATTERN = exports.SESSION_SCOPE_FOOTER_PATTERN = exports.MAX_OPTION_NUMBER = exports.SELECTION_SHAPE_TAIL_LINE_COUNT = void 0;
|
|
68
68
|
exports.hasDismissablePanelFooter = hasDismissablePanelFooter;
|
|
69
|
+
exports.readCommandCodeQuestionRegion = readCommandCodeQuestionRegion;
|
|
70
|
+
exports.hasCommandCodeQuestionChrome = hasCommandCodeQuestionChrome;
|
|
69
71
|
exports.extractCommandCodeSelectionListFrame = extractCommandCodeSelectionListFrame;
|
|
70
72
|
exports.readSelectionListShape = readSelectionListShape;
|
|
71
73
|
exports.shouldOfferOptionNumbers = shouldOfferOptionNumbers;
|
|
@@ -249,6 +251,344 @@ const COMMAND_CODE_RULE_ROW_PATTERN = /^\u2500+$/;
|
|
|
249
251
|
* `tests/fixtures/`.
|
|
250
252
|
*/
|
|
251
253
|
const COMMAND_CODE_RULE_MIN_COLUMNS = 40;
|
|
254
|
+
/**
|
|
255
|
+
* The cursor glyph Command Code draws against the highlighted option.
|
|
256
|
+
*
|
|
257
|
+
* U+276F, measured on the capture Issue #2521 was raised from. Only this one,
|
|
258
|
+
* and not codex's `›` or gemini's `●`: {@link readCommandCodeQuestionRegion}
|
|
259
|
+
* counts cursors to decide whether the region holds ONE live dialog, and a
|
|
260
|
+
* wider alphabet would start counting glyphs that are not cursors at all.
|
|
261
|
+
*/
|
|
262
|
+
const COMMAND_CODE_CURSOR_GLYPH = '❯';
|
|
263
|
+
/**
|
|
264
|
+
* The markers Command Code paints on a question screen's tab strip.
|
|
265
|
+
*
|
|
266
|
+
* Measured row: `● Dispatch | ◯ Review` — a filled disc on the tab that has the
|
|
267
|
+
* screen and a hollow ring on the one that does not. The names are NOT part of
|
|
268
|
+
* the reading (a different question draws different tabs); what is read is the
|
|
269
|
+
* strip's structure, which is what {@link isCommandCodeQuestionTabRow} states.
|
|
270
|
+
*
|
|
271
|
+
* Two families rather than one alphabet, because "one of these is filled and one
|
|
272
|
+
* of these is not" is the whole signal. A list of bullets (`● item one`) carries
|
|
273
|
+
* the first family and nothing else, and a bullet list is the thing this
|
|
274
|
+
* reading must never mistake for a dialog.
|
|
275
|
+
*/
|
|
276
|
+
const COMMAND_CODE_TAB_SELECTED_MARKERS = '●◉⦿';
|
|
277
|
+
/** The hollow half of {@link COMMAND_CODE_TAB_SELECTED_MARKERS}'s pair. */
|
|
278
|
+
const COMMAND_CODE_TAB_UNSELECTED_MARKERS = '◯○◌⚪';
|
|
279
|
+
/** One `<marker> <label>` cell of the tab strip. */
|
|
280
|
+
const COMMAND_CODE_TAB_SEGMENT_PATTERN = new RegExp(`^\\s*([${COMMAND_CODE_TAB_SELECTED_MARKERS}${COMMAND_CODE_TAB_UNSELECTED_MARKERS}])\\s+\\S`);
|
|
281
|
+
/**
|
|
282
|
+
* Is this row Command Code's question-screen tab strip?
|
|
283
|
+
*
|
|
284
|
+
* Three conditions, and each one is a bullet list this predicate has to refuse:
|
|
285
|
+
*
|
|
286
|
+
* - **two or more `|`-separated cells.** `● Dispatch` on its own is a bullet;
|
|
287
|
+
* `● Dispatch | ◯ Review` is a strip. The separator is the cheapest part of
|
|
288
|
+
* the structure and the one prose never has in this position;
|
|
289
|
+
* - **every cell is `<marker> <label>`.** A row that is a strip for its first
|
|
290
|
+
* cell and prose for its second is prose;
|
|
291
|
+
* - **at least one filled marker and at least one hollow one.** A tab strip
|
|
292
|
+
* says which tab has the screen. A row of identical bullets does not, and
|
|
293
|
+
* `● one | ● two` is exactly the list-with-a-pipe this rules out.
|
|
294
|
+
*/
|
|
295
|
+
function isCommandCodeQuestionTabRow(line) {
|
|
296
|
+
const segments = line.split('|');
|
|
297
|
+
if (segments.length < 2)
|
|
298
|
+
return false;
|
|
299
|
+
let selected = 0;
|
|
300
|
+
let unselected = 0;
|
|
301
|
+
for (const segment of segments) {
|
|
302
|
+
const match = COMMAND_CODE_TAB_SEGMENT_PATTERN.exec(segment);
|
|
303
|
+
if (match === null)
|
|
304
|
+
return false;
|
|
305
|
+
if (COMMAND_CODE_TAB_SELECTED_MARKERS.includes(match[1]))
|
|
306
|
+
selected += 1;
|
|
307
|
+
else
|
|
308
|
+
unselected += 1;
|
|
309
|
+
}
|
|
310
|
+
return selected > 0 && unselected > 0;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Rows that mean the region spans more than the one dialog on screen now.
|
|
314
|
+
*
|
|
315
|
+
* Issue #2521's condition 4: the tab strip and its options have to be the
|
|
316
|
+
* SAME screen, with no other turn's generating or completion UI between them.
|
|
317
|
+
* Structurally that is mostly settled by taking the LAST rule row as the top
|
|
318
|
+
* edge — a new turn repaints the composer, and the composer's own lower rule
|
|
319
|
+
* then becomes that edge — so this pattern is the belt to that braces, for a
|
|
320
|
+
* frame captured mid-repaint.
|
|
321
|
+
*
|
|
322
|
+
* Two rows, both restated here rather than imported: `cli-patterns` owns
|
|
323
|
+
* Command Code's busy and marker vocabularies and pulls the logger and the tool
|
|
324
|
+
* registry in with them, and this module is the browser-safe leaf the chat
|
|
325
|
+
* surface imports (see the module docblock).
|
|
326
|
+
*
|
|
327
|
+
* - `esc to interrupt`, the tail Command Code appends to every status row
|
|
328
|
+
* (`COMMAND_CODE_INTERRUPT_HINT_PATTERN`). A turn is in flight;
|
|
329
|
+
* - a row that OPENS with U+273B and a word — `✻ Thought for 1 second`,
|
|
330
|
+
* `✻ Worked for 4s`. Matched by shape rather than by the two English verbs,
|
|
331
|
+
* so a reworded or localised marker still ends the region.
|
|
332
|
+
*/
|
|
333
|
+
const COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN = /\besc\s+to\s+interrupt\b|^[^\S\n]*✻[^\S\n]+\S/im;
|
|
334
|
+
/**
|
|
335
|
+
* Where a footer-less Command Code question screen sits on a pane (Issue #2521).
|
|
336
|
+
*
|
|
337
|
+
* ## The frame this exists for
|
|
338
|
+
*
|
|
339
|
+
* Command Code's `AskUserQuestion` draws no hint-bar footer. It draws a rule,
|
|
340
|
+
* a tab strip, the question, and the options — and when an option's description
|
|
341
|
+
* WRAPS, the continuation row begins with a single space:
|
|
342
|
+
*
|
|
343
|
+
* ────────────────────────────… (200 columns of U+2500)
|
|
344
|
+
* ● Dispatch | ◯ Review
|
|
345
|
+
*
|
|
346
|
+
* Approve proceeding from the plan into worktree creation and dispatch?
|
|
347
|
+
*
|
|
348
|
+
* ❯ 1. Prepare worktrees + dispatch (Recommended)
|
|
349
|
+
* I create the worktrees and pause for you to
|
|
350
|
+
* answer).
|
|
351
|
+
* 2. Worktrees only, then pause
|
|
352
|
+
* …
|
|
353
|
+
*
|
|
354
|
+
* Measured 2026-09-12 on a pane reported as Command Code 1.53.0 at the
|
|
355
|
+
* production 200x1000; the anonymised capture is
|
|
356
|
+
* `tests/fixtures/command-code-askuserquestion-2521/`. Nothing read it:
|
|
357
|
+
* `detectPrompt` stops its scan at ` answer).` and never reaches option 1, and
|
|
358
|
+
* the selection-list branch below wants a footer this screen does not draw. So
|
|
359
|
+
* the frame fell through to the generic composer check — which matches, because
|
|
360
|
+
* `COMMAND_CODE_PROMPT_PATTERN` is `^❯(\s*$|\s+\S)` and `❯ 1. Prepare …` is a
|
|
361
|
+
* `❯` followed by a space and a glyph — and the pane was published as
|
|
362
|
+
* `ready` / `input_prompt`. `wait` read that as a finished turn and exited 0 on
|
|
363
|
+
* a session that was asking a question (Issue #2521's "偽完了").
|
|
364
|
+
*
|
|
365
|
+
* ## What this function is NOT
|
|
366
|
+
*
|
|
367
|
+
* It is not a general reading of footer-less dialogs, and it deliberately does
|
|
368
|
+
* not make `optionCount` into a dialog test. {@link readSelectionListShape}
|
|
369
|
+
* counts the numbers in the tail of ANY frame, an ordinary numbered answer
|
|
370
|
+
* included, and the whole point of the conditions below is that a number list
|
|
371
|
+
* on its own proves nothing. Five things have to line up:
|
|
372
|
+
*
|
|
373
|
+
* 1. the LAST rule row that qualifies as the seam ({@link
|
|
374
|
+
* COMMAND_CODE_RULE_ROW_PATTERN} at {@link COMMAND_CODE_RULE_MIN_COLUMNS} or
|
|
375
|
+
* wider) is the top edge, and the last row carrying content is the bottom.
|
|
376
|
+
* Taking the LAST one is what keeps an older dialog higher up the pane out:
|
|
377
|
+
* a new turn repaints the composer, whose own rules sit below the old
|
|
378
|
+
* dialog, and the region is then the composer's hint row;
|
|
379
|
+
* 2. the first row under that rule is a tab strip
|
|
380
|
+
* ({@link isCommandCodeQuestionTabRow}) and a non-blank question body
|
|
381
|
+
* follows it before the first option;
|
|
382
|
+
* 3. the options are a STRICT run `1.` … `N.`, 2 ≤ N ≤ {@link
|
|
383
|
+
* MAX_OPTION_NUMBER}. A gap, a repeat or a list that starts at `2` is not
|
|
384
|
+
* this screen;
|
|
385
|
+
* 4. exactly one {@link COMMAND_CODE_CURSOR_GLYPH} in the region, and it is on
|
|
386
|
+
* an option row. Two cursors means two screens — typically a composer's own
|
|
387
|
+
* `❯` under the dialog — and none means the highlight is elsewhere;
|
|
388
|
+
* 5. no filter box, no `/model` footer, no dismiss-only footer and no other
|
|
389
|
+
* turn's UI in the region ({@link FILTER_INPUT_PATTERN},
|
|
390
|
+
* {@link COMMAND_CODE_SELECTION_LIST_FOOTER},
|
|
391
|
+
* {@link DISMISSABLE_PANEL_FOOTER_PATTERN},
|
|
392
|
+
* {@link COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN}). `Type something...`
|
|
393
|
+
* is an OPTION on this screen, not a filter, and the filter pattern is
|
|
394
|
+
* narrow enough to tell them apart.
|
|
395
|
+
*
|
|
396
|
+
* `null` for anything else, which leaves every existing verdict and every
|
|
397
|
+
* existing crop exactly as they were.
|
|
398
|
+
*
|
|
399
|
+
* ## Tool-id-free and browser-safe, on purpose
|
|
400
|
+
*
|
|
401
|
+
* Three call sites read the same answer: the command-code detector's
|
|
402
|
+
* `afterPrompt`, {@link extractCommandCodeSelectionListFrame} (which runs for
|
|
403
|
+
* every CLI, with no tool id in hand) and `ChatSurface`, a client component.
|
|
404
|
+
* So this takes a raw frame and nothing else, and imports nothing but
|
|
405
|
+
* `./ansi` — the same trade the rest of this module makes.
|
|
406
|
+
*
|
|
407
|
+
* ## The one spelling it cannot answer on
|
|
408
|
+
*
|
|
409
|
+
* A capture that has been through `stripBoxDrawing` — which blanks a pure-U+2500
|
|
410
|
+
* row, so condition 1 finds no seam and this returns `null`. Same limitation
|
|
411
|
+
* `extractOpenCodeModalOverlayFrame` records for the same reason. Issue #2522
|
|
412
|
+
* did not weaken the reading to work around it: the three consumers that clean
|
|
413
|
+
* their frames (the response poller, Auto-Yes, `/prompt-response`) now keep the
|
|
414
|
+
* same tick's RAW capture and hand that here, so both spellings of one capture
|
|
415
|
+
* exist and the right one is passed.
|
|
416
|
+
*
|
|
417
|
+
* ## Issue #2522: the structural half is shared
|
|
418
|
+
*
|
|
419
|
+
* Conditions 1, 2, 3-minus-strictness and 5 moved into
|
|
420
|
+
* {@link scanCommandCodeQuestionScreen}, which {@link hasCommandCodeQuestionChrome}
|
|
421
|
+
* also reads. This function is exactly that scan plus the two conditions that
|
|
422
|
+
* are about the LIST — a strict run and a single cursor — so every verdict it
|
|
423
|
+
* gave before is the verdict it gives now.
|
|
424
|
+
*
|
|
425
|
+
* @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
|
|
426
|
+
* @returns the region's line indices into the LF-normalised frame, or `null`
|
|
427
|
+
*/
|
|
428
|
+
function readCommandCodeQuestionRegion(frame) {
|
|
429
|
+
const screen = scanCommandCodeQuestionScreen(frame);
|
|
430
|
+
if (screen === null)
|
|
431
|
+
return null;
|
|
432
|
+
// 3 (continued). A STRICT run. The numbers were collected in the order they
|
|
433
|
+
// are drawn and are compared against the run, rather than restarted on every
|
|
434
|
+
// fresh `1` the way `countTrailingOptionRun` does: that function is reading a
|
|
435
|
+
// tail that may hold two lists, and this one is asserting that the region
|
|
436
|
+
// holds exactly one.
|
|
437
|
+
if (!screen.numbers.every((value, index) => value === index + 1))
|
|
438
|
+
return null;
|
|
439
|
+
// 4 (continued). Exactly ONE cursor. Two means two screens — typically a
|
|
440
|
+
// composer's own `❯` under the dialog, or a frame caught mid-repaint.
|
|
441
|
+
if (screen.cursorCount !== 1)
|
|
442
|
+
return null;
|
|
443
|
+
return {
|
|
444
|
+
ruleLineIndex: screen.ruleLineIndex,
|
|
445
|
+
firstLineIndex: screen.firstLineIndex,
|
|
446
|
+
lastLineIndex: screen.lastLineIndex,
|
|
447
|
+
tabLineIndex: screen.tabLineIndex,
|
|
448
|
+
cursorLineIndex: screen.cursorLineIndex,
|
|
449
|
+
optionCount: screen.numbers.length,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Is Command Code's question CHROME on this frame, whatever its numbering says?
|
|
454
|
+
* (Issue #2522)
|
|
455
|
+
*
|
|
456
|
+
* The same five conditions {@link readCommandCodeQuestionRegion} applies, minus
|
|
457
|
+
* the two that are about the LIST rather than about the screen: the run need not
|
|
458
|
+
* be a strict `1.`…`N.`, and there may be more than one cursor on it.
|
|
459
|
+
*
|
|
460
|
+
* ## Why the weaker reading is worth having
|
|
461
|
+
*
|
|
462
|
+
* Issue #2522 確定仕様 B needs three answers where #2521 had two. "Not this
|
|
463
|
+
* screen" keeps every existing verdict; "read in full" produces an answerable
|
|
464
|
+
* prompt; and **"this screen, unreadable"** — a gap in the numbering, a repeated
|
|
465
|
+
* row, a list that starts at `2`, a second cursor from a half-finished repaint —
|
|
466
|
+
* has to reach the manual-operation fallback rather than the `ready` the generic
|
|
467
|
+
* composer check would otherwise publish off the dialog's own `❯` row. That is
|
|
468
|
+
* the very failure both Issues exist for: `wait` exiting 0 on a pane that is
|
|
469
|
+
* asking a human a question.
|
|
470
|
+
*
|
|
471
|
+
* It is deliberately NOT a relaxation of the strict reading. Nothing that was
|
|
472
|
+
* `null` becomes a REGION, so no partial option list is produced anywhere and no
|
|
473
|
+
* existing crop, card or prompt payload changes. What this adds is the ability
|
|
474
|
+
* to say "declined for a numbering reason" out loud.
|
|
475
|
+
*
|
|
476
|
+
* ## Why it is still narrow
|
|
477
|
+
*
|
|
478
|
+
* Every structural condition stays: the last qualifying rule row, a genuine tab
|
|
479
|
+
* strip as the first row under it ({@link isCommandCodeQuestionTabRow} — one
|
|
480
|
+
* filled marker, one hollow, `|`-separated), a non-blank question body before
|
|
481
|
+
* the first option, at least two numbered rows, at least one `❯` ON one of them,
|
|
482
|
+
* and none of the pickers, panels or other-turn UI the other branches own. An
|
|
483
|
+
* assistant answering in a numbered list carries none of that, and a frame with
|
|
484
|
+
* one option or with the `❯` on a composer row is still `false` — the two cases
|
|
485
|
+
* #2521 recorded as "the highlight is elsewhere".
|
|
486
|
+
*
|
|
487
|
+
* @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
|
|
488
|
+
*/
|
|
489
|
+
function hasCommandCodeQuestionChrome(frame) {
|
|
490
|
+
return scanCommandCodeQuestionScreen(frame) !== null;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* The structural half of the question-screen reading, shared by the strict
|
|
494
|
+
* {@link readCommandCodeQuestionRegion} and the weaker
|
|
495
|
+
* {@link hasCommandCodeQuestionChrome} (Issue #2522 split them apart).
|
|
496
|
+
*
|
|
497
|
+
* Written once rather than twice on purpose: the conditions below are what make
|
|
498
|
+
* the reading safe for every other CLI's frames, and a second copy of them is a
|
|
499
|
+
* second thing to forget to narrow.
|
|
500
|
+
*/
|
|
501
|
+
function scanCommandCodeQuestionScreen(frame) {
|
|
502
|
+
if (!frame)
|
|
503
|
+
return null;
|
|
504
|
+
// Stripped per line off the same split, so every index below is valid against
|
|
505
|
+
// the ANSI-bearing rows the cropper slices.
|
|
506
|
+
const lines = frame.replace(/\r\n/g, '\n').split('\n').map(ansi_1.stripAnsi);
|
|
507
|
+
let last = lines.length - 1;
|
|
508
|
+
while (last >= 0 && lines[last].trim() === '')
|
|
509
|
+
last -= 1;
|
|
510
|
+
// A region needs a rule above it, so the last content row cannot be row 0.
|
|
511
|
+
if (last < 1)
|
|
512
|
+
return null;
|
|
513
|
+
let ruleLineIndex = -1;
|
|
514
|
+
for (let i = last - 1; i >= 0; i -= 1) {
|
|
515
|
+
const row = lines[i].trim();
|
|
516
|
+
if (row.length < COMMAND_CODE_RULE_MIN_COLUMNS)
|
|
517
|
+
continue;
|
|
518
|
+
if (!COMMAND_CODE_RULE_ROW_PATTERN.test(row))
|
|
519
|
+
continue;
|
|
520
|
+
ruleLineIndex = i;
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
if (ruleLineIndex < 0)
|
|
524
|
+
return null;
|
|
525
|
+
const region = lines.slice(ruleLineIndex + 1, last + 1);
|
|
526
|
+
const body = region.join('\n');
|
|
527
|
+
// 5. The screens this reading must not take over.
|
|
528
|
+
if (FILTER_INPUT_PATTERN.test(body))
|
|
529
|
+
return null;
|
|
530
|
+
if (exports.COMMAND_CODE_SELECTION_LIST_FOOTER.test(body))
|
|
531
|
+
return null;
|
|
532
|
+
if (exports.DISMISSABLE_PANEL_FOOTER_PATTERN.test(body))
|
|
533
|
+
return null;
|
|
534
|
+
if (COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN.test(body))
|
|
535
|
+
return null;
|
|
536
|
+
// 2. The tab strip opens the region.
|
|
537
|
+
const tabOffset = region.findIndex((line) => line.trim() !== '');
|
|
538
|
+
if (tabOffset < 0)
|
|
539
|
+
return null;
|
|
540
|
+
if (!isCommandCodeQuestionTabRow(region[tabOffset]))
|
|
541
|
+
return null;
|
|
542
|
+
// 3. Numbered rows under it.
|
|
543
|
+
const numbers = [];
|
|
544
|
+
let firstOptionOffset = -1;
|
|
545
|
+
for (let i = tabOffset + 1; i < region.length; i += 1) {
|
|
546
|
+
const match = OPTION_ROW_PATTERN.exec(region[i]);
|
|
547
|
+
if (match === null)
|
|
548
|
+
continue;
|
|
549
|
+
if (firstOptionOffset < 0)
|
|
550
|
+
firstOptionOffset = i;
|
|
551
|
+
numbers.push(Number(match[1]));
|
|
552
|
+
}
|
|
553
|
+
// Two is the floor: one numbered row under a tab strip is not a choice. The
|
|
554
|
+
// ceiling is {@link MAX_OPTION_NUMBER} and it is {@link OPTION_ROW_PATTERN}'s
|
|
555
|
+
// rather than a length check — that pattern captures a SINGLE digit, so a
|
|
556
|
+
// `10.` row is not read as an option at all and an eleven-option screen
|
|
557
|
+
// reports its first nine. Recognising such a screen and under-counting it is
|
|
558
|
+
// the right failure: declining it would put the pane back on the `ready` that
|
|
559
|
+
// made `wait` exit 0. (Issue #2522's reader cross-checks the count against its
|
|
560
|
+
// own block reading and declines to ANSWER such a screen; what it must not do
|
|
561
|
+
// is hand the pane back to the composer check.)
|
|
562
|
+
if (numbers.length < 2)
|
|
563
|
+
return null;
|
|
564
|
+
// 2 (continued). The question itself. A tab strip sitting straight on top of
|
|
565
|
+
// its options is some other screen.
|
|
566
|
+
if (!region.slice(tabOffset + 1, firstOptionOffset).some((line) => line.trim() !== '')) {
|
|
567
|
+
return null;
|
|
568
|
+
}
|
|
569
|
+
// 4. A cursor, on an option row.
|
|
570
|
+
let cursorCount = 0;
|
|
571
|
+
let cursorOffset = -1;
|
|
572
|
+
for (let i = 0; i < region.length; i += 1) {
|
|
573
|
+
const inRow = region[i].split(COMMAND_CODE_CURSOR_GLYPH).length - 1;
|
|
574
|
+
if (inRow === 0)
|
|
575
|
+
continue;
|
|
576
|
+
cursorCount += inRow;
|
|
577
|
+
if (OPTION_ROW_PATTERN.test(region[i]))
|
|
578
|
+
cursorOffset = i;
|
|
579
|
+
}
|
|
580
|
+
if (cursorCount === 0 || cursorOffset < 0)
|
|
581
|
+
return null;
|
|
582
|
+
return {
|
|
583
|
+
ruleLineIndex,
|
|
584
|
+
firstLineIndex: ruleLineIndex + 1,
|
|
585
|
+
lastLineIndex: last,
|
|
586
|
+
tabLineIndex: ruleLineIndex + 1 + tabOffset,
|
|
587
|
+
numbers,
|
|
588
|
+
cursorCount,
|
|
589
|
+
cursorLineIndex: ruleLineIndex + 1 + cursorOffset,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
252
592
|
/**
|
|
253
593
|
* The rows of a Command Code dialog, cut out of the pane it is painted on
|
|
254
594
|
* (Issue #2326).
|
|
@@ -290,7 +630,11 @@ const COMMAND_CODE_RULE_MIN_COLUMNS = 40;
|
|
|
290
630
|
* - **no footer** — the picker was closed between the flags being read and the
|
|
291
631
|
* pane being captured, or the frame is some other dialog. Cropping on a
|
|
292
632
|
* guess would blank the card, which Issue #2326 calls out as worse than
|
|
293
|
-
* showing too much
|
|
633
|
+
* showing too much. Issue #2521 carved ONE screen out of this: a frame that
|
|
634
|
+
* {@link readCommandCodeQuestionRegion} positively recognises is cropped to
|
|
635
|
+
* that region, because `AskUserQuestion` draws no footer at all and its card
|
|
636
|
+
* was otherwise the whole pane. The carve-out is a positive reading, not a
|
|
637
|
+
* relaxation — everything it declines still lands here;
|
|
294
638
|
* - **a footer but no rule above it** — copilot's `/model` footer is
|
|
295
639
|
* `↑/↓ to navigate · … · enter to select · esc to cancel` and matches the
|
|
296
640
|
* same pattern, but copilot draws its picker in a corner-bordered box, so no
|
|
@@ -314,8 +658,22 @@ function extractCommandCodeSelectionListFrame(frame) {
|
|
|
314
658
|
break;
|
|
315
659
|
}
|
|
316
660
|
}
|
|
317
|
-
|
|
318
|
-
|
|
661
|
+
// Issue #2521: no footer is no longer unconditionally "do not crop". One
|
|
662
|
+
// screen draws none — `AskUserQuestion` — and it is the screen whose
|
|
663
|
+
// uncropped card was 409 rows of transcript with the question below the fold.
|
|
664
|
+
// The reading is the narrow one, so every other footer-less frame (a closed
|
|
665
|
+
// picker, a permission dialog, another CLI's overlay) still takes the `null`
|
|
666
|
+
// path and is returned untouched. Checked only when the footer is absent, so
|
|
667
|
+
// a picker's own crop is decided exactly as #2326 left it.
|
|
668
|
+
if (footer < 0) {
|
|
669
|
+
const region = readCommandCodeQuestionRegion(frame);
|
|
670
|
+
if (region === null)
|
|
671
|
+
return null;
|
|
672
|
+
// The rule row itself is the transcript's boundary and not the dialog's
|
|
673
|
+
// first row — the same edge the footer path takes — and `lastLineIndex` is
|
|
674
|
+
// the last row with content, so the pane's trailing padding is left out.
|
|
675
|
+
return lines.slice(region.firstLineIndex, region.lastLineIndex + 1).join('\n');
|
|
676
|
+
}
|
|
319
677
|
for (let i = footer - 1; i >= 0; i -= 1) {
|
|
320
678
|
const row = (0, ansi_1.stripAnsi)(lines[i]).trim();
|
|
321
679
|
if (row.length < COMMAND_CODE_RULE_MIN_COLUMNS)
|
|
@@ -72,6 +72,24 @@
|
|
|
72
72
|
* box. Measured live on v1.40.1 at the production 200x1000 geometry; the capture
|
|
73
73
|
* is `tests/fixtures/chat-dialog-card-2254/command-code-model-1-40-1.txt`.
|
|
74
74
|
*
|
|
75
|
+
* `beforePrompt` arrived with Issue #2521 as a third `afterPrompt` branch and
|
|
76
|
+
* was moved ahead of the shared parser by Issue #2522. It is the only branch
|
|
77
|
+
* here not read off a footer: `AskUserQuestion` draws none. The screen is a
|
|
78
|
+
* rule, a tab strip (`● Dispatch | ◯ Review`), the question and a strict
|
|
79
|
+
* `1.`…`N.` run with one `❯` on it, and `readCommandCodeQuestionRegion` is what
|
|
80
|
+
* recognises that shape. Before #2521, a wrapped option description took the
|
|
81
|
+
* frame away from the shared parser and the generic composer check answered
|
|
82
|
+
* `ready` off the dialog's own cursor row — so `wait` exited 0 on a pane that
|
|
83
|
+
* was asking a human a question.
|
|
84
|
+
*
|
|
85
|
+
* #2521 answered that with a manual-operation fallback (the selection-list
|
|
86
|
+
* reason, no `promptData`). #2522 added `tools/command-code/dialog.ts`, which
|
|
87
|
+
* READS the same region, and the branch now publishes one of two verdicts:
|
|
88
|
+
* `PROMPT_DETECTED` with the parsed question, options and `❯` default where the
|
|
89
|
+
* reading succeeds, and #2521's fallback where the screen is plainly up and the
|
|
90
|
+
* reading declines. The move to `beforePrompt` is part of that: see the branch
|
|
91
|
+
* for why the generic parser must not get this frame either before or after.
|
|
92
|
+
*
|
|
75
93
|
* ## What #2304 re-measured, and what it did not change
|
|
76
94
|
*
|
|
77
95
|
* Nothing here changed, and that is the finding. Seven frames were captured
|
|
@@ -104,6 +122,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
104
122
|
exports.commandCodeStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
105
123
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
106
124
|
const selection_shape_1 = require("../../selection-shape");
|
|
125
|
+
const dialog_1 = require("./dialog");
|
|
107
126
|
const status_reason_1 = require("../../status-reason");
|
|
108
127
|
const run_detection_1 = require("../run-detection");
|
|
109
128
|
const verified_against_1 = require("../verified-against");
|
|
@@ -112,6 +131,83 @@ exports.VERIFIED_AGAINST = verified_against_1.COMMAND_CODE_VERIFIED_AGAINST;
|
|
|
112
131
|
exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
113
132
|
tool: 'command-code',
|
|
114
133
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
134
|
+
beforePrompt(frame) {
|
|
135
|
+
// Issue #2521 recognised this screen; Issue #2522 reads it.
|
|
136
|
+
//
|
|
137
|
+
// `AskUserQuestion` draws no footer, so neither `afterPrompt` branch below
|
|
138
|
+
// reads it — and the shared `detectPrompt` at step 1 does not either, because
|
|
139
|
+
// a wrapped option description continues on a row that begins with a SINGLE
|
|
140
|
+
// space (` answer).`) and the generic multiple-choice parser ends its scan
|
|
141
|
+
// there, one row short of option 1. The frame therefore reached step 3, where
|
|
142
|
+
// `COMMAND_CODE_PROMPT_PATTERN` (`^❯(\s*$|\s+\S)`) matched the dialog's own
|
|
143
|
+
// cursor row, `❯ 1. Prepare worktrees + dispatch (Recommended)`, and the pane
|
|
144
|
+
// was published as `ready` / `input_prompt`. A human was being asked a
|
|
145
|
+
// question and `wait` exited 0 on it.
|
|
146
|
+
//
|
|
147
|
+
// ## Why `beforePrompt` and not `afterPrompt` (Issue #2522 確定仕様 A / B)
|
|
148
|
+
//
|
|
149
|
+
// #2521's branch sat at 1.5, after the shared parser, because it only had to
|
|
150
|
+
// catch the frames that parser could not read. This one has to run FIRST, and
|
|
151
|
+
// for two separate reasons:
|
|
152
|
+
//
|
|
153
|
+
// - **the short spelling.** With one-line descriptions the generic parser
|
|
154
|
+
// SUCCEEDS on this screen, and succeeds badly: `extractQuestionText` walks
|
|
155
|
+
// up to five rows above option 1 and takes the tab strip, the rule and the
|
|
156
|
+
// transcript's TODOS row into the question. Placing the reader after it
|
|
157
|
+
// would leave exactly the frames that already look fine — and are wrong;
|
|
158
|
+
// - **the unreadable spelling.** A question screen with a gap in its
|
|
159
|
+
// numbering, or one taller than the reader's cap, must reach #2521's
|
|
160
|
+
// manual-operation fallback and NOT the generic parser's partial list.
|
|
161
|
+
// That is only expressible ahead of the parser.
|
|
162
|
+
//
|
|
163
|
+
// `/usage`, `/model` and the four permission dialogs are unaffected, and not
|
|
164
|
+
// by ordering: `readCommandCodeQuestionRegion` positively declines every one
|
|
165
|
+
// of them (the pickers by their own footers, the permission dialogs by having
|
|
166
|
+
// no tab strip), which is what the fixture sweep in
|
|
167
|
+
// `command-code-askuserquestion-2521.test.ts` pins.
|
|
168
|
+
//
|
|
169
|
+
// Read against `frame.raw` rather than `frame.lastLines` or `frame.clean`:
|
|
170
|
+
// the region runs from the last rule row to the last content row, which is
|
|
171
|
+
// more rows than the 15-row window holds, and the rule row itself is what
|
|
172
|
+
// `stripBoxDrawing` would erase. Every other consumer of this reading keeps
|
|
173
|
+
// the same tick's raw capture for the same reason (確定仕様 C).
|
|
174
|
+
const reading = (0, dialog_1.readCommandCodeQuestionDialog)(frame.raw);
|
|
175
|
+
// Read in full: the question, its options, the `❯` default and the free-text
|
|
176
|
+
// row are all in hand, so the pane is published exactly as an ordinary
|
|
177
|
+
// answerable dialog is. `hasActivePrompt: true` is what puts `promptData` on
|
|
178
|
+
// `/current-output`, raises the answer buttons, lets `respond <id> 2` reach
|
|
179
|
+
// the pane and lets Auto-Yes consider it — every one of them through the
|
|
180
|
+
// SAME payload, which is the point of reading it once here.
|
|
181
|
+
if (reading.kind === 'prompt') {
|
|
182
|
+
return {
|
|
183
|
+
status: 'waiting',
|
|
184
|
+
confidence: 'high',
|
|
185
|
+
reason: status_reason_1.STATUS_REASON.PROMPT_DETECTED,
|
|
186
|
+
hasActivePrompt: true,
|
|
187
|
+
evidence: 'positive',
|
|
188
|
+
promptDetection: reading.prompt,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// The question UI is plainly up and this reader could not read it. #2521's
|
|
192
|
+
// verdict, unchanged and deliberately kept: `COMMAND_CODE_SELECTION_LIST` is
|
|
193
|
+
// in `SELECTION_LIST_REASONS`, which publishes `isSelectionListActive`,
|
|
194
|
+
// raises the arrow-driven card and makes `wait` exit 10 instead of polling a
|
|
195
|
+
// blocked agent to its `--timeout`.
|
|
196
|
+
//
|
|
197
|
+
// `hasActivePrompt: false` and no `promptDetection`: nothing parsed the
|
|
198
|
+
// options, so there is no payload to answer with and none is invented — and
|
|
199
|
+
// the generic parser is not given a second chance to invent a partial one.
|
|
200
|
+
if (reading.kind === 'unsupported') {
|
|
201
|
+
return {
|
|
202
|
+
status: 'waiting',
|
|
203
|
+
confidence: 'high',
|
|
204
|
+
reason: status_reason_1.STATUS_REASON.COMMAND_CODE_SELECTION_LIST,
|
|
205
|
+
hasActivePrompt: false,
|
|
206
|
+
evidence: 'positive',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
},
|
|
115
211
|
afterPrompt(frame) {
|
|
116
212
|
// Issue #2369. `/usage` opens a READ-ONLY panel: a plan header, two usage
|
|
117
213
|
// meters, a breakdown URL, and `Press Esc to close` as its last row. It is
|