commandmate 0.44.0 → 0.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +331 -335
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +2 -2
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_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.js +2 -2
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
- 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 -2
- 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_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 +3 -3
- 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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +7 -7
- 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 +35 -35
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1210.js +1 -1
- 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 -0
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/2908.js +1 -0
- package/.next/server/chunks/4372.js +5 -0
- package/.next/server/chunks/5595.js +1 -0
- package/.next/server/chunks/5845.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +3 -3
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/850.js +1 -0
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +2 -2
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/9130.js +1 -5
- package/.next/server/chunks/9390.js +1 -2
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9798.js +2 -0
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-340774f1a24f2b45.js → 2407-051f6f84226a9f2c.js} +1 -1
- package/.next/static/chunks/344-e1cefd00787060e4.js +1 -0
- package/.next/static/chunks/3922.f45dcfc1e7da552a.js +1 -0
- package/.next/static/chunks/591-539fec878c9dec5e.js +1 -0
- package/.next/static/chunks/6654-ac431270fac1a283.js +1 -0
- package/.next/static/chunks/{9619-84aced0846cbe3ac.js → 9619-6c17a271f7f98fbb.js} +1 -1
- package/.next/static/chunks/998-2eb5883186abd0bd.js +1 -0
- package/.next/static/chunks/app/layout-9da1ab602bcb3051.js +1 -0
- package/.next/static/chunks/app/more/{page-30057cf1e0762ad2.js → page-87c84987b2765213.js} +1 -1
- package/.next/static/chunks/app/{page-8483ba400af011f5.js → page-1b820c421db48c2c.js} +1 -1
- package/.next/static/chunks/app/review/page-95f749caae382f46.js +1 -0
- package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +1 -0
- package/.next/static/chunks/{webpack-49ade0526854dd4e.js → webpack-021f0741f22dd16a.js} +1 -1
- package/.next/trace +13 -13
- package/README.md +72 -25
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +7 -8
- package/dist/cli/commands/remote.d.ts +10 -0
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +17 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +47 -2
- package/dist/cli/docs/setup-guide.d.ts +1 -1
- package/dist/cli/docs/setup-guide.d.ts.map +1 -1
- package/dist/cli/docs/setup-guide.js +2 -0
- package/dist/cli/types/api-responses.d.ts +25 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +17 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +17 -0
- package/dist/lib/session/prompt-view.d.ts +205 -0
- package/dist/lib/session/prompt-view.d.ts.map +1 -0
- package/dist/lib/session/prompt-view.js +267 -0
- package/dist/server/locales/en/worktree.json +13 -1
- package/dist/server/locales/ja/worktree.json +13 -1
- package/dist/server/server.js +5 -3
- package/dist/server/src/config/session-starting-config.js +75 -0
- package/dist/server/src/lib/auto-yes-lifecycle.js +133 -0
- package/dist/server/src/lib/auto-yes-poller.js +19 -4
- package/dist/server/src/lib/cli-tools/antigravity.js +3 -2
- package/dist/server/src/lib/cli-tools/base.js +15 -1
- package/dist/server/src/lib/cli-tools/codex.js +3 -2
- package/dist/server/src/lib/cli-tools/command-code.js +3 -2
- package/dist/server/src/lib/cli-tools/copilot.js +2 -1
- package/dist/server/src/lib/cli-tools/gemini.js +2 -1
- package/dist/server/src/lib/cli-tools/liveness-spec.js +27 -9
- package/dist/server/src/lib/cli-tools/opencode-v2.js +2 -1
- package/dist/server/src/lib/cli-tools/opencode.js +2 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -1
- package/dist/server/src/lib/detection/cli-patterns.js +38 -20
- package/dist/server/src/lib/detection/status-detector.js +1 -1
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +3 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +7 -31
- package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
- package/dist/server/src/lib/detection/tools/claude/detect.js +8 -3
- package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -46
- package/dist/server/src/lib/detection/tools/codex/live-region.js +73 -0
- package/dist/server/src/lib/detection/tools/command-code/detect.js +11 -0
- package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
- package/dist/server/src/lib/detection/tools/copilot/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
- package/dist/server/src/lib/detection/tools/frame.js +36 -2
- package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
- package/dist/server/src/lib/detection/tools/live-region.js +204 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +3 -0
- package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
- package/dist/server/src/lib/detection/tools/run-detection.js +25 -3
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
- package/dist/server/src/lib/polling/response-checker.js +25 -20
- package/dist/server/src/lib/prompt-answer-sender.js +1 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +8 -0
- package/dist/server/src/lib/relay/relay-delivery.js +3 -0
- package/dist/server/src/lib/relay/relay-triggers.js +9 -0
- package/dist/server/src/lib/resource-cleanup.js +6 -4
- package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -0
- package/dist/server/src/lib/session/claude-session.js +7 -1
- package/dist/server/src/lib/session/current-output-builder.js +53 -21
- package/dist/server/src/lib/session/launch-screen.js +57 -0
- package/dist/server/src/lib/session/prompt-view.js +267 -0
- package/dist/server/src/lib/session/prompt-waiting-composition.js +34 -0
- package/dist/server/src/lib/session/session-starting-state.js +236 -0
- package/dist/server/src/lib/session/waiting-kind.js +3 -0
- package/dist/server/src/lib/session-cleanup.js +5 -3
- package/package.json +1 -1
- package/release-notes/0.44.1.json +54 -0
- package/release-notes/0.44.2.json +33 -0
- package/.next/server/chunks/434.js +0 -1
- package/.next/server/chunks/5775.js +0 -1
- package/.next/server/chunks/650.js +0 -1
- package/.next/server/chunks/6661.js +0 -1
- package/.next/server/chunks/8583.js +0 -1
- package/.next/server/chunks/964.js +0 -1
- package/.next/static/chunks/344-6f9fc1f38f01a839.js +0 -1
- package/.next/static/chunks/3922.8e79fc89f593280b.js +0 -1
- package/.next/static/chunks/5449-6cb80bab2bd06b79.js +0 -1
- package/.next/static/chunks/591-0a45801e83f26f24.js +0 -1
- package/.next/static/chunks/6966-bb854d1145783a64.js +0 -1
- package/.next/static/chunks/app/layout-0fc249fb7de75a27.js +0 -1
- package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +0 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +0 -1
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_buildManifest.js +0 -0
- /package/.next/static/{wu7SUiHTirFcrpo5teyZ3 → QlCqLjorauDDBXPa-C7TK}/_ssgManifest.js +0 -0
|
@@ -24,6 +24,7 @@ const cli_patterns_2 = require("./cli-patterns");
|
|
|
24
24
|
const prompt_1 = require("./prompt");
|
|
25
25
|
const frame_1 = require("../frame");
|
|
26
26
|
const dialog_block_1 = require("../dialog-block");
|
|
27
|
+
const live_region_1 = require("./live-region");
|
|
27
28
|
const run_detection_1 = require("../run-detection");
|
|
28
29
|
const verified_against_1 = require("../verified-against");
|
|
29
30
|
const thinking_constants_1 = require("../../../../config/thinking-constants");
|
|
@@ -43,38 +44,6 @@ exports.VERIFIED_AGAINST = verified_against_1.CODEX_VERIFIED_AGAINST;
|
|
|
43
44
|
*/
|
|
44
45
|
const CODEX_CONFIRMATION_FOOTER_PATTERN = /press\s+(?:number|enter)\s+to\s+confirm/i;
|
|
45
46
|
const CODEX_NUMBERED_OPTION_PATTERN = /^\s*[❯›●]?\s*\d{1,2}[.)]\s/;
|
|
46
|
-
/**
|
|
47
|
-
* Index of the Codex status bar within the last 10 content rows, or -1.
|
|
48
|
-
*
|
|
49
|
-
* Issue #2818: a bar carrying a thread title or the Plan-mode badge after the
|
|
50
|
-
* path (codex 0.154.0+) is the same bar, so it is a boundary too. Without it
|
|
51
|
-
* such frames fell to branch D, whose 15-row tail still holds a finished
|
|
52
|
-
* turn's `• Ran …` record, and an idle session read `running`.
|
|
53
|
-
*/
|
|
54
|
-
function findCodexFooterBoundary(contentLines) {
|
|
55
|
-
for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
|
|
56
|
-
const line = contentLines[ci];
|
|
57
|
-
if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line) || cli_patterns_1.CODEX_TRAILED_STATUS_BAR_PATTERN.test(line))
|
|
58
|
-
return ci;
|
|
59
|
-
}
|
|
60
|
-
return -1;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Exclusive end of the conversation area — the row below the status bar, with
|
|
64
|
-
* the padding above it walked off (Issue #1928).
|
|
65
|
-
*
|
|
66
|
-
* The same boundary branches 0.8 and 2.7 compute inline, named once so
|
|
67
|
-
* `detectDialog` reads the region THEY read. Falls back to the whole frame when
|
|
68
|
-
* the bar cannot be located, which is Issue #1150's drift case: there the tail
|
|
69
|
-
* is the conversation, so the dialog rule still has the right rows.
|
|
70
|
-
*/
|
|
71
|
-
function findCodexContentEnd(contentLines) {
|
|
72
|
-
const boundary = findCodexFooterBoundary(contentLines);
|
|
73
|
-
let end = boundary >= 0 ? boundary - 1 : contentLines.length - 1;
|
|
74
|
-
while (end >= 0 && contentLines[end].trim() === '')
|
|
75
|
-
end--;
|
|
76
|
-
return end + 1;
|
|
77
|
-
}
|
|
78
47
|
/**
|
|
79
48
|
* Issue #1160: decide whether a Codex prompt that detectPrompt() matched is a stale,
|
|
80
49
|
* already-answered prompt left in the 50-line scan window rather than an active one.
|
|
@@ -98,7 +67,7 @@ function findCodexContentEnd(contentLines) {
|
|
|
98
67
|
* here — keeping the guard conservative against flipping a genuine prompt to running.
|
|
99
68
|
*/
|
|
100
69
|
function isCodexStalePrompt(contentLines) {
|
|
101
|
-
const footerBoundary = findCodexFooterBoundary(contentLines);
|
|
70
|
+
const footerBoundary = (0, live_region_1.findCodexFooterBoundary)(contentLines);
|
|
102
71
|
const end = footerBoundary >= 0 ? footerBoundary : contentLines.length;
|
|
103
72
|
let lastPromptIdx = -1;
|
|
104
73
|
let lastThinkingIdx = -1;
|
|
@@ -166,6 +135,8 @@ function isCodexDialogGlyphTail(raw) {
|
|
|
166
135
|
exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
167
136
|
tool: 'codex',
|
|
168
137
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
138
|
+
// Issue #3183: where the live part of the frame begins (`./live-region.ts`).
|
|
139
|
+
liveRegion: live_region_1.CODEX_LIVE_REGION,
|
|
169
140
|
beforePrompt(frame) {
|
|
170
141
|
const { contentLines } = frame;
|
|
171
142
|
// 0.6. The composer is the pane's bottom → no dialog is open (Issue #2841).
|
|
@@ -175,7 +146,11 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
175
146
|
// dialog is up, so a composer at the bottom vetoes all of them at once, and
|
|
176
147
|
// the chain goes on to the prompt / thinking / idle readings it would have
|
|
177
148
|
// reached had the transcript not quoted anything.
|
|
178
|
-
|
|
149
|
+
//
|
|
150
|
+
// Issue #3183: "the composer is the bottom" is the live region's
|
|
151
|
+
// `composerAtBottom`, located once by `normalizeFrame` from
|
|
152
|
+
// `CODEX_LIVE_REGION` (the #2841 reading, unchanged).
|
|
153
|
+
if ((0, frame_1.liveRegionOf)(frame, 'codex').composerAtBottom) {
|
|
179
154
|
return null;
|
|
180
155
|
}
|
|
181
156
|
// 0.7. Codex: pager / edit-previous (transcript) mode detection (Issue #1017)
|
|
@@ -213,7 +188,7 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
213
188
|
// interactive element and nothing but a keypress moves them: that is `waiting`.
|
|
214
189
|
// Checked ahead of prompt detection because the transcript rows on screen 2 are
|
|
215
190
|
// ordinary text that must not be read as options.
|
|
216
|
-
const codexLifecycleDialog = (0, cli_patterns_1.getCodexLifecycleDialog)(
|
|
191
|
+
const codexLifecycleDialog = (0, cli_patterns_1.getCodexLifecycleDialog)((0, frame_1.withLiveRegion)(frame, 'codex'));
|
|
217
192
|
if (codexLifecycleDialog === 'hooks-list' || codexLifecycleDialog === 'hooks-detail') {
|
|
218
193
|
return {
|
|
219
194
|
status: 'waiting',
|
|
@@ -238,7 +213,7 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
238
213
|
// Issue #1150: the status bar is located via CODEX_STATUS_BAR_PATTERN (version-
|
|
239
214
|
// independent; matches both legacy "N% left ·" and v0.141 "model · path" bars),
|
|
240
215
|
// and since #2818 via CODEX_TRAILED_STATUS_BAR_PATTERN too (0.154+ "· <title>").
|
|
241
|
-
const codexFooterBoundary = findCodexFooterBoundary(contentLines);
|
|
216
|
+
const codexFooterBoundary = (0, live_region_1.findCodexFooterBoundary)(contentLines);
|
|
242
217
|
let codexContentEnd = codexFooterBoundary >= 0 ? codexFooterBoundary - 1 : contentLines.length - 1;
|
|
243
218
|
while (codexContentEnd >= 0 && contentLines[codexContentEnd].trim() === '') {
|
|
244
219
|
codexContentEnd--;
|
|
@@ -310,7 +285,7 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
310
285
|
// block with codex working below it is scrollback, not a dialog — and the
|
|
311
286
|
// glyph rule agrees independently, because the bottom-most `›` on such a
|
|
312
287
|
// frame is the composer codex draws while it works.
|
|
313
|
-
const codexDialogFrame = (0, cli_patterns_2.readCodexDialogFrame)(frame.raw, contentLines, findCodexContentEnd(contentLines));
|
|
288
|
+
const codexDialogFrame = (0, cli_patterns_2.readCodexDialogFrame)(frame.raw, contentLines, (0, live_region_1.findCodexContentEnd)(contentLines));
|
|
314
289
|
if (codexDialogFrame && !isCodexStalePrompt(contentLines)) {
|
|
315
290
|
// The footer is not consulted for the verdict; an unrecognised one means
|
|
316
291
|
// codex reworded a screen, which is worth saying out loud exactly once.
|
|
@@ -343,7 +318,7 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
343
318
|
// Issue #2841: a prompt above the composer is conversation text, not a
|
|
344
319
|
// dialog — the same veto branch 0.6 applies to the status branches.
|
|
345
320
|
return (isCodexStalePrompt(frame.contentLines) ||
|
|
346
|
-
(0,
|
|
321
|
+
(0, frame_1.liveRegionOf)(frame, 'codex').composerAtBottom);
|
|
347
322
|
},
|
|
348
323
|
// §4 D1 決定 4 (Issue #1928). All three inputs are readings this module
|
|
349
324
|
// already performs for its status branches, passed rather than recomputed:
|
|
@@ -353,13 +328,15 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
353
328
|
// Issue #2841: Auto-Yes and `respond` act on this answer, so it takes the
|
|
354
329
|
// same veto as the status branches — before the lifecycle screens too, whose
|
|
355
330
|
// wording (`Do you trust …`) can be quoted like any other.
|
|
356
|
-
|
|
357
|
-
|
|
331
|
+
// Issue #3183: the veto itself is applied by `createToolStatusDetector`'s
|
|
332
|
+
// wrapper from the live region, for every tool; this early return only
|
|
333
|
+
// saves the parse.
|
|
334
|
+
if ((0, frame_1.liveRegionOf)(frame, 'codex').composerAtBottom)
|
|
358
335
|
return null;
|
|
359
336
|
return (0, prompt_1.detectCodexDialog)(frame, {
|
|
360
|
-
contentEnd,
|
|
337
|
+
contentEnd: (0, live_region_1.findCodexContentEnd)(frame.contentLines),
|
|
361
338
|
stalePrompt: isCodexStalePrompt(frame.contentLines),
|
|
362
|
-
lifecycleDialog: (0, cli_patterns_1.getCodexLifecycleDialog)(
|
|
339
|
+
lifecycleDialog: (0, cli_patterns_1.getCodexLifecycleDialog)((0, frame_1.withLiveRegion)(frame, 'codex')),
|
|
363
340
|
});
|
|
364
341
|
},
|
|
365
342
|
afterThinking(frame) {
|
|
@@ -370,7 +347,7 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
370
347
|
// A. Thinking indicators (• Ran, • Planning) in the conversation area → should show spinner
|
|
371
348
|
// B. Idle prompt (›) at the end of the conversation area → should show ready
|
|
372
349
|
// Strategy: find the Codex status bar, extract content above it, then check for thinking/idle.
|
|
373
|
-
const codexFooterBoundary = findCodexFooterBoundary(contentLines);
|
|
350
|
+
const codexFooterBoundary = (0, live_region_1.findCodexFooterBoundary)(contentLines);
|
|
374
351
|
if (codexFooterBoundary >= 0) {
|
|
375
352
|
// Find last non-empty content line above footer (skip padding + input area)
|
|
376
353
|
let lastContentIdx = codexFooterBoundary - 1;
|
|
@@ -477,13 +454,16 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
477
454
|
* `detectDialog` vouches for, so the same words quoted in a reply do not count.
|
|
478
455
|
* `/prompt-response` does not call this and keeps accepting an answer.
|
|
479
456
|
*
|
|
480
|
-
* @param cleanOutput - The capture Auto-Yes judged (ANSI and box drawing
|
|
457
|
+
* @param cleanOutput - The capture Auto-Yes judged (ANSI and box drawing
|
|
458
|
+
* stripped), or the frame the poller normalised once for the tick (Issue #3183)
|
|
481
459
|
*/
|
|
482
460
|
function isCodexModelPickerFrame(cleanOutput) {
|
|
483
|
-
const frame =
|
|
461
|
+
const frame = typeof cleanOutput === 'string'
|
|
462
|
+
? (0, frame_1.normalizeFrame)(cleanOutput, 'codex')
|
|
463
|
+
: (0, frame_1.withLiveRegion)(cleanOutput, 'codex');
|
|
484
464
|
if (!exports.codexStatusDetector.detectDialog(frame))
|
|
485
465
|
return false;
|
|
486
|
-
const contentEnd = findCodexContentEnd(frame.contentLines);
|
|
466
|
+
const contentEnd = (0, live_region_1.findCodexContentEnd)(frame.contentLines);
|
|
487
467
|
const block = (0, dialog_block_1.findNumberedOptionBlock)((0, cli_patterns_1.stripBoxDrawing)(frame.clean).split('\n'), contentEnd);
|
|
488
468
|
return (block !== null &&
|
|
489
469
|
(cli_patterns_1.CODEX_PICKER_FOOTER_PATTERN.test(block.footer) ||
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex's live region (Issue #3183; design doc §7 "codex").
|
|
4
|
+
*
|
|
5
|
+
* - **composer** — the bottom-most genuine `›` row ({@link findCodexComposerRow},
|
|
6
|
+
* the #892 rule), with "is it the bottom of the pane?" answered by
|
|
7
|
+
* {@link isCodexComposerAtBottom} (the #2841 rule: the RAW glyph row's SGR
|
|
8
|
+
* first, the stripped last content row otherwise). Before #3183 those were two
|
|
9
|
+
* separate readings in two files; they are now the two halves of one marker.
|
|
10
|
+
* Measured: `codex-dialogs-0157/quoted-approval-idle.txt` L997 (composer) under
|
|
11
|
+
* the quotation at L40-L49.
|
|
12
|
+
* - **dialog top** — not declared. codex removes its composer while a dialog is
|
|
13
|
+
* open and the dialog takes the bottom of the pane (`codex-dialogs-0157/
|
|
14
|
+
* approval.txt` L987-L1000), so the whole frame is the right fallback.
|
|
15
|
+
*
|
|
16
|
+
* @module lib/detection/tools/codex/live-region
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.CODEX_LIVE_REGION = void 0;
|
|
20
|
+
exports.findCodexFooterBoundary = findCodexFooterBoundary;
|
|
21
|
+
exports.findCodexContentEnd = findCodexContentEnd;
|
|
22
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
23
|
+
const cli_patterns_2 = require("./cli-patterns");
|
|
24
|
+
const live_region_1 = require("../live-region");
|
|
25
|
+
/**
|
|
26
|
+
* Index of the Codex status bar within the last 10 content rows, or -1.
|
|
27
|
+
*
|
|
28
|
+
* Issue #2818: a bar carrying a thread title or the Plan-mode badge after the
|
|
29
|
+
* path (codex 0.154.0+) is the same bar, so it is a boundary too. Without it
|
|
30
|
+
* such frames fell to branch D, whose 15-row tail still holds a finished
|
|
31
|
+
* turn's `• Ran …` record, and an idle session read `running`.
|
|
32
|
+
*/
|
|
33
|
+
function findCodexFooterBoundary(contentLines) {
|
|
34
|
+
for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
|
|
35
|
+
const line = contentLines[ci];
|
|
36
|
+
if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line) || cli_patterns_1.CODEX_TRAILED_STATUS_BAR_PATTERN.test(line))
|
|
37
|
+
return ci;
|
|
38
|
+
}
|
|
39
|
+
return -1;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Exclusive end of the conversation area — the row below the status bar, with
|
|
43
|
+
* the padding above it walked off (Issue #1928).
|
|
44
|
+
*
|
|
45
|
+
* Falls back to the whole frame when the bar cannot be located, which is
|
|
46
|
+
* Issue #1150's drift case: there the tail is the conversation, so the dialog
|
|
47
|
+
* rule still has the right rows.
|
|
48
|
+
*/
|
|
49
|
+
function findCodexContentEnd(contentLines) {
|
|
50
|
+
const boundary = findCodexFooterBoundary(contentLines);
|
|
51
|
+
let end = boundary >= 0 ? boundary - 1 : contentLines.length - 1;
|
|
52
|
+
while (end >= 0 && contentLines[end].trim() === '')
|
|
53
|
+
end--;
|
|
54
|
+
return end + 1;
|
|
55
|
+
}
|
|
56
|
+
exports.CODEX_LIVE_REGION = {
|
|
57
|
+
composer: {
|
|
58
|
+
locate({ raw, contentLines }) {
|
|
59
|
+
const contentEnd = findCodexContentEnd(contentLines);
|
|
60
|
+
const atBottom = (0, cli_patterns_2.isCodexComposerAtBottom)(raw, contentLines, contentEnd);
|
|
61
|
+
const row = (0, cli_patterns_1.findCodexComposerRow)(contentLines);
|
|
62
|
+
if (row >= 0)
|
|
63
|
+
return { start: row, end: row, atBottom };
|
|
64
|
+
if (!atBottom)
|
|
65
|
+
return null;
|
|
66
|
+
// The raw glyph row said "composer" although its text reads as a numbered
|
|
67
|
+
// row (a hand-typed `1. buy milk`): the composer is the last content row.
|
|
68
|
+
const start = (0, live_region_1.lastContentRow)(contentLines.slice(0, contentEnd));
|
|
69
|
+
return start < 0 ? null : { start, end: start, atBottom: true };
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
composerHidesDialogs: true,
|
|
73
|
+
};
|
|
@@ -139,6 +139,8 @@ const selection_shape_1 = require("../../selection-shape");
|
|
|
139
139
|
const dialog_1 = require("./dialog");
|
|
140
140
|
const permission_1 = require("./permission");
|
|
141
141
|
const status_reason_1 = require("../../status-reason");
|
|
142
|
+
const live_region_1 = require("./live-region");
|
|
143
|
+
const frame_1 = require("../frame");
|
|
142
144
|
const run_detection_1 = require("../run-detection");
|
|
143
145
|
const verified_against_1 = require("../verified-against");
|
|
144
146
|
/** Command Code build these rules were read off (value in ../verified-against). */
|
|
@@ -146,7 +148,16 @@ exports.VERIFIED_AGAINST = verified_against_1.COMMAND_CODE_VERIFIED_AGAINST;
|
|
|
146
148
|
exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
147
149
|
tool: 'command-code',
|
|
148
150
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
151
|
+
// Issue #3183: where the live part of the frame begins (`./live-region.ts`).
|
|
152
|
+
liveRegion: live_region_1.COMMAND_CODE_LIVE_REGION,
|
|
149
153
|
beforePrompt(frame) {
|
|
154
|
+
// Issue #3183: an input box at the bottom of the pane means none of the
|
|
155
|
+
// three overlays below is open — each replaces the input box — so a footer
|
|
156
|
+
// the conversation quotes cannot reach them, whatever window it sits in.
|
|
157
|
+
// The live region says so once for every rule; the `…AtBottom` readings
|
|
158
|
+
// below (#2846) still decide the frames that have no input box.
|
|
159
|
+
if ((0, frame_1.liveRegionOf)(frame, 'command-code').composerAtBottom)
|
|
160
|
+
return null;
|
|
150
161
|
// Issue #2761. The plan review overlay, read off its two footer rows.
|
|
151
162
|
//
|
|
152
163
|
// `beforePrompt` and not `afterPrompt`, and that placement is the point: the
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Command Code's live region (Issue #3183; design doc §7 "command-code").
|
|
4
|
+
*
|
|
5
|
+
* - **composer** — the input box between two rules pinned to the bottom, with a
|
|
6
|
+
* `❯` row under the opening rule (`findCommandCodeChromeStart`, the same
|
|
7
|
+
* shape as claude's). A `❯ 1.` row there is a question dialog's cursor, not
|
|
8
|
+
* the composer, and is refused. Measured: `tui-frame-footer-2776/
|
|
9
|
+
* command-code-1.58.0-idle-quoted-footers.txt` L29-L32 under the quoted
|
|
10
|
+
* footers at L18-L21.
|
|
11
|
+
* - **dialog top** — the rule above the first option of a dialog closed by the
|
|
12
|
+
* `↑/↓ navigate · enter select` footer. Measured: `command-code-live-2250/
|
|
13
|
+
* dialog-shell-command.txt` L29 / L36 / L40.
|
|
14
|
+
*
|
|
15
|
+
* @module lib/detection/tools/command-code/live-region
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.COMMAND_CODE_LIVE_REGION = void 0;
|
|
19
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
20
|
+
const live_region_1 = require("../live-region");
|
|
21
|
+
/** A numbered cursor row (`❯ 1. Yes`) — a dialog's, never the composer's. */
|
|
22
|
+
const NUMBERED_CURSOR_ROW = /^❯\s*\d{1,2}[.)]\s/;
|
|
23
|
+
exports.COMMAND_CODE_LIVE_REGION = {
|
|
24
|
+
composer: (0, live_region_1.fencedComposer)(lines => {
|
|
25
|
+
const start = (0, cli_patterns_1.findCommandCodeChromeStart)(lines);
|
|
26
|
+
if (start < 0)
|
|
27
|
+
return -1;
|
|
28
|
+
return NUMBERED_CURSOR_ROW.test((0, cli_patterns_1.stripAnsi)(lines[start + 1] ?? '')) ? -1 : start;
|
|
29
|
+
}),
|
|
30
|
+
dialogTop: (0, live_region_1.ruleAboveOptionRun)({
|
|
31
|
+
footer: row => /↑\/↓ navigate · enter select/.test(row),
|
|
32
|
+
rule: /^─{10,}$/,
|
|
33
|
+
maxRows: 120,
|
|
34
|
+
}),
|
|
35
|
+
composerHidesDialogs: true,
|
|
36
|
+
};
|
|
@@ -15,6 +15,7 @@ const cli_patterns_1 = require("../../cli-patterns");
|
|
|
15
15
|
const prompt_detector_1 = require("../../prompt-detector");
|
|
16
16
|
const status_reason_1 = require("../../status-reason");
|
|
17
17
|
const prompt_1 = require("./prompt");
|
|
18
|
+
const live_region_1 = require("./live-region");
|
|
18
19
|
const run_detection_1 = require("../run-detection");
|
|
19
20
|
const verified_against_1 = require("../verified-against");
|
|
20
21
|
/** copilot-cli build these rules were read off (#1885 / #1895; value in ../verified-against, #1929). */
|
|
@@ -39,6 +40,8 @@ function readIdleEvidence(frame) {
|
|
|
39
40
|
exports.copilotStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
40
41
|
tool: 'copilot',
|
|
41
42
|
verifiedAgainst: exports.VERIFIED_AGAINST,
|
|
43
|
+
// Issue #3183: where the live part of the frame begins (`./live-region.ts`).
|
|
44
|
+
liveRegion: live_region_1.COPILOT_LIVE_REGION,
|
|
42
45
|
beforePrompt(frame) {
|
|
43
46
|
// 0. Copilot: picker detection BEFORE thinking detection
|
|
44
47
|
// COPILOT_THINKING_PATTERN includes "Reasoning\s+[■▪▮]" which matches the
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copilot's live region (Issue #3183; design doc §7 "copilot").
|
|
4
|
+
*
|
|
5
|
+
* - **composer** — the bottom chrome `findCopilotChromeStart` locates: the cwd
|
|
6
|
+
* row, the fenced composer (`─` rules on 1.0.80, `╻▄` / `╹▀` frames on
|
|
7
|
+
* 1.0.82) and the status bar under it. Measured: `copilot-live-1885/
|
|
8
|
+
* turn-complete.txt` L997-L1001 (1.0.80) and `copilot-live-2269/
|
|
9
|
+
* turn-complete.txt` L996-L1000 (1.0.82).
|
|
10
|
+
* - **dialog top** — the `╭` corner the bottom `╰` row closes. copilot draws its
|
|
11
|
+
* dialogs in a box over the whole bottom of the pane, chrome gone. Measured:
|
|
12
|
+
* `copilot-live-1885/permission-dialog.txt` L987 / L1001 (1.0.80; 1.0.82's
|
|
13
|
+
* dialog has not been captured — design doc §6 item 3).
|
|
14
|
+
*
|
|
15
|
+
* `composerHidesDialogs: false`: the `/model` picker is drawn with the fenced
|
|
16
|
+
* composer still on screen (`copilot-live-1885/model-picker.txt`; the comment
|
|
17
|
+
* on `findCopilotChromeStart` records the blank header row it leaves), so only
|
|
18
|
+
* numbered readings are vetoed by it. The numbered permission dialog replaces
|
|
19
|
+
* the chrome (`permission-dialog.txt`).
|
|
20
|
+
*
|
|
21
|
+
* @module lib/detection/tools/copilot/live-region
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.COPILOT_LIVE_REGION = void 0;
|
|
25
|
+
const cli_patterns_1 = require("../../cli-patterns");
|
|
26
|
+
const live_region_1 = require("../live-region");
|
|
27
|
+
/** How far above the bottom row the box's closing corner may sit. */
|
|
28
|
+
const BOX_BOTTOM_MAX_ROWS = 2;
|
|
29
|
+
/** How tall a dialog box may be before it stops looking like one. */
|
|
30
|
+
const BOX_MAX_ROWS = 120;
|
|
31
|
+
function findCopilotDialogBoxTop(lines) {
|
|
32
|
+
const last = (0, live_region_1.lastContentRow)(lines);
|
|
33
|
+
let bottom = -1;
|
|
34
|
+
for (let i = last; i >= Math.max(0, last - BOX_BOTTOM_MAX_ROWS); i--) {
|
|
35
|
+
if (lines[i].trimStart().startsWith('╰')) {
|
|
36
|
+
bottom = i;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (bottom < 0)
|
|
41
|
+
return -1;
|
|
42
|
+
for (let i = bottom - 1; i >= Math.max(0, bottom - BOX_MAX_ROWS); i--) {
|
|
43
|
+
if (lines[i].trimStart().startsWith('╭'))
|
|
44
|
+
return i;
|
|
45
|
+
}
|
|
46
|
+
return -1;
|
|
47
|
+
}
|
|
48
|
+
exports.COPILOT_LIVE_REGION = {
|
|
49
|
+
composer: (0, live_region_1.fencedComposer)(lines => (0, cli_patterns_1.findCopilotChromeStart)(lines)),
|
|
50
|
+
dialogTop: (0, live_region_1.dialogTopFrom)(findCopilotDialogBoxTop),
|
|
51
|
+
composerHidesDialogs: false,
|
|
52
|
+
};
|
|
@@ -12,9 +12,13 @@
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.STATUS_CHECK_LINE_COUNT = void 0;
|
|
14
14
|
exports.normalizeFrame = normalizeFrame;
|
|
15
|
+
exports.liveRegionOf = liveRegionOf;
|
|
16
|
+
exports.withLiveRegion = withLiveRegion;
|
|
15
17
|
const cli_patterns_1 = require("../cli-patterns");
|
|
16
18
|
const tui_detection_frame_1 = require("../tui-detection-frame");
|
|
17
19
|
const thinking_constants_1 = require("../../../config/thinking-constants");
|
|
20
|
+
const live_region_specs_1 = require("./live-region-specs");
|
|
21
|
+
const live_region_1 = require("./live-region");
|
|
18
22
|
/**
|
|
19
23
|
* Number of lines from the end to check for prompt and input indicators.
|
|
20
24
|
*
|
|
@@ -23,8 +27,17 @@ const thinking_constants_1 = require("../../../config/thinking-constants");
|
|
|
23
27
|
* existing importers are unaffected.
|
|
24
28
|
*/
|
|
25
29
|
exports.STATUS_CHECK_LINE_COUNT = 15;
|
|
26
|
-
/**
|
|
27
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Build the shared {@link NormalizedFrame} for one capture.
|
|
32
|
+
*
|
|
33
|
+
* @param output - The capture. Pass it as captured (ANSI and box drawing
|
|
34
|
+
* intact): the input-box markers of claude / Command Code / copilot / opencode
|
|
35
|
+
* are rule rows that `stripBoxDrawing` blanks.
|
|
36
|
+
* @param tool - The CLI the capture came from. Names the live-region declaration
|
|
37
|
+
* to apply (Issue #3183); omitted, the region is the whole frame — the reading
|
|
38
|
+
* every rule had before.
|
|
39
|
+
*/
|
|
40
|
+
function normalizeFrame(output, tool) {
|
|
28
41
|
const clean = (0, tui_detection_frame_1.normalizeTuiFrameForDetection)((0, cli_patterns_1.stripAnsi)(output));
|
|
29
42
|
const lines = clean.split('\n');
|
|
30
43
|
// Strip trailing empty lines (tmux terminal padding) before windowing.
|
|
@@ -40,8 +53,29 @@ function normalizeFrame(output) {
|
|
|
40
53
|
clean,
|
|
41
54
|
lines,
|
|
42
55
|
contentLines,
|
|
56
|
+
liveRegion: (0, live_region_1.locateLiveRegion)(tool === undefined ? undefined : live_region_specs_1.LIVE_REGION_SPECS[tool], tool ?? null, {
|
|
57
|
+
raw: output,
|
|
58
|
+
contentLines,
|
|
59
|
+
}),
|
|
43
60
|
lastLines: contentLines.slice(-exports.STATUS_CHECK_LINE_COUNT).join('\n'),
|
|
44
61
|
// DR-003: Separate thinking detection window (5 lines) from prompt detection window (15 lines)
|
|
45
62
|
thinkingLines: contentLines.slice(-thinking_constants_1.THINKING_TAIL_LINE_COUNT).join('\n'),
|
|
46
63
|
};
|
|
47
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* The live region of `frame` as `tool` declares it (Issue #3183).
|
|
67
|
+
*
|
|
68
|
+
* `frame.liveRegion` when the frame was normalised for `tool`; recomputed
|
|
69
|
+
* otherwise — a caller that built the frame without naming the tool (older
|
|
70
|
+
* call sites, tests) still gets the tool's own reading, never a stale one.
|
|
71
|
+
*/
|
|
72
|
+
function liveRegionOf(frame, tool) {
|
|
73
|
+
if (frame.liveRegion.tool === tool)
|
|
74
|
+
return frame.liveRegion;
|
|
75
|
+
return (0, live_region_1.locateLiveRegion)(live_region_specs_1.LIVE_REGION_SPECS[tool], tool, { raw: frame.raw, contentLines: frame.contentLines });
|
|
76
|
+
}
|
|
77
|
+
/** `frame` with its live region located for `tool` (the same object when it already is). */
|
|
78
|
+
function withLiveRegion(frame, tool) {
|
|
79
|
+
const liveRegion = liveRegionOf(frame, tool);
|
|
80
|
+
return liveRegion === frame.liveRegion ? frame : { ...frame, liveRegion };
|
|
81
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Every tool's live-region declaration, by tool (Issue #3183).
|
|
4
|
+
*
|
|
5
|
+
* A table of its own rather than a lookup through the detector registry:
|
|
6
|
+
* `normalizeFrame` reads it, and the detector modules import `normalizeFrame`,
|
|
7
|
+
* so going through `registry.ts` would close an import cycle. Each detector
|
|
8
|
+
* declares the same object as its `ToolDetectorSpec.liveRegion`, and
|
|
9
|
+
* `detector-contract.test.ts` holds the two to identity.
|
|
10
|
+
*
|
|
11
|
+
* `gemini` and `vibe-local` have no measured frames and no declaration: their
|
|
12
|
+
* frames carry the whole-frame region, which is the pre-#3183 reading.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.LIVE_REGION_SPECS = void 0;
|
|
16
|
+
const live_region_1 = require("./antigravity/live-region");
|
|
17
|
+
const live_region_2 = require("./claude/live-region");
|
|
18
|
+
const live_region_3 = require("./codex/live-region");
|
|
19
|
+
const live_region_4 = require("./command-code/live-region");
|
|
20
|
+
const live_region_5 = require("./copilot/live-region");
|
|
21
|
+
const live_region_6 = require("./opencode/live-region");
|
|
22
|
+
const live_region_7 = require("./opencode-v2/live-region");
|
|
23
|
+
exports.LIVE_REGION_SPECS = {
|
|
24
|
+
claude: live_region_2.CLAUDE_LIVE_REGION,
|
|
25
|
+
codex: live_region_3.CODEX_LIVE_REGION,
|
|
26
|
+
antigravity: live_region_1.ANTIGRAVITY_LIVE_REGION,
|
|
27
|
+
'command-code': live_region_4.COMMAND_CODE_LIVE_REGION,
|
|
28
|
+
copilot: live_region_5.COPILOT_LIVE_REGION,
|
|
29
|
+
opencode: live_region_6.OPENCODE_LIVE_REGION,
|
|
30
|
+
'opencode-v2': live_region_7.OPENCODE_V2_LIVE_REGION,
|
|
31
|
+
};
|