commandmate 0.47.2 → 0.48.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 +215 -215
- package/.next/app-path-routes-manifest.json +41 -41
- 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_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 +12 -12
- 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 +41 -41
- 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/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/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 +7 -7
- 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 +3 -3
- 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/2099-c3e0ab70a1b95dd3.js +1 -0
- package/.next/static/chunks/{2407-a6533805a86d05bd.js → 2407-26139a8a2f1adbe8.js} +1 -1
- package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
- package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
- package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
- package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
- package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
- package/.next/static/chunks/app/{layout-538d8d2746ad1588.js → layout-46b4cbf07520d9b6.js} +1 -1
- package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
- package/.next/trace +13 -13
- package/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 +73 -3
- 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 +15 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +101 -13
- 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 +27 -0
- package/dist/cli/types/api-responses.d.ts +116 -2
- 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/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/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 +50 -2
- package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
- 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/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.js +396 -350
- 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/waiting-screen-reading.js +98 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +7 -0
- 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 +122 -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 +133 -43
- 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/current-output-builder.js +64 -11
- package/dist/server/src/lib/session/send-attempt-state.js +23 -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.js +307 -17
- 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 +54 -9
- package/dist/server/src/lib/verification/gate-runner.js +162 -13
- 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 +33 -4
- package/package.json +1 -1
- package/public/sw.js +76 -4
- package/release-notes/0.48.0.json +57 -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/static/chunks/602-1c1488959215e140.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]/page-46aced20b2b1c010.js +0 -1
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
- /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Approval-context boundary logic split out of prompt-detect-multiple-choice.ts (Issue #3866). */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.APPROVAL_TARGET_MAX_LOOKBACK = exports.SEPARATOR_LINE_PATTERN = void 0;
|
|
5
|
+
exports.indentOf = indentOf;
|
|
6
|
+
exports.panelFrameIndent = panelFrameIndent;
|
|
7
|
+
exports.findApprovalContextStart = findApprovalContextStart;
|
|
8
|
+
exports.findApprovalContextRange = findApprovalContextRange;
|
|
9
|
+
exports.findYesNoApprovalContextRange = findYesNoApprovalContextRange;
|
|
10
|
+
exports.joinApprovalTarget = joinApprovalTarget;
|
|
11
|
+
/**
|
|
12
|
+
* Pattern for separator lines (horizontal rules).
|
|
13
|
+
* Matches lines consisting only of dash (-) or em-dash (─) characters.
|
|
14
|
+
* Used to skip separator lines in question extraction and non-option line handling.
|
|
15
|
+
* Anchored at both ends -- ReDoS safe (S4-001).
|
|
16
|
+
*/
|
|
17
|
+
exports.SEPARATOR_LINE_PATTERN = /^[-─]+$/;
|
|
18
|
+
/**
|
|
19
|
+
* Lines that mean "the previous turn ended here" when scanning upward.
|
|
20
|
+
*
|
|
21
|
+
* Every supported CLI renders its transcript as marker-prefixed rows — Claude's
|
|
22
|
+
* tool-use `⏺` and result `⎿`, Codex's activity `•`, its approval receipts `✔`
|
|
23
|
+
* / `✗`, the user's own `›` / `❯` / `>` echo, and its output continuation `└`.
|
|
24
|
+
* The lines a prompt panel puts above its question (a header such as "Bash
|
|
25
|
+
* command", the command itself, a one-line description) never carry one, which
|
|
26
|
+
* is what makes this usable as the panel's upper edge after `stripBoxDrawing`
|
|
27
|
+
* has erased the real box border.
|
|
28
|
+
*
|
|
29
|
+
* Horizontal rules count too: Codex draws one between turns.
|
|
30
|
+
*
|
|
31
|
+
* [Issue #3817] Not inside the panel's own frame: the command a panel shows can
|
|
32
|
+
* carry the same glyphs (a here-document's `> quoted` rows), drawn deeper than
|
|
33
|
+
* the panel's header, question and option rows. See
|
|
34
|
+
* {@link findApprovalContextStart}.
|
|
35
|
+
*
|
|
36
|
+
* Anchored at the start of the trimmed line — ReDoS safe (no repetition).
|
|
37
|
+
*/
|
|
38
|
+
const TURN_BOUNDARY_PATTERN = /^[⏺⎿●○•✔✓✖✗✘›»❯└├>]/;
|
|
39
|
+
/**
|
|
40
|
+
* How far above the question the approval context may reach (Issue #1699).
|
|
41
|
+
*
|
|
42
|
+
* The boundary marker above is the actual fix; this cap only exists so a frame
|
|
43
|
+
* that happens to contain no marker at all (a bare shell `(y/n)` prompt under
|
|
44
|
+
* plain command output) cannot drag an unbounded scrollback window into the
|
|
45
|
+
* deny surface the way the old fixed 19-line lookback did. Sized for the
|
|
46
|
+
* tallest real permission panel measured: header + blank + a wrapped multi-line
|
|
47
|
+
* command + description + blank.
|
|
48
|
+
*/
|
|
49
|
+
exports.APPROVAL_TARGET_MAX_LOOKBACK = 12;
|
|
50
|
+
/**
|
|
51
|
+
* A previous tool call's result row (Issue #3817): claude's `⎿`, codex's `└` /
|
|
52
|
+
* `├` output continuation. Never the user's echo or a quote (`>`).
|
|
53
|
+
*/
|
|
54
|
+
const RESULT_MARKER_PATTERN = /^[⎿└├]/;
|
|
55
|
+
/** Width of a row's leading whitespace. */
|
|
56
|
+
function indentOf(line) {
|
|
57
|
+
return line.length - line.trimStart().length;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The column the dialog's own frame is drawn at (Issue #3817): the least
|
|
61
|
+
* indented non-blank row from the question down to `panelEnd`. Those rows are
|
|
62
|
+
* the question, the option block and the footer — claude puts them at column 1
|
|
63
|
+
* and the command at column 3, codex its `› 1.` cursor at column 0.
|
|
64
|
+
*/
|
|
65
|
+
function panelFrameIndent(lines, questionLineIndex, panelEnd) {
|
|
66
|
+
let indent = Infinity;
|
|
67
|
+
for (let i = questionLineIndex; i < Math.min(panelEnd, lines.length); i++) {
|
|
68
|
+
const line = lines[i];
|
|
69
|
+
if (line === undefined || line.trim() === '')
|
|
70
|
+
continue;
|
|
71
|
+
indent = Math.min(indent, indentOf(line));
|
|
72
|
+
}
|
|
73
|
+
return indent === Infinity ? 0 : indent;
|
|
74
|
+
}
|
|
75
|
+
/** True when this line carries a transcript marker or is a rule. */
|
|
76
|
+
function isTurnBoundaryLine(rawLine) {
|
|
77
|
+
if (rawLine === undefined)
|
|
78
|
+
return false;
|
|
79
|
+
const line = rawLine.trim();
|
|
80
|
+
if (line === '')
|
|
81
|
+
return false;
|
|
82
|
+
return TURN_BOUNDARY_PATTERN.test(line) || exports.SEPARATOR_LINE_PATTERN.test(line);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* First line index that still belongs to *this* prompt, scanning upward.
|
|
86
|
+
*
|
|
87
|
+
* Walks up from `questionLineIndex - 1` and stops just below the nearest turn
|
|
88
|
+
* boundary; with no boundary in reach it falls back to the lookback cap.
|
|
89
|
+
* Everything above the returned index is a previous turn and must never reach a
|
|
90
|
+
* deny pattern — that poisoning is Issue #1699.
|
|
91
|
+
*
|
|
92
|
+
* [Issue #3817] A marker row indented deeper than the dialog's frame
|
|
93
|
+
* ({@link panelFrameIndent}) is the body of the command the panel asks about
|
|
94
|
+
* when a frame row sits above it — the `> quoted` rows of a here-document
|
|
95
|
+
* under a claude panel's ` Bash command` header. Cutting there took the command
|
|
96
|
+
* rows above it out of the deny surface. The previous turn's markers are drawn
|
|
97
|
+
* at or left of the frame (`⏺`, the user's `> msg` / `❯ msg` echo, a rule), or
|
|
98
|
+
* deeper with no frame row above them (claude's ` ⎿` result right under its
|
|
99
|
+
* `⏺`), and both still end the scan.
|
|
100
|
+
*
|
|
101
|
+
* A frame row cannot be told from a body row drawn at the frame's column (a
|
|
102
|
+
* shell here-document's `EOF`), so a frame row is taken as an older panel's
|
|
103
|
+
* header only in one shape: a tool-use block — a marker row at the frame's
|
|
104
|
+
* column, then that row, then deeper rows that are all result markers
|
|
105
|
+
* ({@link RESULT_MARKER_PATTERN}). Anything else between two frame rows is read
|
|
106
|
+
* as body: when the screen cannot tell, the deny surface is taken wide.
|
|
107
|
+
*
|
|
108
|
+
* [Issue #3832] That shape also needs the older header to be one the current
|
|
109
|
+
* panel draws below it (agy's `Command` above ` ⎿ User declined the tool
|
|
110
|
+
* call` above its current `Command`). A body can take the shape too — a
|
|
111
|
+
* 0-column command whose output is an indented `└──` tree, under a `●` row —
|
|
112
|
+
* and cutting there dropped the command from the deny surface. A body that
|
|
113
|
+
* repeats the current header word for word is still cut; the screen cannot
|
|
114
|
+
* tell that one apart.
|
|
115
|
+
*
|
|
116
|
+
* Known limits, measured absent on the claude / codex / agy / copilot /
|
|
117
|
+
* opencode fixtures and the production log (Issue #3832) and left alone:
|
|
118
|
+
* - An older block's result with a row that is not a result marker (an
|
|
119
|
+
* unmarked continuation ` b` under ` ⎿ a`) under a header the current
|
|
120
|
+
* panel repeats is read as body: the previous turn enters the deny surface
|
|
121
|
+
* (over-suppresses).
|
|
122
|
+
* - A body row carrying a marker at the frame's own column (a here-document's
|
|
123
|
+
* `> ` drawn at column 0 under a yes/no `(y/n)`) still ends the scan; the
|
|
124
|
+
* screen cannot tell it from the previous turn's echo. The command rows
|
|
125
|
+
* above the `> ` leave `approvalTarget`, and a yes/no `question` is the
|
|
126
|
+
* prompt line alone. Issue #3881 (the second half) no longer lets that be
|
|
127
|
+
* an answer: the yes/no path ({@link findYesNoApprovalContextRange}) reads
|
|
128
|
+
* a scan that stopped on a `>` row as `truncated`, so a deny miss withholds
|
|
129
|
+
* instead of passing. The boundary itself is left where it was.
|
|
130
|
+
* - agy's older panel under a header the current one does not draw is read as
|
|
131
|
+
* body (over-suppresses), as is the first limit above; both stay.
|
|
132
|
+
*
|
|
133
|
+
* Shared by both detector paths: multiple_choice passes its `questionEndIndex`,
|
|
134
|
+
* yes_no the line its pattern matched on.
|
|
135
|
+
*
|
|
136
|
+
* @param lines - Full frame, already ANSI/box stripped
|
|
137
|
+
* @param questionLineIndex - Line the prompt's own question sits on
|
|
138
|
+
* @param panelEnd - Exclusive end of the dialog's own rows (Issue #3817); their
|
|
139
|
+
* least indented row is the frame. Defaults to the question row alone.
|
|
140
|
+
* @returns Index of the first line of the current prompt's own block
|
|
141
|
+
*/
|
|
142
|
+
function findApprovalContextStart(lines, questionLineIndex, panelEnd = questionLineIndex + 1) {
|
|
143
|
+
return findApprovalContextRange(lines, questionLineIndex, panelEnd).start;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Where {@link findApprovalContextStart} put the top of the approval context,
|
|
147
|
+
* and whether that top is a boundary (Issue #3881, H-3).
|
|
148
|
+
*
|
|
149
|
+
* The start index alone cannot say it. A scan that runs out at
|
|
150
|
+
* {@link APPROVAL_TARGET_MAX_LOOKBACK} returns the same kind of number as one
|
|
151
|
+
* that stopped at the previous turn's marker, and `joinApprovalTarget` turns
|
|
152
|
+
* either into an ordinary string — so a deny pattern whose only match is the
|
|
153
|
+
* 13th row above a yes/no question missed, and the resolver took the miss as
|
|
154
|
+
* a pass. The completeness travels with the start instead:
|
|
155
|
+
*
|
|
156
|
+
* - `complete` — the scan stopped at a boundary (a marker at the frame, an
|
|
157
|
+
* older tool-use block);
|
|
158
|
+
* - `truncated` — it ran out at the cap with a non-blank row still above it;
|
|
159
|
+
* - `top-unknown` — it reached the frame's first row without a boundary.
|
|
160
|
+
*
|
|
161
|
+
* A scan that ran out at the cap over blank rows only is `complete`: nothing
|
|
162
|
+
* above it could belong to the panel.
|
|
163
|
+
*/
|
|
164
|
+
function findApprovalContextRange(lines, questionLineIndex, panelEnd = questionLineIndex + 1) {
|
|
165
|
+
const { start, completeness } = scanApprovalContext(lines, questionLineIndex, panelEnd);
|
|
166
|
+
return { start, completeness };
|
|
167
|
+
}
|
|
168
|
+
/** {@link findApprovalContextRange}, with the row the scan stopped on (Issue #3881). */
|
|
169
|
+
function scanApprovalContext(lines, questionLineIndex, panelEnd) {
|
|
170
|
+
const floor = Math.max(0, questionLineIndex - exports.APPROVAL_TARGET_MAX_LOOKBACK);
|
|
171
|
+
const frameIndent = panelFrameIndent(lines, questionLineIndex, panelEnd);
|
|
172
|
+
// The lowest deeper marker row with no frame row found above it yet.
|
|
173
|
+
let unenclosed = -1;
|
|
174
|
+
// The deeper rows since the last frame row: are they all result markers?
|
|
175
|
+
let segmentRows = 0;
|
|
176
|
+
let segmentAllResults = true;
|
|
177
|
+
// Frame rows already passed: the current panel's header among them.
|
|
178
|
+
const framesBelow = new Set();
|
|
179
|
+
for (let i = questionLineIndex - 1; i >= floor; i--) {
|
|
180
|
+
const line = lines[i];
|
|
181
|
+
if (line === undefined || line.trim() === '')
|
|
182
|
+
continue;
|
|
183
|
+
const atFrame = indentOf(line) <= frameIndent;
|
|
184
|
+
const marker = isTurnBoundaryLine(line);
|
|
185
|
+
if (marker && atFrame) {
|
|
186
|
+
return { start: (unenclosed >= 0 ? unenclosed : i) + 1, completeness: 'complete', cutFrom: i };
|
|
187
|
+
}
|
|
188
|
+
if (!atFrame) {
|
|
189
|
+
if (marker && unenclosed < 0)
|
|
190
|
+
unenclosed = i;
|
|
191
|
+
segmentRows++;
|
|
192
|
+
segmentAllResults &&= RESULT_MARKER_PATTERN.test(line.trim());
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// A frame row: an older tool-use block's header only in that one shape,
|
|
196
|
+
// and only when the current panel draws the same header (Issue #3832).
|
|
197
|
+
const frameText = line.trim();
|
|
198
|
+
if (unenclosed >= 0 && segmentRows > 0 && segmentAllResults && framesBelow.has(frameText)
|
|
199
|
+
&& isMarkerRowAtFrameAbove(lines, i, floor, frameIndent)) {
|
|
200
|
+
return { start: unenclosed + 1, completeness: 'complete', cutFrom: i };
|
|
201
|
+
}
|
|
202
|
+
framesBelow.add(frameText);
|
|
203
|
+
unenclosed = -1;
|
|
204
|
+
segmentRows = 0;
|
|
205
|
+
segmentAllResults = true;
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
start: unenclosed >= 0 ? unenclosed + 1 : floor,
|
|
209
|
+
completeness: scanEndCompleteness(lines, floor),
|
|
210
|
+
cutFrom: floor,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* A here-document's continuation rows, or a quotation: `>` at the start of a
|
|
215
|
+
* row is the one marker a shell's own output draws (PS2), so a scan that
|
|
216
|
+
* stops on it may have stopped inside the command (Issue #3881).
|
|
217
|
+
*/
|
|
218
|
+
const AMBIGUOUS_BOUNDARY_PATTERN = /^>/;
|
|
219
|
+
/**
|
|
220
|
+
* {@link findApprovalContextRange} for a yes/no prompt (Issue #3881, the
|
|
221
|
+
* second half: limit 3 of #3832).
|
|
222
|
+
*
|
|
223
|
+
* A yes/no prompt has no panel of its own, so its frame is the prompt line's
|
|
224
|
+
* column, and a here-document's `> ` continuation rows drawn at that column
|
|
225
|
+
* end the scan exactly like the previous turn's `> msg` echo: the screen
|
|
226
|
+
* cannot tell the two apart. The same holds for a deeper `> ` row that set
|
|
227
|
+
* the start under a `●` boundary (a here-document indented under its command,
|
|
228
|
+
* review N2). Cut at such a row, the boundary is not known
|
|
229
|
+
* to be the previous turn's, so the target is `truncated` — not the whole
|
|
230
|
+
* request: a deny pattern that misses it withholds as `deny-pattern-unusable`
|
|
231
|
+
* rather than passing (the resolver's `approvalTargetCompleteness`). The
|
|
232
|
+
* boundary is not moved: widening the target past a real echo would put the
|
|
233
|
+
* previous turn's text on the deny surface (#1699).
|
|
234
|
+
*
|
|
235
|
+
* Multiple choice keeps {@link findApprovalContextRange}: its panels draw the
|
|
236
|
+
* command deeper than their frame (#3817), and claude's legacy `> msg` echo at
|
|
237
|
+
* the frame is a real boundary there.
|
|
238
|
+
*/
|
|
239
|
+
function findYesNoApprovalContextRange(lines, promptLine, panelEnd) {
|
|
240
|
+
const { start, completeness, cutFrom } = scanApprovalContext(lines, promptLine, panelEnd);
|
|
241
|
+
// Review N2: every row that was cut, not only the row the scan stopped on —
|
|
242
|
+
// a deeper `> ` row (a here-document indented under its command) sets the
|
|
243
|
+
// start below the boundary, and the command above it is cut with it.
|
|
244
|
+
const cutByQuote = lines
|
|
245
|
+
.slice(cutFrom, start)
|
|
246
|
+
.some(row => row !== undefined && AMBIGUOUS_BOUNDARY_PATTERN.test(row.trim()));
|
|
247
|
+
// Review N4: whatever the scan's own end said. A scan that ran up to the
|
|
248
|
+
// frame's first row (`top-unknown`) still cut those rows inside the frame,
|
|
249
|
+
// and a capture known to start at the history's top would otherwise clear
|
|
250
|
+
// it (`withCaptureTopCompleteness` adds nothing to a `history-start`): the
|
|
251
|
+
// cut is a fact about rows on screen, not about the capture's top.
|
|
252
|
+
if (cutByQuote) {
|
|
253
|
+
return { start, completeness: 'truncated' };
|
|
254
|
+
}
|
|
255
|
+
return { start, completeness };
|
|
256
|
+
}
|
|
257
|
+
/** How complete a scan that ran down to `floor` without a boundary is (Issue #3881). */
|
|
258
|
+
function scanEndCompleteness(lines, floor) {
|
|
259
|
+
if (floor === 0)
|
|
260
|
+
return 'top-unknown';
|
|
261
|
+
for (let i = 0; i < floor; i++) {
|
|
262
|
+
const line = lines[i];
|
|
263
|
+
if (line !== undefined && line.trim() !== '')
|
|
264
|
+
return 'truncated';
|
|
265
|
+
}
|
|
266
|
+
return 'complete';
|
|
267
|
+
}
|
|
268
|
+
/** True when the nearest non-blank row above `row` is a marker row at the frame's column. */
|
|
269
|
+
function isMarkerRowAtFrameAbove(lines, row, floor, frameIndent) {
|
|
270
|
+
for (let i = row - 1; i >= floor; i--) {
|
|
271
|
+
const line = lines[i];
|
|
272
|
+
if (line === undefined || line.trim() === '')
|
|
273
|
+
continue;
|
|
274
|
+
return indentOf(line) <= frameIndent && isTurnBoundaryLine(line);
|
|
275
|
+
}
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Join a slice of the frame into an approval-target string.
|
|
280
|
+
*
|
|
281
|
+
* @returns The trimmed block, or undefined when it is empty
|
|
282
|
+
*/
|
|
283
|
+
function joinApprovalTarget(lines, start, end) {
|
|
284
|
+
const joined = lines
|
|
285
|
+
.slice(start, end)
|
|
286
|
+
.map(l => l.trimEnd())
|
|
287
|
+
.join('\n')
|
|
288
|
+
.trim();
|
|
289
|
+
return joined.length > 0 ? joined : undefined;
|
|
290
|
+
}
|