commandmate 0.31.3 → 0.32.1
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 +498 -484
- package/.next/app-path-routes-manifest.json +44 -42
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +2 -2
- 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/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +1 -32
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +2 -33
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route.js.nft.json +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 +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +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.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 -0
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/relays/route.js +1 -0
- package/.next/server/app/api/relays/route.js.nft.json +1 -0
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +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.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.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.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.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.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.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_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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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/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.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.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.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.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.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.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.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 +2 -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 +2 -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]/resolve-target/route.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.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.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.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 +103 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.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.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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +2 -2
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +2 -2
- package/.next/server/app/more/page.js.nft.json +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page.js +2 -2
- package/.next/server/app/repositories/page.js.nft.json +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +2 -2
- package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page.js +2 -2
- package/.next/server/app/skills/installed/page.js.nft.json +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page.js +1 -1
- package/.next/server/app/skills/page.js.nft.json +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +11 -11
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +44 -42
- package/.next/server/chunks/1210.js +1 -0
- package/.next/server/chunks/153.js +1 -0
- package/.next/server/chunks/1886.js +1 -1
- package/.next/server/chunks/21.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3077.js +67 -0
- package/.next/server/chunks/3086.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3270.js +1 -0
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3730.js +1 -0
- package/.next/server/chunks/3925.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4443.js +2 -1
- package/.next/server/chunks/5043.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5220.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/595.js +3 -3
- package/.next/server/chunks/6286.js +48 -0
- package/.next/server/chunks/6306.js +1 -0
- package/.next/server/chunks/6363.js +1 -0
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6491.js +103 -0
- package/.next/server/chunks/{9798.js → 6661.js} +1 -2
- package/.next/server/chunks/6838.js +1 -0
- package/.next/server/chunks/7875.js +25 -0
- package/.next/server/chunks/7890.js +1 -0
- package/.next/server/chunks/8063.js +32 -0
- package/.next/server/chunks/8118.js +1 -1
- package/.next/server/chunks/{7587.js → 8554.js} +1 -1
- package/.next/server/chunks/8687.js +1 -0
- package/.next/server/chunks/8807.js +37 -3
- package/.next/server/chunks/8918.js +6 -4
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9584.js +1 -1
- package/.next/server/chunks/9627.js +21 -5
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/Lno4w_zWXdGdlfXg06Vp8/_buildManifest.js +1 -0
- package/.next/static/chunks/{5694.dda65070757534df.js → 3313.53f7ff985c0c8852.js} +1 -1
- package/.next/static/chunks/4718-9d63107c612a065d.js +1 -0
- package/.next/static/chunks/{4974-35592ec312322124.js → 5694-498765336d0b8c2b.js} +1 -1
- package/.next/static/chunks/{7485.442b21101fca7257.js → 7485.52361bc061cc663a.js} +1 -1
- package/.next/static/chunks/8019-cbf130d0e6334d2d.js +1 -0
- package/.next/static/chunks/8361-9bb887203c456edb.js +1 -0
- package/.next/static/chunks/8772-9be53a530950d804.js +1 -0
- package/.next/static/chunks/998-ac0ded6d5eeb4dc0.js +1 -0
- package/.next/static/chunks/app/api/agents/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/relays/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/skills/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/templates/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/chat/{page-37d7615d17d7e2a0.js → page-e60d07c4c79602f0.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/more/{page-353a3924e6d7968e.js → page-fc94f86aa881489e.js} +1 -1
- package/.next/static/chunks/app/{page-c2bf871d953a1d6f.js → page-6871cca022b24807.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/repositories/{page-7d0f26df0537254c.js → page-788ded1b72963d94.js} +1 -1
- package/.next/static/chunks/app/review/{page-e3f141b2829973e9.js → page-35b99baaf3c93b38.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-53f188ed9ca49e5f.js → page-fa2d62f3e8436c69.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-80569b720aea59cc.js → page-06799157652e8fa9.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-dbd2690ad72da95b.js → page-2f3987e3a131c8d0.js} +1 -1
- package/.next/static/chunks/app/skills/{page-dacd36f9c11aa7da.js → page-e70bfcf5ed4e4865.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-8bc5b680c5f3eae4.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-3d82a9355d5612d9.js +1 -0
- package/.next/static/chunks/webpack-1dc9eb5ebb4fa5ff.js +1 -0
- package/.next/static/css/96d94a4ba771efc3.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/relays/[relayId]/cancel/route.ts +347 -0
- package/.next/types/app/api/relays/route.ts +347 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/README.md +6 -2
- package/dist/cli/commands/ask.d.ts +34 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +494 -0
- package/dist/cli/commands/capture.d.ts +20 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +80 -30
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +47 -4
- package/dist/cli/commands/instances.d.ts +67 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +147 -22
- package/dist/cli/commands/peers.d.ts +64 -0
- package/dist/cli/commands/peers.d.ts.map +1 -0
- package/dist/cli/commands/peers.js +208 -0
- package/dist/cli/commands/relays.d.ts +92 -0
- package/dist/cli/commands/relays.d.ts.map +1 -0
- package/dist/cli/commands/relays.js +293 -0
- package/dist/cli/commands/report.d.ts +3 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +29 -1
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +13 -10
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +66 -20
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +30 -0
- package/dist/cli/commands/wait.d.ts +20 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +55 -6
- package/dist/cli/commands/whoami.d.ts +176 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +377 -0
- package/dist/cli/docs/agent-operations.d.ts +25 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +184 -1
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +25 -1
- package/dist/cli/types/api-responses.d.ts +93 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +16 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/api-client.d.ts +30 -1
- package/dist/cli/utils/api-client.d.ts.map +1 -1
- package/dist/cli/utils/api-client.js +28 -5
- package/dist/lib/cli/command-reference.d.ts +179 -0
- package/dist/lib/cli/command-reference.d.ts.map +1 -0
- package/dist/lib/cli/command-reference.js +210 -0
- package/dist/lib/detection/ansi.d.ts +14 -1
- package/dist/lib/detection/ansi.d.ts.map +1 -1
- package/dist/lib/detection/ansi.js +40 -3
- package/dist/lib/detection/status-reason.d.ts +28 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +28 -0
- package/dist/server/locales/en/worktree.json +23 -0
- package/dist/server/locales/ja/worktree.json +23 -0
- package/dist/server/src/lib/auto-yes-poller.js +26 -11
- package/dist/server/src/lib/db/chat-db.js +161 -7
- package/dist/server/src/lib/db/migrations/index.js +2 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v60-session-relays.js +110 -0
- package/dist/server/src/lib/db/relay-db.js +343 -0
- package/dist/server/src/lib/detection/ansi.js +40 -3
- package/dist/server/src/lib/detection/cli-patterns.js +206 -2
- package/dist/server/src/lib/detection/selection-shape.js +72 -1
- package/dist/server/src/lib/detection/status-reason.js +28 -0
- package/dist/server/src/lib/detection/tools/antigravity/dialog.js +13 -7
- package/dist/server/src/lib/detection/tools/command-code/detect.js +33 -0
- package/dist/server/src/lib/history/user-turn-recorder.js +79 -16
- package/dist/server/src/lib/hooks/agent-event-service.js +27 -5
- package/dist/server/src/lib/hooks/sources/codex/history.js +63 -3
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +53 -1
- package/dist/server/src/lib/hooks/sources/launch-command.js +112 -15
- package/dist/server/src/lib/hooks/stop-history-capture.js +252 -50
- package/dist/server/src/lib/polling/response-checker.js +174 -13
- package/dist/server/src/lib/polling/response-dedup.js +136 -0
- package/dist/server/src/lib/polling/structured-history-gate.js +14 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +5 -0
- package/dist/server/src/lib/realtime/waiting-broadcast.js +12 -0
- package/dist/server/src/lib/relay/relay-delivery.js +554 -0
- package/dist/server/src/lib/relay/relay-messages.js +144 -0
- package/dist/server/src/lib/relay/relay-policy.js +127 -0
- package/dist/server/src/lib/relay/relay-readiness.js +63 -0
- package/dist/server/src/lib/relay/relay-session-ref.js +72 -0
- package/dist/server/src/lib/relay/relay-system-line.js +79 -0
- package/dist/server/src/lib/relay/relay-triggers.js +177 -0
- package/dist/server/src/lib/relay/types.js +25 -0
- package/dist/server/src/lib/session/current-output-builder.js +18 -0
- package/dist/server/src/lib/session/send-user-message.js +1 -0
- package/package.json +1 -1
- package/.next/server/chunks/1058.js +0 -1
- package/.next/server/chunks/1068.js +0 -1
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/261.js +0 -1
- package/.next/server/chunks/2739.js +0 -1
- package/.next/server/chunks/2839.js +0 -1
- package/.next/server/chunks/3484.js +0 -1
- package/.next/server/chunks/358.js +0 -1
- package/.next/server/chunks/3869.js +0 -1
- package/.next/server/chunks/4325.js +0 -1
- package/.next/server/chunks/4393.js +0 -1
- package/.next/server/chunks/5017.js +0 -1
- package/.next/server/chunks/5120.js +0 -1
- package/.next/server/chunks/552.js +0 -25
- package/.next/server/chunks/6130.js +0 -1
- package/.next/server/chunks/7836.js +0 -1
- package/.next/server/chunks/7859.js +0 -21
- package/.next/server/chunks/9696.js +0 -3
- package/.next/static/0hTIackGXw6v7diXJS6yN/_buildManifest.js +0 -1
- package/.next/static/chunks/2813-de885de8a4b11910.js +0 -1
- package/.next/static/chunks/4718-07ec4e10186928db.js +0 -1
- package/.next/static/chunks/6170-951b9f5fe6b4b3b5.js +0 -1
- package/.next/static/chunks/8019-f8e73c1fb5f6f0d3.js +0 -1
- package/.next/static/chunks/8593-fa0eb2802e0ce68a.js +0 -1
- package/.next/static/chunks/app/api/agents/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/agents/versions/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/settings/default-agents/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/skills/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/templates/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-ee11f7b8a34cba8c.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-91b639c90795baa9.js +0 -1
- package/.next/static/chunks/webpack-9f75198882fdaf08.js +0 -1
- package/.next/static/css/acc4b9c3feb04287.css +0 -1
- /package/.next/static/{0hTIackGXw6v7diXJS6yN → Lno4w_zWXdGdlfXg06Vp8}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The relay ledger's CRUD (Issue #2377, table from migration v60).
|
|
4
|
+
*
|
|
5
|
+
* Every state change a relay can undergo is a statement in this file, and each
|
|
6
|
+
* one that must happen at most once is written as a GUARDED update that reports
|
|
7
|
+
* whether it won. That is not a style choice: the turn's end is judged by two
|
|
8
|
+
* independent producers (the Stop hook and the poller) and the delivery pump can
|
|
9
|
+
* be re-entered by a timer while a first pass is still awaiting a send, so
|
|
10
|
+
* "read, decide, write" would deliver some replies twice. `better-sqlite3` is
|
|
11
|
+
* synchronous, so a single `UPDATE … WHERE <precondition>` plus `changes === 1`
|
|
12
|
+
* is a compare-and-set with no window in it.
|
|
13
|
+
*
|
|
14
|
+
* Shapes come from `@/lib/relay/types`, which knows nothing about SQL — the
|
|
15
|
+
* browser hook reads the same interfaces.
|
|
16
|
+
*
|
|
17
|
+
* @module lib/db/relay-db
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.createRelay = createRelay;
|
|
21
|
+
exports.getRelayById = getRelayById;
|
|
22
|
+
exports.listOpenRelaysTo = listOpenRelaysTo;
|
|
23
|
+
exports.listOpenRelaysFrom = listOpenRelaysFrom;
|
|
24
|
+
exports.getSessionRelaySummary = getSessionRelaySummary;
|
|
25
|
+
exports.listOpenRelaysForWorktree = listOpenRelaysForWorktree;
|
|
26
|
+
exports.countOpenRelaysBetween = countOpenRelaysBetween;
|
|
27
|
+
exports.stashRelayPayload = stashRelayPayload;
|
|
28
|
+
exports.listRelaysWithPendingPayload = listRelaysWithPendingPayload;
|
|
29
|
+
exports.clearRelayPending = clearRelayPending;
|
|
30
|
+
exports.markRelayDelivered = markRelayDelivered;
|
|
31
|
+
exports.markRelayPromptNotified = markRelayPromptNotified;
|
|
32
|
+
exports.getRelayPromptSignature = getRelayPromptSignature;
|
|
33
|
+
exports.markRelayExpired = markRelayExpired;
|
|
34
|
+
exports.listExpiredOpenRelays = listExpiredOpenRelays;
|
|
35
|
+
exports.cancelRelay = cancelRelay;
|
|
36
|
+
exports.countRelays = countRelays;
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const types_1 = require("../../lib/relay/types");
|
|
39
|
+
const logger_1 = require("../../lib/logger");
|
|
40
|
+
const logger = (0, logger_1.createLogger)('relay-db');
|
|
41
|
+
/** Every column, in one place, so the readers cannot drift from each other. */
|
|
42
|
+
const RELAY_COLUMNS = `
|
|
43
|
+
id, from_worktree_id, from_instance_id, to_worktree_id, to_instance_id,
|
|
44
|
+
state, hops, sent_request_id, pending_kind, pending_body, prompt_signature,
|
|
45
|
+
created_at, updated_at, expires_at, delivered_at
|
|
46
|
+
`;
|
|
47
|
+
function mapRelay(row) {
|
|
48
|
+
return {
|
|
49
|
+
id: row.id,
|
|
50
|
+
from: { worktreeId: row.from_worktree_id, instanceId: row.from_instance_id },
|
|
51
|
+
to: { worktreeId: row.to_worktree_id, instanceId: row.to_instance_id },
|
|
52
|
+
state: row.state,
|
|
53
|
+
hops: row.hops,
|
|
54
|
+
sentRequestId: row.sent_request_id,
|
|
55
|
+
pendingKind: row.pending_kind ?? null,
|
|
56
|
+
createdAt: row.created_at,
|
|
57
|
+
updatedAt: row.updated_at,
|
|
58
|
+
expiresAt: row.expires_at,
|
|
59
|
+
deliveredAt: row.delivered_at,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Insert a new `pending` relay and hand it back. */
|
|
63
|
+
function createRelay(db, input) {
|
|
64
|
+
const id = (0, crypto_1.randomUUID)();
|
|
65
|
+
const now = input.now ?? Date.now();
|
|
66
|
+
db.prepare(`
|
|
67
|
+
INSERT INTO session_relays
|
|
68
|
+
(id, from_worktree_id, from_instance_id, to_worktree_id, to_instance_id,
|
|
69
|
+
state, hops, sent_request_id, pending_kind, pending_body, prompt_signature,
|
|
70
|
+
created_at, updated_at, expires_at, delivered_at)
|
|
71
|
+
VALUES (?, ?, ?, ?, ?, 'pending', ?, NULL, NULL, NULL, NULL, ?, ?, ?, NULL)
|
|
72
|
+
`).run(id, input.from.worktreeId, input.from.instanceId, input.to.worktreeId, input.to.instanceId, input.hops, now, now, input.expiresAt);
|
|
73
|
+
return {
|
|
74
|
+
id,
|
|
75
|
+
from: { ...input.from },
|
|
76
|
+
to: { ...input.to },
|
|
77
|
+
state: 'pending',
|
|
78
|
+
hops: input.hops,
|
|
79
|
+
sentRequestId: null,
|
|
80
|
+
pendingKind: null,
|
|
81
|
+
createdAt: now,
|
|
82
|
+
updatedAt: now,
|
|
83
|
+
expiresAt: input.expiresAt,
|
|
84
|
+
deliveredAt: null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** One relay by id, or null. */
|
|
88
|
+
function getRelayById(db, id) {
|
|
89
|
+
const row = db
|
|
90
|
+
.prepare(`SELECT ${RELAY_COLUMNS} FROM session_relays WHERE id = ?`)
|
|
91
|
+
.get(id);
|
|
92
|
+
return row ? mapRelay(row) : null;
|
|
93
|
+
}
|
|
94
|
+
/** Placeholders for an `IN (…)` over the open states. */
|
|
95
|
+
const OPEN_STATE_PLACEHOLDERS = types_1.OPEN_RELAY_STATES.map(() => '?').join(', ');
|
|
96
|
+
/** Every still-open relay this session must answer (it is the `to` end). */
|
|
97
|
+
function listOpenRelaysTo(db, endpoint) {
|
|
98
|
+
const rows = db
|
|
99
|
+
.prepare(`
|
|
100
|
+
SELECT ${RELAY_COLUMNS} FROM session_relays
|
|
101
|
+
WHERE to_worktree_id = ? AND to_instance_id = ?
|
|
102
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
103
|
+
ORDER BY created_at ASC
|
|
104
|
+
`)
|
|
105
|
+
.all(endpoint.worktreeId, endpoint.instanceId, ...types_1.OPEN_RELAY_STATES);
|
|
106
|
+
return rows.map(mapRelay);
|
|
107
|
+
}
|
|
108
|
+
/** Every still-open relay this session is waiting on (it is the `from` end). */
|
|
109
|
+
function listOpenRelaysFrom(db, endpoint) {
|
|
110
|
+
const rows = db
|
|
111
|
+
.prepare(`
|
|
112
|
+
SELECT ${RELAY_COLUMNS} FROM session_relays
|
|
113
|
+
WHERE from_worktree_id = ? AND from_instance_id = ?
|
|
114
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
115
|
+
ORDER BY created_at ASC
|
|
116
|
+
`)
|
|
117
|
+
.all(endpoint.worktreeId, endpoint.instanceId, ...types_1.OPEN_RELAY_STATES);
|
|
118
|
+
return rows.map(mapRelay);
|
|
119
|
+
}
|
|
120
|
+
/** Both halves of {@link SessionRelaySummary} in one call. */
|
|
121
|
+
function getSessionRelaySummary(db, endpoint) {
|
|
122
|
+
return {
|
|
123
|
+
owed: listOpenRelaysTo(db, endpoint),
|
|
124
|
+
awaiting: listOpenRelaysFrom(db, endpoint),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** Every open relay in a worktree, whichever end it belongs to. */
|
|
128
|
+
function listOpenRelaysForWorktree(db, worktreeId) {
|
|
129
|
+
const rows = db
|
|
130
|
+
.prepare(`
|
|
131
|
+
SELECT ${RELAY_COLUMNS} FROM session_relays
|
|
132
|
+
WHERE (from_worktree_id = ? OR to_worktree_id = ?)
|
|
133
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
134
|
+
ORDER BY created_at ASC
|
|
135
|
+
`)
|
|
136
|
+
.all(worktreeId, worktreeId, ...types_1.OPEN_RELAY_STATES);
|
|
137
|
+
return rows.map(mapRelay);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* How many open relays already run from `from` to `to`.
|
|
141
|
+
*
|
|
142
|
+
* The Issue's "a from→to pair must not sit at two pending relays at once": a
|
|
143
|
+
* second standing instruction to the same session says nothing the first one
|
|
144
|
+
* does not, and both would fire on the same finished turn.
|
|
145
|
+
*/
|
|
146
|
+
function countOpenRelaysBetween(db, from, to) {
|
|
147
|
+
const row = db
|
|
148
|
+
.prepare(`
|
|
149
|
+
SELECT COUNT(*) AS n FROM session_relays
|
|
150
|
+
WHERE from_worktree_id = ? AND from_instance_id = ?
|
|
151
|
+
AND to_worktree_id = ? AND to_instance_id = ?
|
|
152
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
153
|
+
`)
|
|
154
|
+
.get(from.worktreeId, from.instanceId, to.worktreeId, to.instanceId, ...types_1.OPEN_RELAY_STATES);
|
|
155
|
+
return row.n;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Record a payload that has been decided and not yet delivered.
|
|
159
|
+
*
|
|
160
|
+
* Guarded on `pending_kind IS NULL`, which is what makes two producers finding
|
|
161
|
+
* the same finished turn cost ONE delivery: the second one loses the race and
|
|
162
|
+
* returns false rather than queueing a duplicate. The guard is released by
|
|
163
|
+
* {@link clearRelayPending} once the payload has actually gone out, so the same
|
|
164
|
+
* relay can carry a prompt notice now and a reply later.
|
|
165
|
+
*
|
|
166
|
+
* @returns Whether this call is the one that stashed it
|
|
167
|
+
*/
|
|
168
|
+
function stashRelayPayload(db, id, kind, body, now = Date.now()) {
|
|
169
|
+
const result = db
|
|
170
|
+
.prepare(`
|
|
171
|
+
UPDATE session_relays
|
|
172
|
+
SET pending_kind = ?, pending_body = ?, updated_at = ?
|
|
173
|
+
WHERE id = ? AND pending_kind IS NULL
|
|
174
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
175
|
+
`)
|
|
176
|
+
.run(kind, body, now, id, ...types_1.OPEN_RELAY_STATES);
|
|
177
|
+
return result.changes === 1;
|
|
178
|
+
}
|
|
179
|
+
/** Every relay carrying an undelivered payload, oldest first. */
|
|
180
|
+
function listRelaysWithPendingPayload(db) {
|
|
181
|
+
const rows = db
|
|
182
|
+
.prepare(`
|
|
183
|
+
SELECT ${RELAY_COLUMNS} FROM session_relays
|
|
184
|
+
WHERE pending_kind IS NOT NULL
|
|
185
|
+
ORDER BY updated_at ASC
|
|
186
|
+
`)
|
|
187
|
+
.all();
|
|
188
|
+
return rows
|
|
189
|
+
.filter((row) => row.pending_body !== null && row.pending_kind !== null)
|
|
190
|
+
.map((row) => ({
|
|
191
|
+
relay: mapRelay(row),
|
|
192
|
+
kind: row.pending_kind,
|
|
193
|
+
body: row.pending_body,
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
/** Drop an undelivered payload (it went out, or it was superseded). */
|
|
197
|
+
function clearRelayPending(db, id, now = Date.now()) {
|
|
198
|
+
db.prepare(`
|
|
199
|
+
UPDATE session_relays
|
|
200
|
+
SET pending_kind = NULL, pending_body = NULL, updated_at = ?
|
|
201
|
+
WHERE id = ?
|
|
202
|
+
`).run(now, id);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Close the relay as delivered, exactly once.
|
|
206
|
+
*
|
|
207
|
+
* Two clauses, and they guard different things — worth separating, because a
|
|
208
|
+
* later reader who notices that the second is redundant *for one relay id* will
|
|
209
|
+
* otherwise delete the one that is not.
|
|
210
|
+
*
|
|
211
|
+
* - `state IN (open)` is what makes a SECOND call for the same relay answer
|
|
212
|
+
* false: the first call left it `delivered`, which is not an open state.
|
|
213
|
+
* - `sent_request_id IS NULL`, together with the column's UNIQUE index, is what
|
|
214
|
+
* makes the delivery id itself unrepeatable ACROSS relays and across
|
|
215
|
+
* processes. It is the idempotency key the Issue names, and it is why this
|
|
216
|
+
* function catches: the index refusing a write is the answer "somebody else
|
|
217
|
+
* got there first", and that answer must not arrive as an exception inside a
|
|
218
|
+
* delivery path.
|
|
219
|
+
*
|
|
220
|
+
* @returns Whether this call is the one that closed it
|
|
221
|
+
*/
|
|
222
|
+
function markRelayDelivered(db, id, sentRequestId, now = Date.now()) {
|
|
223
|
+
try {
|
|
224
|
+
const result = db
|
|
225
|
+
.prepare(`
|
|
226
|
+
UPDATE session_relays
|
|
227
|
+
SET state = 'delivered', sent_request_id = ?, delivered_at = ?,
|
|
228
|
+
pending_kind = NULL, pending_body = NULL, updated_at = ?
|
|
229
|
+
WHERE id = ? AND sent_request_id IS NULL
|
|
230
|
+
AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
231
|
+
`)
|
|
232
|
+
.run(sentRequestId, now, now, id, ...types_1.OPEN_RELAY_STATES);
|
|
233
|
+
return result.changes === 1;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
// The UNIQUE index refusing the write IS the answer "somebody else got
|
|
237
|
+
// there first", and it must not become an exception in a delivery path.
|
|
238
|
+
logger.warn('relay-deliver-conflict', {
|
|
239
|
+
relayId: id,
|
|
240
|
+
error: error instanceof Error ? error.message : String(error),
|
|
241
|
+
});
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Note that A is being told B is waiting on a confirmation.
|
|
247
|
+
*
|
|
248
|
+
* Leaves the relay OPEN — `prompt` is an open state, so answering the dialog
|
|
249
|
+
* lets B finish and the reply is stashed and delivered from here — and leaves
|
|
250
|
+
* any stashed payload alone: this records the DECISION to notify, while
|
|
251
|
+
* `clearRelayPending` records that the notice went out. `prompt_signature` is
|
|
252
|
+
* what stops a twenty-minute wait from producing a notice on every poll.
|
|
253
|
+
*/
|
|
254
|
+
function markRelayPromptNotified(db, id, signature, now = Date.now()) {
|
|
255
|
+
db.prepare(`
|
|
256
|
+
UPDATE session_relays
|
|
257
|
+
SET state = 'prompt', prompt_signature = ?, updated_at = ?
|
|
258
|
+
WHERE id = ?
|
|
259
|
+
`).run(signature, now, id);
|
|
260
|
+
}
|
|
261
|
+
/** The confirmation notice already sent for this relay, or null. */
|
|
262
|
+
function getRelayPromptSignature(db, id) {
|
|
263
|
+
const row = db
|
|
264
|
+
.prepare('SELECT prompt_signature FROM session_relays WHERE id = ?')
|
|
265
|
+
.get(id);
|
|
266
|
+
return row?.prompt_signature ?? null;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Close the relay as expired, exactly once.
|
|
270
|
+
*
|
|
271
|
+
* The once-ness is the point: the Issue asks for ONE line of notice, and the
|
|
272
|
+
* state transition is what the notice is written from.
|
|
273
|
+
*
|
|
274
|
+
* @returns Whether this call is the one that expired it
|
|
275
|
+
*/
|
|
276
|
+
function markRelayExpired(db, id, now = Date.now()) {
|
|
277
|
+
const result = db
|
|
278
|
+
.prepare(`
|
|
279
|
+
UPDATE session_relays
|
|
280
|
+
SET state = 'expired', updated_at = ?
|
|
281
|
+
WHERE id = ? AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
282
|
+
`)
|
|
283
|
+
.run(now, id, ...types_1.OPEN_RELAY_STATES);
|
|
284
|
+
return result.changes === 1;
|
|
285
|
+
}
|
|
286
|
+
/** Every open relay whose deadline has passed. */
|
|
287
|
+
function listExpiredOpenRelays(db, now = Date.now()) {
|
|
288
|
+
const rows = db
|
|
289
|
+
.prepare(`
|
|
290
|
+
SELECT ${RELAY_COLUMNS} FROM session_relays
|
|
291
|
+
WHERE state IN (${OPEN_STATE_PLACEHOLDERS}) AND expires_at <= ?
|
|
292
|
+
ORDER BY expires_at ASC
|
|
293
|
+
`)
|
|
294
|
+
.all(...types_1.OPEN_RELAY_STATES, now);
|
|
295
|
+
return rows.map(mapRelay);
|
|
296
|
+
}
|
|
297
|
+
/** Withdraw a relay. Returns false when it was already closed or absent. */
|
|
298
|
+
function cancelRelay(db, id, now = Date.now()) {
|
|
299
|
+
const result = db
|
|
300
|
+
.prepare(`
|
|
301
|
+
UPDATE session_relays
|
|
302
|
+
SET state = 'cancelled', pending_kind = NULL, pending_body = NULL, updated_at = ?
|
|
303
|
+
WHERE id = ? AND state IN (${OPEN_STATE_PLACEHOLDERS})
|
|
304
|
+
`)
|
|
305
|
+
.run(now, id, ...types_1.OPEN_RELAY_STATES);
|
|
306
|
+
return result.changes === 1;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Count relays per state.
|
|
310
|
+
*
|
|
311
|
+
* The shape `commandmate task show` and `report metrics` print. Counting in SQL
|
|
312
|
+
* rather than reading rows because a long-lived server accumulates thousands
|
|
313
|
+
* and both callers want five integers.
|
|
314
|
+
*/
|
|
315
|
+
function countRelays(db, filter = {}) {
|
|
316
|
+
const clauses = [];
|
|
317
|
+
const params = [];
|
|
318
|
+
if (filter.worktreeId) {
|
|
319
|
+
if (filter.instanceId) {
|
|
320
|
+
clauses.push('((from_worktree_id = ? AND from_instance_id = ?) OR (to_worktree_id = ? AND to_instance_id = ?))');
|
|
321
|
+
params.push(filter.worktreeId, filter.instanceId, filter.worktreeId, filter.instanceId);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
clauses.push('(from_worktree_id = ? OR to_worktree_id = ?)');
|
|
325
|
+
params.push(filter.worktreeId, filter.worktreeId);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (filter.since !== undefined) {
|
|
329
|
+
clauses.push('created_at >= ?');
|
|
330
|
+
params.push(filter.since);
|
|
331
|
+
}
|
|
332
|
+
const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
333
|
+
const rows = db
|
|
334
|
+
.prepare(`SELECT state, COUNT(*) AS n FROM session_relays ${where} GROUP BY state`)
|
|
335
|
+
.all(...params);
|
|
336
|
+
const counts = (0, types_1.emptyRelayCounts)();
|
|
337
|
+
for (const row of rows) {
|
|
338
|
+
if (row.state in counts) {
|
|
339
|
+
counts[row.state] = row.n;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return counts;
|
|
343
|
+
}
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* Covers:
|
|
12
12
|
* - SGR sequences: ESC[Nm (colors, bold, underline, etc.)
|
|
13
13
|
* - OSC sequences: ESC]...BEL and ESC]...ST (ESC \\) - window title, and the
|
|
14
|
-
* OSC 8 hyperlinks that claude/codex/copilot emit (Issue #1912)
|
|
14
|
+
* OSC 8 hyperlinks that claude/codex/copilot emit (Issue #1912). Also
|
|
15
|
+
* available on its own as {@link stripOsc} (Issue #2369), for a consumer that
|
|
16
|
+
* renders SGR and must not render OSC.
|
|
15
17
|
* - CSI sequences: ESC[...letter (cursor movement, erase, etc.)
|
|
16
18
|
*
|
|
17
19
|
* Known limitations (SEC-002): 8-bit CSI (0x9B), DEC private modes (ESC[?25h),
|
|
@@ -19,14 +21,49 @@
|
|
|
19
21
|
* practice tmux capture-pane output rarely contains these.
|
|
20
22
|
*/
|
|
21
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.ANSI_PATTERN = void 0;
|
|
24
|
+
exports.ANSI_PATTERN = exports.OSC_PATTERN = void 0;
|
|
23
25
|
exports.stripAnsi = stripAnsi;
|
|
26
|
+
exports.stripOsc = stripOsc;
|
|
24
27
|
exports.extractAnsiSequences = extractAnsiSequences;
|
|
25
|
-
|
|
28
|
+
/**
|
|
29
|
+
* One OSC sequence: `ESC ]`, a payload, and either terminator (BEL or ST).
|
|
30
|
+
*
|
|
31
|
+
* Split out of {@link ANSI_PATTERN} by Issue #2369 so a second consumer can
|
|
32
|
+
* strip OSC **without** stripping SGR. `sanitizeTerminalOutput`
|
|
33
|
+
* (`lib/security/sanitize.ts`) is that consumer: it hands the frame to
|
|
34
|
+
* `ansi-to-html`, which turns SGR into colour and does not know OSC at all — so
|
|
35
|
+
* before this split, Command Code's `/usage` panel rendered its breakdown link
|
|
36
|
+
* as the literal text `]8;;https://commandcode.ai/…\` beside the label. Calling
|
|
37
|
+
* `stripAnsi` there would have thrown the colour away with it.
|
|
38
|
+
*
|
|
39
|
+
* The payload class excludes ESC as well as BEL (Issue #1912) so a sequence
|
|
40
|
+
* ended by ST cannot run on to a BEL later in the buffer and swallow the visible
|
|
41
|
+
* link text between them. An OSC with no terminator at all matches nothing and
|
|
42
|
+
* is left in place, which is the safe answer: eating the rest of the frame is
|
|
43
|
+
* worse than showing one stray escape.
|
|
44
|
+
*
|
|
45
|
+
* The source is shared with {@link ANSI_PATTERN} rather than restated, so the
|
|
46
|
+
* two cannot drift about which terminators exist.
|
|
47
|
+
*/
|
|
48
|
+
const OSC_SOURCE = '\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)';
|
|
49
|
+
/** {@link OSC_SOURCE} as a reusable global pattern. */
|
|
50
|
+
exports.OSC_PATTERN = new RegExp(OSC_SOURCE, 'g');
|
|
51
|
+
exports.ANSI_PATTERN = new RegExp(`\\x1b\\[[0-9;]*[a-zA-Z]|${OSC_SOURCE}|\\[[0-9;]*m`, 'g');
|
|
26
52
|
/** Remove all ANSI escape sequences from a string. */
|
|
27
53
|
function stripAnsi(str) {
|
|
28
54
|
return str.replace(exports.ANSI_PATTERN, '');
|
|
29
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Remove OSC sequences only, leaving SGR (colour) and CSI untouched.
|
|
58
|
+
*
|
|
59
|
+
* For OSC 8 hyperlinks — `ESC ] 8 ; ; <url> ST <label> ESC ] 8 ; ; ST` — this
|
|
60
|
+
* drops both halves of the pair and keeps `<label>`, which is the text the
|
|
61
|
+
* terminal itself shows. See {@link OSC_PATTERN} for who needs this and why
|
|
62
|
+
* `stripAnsi` is not the answer for them.
|
|
63
|
+
*/
|
|
64
|
+
function stripOsc(str) {
|
|
65
|
+
return str.replace(exports.OSC_PATTERN, '');
|
|
66
|
+
}
|
|
30
67
|
/**
|
|
31
68
|
* Extract the ANSI escape sequences from a string, in order, discarding all
|
|
32
69
|
* other characters. Reuses the same tested pattern as {@link stripAnsi} so the
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
* Shared between response-poller.ts and API routes
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = void 0;
|
|
7
|
+
exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
|
|
8
|
+
exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = void 0;
|
|
9
9
|
exports.isCodexTurnActive = isCodexTurnActive;
|
|
10
10
|
exports.findClaudeChromeStart = findClaudeChromeStart;
|
|
11
11
|
exports.isCodexPromptReady = isCodexPromptReady;
|
|
12
12
|
exports.getCodexActiveDialog = getCodexActiveDialog;
|
|
13
13
|
exports.getCodexLifecycleDialog = getCodexLifecycleDialog;
|
|
14
|
+
exports.findCodexChromeStart = findCodexChromeStart;
|
|
15
|
+
exports.findCodexUserEchoIndex = findCodexUserEchoIndex;
|
|
14
16
|
exports.findOpenCodeChromeStart = findOpenCodeChromeStart;
|
|
15
17
|
exports.findOpenCodeUserEchoEnd = findOpenCodeUserEchoEnd;
|
|
16
18
|
exports.findOpenCodeComposerRows = findOpenCodeComposerRows;
|
|
@@ -29,6 +31,7 @@ exports.buildDetectPromptOptions = buildDetectPromptOptions;
|
|
|
29
31
|
const logger_1 = require("../../lib/logger");
|
|
30
32
|
const ansi_1 = require("./ansi");
|
|
31
33
|
const composer_text_1 = require("./composer-text");
|
|
34
|
+
const cli_patterns_1 = require("./tools/codex/cli-patterns");
|
|
32
35
|
const thinking_constants_1 = require("../../config/thinking-constants");
|
|
33
36
|
const logger = (0, logger_1.createLogger)('cli-patterns');
|
|
34
37
|
/**
|
|
@@ -589,6 +592,207 @@ exports.CODEX_PAGER_FOOTER_PATTERN = /(?:↑\/↓|pgup\/pgdn|home\/end)\s+to\s+(
|
|
|
589
592
|
* line. No nested quantifiers (ReDoS-safe; adjacent greedy quantifiers only).
|
|
590
593
|
*/
|
|
591
594
|
exports.CODEX_STATUS_BAR_PATTERN = /^\s*\S.*·\s*~?\/\S*\s*$/;
|
|
595
|
+
/**
|
|
596
|
+
* How far above the last non-blank row {@link findCodexChromeStart} looks for the
|
|
597
|
+
* composer.
|
|
598
|
+
*
|
|
599
|
+
* Same allowance and the same reason as {@link CODEX_COMPOSER_SEARCH_ROWS}: codex
|
|
600
|
+
* pins the composer two to three rows above the bottom in every measured frame
|
|
601
|
+
* (`tests/fixtures/codex-live-2310/`), and a wider band would let the search walk
|
|
602
|
+
* into the transcript and mistake the echoed user message — drawn with the same
|
|
603
|
+
* `›` — for the input box.
|
|
604
|
+
*
|
|
605
|
+
* Wider than the 8 rows of the liveness search because 0.15x can draw notices
|
|
606
|
+
* BELOW the composer (`N background terminal running · /ps to view · /stop to
|
|
607
|
+
* close`) that the liveness search never had to step over.
|
|
608
|
+
*/
|
|
609
|
+
const CODEX_CHROME_SEARCH_ROWS = 12;
|
|
610
|
+
/**
|
|
611
|
+
* A row whose first character is codex's `›` glyph, with something after it.
|
|
612
|
+
*
|
|
613
|
+
* Deliberately not {@link CODEX_PROMPT_PATTERN}: that one is multiline and
|
|
614
|
+
* matches a bare `›`, which is right for "is a prompt on screen anywhere?" and
|
|
615
|
+
* wrong for classifying ONE row. Anchored at column 0 because all three of
|
|
616
|
+
* codex's `›` uses are, and an indented `›` in a reply is quoted text.
|
|
617
|
+
*/
|
|
618
|
+
const CODEX_CHROME_GLYPH_ROW_PATTERN = /^›(\s|$)/;
|
|
619
|
+
/**
|
|
620
|
+
* Locate the start of codex's bottom-pinned chrome within a captured pane.
|
|
621
|
+
*
|
|
622
|
+
* The fifth reader of this shape, after {@link findClaudeChromeStart} (#1289),
|
|
623
|
+
* {@link findCopilotChromeStart} (#1897), {@link findOpenCodeChromeStart}
|
|
624
|
+
* (#1911) and {@link findCommandCodeChromeStart} (#2250). codex is the tool that
|
|
625
|
+
* never got one, and Issue #2400 is the bill for that.
|
|
626
|
+
*
|
|
627
|
+
* codex renders inline and pins two rows to the bottom of a settled pane:
|
|
628
|
+
*
|
|
629
|
+
* ```text
|
|
630
|
+
* › Ask Codex to do anything ← composer (placeholder or typed text)
|
|
631
|
+
*
|
|
632
|
+
* gpt-6-astra xhigh · ~/share/work/…/CommandMate ← status bar (model · cwd)
|
|
633
|
+
* ```
|
|
634
|
+
*
|
|
635
|
+
* Below the composer codex may also draw its own notices (`N background terminal
|
|
636
|
+
* running · /ps to view`), so the boundary is "the composer row" rather than a
|
|
637
|
+
* list of footer shapes: everything from the composer down is chrome by
|
|
638
|
+
* construction, whatever codex adds there next.
|
|
639
|
+
*
|
|
640
|
+
* ## What went wrong without it (#2400)
|
|
641
|
+
*
|
|
642
|
+
* While the capture window is NOT saturated codex's extraction starts at
|
|
643
|
+
* `lastCapturedLine`, so the composer only ever mattered as the `endIndex` break
|
|
644
|
+
* — which the extraction loop already had. Once the pane outgrows
|
|
645
|
+
* `CACHE_MAX_CAPTURE_LINES` (#1670) the cursor stops being a position in the
|
|
646
|
+
* capture and `resolveExtractionStartIndex` switches to the newest echoed user
|
|
647
|
+
* prompt. With no `contentEnd`, that backwards search started at the very bottom
|
|
648
|
+
* of the pane and the first `›` it met was the COMPOSER. Extraction then began
|
|
649
|
+
* on the row after it, i.e. on the status bar, and the saved "reply" for every
|
|
650
|
+
* turn on a saturated pane was one row:
|
|
651
|
+
*
|
|
652
|
+
* ```text
|
|
653
|
+
* gpt-6-astra xhigh · ~/share/work/github_kewton/CommandAgent-develop
|
|
654
|
+
* ```
|
|
655
|
+
*
|
|
656
|
+
* Identical on every turn, so `isDuplicateResponse` then locked on it and the
|
|
657
|
+
* pane could not record another reply at all. That is #1289's defect verbatim,
|
|
658
|
+
* one tool later — the same reason `findCommandCodeChromeStart` exists.
|
|
659
|
+
*
|
|
660
|
+
* ## Why the attributes and not the placeholder text
|
|
661
|
+
*
|
|
662
|
+
* The codex branch of `findRecentUserPromptIndex` used to exclude the composer by
|
|
663
|
+
* naming its placeholders (`Implement`, `Find and fix`, `Type`, `Summarize`).
|
|
664
|
+
* Those are codex 0.1x wording, and 0.15x draws `Ask Codex to do anything`, so
|
|
665
|
+
* the list silently stopped matching the thing it was written for. Issue #2310
|
|
666
|
+
* measured what actually separates codex's three uses of `›` (U+203A), and it is
|
|
667
|
+
* the SGR attributes, not the text: the composer glyph is bold (`ESC[1m›`), a
|
|
668
|
+
* transcript echo is dim (`ESC[1;2m›`), a dialog option carries a coloured glyph
|
|
669
|
+
* or a bold label. {@link readCodexGlyphRowKind} is that measurement, and this
|
|
670
|
+
* reader is one of its callers.
|
|
671
|
+
*
|
|
672
|
+
* `-1` is returned for a frame whose bottom-most `›` is an option row: codex
|
|
673
|
+
* replaces the composer with the dialog, so there is no chrome to trim and the
|
|
674
|
+
* caller resolves the frame on the prompt path instead.
|
|
675
|
+
*
|
|
676
|
+
* ## The stripped-capture fallback
|
|
677
|
+
*
|
|
678
|
+
* Auto-Yes hands the detection layer a capture that has already been through
|
|
679
|
+
* `stripAnsi`, and there every `›` is the same byte — {@link
|
|
680
|
+
* readCodexGlyphRowKind} answers `null` on purpose rather than guessing. This
|
|
681
|
+
* reader still has to answer for those frames, so it falls back to the one
|
|
682
|
+
* structural landmark codex pins BELOW the composer and nowhere else: the status
|
|
683
|
+
* bar ({@link CODEX_STATUS_BAR_PATTERN}, `model · /path`). Requiring it means a
|
|
684
|
+
* frame with no bar — a pane mid-redraw, an overlay — yields `-1` and the
|
|
685
|
+
* pre-#2400 reading, which is the direction that costs nothing.
|
|
686
|
+
*
|
|
687
|
+
* @param lines - Captured pane lines, ANSI-bearing or not; trailing blanks tolerated
|
|
688
|
+
* @returns Index of the composer row, or -1 when no composer chrome is present
|
|
689
|
+
*/
|
|
690
|
+
function findCodexChromeStart(lines) {
|
|
691
|
+
let lastRow = lines.length - 1;
|
|
692
|
+
while (lastRow >= 0 && (0, ansi_1.stripAnsi)(lines[lastRow]).trim() === '')
|
|
693
|
+
lastRow--;
|
|
694
|
+
if (lastRow < 0)
|
|
695
|
+
return -1;
|
|
696
|
+
// Bottom-most `›` row within the band codex reserves for its chrome. Anything
|
|
697
|
+
// further up is transcript, and latching onto an echo there would cut the
|
|
698
|
+
// reply this whole reader exists to keep.
|
|
699
|
+
let glyphRow = -1;
|
|
700
|
+
for (let i = lastRow; i >= Math.max(0, lastRow - CODEX_CHROME_SEARCH_ROWS); i--) {
|
|
701
|
+
if (CODEX_CHROME_GLYPH_ROW_PATTERN.test((0, ansi_1.stripAnsi)(lines[i]))) {
|
|
702
|
+
glyphRow = i;
|
|
703
|
+
break;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
if (glyphRow < 0)
|
|
707
|
+
return -1;
|
|
708
|
+
const kind = (0, cli_patterns_1.readCodexGlyphRowKind)(lines[glyphRow]);
|
|
709
|
+
if (kind === 'composer')
|
|
710
|
+
return glyphRow;
|
|
711
|
+
// A dialog is up (no composer drawn) or the bottom-most `›` is a transcript
|
|
712
|
+
// echo mid-redraw. Neither is chrome to trim.
|
|
713
|
+
if (kind !== null)
|
|
714
|
+
return -1;
|
|
715
|
+
// Stripped capture: no attributes to read. Accept the row as the composer only
|
|
716
|
+
// when codex's status bar is drawn below it, which is where it always sits and
|
|
717
|
+
// where a transcript echo can never be.
|
|
718
|
+
for (let i = glyphRow + 1; i <= lastRow; i++) {
|
|
719
|
+
if (exports.CODEX_STATUS_BAR_PATTERN.test((0, ansi_1.stripAnsi)(lines[i])))
|
|
720
|
+
return glyphRow;
|
|
721
|
+
}
|
|
722
|
+
return -1;
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* The shape of a codex row that could be the echo of a message the user sent.
|
|
726
|
+
*
|
|
727
|
+
* Shape only — `›` at column 0 with text after it — which all three of codex's
|
|
728
|
+
* `›` uses share. {@link findCodexUserEchoIndex} is what tells them apart.
|
|
729
|
+
*/
|
|
730
|
+
exports.CODEX_USER_ECHO_PATTERN = /^›\s+\S/;
|
|
731
|
+
/**
|
|
732
|
+
* Find the newest transcript echo of an operator message in a codex capture.
|
|
733
|
+
*
|
|
734
|
+
* The reader `findRecentUserPromptIndex` anchors codex turns on (Issue #2400).
|
|
735
|
+
* It replaces a negative lookahead over composer placeholder strings
|
|
736
|
+
* (`(?!Implement|Find and fix|Type|Summarize)`) written against codex 0.1x:
|
|
737
|
+
* 0.15x draws `Ask Codex to do anything`, so the guard matched nothing it was
|
|
738
|
+
* written for. The composer became the newest "echo", and on a saturated pane —
|
|
739
|
+
* the one path where this anchor decides where extraction STARTS (#1670) — the
|
|
740
|
+
* reply saved for every turn was the single status-bar row below it.
|
|
741
|
+
*
|
|
742
|
+
* ## What the attributes can and cannot separate
|
|
743
|
+
*
|
|
744
|
+
* #2310 measured the three uses of `›` and this reader adds the fourth reading
|
|
745
|
+
* they left open, captured for #2400 on codex-cli 0.153.4
|
|
746
|
+
* (`tests/fixtures/codex-live-2310/turn-submitted-no-status.txt`): the echo of
|
|
747
|
+
* a message the operator has JUST submitted is drawn `ESC[1m› ESC[0m<text>` —
|
|
748
|
+
* bold glyph, plain label — and only becomes the dim `ESC[1;2m› ` of the
|
|
749
|
+
* measured frames once the turn settles. That shape is indistinguishable from a
|
|
750
|
+
* composer holding typed text, so no per-row attribute rule can separate them.
|
|
751
|
+
*
|
|
752
|
+
* What separates them is position, which codex's layout fixes: the composer is
|
|
753
|
+
* the BOTTOM-MOST `›` row of a frame. So the reader takes the boundary from its
|
|
754
|
+
* caller:
|
|
755
|
+
*
|
|
756
|
+
* - `composerTrimmed` — `findCodexChromeStart` located the chrome and `lines`
|
|
757
|
+
* has already been cut above it, so every `›` row left is transcript and the
|
|
758
|
+
* newest one wins outright.
|
|
759
|
+
* - otherwise — the composer may still be the bottom-most `›` row, so the first
|
|
760
|
+
* candidate is stepped over. This is the structural spelling of the guard the
|
|
761
|
+
* placeholder list used to be, and unlike that list it cannot go stale.
|
|
762
|
+
*
|
|
763
|
+
* Dialog option rows are refused wherever they appear: codex renders inline, so
|
|
764
|
+
* a dialog answered minutes ago is still in the scrollback with its options
|
|
765
|
+
* intact (#1160), and anchoring on one would cut the reply mid-way.
|
|
766
|
+
*
|
|
767
|
+
* @param lines - Captured pane rows, ANSI intact where the caller has it
|
|
768
|
+
* @param contentEnd - Exclusive end of the conversation region
|
|
769
|
+
* @param windowSize - How many rows above `contentEnd` to search
|
|
770
|
+
* @param composerTrimmed - Whether `contentEnd` already excludes the composer
|
|
771
|
+
* @returns Index of the newest echo row, or -1 when none is in the window
|
|
772
|
+
*/
|
|
773
|
+
function findCodexUserEchoIndex(lines, contentEnd, windowSize, composerTrimmed) {
|
|
774
|
+
let composerHandled = composerTrimmed;
|
|
775
|
+
for (let i = Math.min(contentEnd, lines.length) - 1; i >= Math.max(0, contentEnd - windowSize); i--) {
|
|
776
|
+
if (!exports.CODEX_USER_ECHO_PATTERN.test((0, ansi_1.stripAnsi)(lines[i])))
|
|
777
|
+
continue;
|
|
778
|
+
const kind = (0, cli_patterns_1.readCodexGlyphRowKind)(lines[i]);
|
|
779
|
+
// An option row of a dialog still sitting in the scrollback.
|
|
780
|
+
if (kind === 'option')
|
|
781
|
+
continue;
|
|
782
|
+
// Positively an echo: codex has settled the row and drawn its glyph dim.
|
|
783
|
+
if (kind === 'transcript-echo')
|
|
784
|
+
return i;
|
|
785
|
+
// `composer` (bold glyph) or `null` (an ANSI-stripped capture, where all
|
|
786
|
+
// three uses are one byte). Either could be the input box, and the input box
|
|
787
|
+
// is always the bottom-most `›` row.
|
|
788
|
+
if (!composerHandled) {
|
|
789
|
+
composerHandled = true;
|
|
790
|
+
continue;
|
|
791
|
+
}
|
|
792
|
+
return i;
|
|
793
|
+
}
|
|
794
|
+
return -1;
|
|
795
|
+
}
|
|
592
796
|
/**
|
|
593
797
|
* Pasted text pattern
|
|
594
798
|
*
|