commandmate 0.46.1 → 0.47.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 +223 -216
- package/.next/app-path-routes-manifest.json +19 -18
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +8 -0
- 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 +4 -2
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_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 -7
- package/.next/server/app/api/push/escalation/route.js.nft.json +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 -7
- package/.next/server/app/api/push/vapid/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_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 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_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 +2 -2
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +19 -18
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1559.js +1 -1
- package/.next/server/chunks/1601.js +7 -0
- package/.next/server/chunks/1836.js +1 -0
- package/.next/server/chunks/1945.js +14 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2422.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2460.js +1 -1
- package/.next/server/chunks/2534.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/{3077.js → 4194.js} +12 -12
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4248.js +1 -1
- package/.next/server/chunks/5209.js +1 -1
- package/.next/server/chunks/5292.js +1 -1
- package/.next/server/chunks/5595.js +1 -1
- package/.next/server/chunks/5845.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/{2283.js → 6486.js} +7 -7
- package/.next/server/chunks/6722.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6793.js +2 -2
- package/.next/server/chunks/7166.js +19 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +10 -10
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +4 -4
- package/.next/server/chunks/9199.js +1 -0
- package/.next/server/chunks/936.js +1 -0
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/9540.js +1 -0
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- 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/{2407-9703c569370b8a9d.js → 2407-b2f524f99f7fc353.js} +1 -1
- package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
- package/.next/static/chunks/{5794-4eee51ff1e878aa6.js → 5794-80ac3f06f098ea29.js} +1 -1
- package/.next/static/chunks/602-1c1488959215e140.js +1 -0
- package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
- package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
- package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/dist/cli/commands/auto-yes.d.ts +19 -0
- package/dist/cli/commands/auto-yes.d.ts.map +1 -1
- package/dist/cli/commands/auto-yes.js +45 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -18
- package/dist/cli/commands/ls.d.ts +15 -1
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +39 -3
- package/dist/cli/commands/prompt.d.ts +42 -0
- package/dist/cli/commands/prompt.d.ts.map +1 -0
- package/dist/cli/commands/prompt.js +211 -0
- package/dist/cli/commands/relays.d.ts.map +1 -1
- package/dist/cli/commands/relays.js +13 -1
- package/dist/cli/commands/respond-strict.d.ts +31 -0
- package/dist/cli/commands/respond-strict.d.ts.map +1 -0
- package/dist/cli/commands/respond-strict.js +214 -0
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +38 -0
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +41 -5
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +18 -0
- package/dist/cli/commands/wait.d.ts +21 -1
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +108 -12
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +63 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -2
- package/dist/cli/types/api-responses.d.ts +54 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +30 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +12 -1
- package/dist/cli/utils/api-client.d.ts +13 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +10 -2
- package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
- package/dist/cli/utils/daemon-factory.js +3 -1
- package/dist/cli/utils/daemon.d.ts +38 -1
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +161 -8
- package/dist/cli/utils/paths.d.ts +12 -0
- package/dist/cli/utils/paths.d.ts.map +1 -1
- package/dist/cli/utils/paths.js +17 -0
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts +43 -1
- package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
- package/dist/lib/polling/auto-yes-suppression-reason.js +18 -1
- package/dist/lib/prompt-observation/kinds.d.ts +101 -0
- package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
- package/dist/lib/prompt-observation/kinds.js +123 -0
- package/dist/lib/prompt-observation/types.d.ts +271 -0
- package/dist/lib/prompt-observation/types.d.ts.map +1 -0
- package/dist/lib/prompt-observation/types.js +14 -0
- package/dist/lib/session/send-attempt-types.d.ts +66 -0
- package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
- package/dist/lib/session/send-attempt-types.js +17 -0
- package/dist/server/locales/en/worktree.json +4 -0
- package/dist/server/locales/ja/worktree.json +4 -0
- package/dist/server/server.js +20 -1
- package/dist/server/src/config/auto-yes-config.js +11 -0
- package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
- package/dist/server/src/lib/auto-yes-poller.js +345 -28
- package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
- package/dist/server/src/lib/auto-yes-state.js +197 -4
- package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
- package/dist/server/src/lib/cli-tools/command-code.js +10 -2
- package/dist/server/src/lib/cli-tools/copilot.js +21 -10
- package/dist/server/src/lib/cli-tools/gemini.js +60 -13
- package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
- package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
- package/dist/server/src/lib/detection/selection-shape.js +35 -1
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
- package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
- package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
- package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
- package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
- package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
- package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
- package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
- package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
- package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
- package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
- package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
- package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
- package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +18 -1
- package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
- package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
- package/dist/server/src/lib/polling/response-checker.js +9 -0
- package/dist/server/src/lib/polling/response-poller-core.js +136 -104
- package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
- package/dist/server/src/lib/prompt-observation/types.js +14 -0
- package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
- package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
- package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
- package/dist/server/src/lib/relay/relay-delivery.js +76 -30
- package/dist/server/src/lib/schedule-manager.js +28 -0
- package/dist/server/src/lib/session/cli-session.js +38 -3
- package/dist/server/src/lib/session/send-attempt-state.js +155 -0
- package/dist/server/src/lib/session/send-attempt-types.js +17 -0
- package/dist/server/src/lib/session/send-user-message.js +46 -0
- package/dist/server/src/lib/session/worktree-session-reconcile.js +2 -1
- package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
- package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
- package/dist/server/src/lib/tmux/tmux.js +4 -0
- package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
- package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
- package/dist/server/src/lib/verification/scope-gate.js +19 -271
- package/dist/server/src/lib/ws-server.js +48 -6
- package/docs/en/user-guide/cli-setup-guide.md +12 -1
- package/docs/en/user-guide/webapp-guide.md +2 -0
- package/package.json +1 -1
- package/release-notes/0.47.0.json +118 -0
- package/.next/server/chunks/1789.js +0 -1
- package/.next/server/chunks/2908.js +0 -1
- package/.next/server/chunks/2984.js +0 -25
- package/.next/server/chunks/3718.js +0 -1
- package/.next/server/chunks/4837.js +0 -14
- package/.next/server/chunks/611.js +0 -1
- package/.next/server/chunks/850.js +0 -1
- package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
- package/.next/static/chunks/5371-0dc947683e46e78c.js +0 -1
- package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/layout-3e357690446cd2da.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-effbf0796881dd5a.js +0 -1
- /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
- /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
|
@@ -29,6 +29,10 @@
|
|
|
29
29
|
* 8. clearInProgressMessageId
|
|
30
30
|
* 9. startPolling — record the assistant response afterwards
|
|
31
31
|
*
|
|
32
|
+
* Every attempt that reaches the ownership check also records how it ended —
|
|
33
|
+
* not-sent / sent / indeterminate — for `prompt --json`'s `lastSend` (Issue
|
|
34
|
+
* #3759, `./send-attempt-state`). Nothing is resent on any outcome.
|
|
35
|
+
*
|
|
32
36
|
* Out of scope (kept in the HTTP layer / caller): request/body validation,
|
|
33
37
|
* content trimming/size limits, imagePath validation, CLI-tool availability
|
|
34
38
|
* and session-start (running) checks. The caller passes already-validated input.
|
|
@@ -48,6 +52,10 @@ const worktree_session_ownership_1 = require("../../lib/cli-tools/worktree-sessi
|
|
|
48
52
|
const session_name_1 = require("../../lib/cli-tools/session-name");
|
|
49
53
|
const prompt_waiting_guard_1 = require("../../lib/session/prompt-waiting-guard");
|
|
50
54
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
55
|
+
const cli_session_1 = require("../../lib/session/cli-session");
|
|
56
|
+
const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
|
|
57
|
+
const composer_text_1 = require("../../lib/detection/composer-text");
|
|
58
|
+
const status_capture_config_1 = require("../../config/status-capture-config");
|
|
51
59
|
const opencode_1 = require("../../lib/cli-tools/opencode");
|
|
52
60
|
const logger = (0, logger_1.createLogger)('session/send-user-message');
|
|
53
61
|
function getErrorMessage(error) {
|
|
@@ -92,6 +100,28 @@ async function waitForPreviousTurnRecorded(worktreeId, resolvedInstanceId) {
|
|
|
92
100
|
}
|
|
93
101
|
return true;
|
|
94
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether the composer still shows the message after a send whose submit was
|
|
105
|
+
* never confirmed (Issue #3759) — evidence that it is typed but unsent.
|
|
106
|
+
*
|
|
107
|
+
* Only for the composers `extractComposerText` has measured; any other tool,
|
|
108
|
+
* and any read that fails, answers false and the state stays
|
|
109
|
+
* `submit-unconfirmed`. Either way the state is `indeterminate`: a message in
|
|
110
|
+
* the composer is not one to type again.
|
|
111
|
+
*/
|
|
112
|
+
async function composerStillHolds(worktreeId, cliToolId, instanceId, content) {
|
|
113
|
+
if (!composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId))
|
|
114
|
+
return false;
|
|
115
|
+
try {
|
|
116
|
+
const output = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
|
|
117
|
+
const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
|
|
118
|
+
return read.state === 'content' && (0, send_attempt_state_1.composerHoldsMessage)(read.text, content);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.warn('send-composer-residue-read-failed', { error: getErrorMessage(error) });
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
95
125
|
/**
|
|
96
126
|
* Send a validated user message to the CLI tool and record it in history.
|
|
97
127
|
*
|
|
@@ -111,6 +141,12 @@ async function sendUserMessage(db, params) {
|
|
|
111
141
|
*/
|
|
112
142
|
const resolvedInstanceId = instanceId ?? cliToolId;
|
|
113
143
|
const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
|
|
144
|
+
// Issue #3759: how this attempt left the message, kept for `lastSend` (and
|
|
145
|
+
// read back by the send route for its error). The result's shape is
|
|
146
|
+
// unchanged; recording never throws.
|
|
147
|
+
const settle = (state, reason) => {
|
|
148
|
+
(0, send_attempt_state_1.recordSendAttempt)({ worktreeId, cliToolId, instanceId: resolvedInstanceId }, { state, reason, content });
|
|
149
|
+
};
|
|
114
150
|
// Issue #2865: the send route checks ownership itself, but the timer manager
|
|
115
151
|
// and relay delivery reach tmux only through here. A session under this
|
|
116
152
|
// worktree's name that was created in another directory belongs to another
|
|
@@ -119,6 +155,7 @@ async function sendUserMessage(db, params) {
|
|
|
119
155
|
const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId);
|
|
120
156
|
const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName, db);
|
|
121
157
|
if (ownership === null || ownership.verdict === 'foreign') {
|
|
158
|
+
settle('not-sent', 'foreign-session');
|
|
122
159
|
logger.warn('send-refused-foreign-session', {
|
|
123
160
|
worktreeId,
|
|
124
161
|
cliToolId,
|
|
@@ -157,6 +194,7 @@ async function sendUserMessage(db, params) {
|
|
|
157
194
|
ignoreStructured: params.ignoreStructuredPromptGuard,
|
|
158
195
|
});
|
|
159
196
|
if (promptGuard.waiting) {
|
|
197
|
+
settle('not-sent', 'prompt-waiting');
|
|
160
198
|
logger.info('send-refused-prompt-waiting', {
|
|
161
199
|
worktreeId,
|
|
162
200
|
cliToolId,
|
|
@@ -194,6 +232,7 @@ async function sendUserMessage(db, params) {
|
|
|
194
232
|
}
|
|
195
233
|
catch (error) {
|
|
196
234
|
logger.error('failed-to-send-model-command:', { error: getErrorMessage(error) });
|
|
235
|
+
settle('not-sent', 'model-switch-failed');
|
|
197
236
|
return { ok: false, stage: 'model', error: getErrorMessage(error) };
|
|
198
237
|
}
|
|
199
238
|
// Issue #2630: copilot is idle now, and if the previous turn ended during the
|
|
@@ -314,11 +353,18 @@ async function sendUserMessage(db, params) {
|
|
|
314
353
|
}
|
|
315
354
|
catch (error) {
|
|
316
355
|
logger.error('failed-to-send-message-to:', { error: getErrorMessage(error) });
|
|
356
|
+
// Issue #3759: not-sent only when the error says the body was never typed.
|
|
357
|
+
let failure = (0, send_attempt_state_1.classifySendFailure)(error);
|
|
358
|
+
if (failure.reason === 'submit-unconfirmed' && (await composerStillHolds(worktreeId, cliToolId, instanceId, content))) {
|
|
359
|
+
failure = { state: 'indeterminate', reason: 'composer-residue' };
|
|
360
|
+
}
|
|
361
|
+
settle(failure.state, failure.reason);
|
|
317
362
|
if ((0, session_start_error_1.isSessionStartTimeoutError)(error)) {
|
|
318
363
|
return { ok: false, stage: 'send', error: error.message, code: session_start_error_1.SESSION_STARTING_CODE };
|
|
319
364
|
}
|
|
320
365
|
return { ok: false, stage: 'send', error: getErrorMessage(error) };
|
|
321
366
|
}
|
|
367
|
+
settle('sent', 'submitted');
|
|
322
368
|
// 5. Create user message in database (History source: chat_messages).
|
|
323
369
|
const message = (0, db_1.createMessage)(db, {
|
|
324
370
|
worktreeId,
|
|
@@ -533,7 +533,8 @@ function migrateRuntimeState(db, renames, result) {
|
|
|
533
533
|
if (!runningAutoYesPollers.has(move.oldKey))
|
|
534
534
|
continue;
|
|
535
535
|
try {
|
|
536
|
-
|
|
536
|
+
// Issue #3730: a move, not a release — the grant goes on under newKey.
|
|
537
|
+
(0, auto_yes_manager_1.stopAutoYesPolling)(move.oldKey, 'worktree-id-migrated');
|
|
537
538
|
restarts.push(move);
|
|
538
539
|
}
|
|
539
540
|
catch (error) {
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* "A tmux session of this name was just created" (Issue #3796).
|
|
4
|
+
*
|
|
5
|
+
* The Auto-Yes poller that found no session waits `MAX_BACKOFF_MS` for its next
|
|
6
|
+
* tick, and the push gate holds a prompt wait until that tick (#3791), so a
|
|
7
|
+
* session created right after the poller looked was answered — or its human
|
|
8
|
+
* notified — up to about 64 s late. {@link createSession} reports every session
|
|
9
|
+
* it creates here, and a waiting poller listens for its own session's name and
|
|
10
|
+
* ticks early.
|
|
11
|
+
*
|
|
12
|
+
* Synchronous and dependency-free on purpose: `tmux.ts` is the lowest layer and
|
|
13
|
+
* must not import the poller (it would be a cycle). A listener that throws is
|
|
14
|
+
* isolated from the others and from the session creation that fired it.
|
|
15
|
+
*
|
|
16
|
+
* @module lib/tmux/session-created-signal
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.onTmuxSessionCreated = onTmuxSessionCreated;
|
|
20
|
+
exports.notifyTmuxSessionCreated = notifyTmuxSessionCreated;
|
|
21
|
+
exports.countTmuxSessionCreatedListeners = countTmuxSessionCreatedListeners;
|
|
22
|
+
exports.clearTmuxSessionCreatedListeners = clearTmuxSessionCreatedListeners;
|
|
23
|
+
const global_state_1 = require("../global-state");
|
|
24
|
+
/**
|
|
25
|
+
* sessionName -> listeners. globalThis for the reason every shared in-memory
|
|
26
|
+
* state is (#1736): the creator (a route bundle) and the poller (the server's)
|
|
27
|
+
* can hold separate copies of this module.
|
|
28
|
+
*/
|
|
29
|
+
const listeners = (0, global_state_1.getOrInitGlobal)('__tmuxSessionCreatedListeners', () => new Map());
|
|
30
|
+
/**
|
|
31
|
+
* Call `listener` the next time a session named `sessionName` is created.
|
|
32
|
+
*
|
|
33
|
+
* @returns Unsubscribe; calling it more than once does nothing
|
|
34
|
+
*/
|
|
35
|
+
function onTmuxSessionCreated(sessionName, listener) {
|
|
36
|
+
let set = listeners.get(sessionName);
|
|
37
|
+
if (set === undefined) {
|
|
38
|
+
set = new Set();
|
|
39
|
+
listeners.set(sessionName, set);
|
|
40
|
+
}
|
|
41
|
+
set.add(listener);
|
|
42
|
+
return () => {
|
|
43
|
+
const current = listeners.get(sessionName);
|
|
44
|
+
if (current === undefined)
|
|
45
|
+
return;
|
|
46
|
+
current.delete(listener);
|
|
47
|
+
if (current.size === 0)
|
|
48
|
+
listeners.delete(sessionName);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Tell the listeners of `sessionName` that it was created. Each one is called once and dropped. */
|
|
52
|
+
function notifyTmuxSessionCreated(sessionName) {
|
|
53
|
+
const set = listeners.get(sessionName);
|
|
54
|
+
if (set === undefined)
|
|
55
|
+
return;
|
|
56
|
+
listeners.delete(sessionName);
|
|
57
|
+
for (const listener of set) {
|
|
58
|
+
try {
|
|
59
|
+
listener();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// A listener's failure must not fail the session creation that fired it.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Number of sessions someone is waiting for. Test seam. */
|
|
67
|
+
function countTmuxSessionCreatedListeners() {
|
|
68
|
+
let n = 0;
|
|
69
|
+
for (const set of listeners.values())
|
|
70
|
+
n += set.size;
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
/** Drop every listener. Test seam. */
|
|
74
|
+
function clearTmuxSessionCreatedListeners() {
|
|
75
|
+
listeners.clear();
|
|
76
|
+
}
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.CACHE_MAX_CAPTURE_LINES = exports.CACHE_MAX_ENTRIES = exports.CACHE_TTL_MS = void 0;
|
|
23
23
|
exports.isCaptureWindowSaturated = isCaptureWindowSaturated;
|
|
24
|
+
exports.getCaptureGeneration = getCaptureGeneration;
|
|
25
|
+
exports.isCaptureGenerationCurrent = isCaptureGenerationCurrent;
|
|
24
26
|
exports.sliceOutput = sliceOutput;
|
|
25
27
|
exports.getCachedCapture = getCachedCapture;
|
|
26
28
|
exports.setCachedCapture = setCachedCapture;
|
|
@@ -85,6 +87,37 @@ function getCache() {
|
|
|
85
87
|
function getInflight() {
|
|
86
88
|
return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheInflight', () => new Map());
|
|
87
89
|
}
|
|
90
|
+
function getGenerationState() {
|
|
91
|
+
return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheGeneration', () => ({ global: 0, sessions: new Map() }));
|
|
92
|
+
}
|
|
93
|
+
// =========================================================================
|
|
94
|
+
// getCaptureGeneration() / isCaptureGenerationCurrent()
|
|
95
|
+
// =========================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Take the invalidation generation for a session before starting a capture
|
|
98
|
+
* (Issue #3734). Pass it to isCaptureGenerationCurrent() after the await.
|
|
99
|
+
*
|
|
100
|
+
* @param sessionName - tmux session name
|
|
101
|
+
* @returns Generation snapshot
|
|
102
|
+
*/
|
|
103
|
+
function getCaptureGeneration(sessionName) {
|
|
104
|
+
const state = getGenerationState();
|
|
105
|
+
return { global: state.global, session: state.sessions.get(sessionName) ?? 0 };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Whether no invalidateCache(sessionName) / clearAllCache() ran since the
|
|
109
|
+
* snapshot was taken (Issue #3734). A capture that started before the
|
|
110
|
+
* invalidation may show the screen from before a send, so it must not be
|
|
111
|
+
* written back to the cache.
|
|
112
|
+
*
|
|
113
|
+
* @param sessionName - tmux session name
|
|
114
|
+
* @param generation - Snapshot from getCaptureGeneration()
|
|
115
|
+
* @returns True when the capture may be written back
|
|
116
|
+
*/
|
|
117
|
+
function isCaptureGenerationCurrent(sessionName, generation) {
|
|
118
|
+
const current = getCaptureGeneration(sessionName);
|
|
119
|
+
return current.global === generation.global && current.session === generation.session;
|
|
120
|
+
}
|
|
88
121
|
// =========================================================================
|
|
89
122
|
// sliceOutput()
|
|
90
123
|
// =========================================================================
|
|
@@ -183,6 +216,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
|
|
|
183
216
|
// =========================================================================
|
|
184
217
|
/**
|
|
185
218
|
* Invalidate cache for a specific session.
|
|
219
|
+
* Issue #3734: also advances the session's generation and drops its inflight
|
|
220
|
+
* entry, so a capture started before the invalidation is neither written back
|
|
221
|
+
* nor joined by callers that arrive after it (they start a fresh capture).
|
|
186
222
|
* [SEC4-006] Logs debug message with session name for troubleshooting.
|
|
187
223
|
*
|
|
188
224
|
* @param sessionName - tmux session name to invalidate
|
|
@@ -190,6 +226,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
|
|
|
190
226
|
function invalidateCache(sessionName) {
|
|
191
227
|
const cache = getCache();
|
|
192
228
|
cache.delete(sessionName);
|
|
229
|
+
const generations = getGenerationState().sessions;
|
|
230
|
+
generations.set(sessionName, (generations.get(sessionName) ?? 0) + 1);
|
|
231
|
+
getInflight().delete(sessionName);
|
|
193
232
|
// [SEC4-006] Debug log for cache invalidation chain tracking
|
|
194
233
|
logger.debug('cache:invalidate', { sessionName });
|
|
195
234
|
}
|
|
@@ -197,14 +236,20 @@ function invalidateCache(sessionName) {
|
|
|
197
236
|
// clearAllCache()
|
|
198
237
|
// =========================================================================
|
|
199
238
|
/**
|
|
200
|
-
* Clear all cache entries and inflight requests.
|
|
201
|
-
*
|
|
239
|
+
* Clear all cache entries and inflight requests for every session.
|
|
240
|
+
* Called at the start of a worktree's session cleanup (session-cleanup.ts).
|
|
241
|
+
* Issue #3734: advances the global generation so captures started before the
|
|
242
|
+
* clear are not written back. Per-session counts are dropped here because the
|
|
243
|
+
* global generation alone already tells every older snapshot apart.
|
|
202
244
|
*/
|
|
203
245
|
function clearAllCache() {
|
|
204
246
|
const cache = getCache();
|
|
205
247
|
cache.clear();
|
|
206
248
|
const inflight = getInflight();
|
|
207
249
|
inflight.clear();
|
|
250
|
+
const state = getGenerationState();
|
|
251
|
+
state.global += 1;
|
|
252
|
+
state.sessions.clear();
|
|
208
253
|
}
|
|
209
254
|
// =========================================================================
|
|
210
255
|
// resetCacheForTesting()
|
|
@@ -216,6 +261,7 @@ function clearAllCache() {
|
|
|
216
261
|
function resetCacheForTesting() {
|
|
217
262
|
globalThis.__tmuxCaptureCache = undefined;
|
|
218
263
|
globalThis.__tmuxCaptureCacheInflight = undefined;
|
|
264
|
+
globalThis.__tmuxCaptureCacheGeneration = undefined;
|
|
219
265
|
}
|
|
220
266
|
// =========================================================================
|
|
221
267
|
// getOrFetchCapture() - singleflight pattern
|
|
@@ -247,18 +293,24 @@ async function getOrFetchCapture(sessionName, requestedLines, fetchFn) {
|
|
|
247
293
|
return sliceOutput(result, requestedLines);
|
|
248
294
|
}
|
|
249
295
|
// 3. Create new fetch promise
|
|
296
|
+
// Issue #3734: snapshot the generation before fetchFn() starts
|
|
297
|
+
const generation = getCaptureGeneration(sessionName);
|
|
250
298
|
const fetchPromise = fetchFn();
|
|
251
299
|
inflight.set(sessionName, fetchPromise);
|
|
252
300
|
try {
|
|
253
301
|
const output = await fetchPromise;
|
|
254
|
-
// Cache non-empty results only [SEC4-007]
|
|
255
|
-
|
|
302
|
+
// Cache non-empty results only [SEC4-007], and only when no invalidation
|
|
303
|
+
// happened while waiting (Issue #3734)
|
|
304
|
+
if (output.length > 0 && isCaptureGenerationCurrent(sessionName, generation)) {
|
|
256
305
|
setCachedCapture(sessionName, output, exports.CACHE_MAX_CAPTURE_LINES);
|
|
257
306
|
}
|
|
258
307
|
return sliceOutput(output, requestedLines);
|
|
259
308
|
}
|
|
260
309
|
finally {
|
|
261
|
-
// Clean up inflight entry
|
|
262
|
-
|
|
310
|
+
// Clean up inflight entry, unless an invalidation already replaced it
|
|
311
|
+
// with a newer fetch (Issue #3734)
|
|
312
|
+
if (inflight.get(sessionName) === fetchPromise) {
|
|
313
|
+
inflight.delete(sessionName);
|
|
314
|
+
}
|
|
263
315
|
}
|
|
264
316
|
}
|
|
@@ -31,6 +31,7 @@ const util_1 = require("util");
|
|
|
31
31
|
const tmux_capture_cache_1 = require("./tmux-capture-cache");
|
|
32
32
|
const geometry_delegation_1 = require("./geometry-delegation");
|
|
33
33
|
const legacy_session_alias_1 = require("./legacy-session-alias");
|
|
34
|
+
const session_created_signal_1 = require("./session-created-signal");
|
|
34
35
|
const validation_1 = require("../../lib/cli-tools/validation");
|
|
35
36
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
36
37
|
const logger_1 = require("../../lib/logger");
|
|
@@ -449,6 +450,9 @@ async function createSession(sessionNameOrOptions, cwd) {
|
|
|
449
450
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
450
451
|
throw new Error(`Failed to create tmux session: ${errorMessage}`);
|
|
451
452
|
}
|
|
453
|
+
// Issue #3796: an Auto-Yes poller waiting for this session ticks now rather
|
|
454
|
+
// than a backoff later. Outside the try: a listener cannot fail the creation.
|
|
455
|
+
(0, session_created_signal_1.notifyTmuxSessionCreated)(sessionName);
|
|
452
456
|
}
|
|
453
457
|
/**
|
|
454
458
|
* Send keys to a tmux session
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `log_tail` formatting for the built-in `scope` gate (Issue #3647: split out of
|
|
4
|
+
* scope-gate.ts, which re-exports everything public here).
|
|
5
|
+
*
|
|
6
|
+
* @module lib/verification/scope-gate-format
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SCOPE_PATTERN_ARROW = exports.MAX_REPORTED_VIOLATIONS = void 0;
|
|
10
|
+
exports.formatPatterns = formatPatterns;
|
|
11
|
+
exports.formatDecidedPath = formatDecidedPath;
|
|
12
|
+
exports.formatAdmitted = formatAdmitted;
|
|
13
|
+
exports.formatAgentStateExcluded = formatAgentStateExcluded;
|
|
14
|
+
exports.formatOrchestratorExcluded = formatOrchestratorExcluded;
|
|
15
|
+
/**
|
|
16
|
+
* Violations listed in `log_tail` before the rest are summarised as a count.
|
|
17
|
+
*
|
|
18
|
+
* A worker that ran in the wrong directory can put thousands of paths out of
|
|
19
|
+
* scope, and log_tail is stored per gate in SQLite.
|
|
20
|
+
*/
|
|
21
|
+
exports.MAX_REPORTED_VIOLATIONS = 100;
|
|
22
|
+
/**
|
|
23
|
+
* Separator between a reported path and the pattern that decided it (#1841).
|
|
24
|
+
*
|
|
25
|
+
* Mirrored by the CLI's scope-evidence parser (`src/cli/commands/verify.ts`,
|
|
26
|
+
* SCOPE_PATTERN_ARROW): the gate's report is the only carrier for this evidence
|
|
27
|
+
* — `verification_gate_results` has columns for a status, an exit code and a log
|
|
28
|
+
* body, and nothing else — so the two constants have to agree. A round-trip
|
|
29
|
+
* test feeds a real `evaluateScope` report through that parser rather than
|
|
30
|
+
* trusting the two copies to be edited together.
|
|
31
|
+
*
|
|
32
|
+
* A path containing this exact three-character sequence would split wrongly on
|
|
33
|
+
* the way back. Nothing prevents such a filename; it is accepted because the
|
|
34
|
+
* alternative — encoding paths in a log a human reads first — costs every
|
|
35
|
+
* reader something to protect against a file no repository has.
|
|
36
|
+
*/
|
|
37
|
+
exports.SCOPE_PATTERN_ARROW = ' \u2190 ';
|
|
38
|
+
function formatPatterns(patterns) {
|
|
39
|
+
return patterns.length > 0 ? patterns.join(', ') : '(none)';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* One reported path, optionally naming the rule that decided it (#1841).
|
|
43
|
+
*
|
|
44
|
+
* Admitted paths lead with `+` rather than `-` so the two sections cannot be
|
|
45
|
+
* confused by a reader — or by a grep — that has only one line in front of it.
|
|
46
|
+
*/
|
|
47
|
+
function formatDecidedPath(marker, path, pattern) {
|
|
48
|
+
if (pattern === null)
|
|
49
|
+
return ` ${marker} ${path}`;
|
|
50
|
+
return ` ${marker} ${path}${exports.SCOPE_PATTERN_ARROW}${pattern}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The `admitted:` section: what this run was allowed to change, and by which
|
|
54
|
+
* rule (#1841).
|
|
55
|
+
*
|
|
56
|
+
* With an `allow` of exact paths the pattern *is* the file and this adds
|
|
57
|
+
* nothing, but #1546 made globs legal, and `src/**` leaves no record of what it
|
|
58
|
+
* actually covered on the day it ran. The contract is the claim; this is the
|
|
59
|
+
* evidence for it, and it has to survive in `log_tail` because the run's own
|
|
60
|
+
* working tree will have moved on by the time anyone asks.
|
|
61
|
+
*
|
|
62
|
+
* Capped by the same rule as the violations, for the same reason (log_tail is
|
|
63
|
+
* stored per gate in SQLite), and the truncation is stated rather than silent —
|
|
64
|
+
* a list that stops at 100 with no marker reads as a complete one.
|
|
65
|
+
*/
|
|
66
|
+
function formatAdmitted(admitted) {
|
|
67
|
+
if (admitted.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
const listed = admitted.slice(0, exports.MAX_REPORTED_VIOLATIONS);
|
|
70
|
+
const remainder = admitted.length - listed.length;
|
|
71
|
+
return [
|
|
72
|
+
'admitted:',
|
|
73
|
+
...listed.map((entry) => formatDecidedPath('+', entry.path, entry.pattern)),
|
|
74
|
+
// Worded `(+N more)` rather than the violations' `... and N more`: the two
|
|
75
|
+
// sections are capped independently and a reader scanning a truncated
|
|
76
|
+
// report should not have to work out which count belongs to which list.
|
|
77
|
+
...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
/** The `excluded:` section naming agent-managed state files left out (#3126). */
|
|
81
|
+
function formatAgentStateExcluded(excluded) {
|
|
82
|
+
if (excluded.length === 0)
|
|
83
|
+
return [];
|
|
84
|
+
const listed = excluded.slice(0, exports.MAX_REPORTED_VIOLATIONS);
|
|
85
|
+
const remainder = excluded.length - listed.length;
|
|
86
|
+
return [
|
|
87
|
+
'excluded (agent-managed state files, not counted as change):',
|
|
88
|
+
...listed.map((path) => ` ~ ${path}`),
|
|
89
|
+
...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
/** The `excluded:` section naming orchestrator-only committed paths (#3588). */
|
|
93
|
+
function formatOrchestratorExcluded(excluded) {
|
|
94
|
+
if (excluded.length === 0)
|
|
95
|
+
return [];
|
|
96
|
+
return [
|
|
97
|
+
'excluded (changed only by orchestrator commits, not counted as change):',
|
|
98
|
+
...excluded.map((path) => ` ~ ${path}`),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scope glob matching for the built-in `scope` gate (Issue #3647: split out of
|
|
4
|
+
* scope-gate.ts, which re-exports everything public here).
|
|
5
|
+
*
|
|
6
|
+
* @module lib/verification/scope-gate-glob
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ScopeMatcher = exports.SCOPE_EXEMPT_CONTRACT_PATH = exports.SCOPE_EXEMPT_ALWAYS_ALLOWED = exports.ALWAYS_ALLOWED_PREFIX = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Paths that are in scope no matter what the contract says.
|
|
12
|
+
*
|
|
13
|
+
* The contract file lives here, so a contract whose own `allow` list forgot to
|
|
14
|
+
* mention `.commandmate/` would fail the moment it was committed — the scope
|
|
15
|
+
* declaration would make its own storage a violation. The exemption covers the
|
|
16
|
+
* `allow` requirement only; an explicit `deny` still applies, because a deny is
|
|
17
|
+
* a deliberate prohibition and silently ignoring one is worse than the accident
|
|
18
|
+
* this exemption prevents.
|
|
19
|
+
*/
|
|
20
|
+
exports.ALWAYS_ALLOWED_PREFIX = '.commandmate/';
|
|
21
|
+
/**
|
|
22
|
+
* Stand-ins for the two ways a path is admitted without matching `allow`.
|
|
23
|
+
*
|
|
24
|
+
* Parenthesised so they cannot be mistaken for a pattern the contract declared:
|
|
25
|
+
* a reader who greps the contract for `(exempt: .commandmate/)` should find
|
|
26
|
+
* nothing, because nothing there put it in scope.
|
|
27
|
+
*/
|
|
28
|
+
exports.SCOPE_EXEMPT_ALWAYS_ALLOWED = `(exempt: ${exports.ALWAYS_ALLOWED_PREFIX})`;
|
|
29
|
+
exports.SCOPE_EXEMPT_CONTRACT_PATH = '(exempt: contract path)';
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Glob matching
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Translate a scope glob into an anchored regular expression.
|
|
35
|
+
*
|
|
36
|
+
* Deliberately a small, documented subset rather than a glob library. The
|
|
37
|
+
* semantics are fixed in docs/design/task-contract.md §2.2:
|
|
38
|
+
*
|
|
39
|
+
* - `**` as a whole path segment crosses directory boundaries, including zero of
|
|
40
|
+
* them: `a/**` matches `a/b` and `a/b/c`, `**\/*.ts` matches `x.ts`.
|
|
41
|
+
* - `*` and `?` never cross `/`. Leading dots are ordinary characters, so
|
|
42
|
+
* `.github/**` and `*.md` behave the way they read.
|
|
43
|
+
* - `{a,b}` is alternation, nestable. Unbalanced braces are literal, as in a
|
|
44
|
+
* shell — `src/{a` is a path with a brace in it, not a syntax error.
|
|
45
|
+
* - `[` and `]` are **literal**. This repository routes through
|
|
46
|
+
* `src/app/proxy/[...path]/`, and treating those as character classes would
|
|
47
|
+
* make the pattern that names them match nothing at all — a silent no-match is
|
|
48
|
+
* the failure mode this gate exists to avoid.
|
|
49
|
+
* - A pattern that matches a directory also matches everything beneath it, so
|
|
50
|
+
* `src/lib`, `src/lib/` and `src/lib/**` all mean the same thing. Without this
|
|
51
|
+
* rule, `allow: ["src/lib/verification"]` — the way people write a directory —
|
|
52
|
+
* would put every file inside it out of scope.
|
|
53
|
+
*/
|
|
54
|
+
function globToRegExp(rawPattern) {
|
|
55
|
+
// A trailing slash carries no information once the rule above applies.
|
|
56
|
+
const pattern = rawPattern.replace(/\/+$/, '');
|
|
57
|
+
const bracesBalanced = hasBalancedBraces(pattern);
|
|
58
|
+
let source = '';
|
|
59
|
+
let depth = 0;
|
|
60
|
+
let i = 0;
|
|
61
|
+
while (i < pattern.length) {
|
|
62
|
+
const char = pattern[i];
|
|
63
|
+
if (char === '*') {
|
|
64
|
+
let end = i;
|
|
65
|
+
while (pattern[end] === '*')
|
|
66
|
+
end += 1;
|
|
67
|
+
const isGlobstar = end - i > 1;
|
|
68
|
+
const atSegmentStart = i === 0 || pattern[i - 1] === '/';
|
|
69
|
+
if (isGlobstar && atSegmentStart && pattern[end] === '/') {
|
|
70
|
+
// Consume the following slash too: `a/**/b` has to match `a/b`.
|
|
71
|
+
source += '(?:[^/]*/)*';
|
|
72
|
+
i = end + 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (isGlobstar && atSegmentStart && end === pattern.length) {
|
|
76
|
+
source += '.*';
|
|
77
|
+
i = end;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// `**` that is not a whole segment (`a**b`) cannot mean "cross
|
|
81
|
+
// directories" without also matching `a/x/b`, which the pattern does not
|
|
82
|
+
// say. Collapse it to a single-segment wildcard.
|
|
83
|
+
source += '[^/]*';
|
|
84
|
+
i = end;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (char === '?') {
|
|
88
|
+
source += '[^/]';
|
|
89
|
+
i += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (bracesBalanced && char === '{') {
|
|
93
|
+
depth += 1;
|
|
94
|
+
source += '(?:';
|
|
95
|
+
i += 1;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (bracesBalanced && char === '}' && depth > 0) {
|
|
99
|
+
depth -= 1;
|
|
100
|
+
source += ')';
|
|
101
|
+
i += 1;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (bracesBalanced && char === ',' && depth > 0) {
|
|
105
|
+
source += '|';
|
|
106
|
+
i += 1;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
source += char.replace(/[.*+?^${}()|[\]\\]/, '\\$&');
|
|
110
|
+
i += 1;
|
|
111
|
+
}
|
|
112
|
+
return new RegExp(`^${source}(?:/.*)?$`);
|
|
113
|
+
}
|
|
114
|
+
function hasBalancedBraces(pattern) {
|
|
115
|
+
let depth = 0;
|
|
116
|
+
for (const char of pattern) {
|
|
117
|
+
if (char === '{')
|
|
118
|
+
depth += 1;
|
|
119
|
+
else if (char === '}') {
|
|
120
|
+
depth -= 1;
|
|
121
|
+
if (depth < 0)
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return depth === 0;
|
|
126
|
+
}
|
|
127
|
+
function compilePattern(pattern) {
|
|
128
|
+
return { pattern, regexp: globToRegExp(pattern) };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A scope declaration compiled once per run.
|
|
132
|
+
*
|
|
133
|
+
* Compiling per pattern per file would rebuild the same regexes for every one of
|
|
134
|
+
* potentially thousands of changed paths.
|
|
135
|
+
*/
|
|
136
|
+
class ScopeMatcher {
|
|
137
|
+
contractPath;
|
|
138
|
+
allow;
|
|
139
|
+
deny;
|
|
140
|
+
/**
|
|
141
|
+
* @param contractPath the contract's own path, exempted alongside
|
|
142
|
+
* {@link ALWAYS_ALLOWED_PREFIX} for contracts kept outside `.commandmate/`
|
|
143
|
+
*/
|
|
144
|
+
constructor(scope, contractPath = null) {
|
|
145
|
+
this.contractPath = contractPath;
|
|
146
|
+
this.allow = scope.allow.map(compilePattern);
|
|
147
|
+
this.deny = scope.deny.map(compilePattern);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Which declared rule decided `path`, and which way (#1841).
|
|
151
|
+
*
|
|
152
|
+
* The **first** matching pattern is reported, in the contract's declaration
|
|
153
|
+
* order, on both sides. Reporting the last would name a rule the reader
|
|
154
|
+
* cannot use: `allow: ["src/**", "src/lib/**"]` admits `src/lib/a.ts` under
|
|
155
|
+
* the first entry, and deleting the second changes nothing about the verdict.
|
|
156
|
+
*
|
|
157
|
+
* `path` is a repository-root-relative POSIX path as git reports it.
|
|
158
|
+
*/
|
|
159
|
+
classify(path) {
|
|
160
|
+
const denied = this.deny.find((entry) => entry.regexp.test(path));
|
|
161
|
+
if (denied)
|
|
162
|
+
return { admitted: false, pattern: denied.pattern };
|
|
163
|
+
if (path.startsWith(exports.ALWAYS_ALLOWED_PREFIX)) {
|
|
164
|
+
return { admitted: true, pattern: exports.SCOPE_EXEMPT_ALWAYS_ALLOWED };
|
|
165
|
+
}
|
|
166
|
+
if (path === this.contractPath) {
|
|
167
|
+
return { admitted: true, pattern: exports.SCOPE_EXEMPT_CONTRACT_PATH };
|
|
168
|
+
}
|
|
169
|
+
const allowed = this.allow.find((entry) => entry.regexp.test(path));
|
|
170
|
+
return allowed
|
|
171
|
+
? { admitted: true, pattern: allowed.pattern }
|
|
172
|
+
: { admitted: false, pattern: null };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Whether `path` is a scope violation.
|
|
176
|
+
*
|
|
177
|
+
* Delegates to {@link classify} rather than repeating the rules: the verdict
|
|
178
|
+
* and the evidence for it must never be able to disagree, and two copies of
|
|
179
|
+
* "deny wins, then the exemptions, then allow" is exactly how they would.
|
|
180
|
+
*/
|
|
181
|
+
isViolation(path) {
|
|
182
|
+
return !this.classify(path).admitted;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.ScopeMatcher = ScopeMatcher;
|