commandmate 0.47.2 → 0.49.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 +180 -180
- package/.next/app-path-routes-manifest.json +30 -30
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +3 -3
- 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.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.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_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 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- 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_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.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +12 -12
- 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 +30 -30
- package/.next/server/chunks/1191.js +11 -4
- package/.next/server/chunks/1501.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1656.js +2 -2
- package/.next/server/chunks/1945.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/255.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3505.js +2 -2
- package/.next/server/chunks/4243.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/4280.js +1 -0
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/6119.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6486.js +9 -8
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/720.js +103 -0
- package/.next/server/chunks/7604.js +2 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +8 -8
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8807.js +19 -18
- package/.next/server/chunks/8918.js +2 -104
- package/.next/server/chunks/936.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -1
- package/.next/server/chunks/9627.js +5 -5
- package/.next/server/chunks/9731.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/static/chunks/1128-914c559913546bbc.js +1 -0
- package/.next/static/chunks/{2407-a6533805a86d05bd.js → 2407-ab92ae9837c39dce.js} +1 -1
- package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-7173dc305dffc4f6.js} +1 -1
- package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
- package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
- package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
- package/.next/static/chunks/9079-987939d231704218.js +1 -0
- package/.next/static/chunks/app/{layout-538d8d2746ad1588.js → layout-aa8e66164a4367af.js} +1 -1
- package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +1 -0
- package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/auto-yes.d.ts +24 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +76 -8
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +5 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +10 -1
- package/dist/cli/commands/prompt.d.ts.map +1 -1
- package/dist/cli/commands/prompt.js +5 -3
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +19 -6
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +8 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +101 -13
- package/dist/cli/config/duration-constants.d.ts +16 -13
- package/dist/cli/config/duration-constants.d.ts.map +1 -1
- package/dist/cli/config/duration-constants.js +21 -21
- package/dist/cli/docs/agent-operations.d.ts +2 -2
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +29 -1
- package/dist/cli/types/api-responses.d.ts +145 -3
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +4 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.d.ts +0 -18
- package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
- package/dist/cli/utils/resource-resolvers.js +1 -51
- package/dist/cli/utils/verify-runner.d.ts +24 -1
- package/dist/cli/utils/verify-runner.d.ts.map +1 -1
- package/dist/cli/utils/verify-runner.js +54 -1
- package/dist/config/auto-yes-duration.d.ts +56 -0
- package/dist/config/auto-yes-duration.d.ts.map +1 -0
- package/dist/config/auto-yes-duration.js +76 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +54 -2
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +33 -2
- package/dist/lib/prompt-observation/types.d.ts +13 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +2 -1
- package/dist/server/locales/ja/worktree.json +2 -1
- package/dist/server/src/config/auto-yes-config.js +14 -19
- package/dist/server/src/config/auto-yes-duration.js +76 -0
- package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
- package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
- package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
- package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
- package/dist/server/src/lib/auto-yes-poller.js +337 -376
- package/dist/server/src/lib/auto-yes-state.js +59 -4
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +235 -19
- package/dist/server/src/lib/db/chat-db.js +5 -1
- package/dist/server/src/lib/db/verification-db.js +23 -2
- package/dist/server/src/lib/detection/composer-text.js +215 -11
- package/dist/server/src/lib/detection/option-recommendation.js +120 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
- package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +402 -539
- package/dist/server/src/lib/detection/prompt-detector.js +92 -21
- package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
- package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
- package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
- package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
- package/dist/server/src/lib/detection/upstream-faults.js +19 -2
- package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +7 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +3 -0
- package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +34 -3
- package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
- package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
- package/dist/server/src/lib/polling/auto-yes-manual-answer.js +124 -0
- package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
- package/dist/server/src/lib/polling/auto-yes-policy.js +11 -5
- package/dist/server/src/lib/polling/auto-yes-poller-capture.js +15 -2
- package/dist/server/src/lib/polling/auto-yes-poller-generation.js +42 -1
- package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +42 -5
- package/dist/server/src/lib/polling/auto-yes-poller-state.js +147 -49
- package/dist/server/src/lib/polling/auto-yes-poller-steps.js +172 -2
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +2 -2
- package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
- package/dist/server/src/lib/polling/auto-yes-resolver.js +96 -21
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +33 -2
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
- package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
- package/dist/server/src/lib/polling/response-checker.js +145 -58
- package/dist/server/src/lib/prompt-answer-sender.js +104 -10
- package/dist/server/src/lib/push/notification-dedup.js +15 -2
- package/dist/server/src/lib/push/prompt-card-state.js +140 -19
- package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
- package/dist/server/src/lib/push/push-sender.js +23 -3
- package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
- package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
- package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
- package/dist/server/src/lib/session/agent-event-state.js +25 -5
- package/dist/server/src/lib/session/agent-event-turn.js +140 -46
- package/dist/server/src/lib/session/cli-session.js +21 -2
- package/dist/server/src/lib/session/composer-clear.js +56 -4
- package/dist/server/src/lib/session/current-output-builder.js +66 -12
- package/dist/server/src/lib/session/send-attempt-state.js +24 -7
- package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
- package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
- package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
- package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
- package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
- package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
- package/dist/server/src/lib/session/waiting-episode-state.js +68 -91
- package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
- package/dist/server/src/lib/tmux/tmux.js +79 -9
- package/dist/server/src/lib/verification/gate-runner.js +172 -16
- package/dist/server/src/lib/verification/machine-lock.js +5 -0
- package/dist/server/src/lib/ws-server.js +18 -3
- package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
- package/dist/server/src/types/auto-yes-decision.js +61 -0
- package/dist/server/src/types/auto-yes.js +6 -0
- package/dist/server/src/types/prompt-reading.js +32 -0
- package/dist/types/auto-yes-answer-mode.d.ts +35 -0
- package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
- package/dist/types/auto-yes-answer-mode.js +38 -0
- package/docs/en/user-guide/webapp-guide.md +47 -13
- package/package.json +1 -1
- package/public/sw.js +76 -4
- package/release-notes/0.48.0.json +57 -0
- package/release-notes/0.49.0.json +45 -0
- package/.next/server/chunks/1559.js +0 -2
- package/.next/server/chunks/2460.js +0 -1
- package/.next/server/chunks/5595.js +0 -1
- package/.next/server/chunks/610.js +0 -1
- package/.next/server/chunks/6722.js +0 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
- package/.next/static/chunks/602-1c1488959215e140.js +0 -1
- package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
- package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-46aced20b2b1c010.js +0 -1
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
|
@@ -93,12 +93,25 @@
|
|
|
93
93
|
* server does. That is deliberate — `useTerminalPanePolling` derives the
|
|
94
94
|
* composer text client-side from the frame it already has, which keeps the
|
|
95
95
|
* WebSocket push path and the HTTP poll path from disagreeing.
|
|
96
|
+
*
|
|
97
|
+
* That is also why the "a dialog below the composer means no composer" rule
|
|
98
|
+
* (Issue #3927, {@link codexDialogBelow}) lives here rather than next to the
|
|
99
|
+
* clear in `session/composer-clear.ts`: the clear, the published
|
|
100
|
+
* `composerText` and the browser's own reading all go through
|
|
101
|
+
* {@link extractLiveComposerText}, and `tools/codex/cli-patterns.ts`, whose
|
|
102
|
+
* `readCodexGlyphRowKind` the rule was first written on, imports the logger.
|
|
96
103
|
*/
|
|
97
104
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
98
105
|
exports.SUPPORTED_COMPOSER_TOOLS = exports.COMPOSER_TEXT_MAX_CHARS = void 0;
|
|
99
106
|
exports.findClaudeInputBox = findClaudeInputBox;
|
|
107
|
+
exports.isCodexComposerRow = isCodexComposerRow;
|
|
108
|
+
exports.isCodexBoldGutterRow = isCodexBoldGutterRow;
|
|
109
|
+
exports.findCodexLiveComposerRow = findCodexLiveComposerRow;
|
|
110
|
+
exports.codexDialogBelow = codexDialogBelow;
|
|
100
111
|
exports.findCodexInputBox = findCodexInputBox;
|
|
101
112
|
exports.extractComposerText = extractComposerText;
|
|
113
|
+
exports.extractLiveComposerText = extractLiveComposerText;
|
|
114
|
+
exports.readCodexComposerFrom = readCodexComposerFrom;
|
|
102
115
|
const ansi_1 = require("./ansi");
|
|
103
116
|
/**
|
|
104
117
|
* Upper bound on the published composer text.
|
|
@@ -208,6 +221,10 @@ function isBlankRow(line) {
|
|
|
208
221
|
* A bare `\u203A` with nothing after it is accepted: `capture-pane` trims trailing
|
|
209
222
|
* whitespace, so that is what a composer with neither text nor placeholder looks
|
|
210
223
|
* like, and calling it `no_composer` would be a worse answer than `empty`.
|
|
224
|
+
*
|
|
225
|
+
* Exported for the send path (Issue #3906): when {@link findCodexInputBox}'s
|
|
226
|
+
* block bound cannot reach a composer split by many blank rows, the sender
|
|
227
|
+
* still has to tell the real `\u203A` row from these look-alikes.
|
|
211
228
|
*/
|
|
212
229
|
function isCodexComposerRow(line) {
|
|
213
230
|
if (line === undefined)
|
|
@@ -226,6 +243,120 @@ function isCodexComposerRow(line) {
|
|
|
226
243
|
const firstText = chars.slice(2).find(c => c.ch !== ' ');
|
|
227
244
|
return firstText === undefined || !firstText.bold;
|
|
228
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Whether a codex `\u203A` row has its gutter space inside the glyph's bold span
|
|
248
|
+
* (Issue #3906).
|
|
249
|
+
*
|
|
250
|
+
* codex also draws the transcript echo of a sent message with a bold glyph that
|
|
251
|
+
* is NOT dim — `ESC[1m\u203A ESC[0m` + text (measured on 0.153.2 and 0.160.0:
|
|
252
|
+
* `tests/fixtures/codex-live-2310/turn-submitted-no-status.txt:36`,
|
|
253
|
+
* `codex-multiline-composer-3205/tc104-raw-pane.txt:20`,
|
|
254
|
+
* `codex-dialogs-0157/approval.txt:24`) — which {@link isCodexComposerRow}
|
|
255
|
+
* accepts. Every measured composer resets right after its glyph
|
|
256
|
+
* (`ESC[1m\u203AESC[0m `), and every echo carries the space in the glyph's span,
|
|
257
|
+
* dim or not. {@link findCodexInputBox} does not need this — it only looks at
|
|
258
|
+
* the frame's last blocks, where the live composer is — but a search that climbs
|
|
259
|
+
* past them into the transcript does.
|
|
260
|
+
*/
|
|
261
|
+
function isCodexBoldGutterRow(line) {
|
|
262
|
+
if (line === undefined)
|
|
263
|
+
return false;
|
|
264
|
+
const chars = scanAttributedChars(line);
|
|
265
|
+
return chars.length > 1 && chars[0].ch === CODEX_PROMPT_GLYPH && chars[1].ch === ' ' && chars[1].bold;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Classify one raw codex row whose first rendered glyph is `\u203A` (Issue #3927).
|
|
269
|
+
*
|
|
270
|
+
* The same reading as `readCodexGlyphRowKind` in `tools/codex/cli-patterns.ts`,
|
|
271
|
+
* re-stated on this module's SGR scan because that module imports the logger
|
|
272
|
+
* and this one is read by the browser bundle. In order: no attributes at all →
|
|
273
|
+
* null (a stripped capture, where every `\u203A` use reads the same); a dim
|
|
274
|
+
* glyph → the transcript echo; a bold label → a dialog option; a dim label →
|
|
275
|
+
* the composer's placeholder; a coloured glyph whose label is drawn in the
|
|
276
|
+
* same colour → a dialog option (from 0.155.1 the composer's glyph is
|
|
277
|
+
* coloured too, but it resets before its label); anything else → the composer.
|
|
278
|
+
* `tests/unit/lib/detection/composer-text-dialog-below-3927.test.ts` holds the
|
|
279
|
+
* two readings equal over the codex fixtures.
|
|
280
|
+
*
|
|
281
|
+
* @param rawRow - One row of the capture, ANSI intact
|
|
282
|
+
*/
|
|
283
|
+
function readCodexGlyphRow(rawRow) {
|
|
284
|
+
if (!rawRow.includes('\x1b'))
|
|
285
|
+
return null;
|
|
286
|
+
const chars = scanAttributedChars(rawRow);
|
|
287
|
+
const glyphIndex = chars.findIndex(c => c.ch.trim() !== '');
|
|
288
|
+
if (glyphIndex < 0 || chars[glyphIndex].ch !== CODEX_PROMPT_GLYPH)
|
|
289
|
+
return null;
|
|
290
|
+
const glyph = chars[glyphIndex];
|
|
291
|
+
if (glyph.dim)
|
|
292
|
+
return 'transcript-echo';
|
|
293
|
+
const label = chars.slice(glyphIndex + 1).find(c => c.ch.trim() !== '');
|
|
294
|
+
if (label?.bold)
|
|
295
|
+
return 'option';
|
|
296
|
+
if (label?.dim)
|
|
297
|
+
return 'composer';
|
|
298
|
+
if (glyph.fg !== null && label?.fg === glyph.fg)
|
|
299
|
+
return 'option';
|
|
300
|
+
return 'composer';
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* A composer row by every reading: {@link isCodexComposerRow}, and not the
|
|
304
|
+
* bold-not-dim echo ({@link isCodexBoldGutterRow}). The caller has already had
|
|
305
|
+
* {@link readCodexGlyphRow} call it `'composer'`, which also requires ANSI
|
|
306
|
+
* attributes: an attribute-free `\u203A` row (a stripped capture, where a dialog
|
|
307
|
+
* option reads the same as a composer) is never taken (Issue #3906).
|
|
308
|
+
*/
|
|
309
|
+
function isLiveComposerRow(row) {
|
|
310
|
+
return isCodexComposerRow(row) && !isCodexBoldGutterRow(row);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* The live codex composer's `\u203A` row, wherever it is in the frame (Issue #3906).
|
|
314
|
+
*
|
|
315
|
+
* Read from the bottom, in the order `findCodexBottomGlyphRow` reads a frame:
|
|
316
|
+
* a dialog's highlighted option reached before any composer row means the
|
|
317
|
+
* dialog is what the pane shows now, and a composer row above it is one left
|
|
318
|
+
* there from before (codex-live-1671) — so the answer is -1, not that row. The
|
|
319
|
+
* transcript echo of a sent message is skipped, dim ({@link isCodexComposerRow}
|
|
320
|
+
* rejects it) or not ({@link isCodexBoldGutterRow}).
|
|
321
|
+
*
|
|
322
|
+
* Moved here from `session/composer-clear.ts` by Issue #3927, with
|
|
323
|
+
* {@link codexDialogBelow}, so the browser can read the same rule.
|
|
324
|
+
*
|
|
325
|
+
* @param rows - The capture split into rows, ANSI intact
|
|
326
|
+
* @returns The row's index, or -1 when no live composer row is drawn
|
|
327
|
+
*/
|
|
328
|
+
function findCodexLiveComposerRow(rows) {
|
|
329
|
+
for (let i = rows.length - 1; i >= 0; i--) {
|
|
330
|
+
const kind = readCodexGlyphRow(rows[i]);
|
|
331
|
+
if (kind === 'option')
|
|
332
|
+
return -1;
|
|
333
|
+
if (kind === 'composer' && isLiveComposerRow(rows[i]))
|
|
334
|
+
return i;
|
|
335
|
+
}
|
|
336
|
+
return -1;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Whether a dialog, not a composer, is what the pane shows below `row` (Issue #3906).
|
|
340
|
+
*
|
|
341
|
+
* The same bottom-up reading as {@link findCodexLiveComposerRow}, stopped at
|
|
342
|
+
* `row`: a dialog's highlighted option reached first means the composer at
|
|
343
|
+
* `row` — even one {@link findCodexInputBox} located among the frame's last
|
|
344
|
+
* blocks — was left there from before the dialog opened. A live composer row
|
|
345
|
+
* reached first means it was not.
|
|
346
|
+
*
|
|
347
|
+
* @param rows - The capture split into rows, ANSI intact
|
|
348
|
+
* @param row - Index of the composer's `\u203A` row
|
|
349
|
+
*/
|
|
350
|
+
function codexDialogBelow(rows, row) {
|
|
351
|
+
for (let i = rows.length - 1; i > row; i--) {
|
|
352
|
+
const kind = readCodexGlyphRow(rows[i]);
|
|
353
|
+
if (kind === 'option')
|
|
354
|
+
return true;
|
|
355
|
+
if (kind === 'composer' && isLiveComposerRow(rows[i]))
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
229
360
|
/**
|
|
230
361
|
* Locate codex's composer in a captured pane (Issue #1890).
|
|
231
362
|
*
|
|
@@ -282,7 +413,7 @@ function findCodexInputBox(lines) {
|
|
|
282
413
|
*/
|
|
283
414
|
function applySgr(params, state) {
|
|
284
415
|
const parts = params === '' ? ['0'] : params.split(';');
|
|
285
|
-
let { dim, bold } = state;
|
|
416
|
+
let { dim, bold, fg } = state;
|
|
286
417
|
for (let i = 0; i < parts.length; i++) {
|
|
287
418
|
const code = parts[i] === '' ? 0 : Number(parts[i]);
|
|
288
419
|
if (Number.isNaN(code))
|
|
@@ -290,15 +421,18 @@ function applySgr(params, state) {
|
|
|
290
421
|
if (code === 38 || code === 48 || code === 58) {
|
|
291
422
|
const mode = parts[i + 1] === '' || parts[i + 1] === undefined ? -1 : Number(parts[i + 1]);
|
|
292
423
|
// 5 = 256-colour (one argument), 2 = 24-bit RGB (three arguments).
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
else
|
|
298
|
-
i += 1;
|
|
424
|
+
const argCount = mode === 5 ? 2 : mode === 2 ? 4 : 1;
|
|
425
|
+
if (code === 38)
|
|
426
|
+
fg = parts.slice(i + 1, i + 1 + argCount).join(';');
|
|
427
|
+
i += argCount;
|
|
299
428
|
continue;
|
|
300
429
|
}
|
|
301
|
-
if (code === 0
|
|
430
|
+
if (code === 0) {
|
|
431
|
+
dim = false;
|
|
432
|
+
bold = false;
|
|
433
|
+
fg = null;
|
|
434
|
+
}
|
|
435
|
+
else if (code === 22) {
|
|
302
436
|
dim = false;
|
|
303
437
|
bold = false;
|
|
304
438
|
}
|
|
@@ -306,8 +440,12 @@ function applySgr(params, state) {
|
|
|
306
440
|
bold = true;
|
|
307
441
|
else if (code === 2)
|
|
308
442
|
dim = true;
|
|
443
|
+
else if (code === 39)
|
|
444
|
+
fg = null;
|
|
445
|
+
else if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97))
|
|
446
|
+
fg = String(code);
|
|
309
447
|
}
|
|
310
|
-
return { dim, bold };
|
|
448
|
+
return { dim, bold, fg };
|
|
311
449
|
}
|
|
312
450
|
/**
|
|
313
451
|
* Split one raw pane row into rendered characters tagged with their dim state.
|
|
@@ -319,12 +457,12 @@ function applySgr(params, state) {
|
|
|
319
457
|
*/
|
|
320
458
|
function scanAttributedChars(line) {
|
|
321
459
|
const out = [];
|
|
322
|
-
let state = { dim: false, bold: false };
|
|
460
|
+
let state = { dim: false, bold: false, fg: null };
|
|
323
461
|
let i = 0;
|
|
324
462
|
while (i < line.length) {
|
|
325
463
|
const ch = line[i];
|
|
326
464
|
if (ch !== '\x1b') {
|
|
327
|
-
out.push({ ch, dim: state.dim, bold: state.bold });
|
|
465
|
+
out.push({ ch, dim: state.dim, bold: state.bold, fg: state.fg });
|
|
328
466
|
i++;
|
|
329
467
|
continue;
|
|
330
468
|
}
|
|
@@ -430,6 +568,72 @@ function extractComposerText(rawCapture, cliToolId) {
|
|
|
430
568
|
const region = locateComposer(lines, cliToolId);
|
|
431
569
|
if (region === null)
|
|
432
570
|
return { text: '', state: 'no_composer' };
|
|
571
|
+
return readComposerRegion(lines, region);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* The composer the pane shows NOW — {@link extractComposerText}, less a codex
|
|
575
|
+
* composer that a dialog has opened below (Issue #3927).
|
|
576
|
+
*
|
|
577
|
+
* codex draws on the normal screen, so a composer row from before a dialog
|
|
578
|
+
* opened can still sit among the frame's last blocks, above the dialog's
|
|
579
|
+
* highlighted option. {@link extractComposerText} locates it and reports its
|
|
580
|
+
* old text as `content`; this reports `no_composer`, the answer the clear
|
|
581
|
+
* (`session/composer-clear.ts`) has given that frame since #3906. The two
|
|
582
|
+
* display paths — the published `composerText`
|
|
583
|
+
* (`session/current-output-builder.ts`) and the browser's own reading
|
|
584
|
+
* (`hooks/useTerminalPanePolling.ts`) — read through this, so the unsent bar
|
|
585
|
+
* neither shows text its [Clear] cannot remove nor offers a [Run] whose Enter
|
|
586
|
+
* would land in the dialog.
|
|
587
|
+
*
|
|
588
|
+
* {@link extractComposerText} itself keeps its reading. The sender
|
|
589
|
+
* (`cli-tools/submit-verified-sender.ts`) applies {@link codexDialogBelow} to
|
|
590
|
+
* the box it locates on its own branches, and Auto-Yes's Enter fallback and
|
|
591
|
+
* the send-residue check are left reading the box as before.
|
|
592
|
+
*
|
|
593
|
+
* @param rawCapture - A pane capture with ANSI attributes intact
|
|
594
|
+
* @param cliToolId - The CLI whose session was captured
|
|
595
|
+
*/
|
|
596
|
+
function extractLiveComposerText(rawCapture, cliToolId) {
|
|
597
|
+
const read = extractComposerText(rawCapture, cliToolId);
|
|
598
|
+
if (cliToolId !== 'codex' || read.state === 'no_composer' || read.state === 'unsupported_tool')
|
|
599
|
+
return read;
|
|
600
|
+
const lines = rawCapture.split('\n');
|
|
601
|
+
const box = findCodexInputBox(lines);
|
|
602
|
+
if (box !== null && codexDialogBelow(lines, box.firstRow))
|
|
603
|
+
return { text: '', state: 'no_composer' };
|
|
604
|
+
return read;
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Read a codex composer from a known `\u203A` row (Issue #3906).
|
|
608
|
+
*
|
|
609
|
+
* {@link findCodexInputBox} only searches the frame's last four blocks, and
|
|
610
|
+
* takes the composer's own block alone: a body of several paragraphs puts its
|
|
611
|
+
* `\u203A` row higher up, and its text stops at the first blank row. This reads
|
|
612
|
+
* from `firstRow` down to the frame's last block — codex's model / cwd footer —
|
|
613
|
+
* blank rows included, under the same dim rule as {@link extractComposerText}.
|
|
614
|
+
* When the composer's own block is the frame's last block it is read to the end.
|
|
615
|
+
*
|
|
616
|
+
* Whether `firstRow` is the live composer — not a row left above a dialog — is
|
|
617
|
+
* the caller's question; this only reads it.
|
|
618
|
+
*
|
|
619
|
+
* @param lines - Captured pane lines, ANSI intact
|
|
620
|
+
* @param firstRow - Index of a row {@link isCodexComposerRow} accepts
|
|
621
|
+
*/
|
|
622
|
+
function readCodexComposerFrom(lines, firstRow) {
|
|
623
|
+
let end = lines.length - 1;
|
|
624
|
+
while (end >= 0 && isBlankRow(lines[end]))
|
|
625
|
+
end--;
|
|
626
|
+
let lastBlockStart = end;
|
|
627
|
+
while (lastBlockStart > 0 && !isBlankRow(lines[lastBlockStart - 1]))
|
|
628
|
+
lastBlockStart--;
|
|
629
|
+
let ownBlockEnd = firstRow;
|
|
630
|
+
while (ownBlockEnd + 1 < lines.length && !isBlankRow(lines[ownBlockEnd + 1]))
|
|
631
|
+
ownBlockEnd++;
|
|
632
|
+
const lastRow = lastBlockStart > ownBlockEnd ? lastBlockStart - 1 : end;
|
|
633
|
+
return readComposerRegion(lines, { firstRow, lastRow, glyph: CODEX_PROMPT_GLYPH_PATTERN });
|
|
634
|
+
}
|
|
635
|
+
/** The text of a located composer region, under the dim rule. */
|
|
636
|
+
function readComposerRegion(lines, region) {
|
|
433
637
|
const realRows = [];
|
|
434
638
|
const renderedRows = [];
|
|
435
639
|
for (let i = region.firstRow; i <= region.lastRow; i++) {
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which option of a question the question itself recommends (Issue #3863).
|
|
4
|
+
*
|
|
5
|
+
* Auto-Yes's `recommended` answer mode answers a question with the option
|
|
6
|
+
* whose TITLE ends in a recommendation marker — `(Recommended)`, `(推奨)` or
|
|
7
|
+
* `(推奨)`. The title, not the label as a whole: on Claude's and Command
|
|
8
|
+
* Code's pickers an option is a title row and, under it, a description, and a
|
|
9
|
+
* description may end in the same words (`… see Recommended Next Actions`),
|
|
10
|
+
* or quote the marker. So the readers that still know where a title ends —
|
|
11
|
+
* the block reader, Command Code's question reader and Claude's
|
|
12
|
+
* AskUserQuestion parser — say per option what its title shows:
|
|
13
|
+
*
|
|
14
|
+
* - `true`: the title ends in a marker;
|
|
15
|
+
* - `false`: it does not;
|
|
16
|
+
* - `'unknown'`: the reader could not tell the title from what follows it
|
|
17
|
+
* (a continuation row that may be the title wrapping or a description).
|
|
18
|
+
*
|
|
19
|
+
* A reader never answers `false` for a title it could not delimit: a marker
|
|
20
|
+
* on the part it could not place would make "no option is recommended" (the
|
|
21
|
+
* default is then answered) a guess.
|
|
22
|
+
*
|
|
23
|
+
* The labels themselves, and every text a contract's deny patterns are
|
|
24
|
+
* matched against, are left as they were read.
|
|
25
|
+
*
|
|
26
|
+
* Leaf module: imports nothing.
|
|
27
|
+
*
|
|
28
|
+
* @module lib/detection/option-recommendation
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.isRecommendedTitle = isRecommendedTitle;
|
|
32
|
+
exports.isRecommendationMarker = isRecommendationMarker;
|
|
33
|
+
exports.upperBoundColumns = upperBoundColumns;
|
|
34
|
+
exports.lowerBoundPaneColumns = lowerBoundPaneColumns;
|
|
35
|
+
exports.cannotBeWrapOf = cannotBeWrapOf;
|
|
36
|
+
/**
|
|
37
|
+
* A marker at the very end of a title, standing on its own: what precedes it
|
|
38
|
+
* is the start of the title, white space, or anything but an ASCII letter or
|
|
39
|
+
* digit (`dispatch (Recommended)`, `する(推奨)`), never a word it is glued
|
|
40
|
+
* to (`Not(Recommended)`). Case as the tools write it. Anchored, no nested
|
|
41
|
+
* quantifiers (ReDoS-safe).
|
|
42
|
+
*/
|
|
43
|
+
const RECOMMENDATION_MARKER_PATTERN = /(?:^|[^A-Za-z0-9])(?:\(Recommended\)|(推奨)|\(推奨\))$/;
|
|
44
|
+
/**
|
|
45
|
+
* Whether a title — the option's whole title, wrapped rows joined — ends in a
|
|
46
|
+
* recommendation marker.
|
|
47
|
+
*
|
|
48
|
+
* @param title - The option's title, without its number or cursor
|
|
49
|
+
*/
|
|
50
|
+
function isRecommendedTitle(title) {
|
|
51
|
+
return RECOMMENDATION_MARKER_PATTERN.test(title.trim());
|
|
52
|
+
}
|
|
53
|
+
/** The markers, as a row holding nothing else spells them. */
|
|
54
|
+
const RECOMMENDATION_MARKERS = new Set(['(Recommended)', '(推奨)', '(推奨)']);
|
|
55
|
+
/**
|
|
56
|
+
* Whether a row holds a marker and nothing else — the tail of a title that
|
|
57
|
+
* wrapped right before its marker (`❯ 1. 整えた状態で続行` / `(Recommended)`).
|
|
58
|
+
*/
|
|
59
|
+
function isRecommendationMarker(row) {
|
|
60
|
+
return RECOMMENDATION_MARKERS.has(row.trim());
|
|
61
|
+
}
|
|
62
|
+
/** One code point that occupies no terminal column. */
|
|
63
|
+
const COMBINING_MARK = /^\p{M}$/u;
|
|
64
|
+
/**
|
|
65
|
+
* An UPPER bound on the columns a row occupies: printable ASCII is one
|
|
66
|
+
* column, a combining mark none, and anything else is counted as two (East
|
|
67
|
+
* Asian wide characters are two; no other code point is wider). Used with a
|
|
68
|
+
* LOWER bound on the pane width, so "it would have fit" is never claimed for
|
|
69
|
+
* a row that might not have.
|
|
70
|
+
*/
|
|
71
|
+
function upperBoundColumns(text) {
|
|
72
|
+
let columns = 0;
|
|
73
|
+
for (const char of text) {
|
|
74
|
+
const code = char.codePointAt(0) ?? 0;
|
|
75
|
+
if (code >= 0x20 && code < 0x7f)
|
|
76
|
+
columns += 1;
|
|
77
|
+
else if (!COMBINING_MARK.test(char))
|
|
78
|
+
columns += 2;
|
|
79
|
+
}
|
|
80
|
+
return columns;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A LOWER bound on the pane width: the widest row of the frame, counting one
|
|
84
|
+
* column per code point (combining marks none). A row the pane drew is never
|
|
85
|
+
* wider than the pane.
|
|
86
|
+
*/
|
|
87
|
+
function lowerBoundPaneColumns(rows) {
|
|
88
|
+
let widest = 0;
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
let columns = 0;
|
|
91
|
+
for (const char of row.trimEnd()) {
|
|
92
|
+
if (!COMBINING_MARK.test(char))
|
|
93
|
+
columns += 1;
|
|
94
|
+
}
|
|
95
|
+
if (columns > widest)
|
|
96
|
+
widest = columns;
|
|
97
|
+
}
|
|
98
|
+
return widest;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Whether `next` cannot be the wrapped tail of `row` — the pane would have
|
|
102
|
+
* kept `next`'s first word on `row`.
|
|
103
|
+
*
|
|
104
|
+
* Terminals word-wrap a title: a row ends early only when the following word
|
|
105
|
+
* would not fit. So when `row` plus a space plus that word fits inside the
|
|
106
|
+
* pane, `row` did not wrap there and `next` begins something else (the
|
|
107
|
+
* option's description). Judged with an upper bound on what the row and the
|
|
108
|
+
* word occupy and a lower bound on the pane, so a `true` is never a guess; a
|
|
109
|
+
* `false` only says the row MAY have wrapped.
|
|
110
|
+
*
|
|
111
|
+
* @param row - The option's row, as drawn (indent and number included)
|
|
112
|
+
* @param next - The row under it
|
|
113
|
+
* @param paneColumns - {@link lowerBoundPaneColumns} of the frame
|
|
114
|
+
*/
|
|
115
|
+
function cannotBeWrapOf(row, next, paneColumns) {
|
|
116
|
+
const firstWord = next.trim().split(/\s+/, 1)[0] ?? '';
|
|
117
|
+
if (firstWord === '')
|
|
118
|
+
return false;
|
|
119
|
+
return upperBoundColumns(row.trimEnd()) + 1 + upperBoundColumns(firstWord) <= paneColumns;
|
|
120
|
+
}
|