commandmate 0.30.2 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +160 -160
- package/.next/app-path-routes-manifest.json +27 -27
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/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_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 +3 -3
- 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 +4 -4
- 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_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 +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +4 -3
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +4 -3
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/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 +10 -10
- 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 +27 -27
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1262.js +1 -1
- package/.next/server/chunks/1886.js +3 -3
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -1
- package/.next/server/chunks/3123.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3480.js +5 -4
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +1 -5
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5043.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/552.js +2 -2
- package/.next/server/chunks/6072.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/663.js +4 -3
- package/.next/server/chunks/6894.js +2 -2
- package/.next/server/chunks/7187.js +1 -0
- package/.next/server/chunks/7472.js +1 -1
- package/.next/server/chunks/{880.js → 7859.js} +6 -6
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8800.js +2 -2
- package/.next/server/chunks/8918.js +7 -0
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +4 -4
- package/.next/server/chunks/9627.js +1 -1
- package/.next/server/chunks/9696.js +1 -1
- package/.next/server/chunks/9798.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +1 -0
- package/.next/static/chunks/4718-de1224c9e8a6e7fc.js +1 -0
- package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +1 -0
- package/.next/static/chunks/{5229-6c89475b61bd2c8b.js → 6170-951b9f5fe6b4b3b5.js} +1 -1
- package/.next/static/chunks/app/chat/{page-9aa2011410895b0d.js → page-37d7615d17d7e2a0.js} +1 -1
- package/.next/static/chunks/app/layout-4c2f21e3f653ee4c.js +1 -0
- package/.next/static/chunks/app/more/{page-333bba1c8bbc9c11.js → page-353a3924e6d7968e.js} +1 -1
- package/.next/static/chunks/app/{page-214f7ffa13a0cf10.js → page-c2bf871d953a1d6f.js} +1 -1
- package/.next/static/chunks/app/repositories/{page-4951cac905e50224.js → page-7d0f26df0537254c.js} +1 -1
- package/.next/static/chunks/app/review/{page-a0899b2d285318c3.js → page-e3f141b2829973e9.js} +1 -1
- package/.next/static/chunks/app/sessions/{page-fb36145ec732092a.js → page-53f188ed9ca49e5f.js} +1 -1
- package/.next/static/chunks/app/skills/[skillId]/{page-9099e26b60442873.js → page-80569b720aea59cc.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-182e32368696d824.js → page-dbd2690ad72da95b.js} +1 -1
- package/.next/static/chunks/app/skills/{page-d3fdc88239ebe0ab.js → page-dacd36f9c11aa7da.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-97205088520255a5.js +1 -0
- package/.next/static/css/5c13ea243dfdcb66.css +1 -0
- package/.next/trace +13 -13
- package/README.md +37 -11
- package/dist/cli/commands/attach.d.ts +50 -0
- package/dist/cli/commands/attach.d.ts.map +1 -0
- package/dist/cli/commands/attach.js +204 -0
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +114 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +23 -2
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +41 -1
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +34 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +5 -0
- package/dist/cli/types/index.d.ts +36 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/config/tmux-pane-config.d.ts +153 -0
- package/dist/config/tmux-pane-config.d.ts.map +1 -0
- package/dist/config/tmux-pane-config.js +172 -0
- package/dist/lib/cli-tools/session-name.d.ts +44 -0
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -0
- package/dist/lib/cli-tools/session-name.js +57 -0
- package/dist/lib/cli-tools/types.d.ts +1 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/cli-tools/types.js +6 -1
- package/dist/lib/cli-tools/validation.d.ts +34 -0
- package/dist/lib/cli-tools/validation.d.ts.map +1 -0
- package/dist/lib/cli-tools/validation.js +41 -0
- package/dist/lib/detection/status-reason.d.ts +18 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.js +18 -0
- package/dist/lib/detection/tools/verified-against.d.ts +57 -7
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +59 -8
- package/dist/lib/detection/version-probes.d.ts +26 -5
- package/dist/lib/detection/version-probes.d.ts.map +1 -1
- package/dist/lib/detection/version-probes.js +28 -6
- package/dist/lib/session/tmux-session-surface.d.ts +369 -0
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -0
- package/dist/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/config/cli-tool-timing-config.js +12 -1
- package/dist/server/src/config/detection-evidence-config.js +5 -0
- package/dist/server/src/config/schedule-config.js +28 -1
- package/dist/server/src/lib/cli-tools/antigravity.js +2 -2
- package/dist/server/src/lib/cli-tools/base.js +13 -8
- package/dist/server/src/lib/cli-tools/claude.js +20 -0
- package/dist/server/src/lib/cli-tools/codex.js +205 -61
- package/dist/server/src/lib/cli-tools/command-code.js +349 -0
- package/dist/server/src/lib/cli-tools/composer-spec.js +6 -0
- package/dist/server/src/lib/cli-tools/copilot.js +2 -2
- package/dist/server/src/lib/cli-tools/gemini.js +2 -2
- package/dist/server/src/lib/cli-tools/graceful-exit.js +16 -1
- package/dist/server/src/lib/cli-tools/index.js +4 -1
- package/dist/server/src/lib/cli-tools/install-hints.js +131 -0
- package/dist/server/src/lib/cli-tools/liveness-spec.js +18 -0
- package/dist/server/src/lib/cli-tools/manager.js +2 -0
- package/dist/server/src/lib/cli-tools/opencode.js +2 -2
- package/dist/server/src/lib/cli-tools/start-availability.js +18 -11
- package/dist/server/src/lib/cli-tools/types.js +6 -1
- package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
- package/dist/server/src/lib/cmate-parser.js +6 -0
- package/dist/server/src/lib/detection/cli-patterns.js +441 -8
- package/dist/server/src/lib/detection/opencode-modal-overlay.js +66 -100
- package/dist/server/src/lib/detection/selection-shape.js +341 -0
- package/dist/server/src/lib/detection/sgr-background.js +210 -0
- package/dist/server/src/lib/detection/status-detector.js +6 -0
- package/dist/server/src/lib/detection/status-reason.js +18 -0
- package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -15
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +392 -0
- package/dist/server/src/lib/detection/tools/codex/detect.js +83 -2
- package/dist/server/src/lib/detection/tools/command-code/detect.js +159 -0
- package/dist/server/src/lib/detection/tools/registry.js +6 -4
- package/dist/server/src/lib/detection/tools/verified-against.js +59 -8
- package/dist/server/src/lib/detection/version-probes.js +28 -6
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +77 -16
- package/dist/server/src/lib/hooks/sources/claude/history.js +94 -18
- package/dist/server/src/lib/hooks/sources/codex/history.js +84 -15
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +130 -17
- package/dist/server/src/lib/hooks/sources/codex/relay-install.js +145 -0
- package/dist/server/src/lib/hooks/sources/command-code/history.js +865 -0
- package/dist/server/src/lib/hooks/sources/command-code/hooks-config.js +390 -0
- package/dist/server/src/lib/hooks/sources/command-code/source.js +290 -0
- package/dist/server/src/lib/hooks/sources/command-code/tool-id.js +18 -0
- package/dist/server/src/lib/hooks/sources/command-code/transcript.js +604 -0
- package/dist/server/src/lib/hooks/sources/index.js +3 -1
- package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -3
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +24 -28
- package/dist/server/src/lib/hooks/sources/registry.js +4 -0
- package/dist/server/src/lib/hooks/sources/turn-body.js +77 -19
- package/dist/server/src/lib/job-executor.js +12 -0
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +6 -0
- package/dist/server/src/lib/polling/response-checker.js +112 -7
- package/dist/server/src/lib/polling/structured-history-gate.js +15 -8
- package/dist/server/src/lib/realtime/types.js +15 -5
- package/dist/server/src/lib/response-cleaner.js +24 -1
- package/dist/server/src/lib/response-extractor.js +11 -0
- package/dist/server/src/lib/session/claude-executor.js +223 -4
- package/dist/server/src/lib/session/cli-session.js +52 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +525 -0
- package/dist/server/src/lib/skills/compatibility-matrix.js +117 -1
- package/dist/server/src/lib/tmux/geometry-delegation.js +143 -0
- package/dist/server/src/lib/tmux/read-mode-pager.js +76 -10
- package/dist/server/src/lib/tmux/read-mode.js +44 -2
- package/dist/server/src/lib/tmux/session-hook-scripts.js +249 -0
- package/dist/server/src/lib/tmux/session-hooks.js +122 -0
- package/dist/server/src/lib/tmux/session-status-options.js +213 -0
- package/dist/server/src/lib/tmux/tmux.js +79 -2
- package/dist/server/src/lib/version-checker.js +110 -0
- package/dist/server/src/lib/ws-server.js +16 -10
- package/dist/server/src/types/agent-transcript.js +73 -1
- package/dist/server/src/types/terminal-keys.js +131 -3
- package/dist/types/terminal-keys.d.ts +100 -3
- package/dist/types/terminal-keys.d.ts.map +1 -1
- package/dist/types/terminal-keys.js +131 -3
- package/package.json +1 -1
- package/.next/server/chunks/3099.js +0 -5
- package/.next/server/chunks/7824.js +0 -1
- package/.next/static/chunks/3916-0e929d089282dc5d.js +0 -1
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +0 -1
- package/.next/static/chunks/6381-147dde2a967e9458.js +0 -1
- package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-2f73d69187936627.js +0 -1
- package/.next/static/css/23f9c40ecc458c77.css +0 -1
- /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → nXW4dPkpE_9xUf_9ySRff}/_buildManifest.js +0 -0
- /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → nXW4dPkpE_9xUf_9ySRff}/_ssgManifest.js +0 -0
|
@@ -15,8 +15,9 @@ exports.getToolStatusDetector = getToolStatusDetector;
|
|
|
15
15
|
const detect_1 = require("./antigravity/detect");
|
|
16
16
|
const detect_2 = require("./claude/detect");
|
|
17
17
|
const detect_3 = require("./codex/detect");
|
|
18
|
-
const detect_4 = require("./
|
|
19
|
-
const detect_5 = require("./
|
|
18
|
+
const detect_4 = require("./command-code/detect");
|
|
19
|
+
const detect_5 = require("./copilot/detect");
|
|
20
|
+
const detect_6 = require("./opencode/detect");
|
|
20
21
|
const run_detection_1 = require("./run-detection");
|
|
21
22
|
const verified_against_1 = require("./verified-against");
|
|
22
23
|
/**
|
|
@@ -38,9 +39,10 @@ const vibeLocalStatusDetector = createGenericStatusDetector('vibe-local');
|
|
|
38
39
|
const DETECTORS = {
|
|
39
40
|
claude: detect_2.claudeStatusDetector,
|
|
40
41
|
codex: detect_3.codexStatusDetector,
|
|
41
|
-
copilot:
|
|
42
|
-
opencode:
|
|
42
|
+
copilot: detect_5.copilotStatusDetector,
|
|
43
|
+
opencode: detect_6.opencodeStatusDetector,
|
|
43
44
|
antigravity: detect_1.antigravityStatusDetector,
|
|
45
|
+
'command-code': detect_4.commandCodeStatusDetector,
|
|
44
46
|
gemini: geminiStatusDetector,
|
|
45
47
|
'vibe-local': vibeLocalStatusDetector,
|
|
46
48
|
};
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* instead of importing it.
|
|
27
27
|
*/
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
|
|
29
|
+
exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
|
|
30
30
|
/** claude these rules were read off (#1708 / #1927 fixtures). */
|
|
31
31
|
exports.CLAUDE_VERIFIED_AGAINST = {
|
|
32
32
|
version: '2.1.240',
|
|
@@ -39,10 +39,21 @@ exports.CODEX_VERIFIED_AGAINST = {
|
|
|
39
39
|
capturedAt: '2026-08-15',
|
|
40
40
|
paneGeometry: '200x1000',
|
|
41
41
|
};
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* copilot-cli these rules were read off (#1885 / #1895 / #2269 fixtures).
|
|
44
|
+
*
|
|
45
|
+
* Bumped from 1.0.80 because the frames were RE-CAPTURED and the rules CHANGED:
|
|
46
|
+
* 1.0.82 redrew the composer's fence (`─` rules became a `╻▄` / `╹▀` half-block
|
|
47
|
+
* frame), dropped the `❯` from the composer in favour of the frame's own `┃`
|
|
48
|
+
* edge, boxed the transcript's echoed prompt between two more half-block
|
|
49
|
+
* dividers, and put a file-type badge in front of most tool rows' verbs. The
|
|
50
|
+
* frames are `tests/unit/lib/detection/fixtures/copilot-live-2269/`, captured on
|
|
51
|
+
* a private tmux socket at the production geometry; the 1.0.80 frames stay where
|
|
52
|
+
* they are and the rules still answer for both builds.
|
|
53
|
+
*/
|
|
43
54
|
exports.COPILOT_VERIFIED_AGAINST = {
|
|
44
|
-
version: '1.0.
|
|
45
|
-
capturedAt: '2026-
|
|
55
|
+
version: '1.0.82',
|
|
56
|
+
capturedAt: '2026-09-04',
|
|
46
57
|
paneGeometry: '200x1000',
|
|
47
58
|
};
|
|
48
59
|
/**
|
|
@@ -62,11 +73,50 @@ exports.OPENCODE_VERIFIED_AGAINST = {
|
|
|
62
73
|
capturedAt: '2026-08-26',
|
|
63
74
|
paneGeometry: '80x200',
|
|
64
75
|
};
|
|
65
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* agy these rules were read off (#988 / #995 footer + selection rules, re-read
|
|
78
|
+
* against the #2270 live panes).
|
|
79
|
+
*
|
|
80
|
+
* Bumped from `0.4.x` / `2026-07-30` / `inline` because the frames were
|
|
81
|
+
* RE-CAPTURED, not because the binary moved: #2270 drove agy 1.1.25 on a private
|
|
82
|
+
* tmux socket at the production geometry and kept both panes inline in
|
|
83
|
+
* `tests/unit/status-detector-selection.test.ts`
|
|
84
|
+
* (`AGY_1125_PERMISSION_PANE`, `AGY_1125_SWITCH_MODEL_PANE`) under the banner
|
|
85
|
+
* `Antigravity CLI 1.1.25`, trailing pane padding included. The
|
|
86
|
+
* `Do you want to proceed?` + `N. label` rules were measured off those frames,
|
|
87
|
+
* and `ANTIGRAVITY_SELECTION_LIST_PATTERN` (#995 / #997) was re-checked against
|
|
88
|
+
* them and left unchanged.
|
|
89
|
+
*
|
|
90
|
+
* `paneGeometry` leaves `inline` because the 1.1.25 permission dialog draws no
|
|
91
|
+
* composer row at all — it reproduces only at the 200x1000 pane the server
|
|
92
|
+
* captures, and a fixture without the ~970 blank padding rows exercises a
|
|
93
|
+
* different `lastLines` slice than production does. That is a statement about
|
|
94
|
+
* the capture condition, not about agy: the scrollback-retained rendering the
|
|
95
|
+
* `afterThinking` footer rules rest on (#988) is unchanged, and the 1.1.25
|
|
96
|
+
* dialog still ends on `esc to cancel`.
|
|
97
|
+
*
|
|
98
|
+
* What this stamp does NOT claim: #2270 captured `waiting` frames only, so the
|
|
99
|
+
* idle (`? for shortcuts`) and generating (spinner) branches are carried over
|
|
100
|
+
* from the 0.4 captures rather than re-measured. A live IDLE 1.1.25 frame is
|
|
101
|
+
* still uncaptured — see the `readIdleEvidence` note in `antigravity/detect.ts`.
|
|
102
|
+
*/
|
|
66
103
|
exports.ANTIGRAVITY_VERIFIED_AGAINST = {
|
|
67
|
-
version: '
|
|
68
|
-
capturedAt: '2026-
|
|
69
|
-
paneGeometry: '
|
|
104
|
+
version: '1.1.25',
|
|
105
|
+
capturedAt: '2026-09-04',
|
|
106
|
+
paneGeometry: '200x1000',
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Command Code these rules were read off (#2250 fixtures).
|
|
110
|
+
*
|
|
111
|
+
* The frames are `tests/fixtures/command-code-live-2250/`, captured on a private
|
|
112
|
+
* tmux socket at the production geometry — the default pane size does not
|
|
113
|
+
* reproduce the 200-column rules that fence the composer, and the status row
|
|
114
|
+
* drops its `esc to interrupt` tail below 72 columns.
|
|
115
|
+
*/
|
|
116
|
+
exports.COMMAND_CODE_VERIFIED_AGAINST = {
|
|
117
|
+
version: '1.40.1',
|
|
118
|
+
capturedAt: '2026-09-03',
|
|
119
|
+
paneGeometry: '200x1000',
|
|
70
120
|
};
|
|
71
121
|
/**
|
|
72
122
|
* The stamp for a tool whose frames nobody has captured yet.
|
|
@@ -94,6 +144,7 @@ exports.DETECTOR_VERIFIED_AGAINST = {
|
|
|
94
144
|
copilot: exports.COPILOT_VERIFIED_AGAINST,
|
|
95
145
|
opencode: exports.OPENCODE_VERIFIED_AGAINST,
|
|
96
146
|
antigravity: exports.ANTIGRAVITY_VERIFIED_AGAINST,
|
|
147
|
+
'command-code': exports.COMMAND_CODE_VERIFIED_AGAINST,
|
|
97
148
|
gemini: exports.UNMEASURED_VERIFIED_AGAINST,
|
|
98
149
|
'vibe-local': exports.UNMEASURED_VERIFIED_AGAINST,
|
|
99
150
|
};
|
|
@@ -124,7 +124,7 @@ function parseCliVersion(output) {
|
|
|
124
124
|
return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
|
-
* A `verifiedAgainst` stamp written as a minor-series wildcard: `0.
|
|
127
|
+
* A `verifiedAgainst` stamp written as a minor-series wildcard: `2.0.x`.
|
|
128
128
|
*
|
|
129
129
|
* Only ever applied to the stamp, never to a probe's own output — one side of
|
|
130
130
|
* this comparison is a string a human typed into a tool module, the other is
|
|
@@ -135,11 +135,32 @@ const VERIFIED_AGAINST_WILDCARD_REGEX = /^(\d+)\.(\d+)\.(?:x|\*)$/i;
|
|
|
135
135
|
* The comparable form of a `verifiedAgainst` stamp, or null when there is none.
|
|
136
136
|
*
|
|
137
137
|
* `'unmeasured'` is null — a tool nobody has captured frames for cannot be
|
|
138
|
-
* fresh or stale. `'0.
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
138
|
+
* fresh or stale. A minor-series stamp such as `'2.0.x'` becomes `2.0.0`;
|
|
139
|
+
* widening to `.0` is the safe direction, because it can only ever call a newer
|
|
140
|
+
* install stale, never call a stale one current.
|
|
141
|
+
*
|
|
142
|
+
* ## The wildcard branch has no caller in the table today, and stays anyway
|
|
143
|
+
*
|
|
144
|
+
* antigravity's `0.4.x` (Issue #995 measured a range rather than a build) was
|
|
145
|
+
* the only wildcard stamp ever written, and Issue #2292 replaced it with the
|
|
146
|
+
* build #2270 actually read the rules off (`1.1.25`). Re-run the grep that
|
|
147
|
+
* settled it and the branch has zero users:
|
|
148
|
+
*
|
|
149
|
+
* ```
|
|
150
|
+
* $ grep -rnE "version: '[0-9]+\.[0-9]+\.(x|\*)'" src/
|
|
151
|
+
* (no matches)
|
|
152
|
+
* ```
|
|
153
|
+
*
|
|
154
|
+
* It is kept, because deleting it would not delete the FORMAT.
|
|
155
|
+
* `verifiedAgainst` is a hand-written string, and the next person who measures a
|
|
156
|
+
* series rather than a build can still type `2.0.x`. With this branch that
|
|
157
|
+
* stamp compares. Without it {@link parseCliVersion} reads it as null and the
|
|
158
|
+
* tool is filed alongside `'unmeasured'` — never stale, no warning, nothing an
|
|
159
|
+
* operator can act on — which is the same failure #2292 was raised to fix, one
|
|
160
|
+
* level further down. A parser for an input the table still permits is not dead
|
|
161
|
+
* code; the unit exercises it on the format directly rather than through
|
|
162
|
+
* whichever stamp the table happens to hold, so it does not go vacuous now that
|
|
163
|
+
* no tool uses it.
|
|
143
164
|
*/
|
|
144
165
|
function parseVerifiedAgainstVersion(stamp) {
|
|
145
166
|
const wildcard = VERIFIED_AGAINST_WILDCARD_REGEX.exec(stamp);
|
|
@@ -180,6 +201,7 @@ exports.DETECTOR_VERSION_PROBES = {
|
|
|
180
201
|
claude: { kind: 'execFile', command: 'claude', args: ['--version'] },
|
|
181
202
|
codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
|
|
182
203
|
antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
|
|
204
|
+
'command-code': { kind: 'execFile', command: 'commandcode', args: ['--version'] },
|
|
183
205
|
opencode: { kind: 'execFile', command: 'opencode', args: ['--version'] },
|
|
184
206
|
gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
|
|
185
207
|
copilot: {
|
|
@@ -366,12 +366,21 @@ async function captureAntigravityTranscriptTurn(target, capture = {}) {
|
|
|
366
366
|
anchored: pending.anchored,
|
|
367
367
|
});
|
|
368
368
|
}
|
|
369
|
+
// Every prompt row first, then every reply (Issue #2273). The two passes are
|
|
370
|
+
// what let a reply be dated at its turn's END without overtaking the NEXT
|
|
371
|
+
// turn's prompt: a queued `/send` row is written while this turn is still
|
|
372
|
+
// running, so its instant is only knowable once that row has been recorded.
|
|
373
|
+
// With one turn pending — the ordinary case — this is the single call it
|
|
374
|
+
// always was.
|
|
375
|
+
const userRows = [];
|
|
376
|
+
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
377
|
+
const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
|
|
378
|
+
userRows.push(await recordAntigravityUserTurn(target, pending.turns[index], previousStartedAt));
|
|
379
|
+
}
|
|
369
380
|
let captured = false;
|
|
370
381
|
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
371
382
|
const turn = pending.turns[index];
|
|
372
|
-
|
|
373
|
-
const userRow = await recordAntigravityUserTurn(target, turn, previousStartedAt);
|
|
374
|
-
captured = await writeAntigravityTurn(target, turn, (0, transcript_1.renderAntigravityTurn)(turn), resolveAssistantTimestampMs(turn, userRow), path);
|
|
383
|
+
captured = await writeAntigravityTurn(target, turn, (0, transcript_1.renderAntigravityTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastAntigravityRecordAt(turn), nextTurnOpensAt(pending.turns, userRows, index)), path);
|
|
375
384
|
}
|
|
376
385
|
return captured;
|
|
377
386
|
}
|
|
@@ -500,21 +509,73 @@ async function recordAntigravityUserTurn(target, turn, previousStartedAt = 0) {
|
|
|
500
509
|
/**
|
|
501
510
|
* When the assistant row for this turn is dated.
|
|
502
511
|
*
|
|
503
|
-
* The turn's
|
|
504
|
-
*
|
|
512
|
+
* **The turn's LAST record, not its first (Issue #2273).** #2196 dated the reply
|
|
513
|
+
* one millisecond after the prompt so that `groupMessagesIntoPairs` — which
|
|
514
|
+
* orders by timestamp and nothing else — could never put the answer above the
|
|
515
|
+
* question. That is still guaranteed, by `earliest` below, and it is still
|
|
516
|
+
* necessary: agy stamps the prompt and the first reply of a fast turn with the
|
|
517
|
+
* *same second* (measured — `created_at` is second-resolution, and turn 1 of the
|
|
518
|
+
* captured session has `02:12:41Z` on both).
|
|
519
|
+
*
|
|
520
|
+
* What #2196 did not account for is the row that lands BETWEEN the two. A tool
|
|
521
|
+
* approval is written when the dialog appears, seconds into the turn, and the
|
|
522
|
+
* chat surface orders its rows by timestamp: a reply dated at the turn's start
|
|
523
|
+
* therefore draws above an approval that really happened before it. The measured
|
|
524
|
+
* case is in the Issue — prompt `04:49:50.989Z`, reply `04:49:54.000Z`, approval
|
|
525
|
+
* `04:49:57.513Z` — and the reply's own last record is later than all three. So
|
|
526
|
+
* the last record's instant is what the row is dated by: it is the moment the
|
|
527
|
+
* turn actually ended, and everything the turn produced sorts before it.
|
|
528
|
+
*
|
|
529
|
+
* Two bounds keep the move honest:
|
|
530
|
+
*
|
|
531
|
+
* - `earliest` is a floor, never overridden. A turn with no timestamped
|
|
532
|
+
* record (`lastRecordAt === 0`) is dated exactly where #2196 put it.
|
|
533
|
+
* - `nextTurnOpensAt` is a ceiling. The next turn's prompt row may be a `/send`
|
|
534
|
+
* row written while THIS turn was still running — a queued prompt — and a
|
|
535
|
+
* reply that overtook it would be paired with the wrong question.
|
|
536
|
+
*
|
|
537
|
+
* @param lastRecordAt - Epoch ms of the turn's last record, or 0 when unknown
|
|
538
|
+
* @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
|
|
539
|
+
* this is the newest turn in the window
|
|
540
|
+
*/
|
|
541
|
+
function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
|
|
542
|
+
const earliest = userRow.timestampMs === null
|
|
543
|
+
? turn.startedAt
|
|
544
|
+
: Math.max(turn.startedAt, userRow.timestampMs + 1);
|
|
545
|
+
const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
|
|
546
|
+
return Math.max(earliest, Math.min(lastRecordAt, latest));
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* When the last record agy wrote for this turn was made (Issue #2273).
|
|
550
|
+
*
|
|
551
|
+
* The maximum rather than `records.at(-1)`: `created_at` is agy's own field and
|
|
552
|
+
* a record that carries none reads as null, so the last record in file order is
|
|
553
|
+
* not always the last one with a clock on it.
|
|
505
554
|
*
|
|
506
|
-
*
|
|
507
|
-
* `groupMessagesIntoPairs` orders by timestamp and nothing else, and agy stamps
|
|
508
|
-
* both the prompt and the first reply of a fast turn with the *same second*
|
|
509
|
-
* (measured — `created_at` is second-resolution, and turn 1 of the captured
|
|
510
|
-
* session has `02:12:41Z` on both). A tie is then decided by whichever row the
|
|
511
|
-
* database returned first, and the losing arrangement — assistant, then user —
|
|
512
|
-
* is exactly the `orphan` pair #2196 exists to remove.
|
|
555
|
+
* @returns Epoch ms, or 0 when the turn has no timestamped record
|
|
513
556
|
*/
|
|
514
|
-
function
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
557
|
+
function lastAntigravityRecordAt(turn) {
|
|
558
|
+
let at = 0;
|
|
559
|
+
for (const record of turn.records) {
|
|
560
|
+
if (record.timestampMs !== null && record.timestampMs > at)
|
|
561
|
+
at = record.timestampMs;
|
|
562
|
+
}
|
|
563
|
+
return at;
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* The instant the next pending turn's prompt row carries, or null (Issue #2273).
|
|
567
|
+
*
|
|
568
|
+
* The user row's own timestamp when there is one, because that is what History
|
|
569
|
+
* sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
|
|
570
|
+
* was written when CommandMate handed the text to the pane, which for a queued
|
|
571
|
+
* prompt is while the previous turn was still running. The turn's start is the
|
|
572
|
+
* fallback for a turn that produced no row at all.
|
|
573
|
+
*/
|
|
574
|
+
function nextTurnOpensAt(turns, userRows, index) {
|
|
575
|
+
const next = turns[index + 1];
|
|
576
|
+
if (!next)
|
|
577
|
+
return null;
|
|
578
|
+
return userRows[index + 1]?.timestampMs ?? next.startedAt;
|
|
518
579
|
}
|
|
519
580
|
/**
|
|
520
581
|
* Write one rendered turn, unless it is already there.
|
|
@@ -358,12 +358,23 @@ async function captureClaudeTranscriptTurn(target, capture) {
|
|
|
358
358
|
// by timestamp, and each turn's `/send` row is adopted against the previous
|
|
359
359
|
// turn's start, so a later turn must not get to claim a row an earlier one
|
|
360
360
|
// is about to ask for.
|
|
361
|
+
//
|
|
362
|
+
// Every prompt row is recorded before any reply is written (Issue #2273).
|
|
363
|
+
// That is what lets a reply be dated at its turn's END without overtaking
|
|
364
|
+
// the NEXT turn's prompt: a queued `/send` row is written while this turn is
|
|
365
|
+
// still running, so its instant is only knowable once that row has been
|
|
366
|
+
// recorded. With one turn pending — the ordinary case — this is the single
|
|
367
|
+
// call it always was.
|
|
368
|
+
const userRows = [];
|
|
369
|
+
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
370
|
+
const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
|
|
371
|
+
userRows.push(await recordClaudeUserTurn(target, pending.turns[index], previousStartedAt));
|
|
372
|
+
}
|
|
373
|
+
const lastRecordAt = lastClaudeAssistantRecordAt(parsed.records);
|
|
361
374
|
let captured = false;
|
|
362
375
|
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
363
376
|
const turn = pending.turns[index];
|
|
364
|
-
|
|
365
|
-
const userRow = await recordClaudeUserTurn(target, turn, previousStartedAt);
|
|
366
|
-
captured = await writeClaudeTurn(target, turn, (0, transcript_1.renderClaudeTurn)(turn), resolveAssistantTimestampMs(turn, userRow), path);
|
|
377
|
+
captured = await writeClaudeTurn(target, turn, (0, transcript_1.renderClaudeTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.promptUuid) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path);
|
|
367
378
|
}
|
|
368
379
|
return captured;
|
|
369
380
|
}
|
|
@@ -643,22 +654,87 @@ async function recordClaudeUserTurn(target, turn, previousStartedAt = 0) {
|
|
|
643
654
|
/**
|
|
644
655
|
* When the assistant row for this turn is dated.
|
|
645
656
|
*
|
|
646
|
-
*
|
|
647
|
-
*
|
|
648
|
-
*
|
|
649
|
-
*
|
|
650
|
-
*
|
|
651
|
-
*
|
|
652
|
-
*
|
|
653
|
-
*
|
|
654
|
-
*
|
|
655
|
-
*
|
|
656
|
-
*
|
|
657
|
+
* **The turn's LAST assistant record, not its prompt (Issue #2273).** #2121
|
|
658
|
+
* dated the reply by the prompt record's clock so that a row written a poll late
|
|
659
|
+
* still sorted where the conversation put it, and #2196 moved it one millisecond
|
|
660
|
+
* on so that `groupMessagesIntoPairs` — which orders by timestamp and nothing
|
|
661
|
+
* else — could never return the answer above the question. Both properties
|
|
662
|
+
* survive: `earliest` is a floor this never goes under.
|
|
663
|
+
*
|
|
664
|
+
* What neither accounted for is the row that lands BETWEEN the prompt and the
|
|
665
|
+
* reply. A tool approval is written when the dialog appears, seconds into the
|
|
666
|
+
* turn, and the chat surface orders its rows by timestamp — so a reply dated at
|
|
667
|
+
* the turn's start draws ABOVE an approval that really happened before it. The
|
|
668
|
+
* measured case is in the Issue: prompt `04:49:50.989Z`, reply `04:49:54.000Z`,
|
|
669
|
+
* approval `04:49:57.513Z`, rendered as question → answer → approval.
|
|
670
|
+
*
|
|
671
|
+
* The turn's last assistant record is the moment the reply was finished, so
|
|
672
|
+
* everything the turn produced on the way sorts before it. `lastRecordAt` is 0
|
|
673
|
+
* when the window held no timestamped assistant record for the turn, and the row
|
|
674
|
+
* is then dated exactly where #2196 put it.
|
|
675
|
+
*
|
|
676
|
+
* `nextTurnOpensAt` is the ceiling. The next turn's prompt row may be a `/send`
|
|
677
|
+
* row written while THIS turn was still running — a queued prompt — and a reply
|
|
678
|
+
* that overtook it would be paired with the wrong question.
|
|
679
|
+
*
|
|
680
|
+
* @param lastRecordAt - Epoch ms of the turn's last assistant record, or 0
|
|
681
|
+
* @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
|
|
682
|
+
* this is the newest turn in the window
|
|
683
|
+
*/
|
|
684
|
+
function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
|
|
685
|
+
const earliest = userRow.timestampMs === null
|
|
686
|
+
? turn.startedAt
|
|
687
|
+
: Math.max(turn.startedAt, userRow.timestampMs + 1);
|
|
688
|
+
const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
|
|
689
|
+
return Math.max(earliest, Math.min(lastRecordAt, latest));
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* When each turn's last assistant record was written (Issue #2273).
|
|
693
|
+
*
|
|
694
|
+
* Keyed by `promptUuid`, which is the turn key {@link buildClaudeTurns} uses, and
|
|
695
|
+
* walked over the same records with the same two rules — sidechains skipped, a
|
|
696
|
+
* prompt record opening a turn — so the two passes cannot disagree about which
|
|
697
|
+
* turn a record belongs to. It is a second pass rather than a field on the
|
|
698
|
+
* accumulator because `./transcript` is not this Issue's to change.
|
|
699
|
+
*
|
|
700
|
+
* Only `assistant` records count. A turn's `user` records are its tool RESULTS,
|
|
701
|
+
* and the last of those is a step the agent took before it had finished
|
|
702
|
+
* answering; the reply is dated by the agent's last word.
|
|
703
|
+
*
|
|
704
|
+
* @returns `promptUuid` → epoch ms; absent for a turn with no timestamped
|
|
705
|
+
* assistant record
|
|
657
706
|
*/
|
|
658
|
-
function
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
707
|
+
function lastClaudeAssistantRecordAt(records) {
|
|
708
|
+
const at = new Map();
|
|
709
|
+
let key = null;
|
|
710
|
+
for (const record of records) {
|
|
711
|
+
if (record.isSidechain)
|
|
712
|
+
continue;
|
|
713
|
+
if ((0, transcript_1.isClaudePromptRecord)(record)) {
|
|
714
|
+
key = record.uuid;
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
if (record.type !== 'assistant' || key === null || record.timestampMs === null)
|
|
718
|
+
continue;
|
|
719
|
+
if (record.timestampMs > (at.get(key) ?? 0))
|
|
720
|
+
at.set(key, record.timestampMs);
|
|
721
|
+
}
|
|
722
|
+
return at;
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* The instant the next pending turn's prompt row carries, or null (Issue #2273).
|
|
726
|
+
*
|
|
727
|
+
* The user row's own timestamp when there is one, because that is what History
|
|
728
|
+
* sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
|
|
729
|
+
* was written when CommandMate handed the text to the pane, which for a queued
|
|
730
|
+
* prompt is while the previous turn was still running. The turn's start is the
|
|
731
|
+
* fallback for a turn that produced no row at all.
|
|
732
|
+
*/
|
|
733
|
+
function nextTurnOpensAt(turns, userRows, index) {
|
|
734
|
+
const next = turns[index + 1];
|
|
735
|
+
if (!next)
|
|
736
|
+
return null;
|
|
737
|
+
return userRows[index + 1]?.timestampMs ?? next.startedAt;
|
|
662
738
|
}
|
|
663
739
|
/**
|
|
664
740
|
* The transcript file for this instance, or null.
|
|
@@ -400,12 +400,22 @@ async function captureCodexTranscriptTurn(target, capture = {}) {
|
|
|
400
400
|
anchored: pending.anchored,
|
|
401
401
|
});
|
|
402
402
|
}
|
|
403
|
+
// Every prompt row first, then every reply (Issue #2273). The two passes are
|
|
404
|
+
// what let a reply be dated at its turn's END without overtaking the NEXT
|
|
405
|
+
// turn's prompt: a queued `/send` row is written while this turn is still
|
|
406
|
+
// running, so its instant is only knowable once that row has been recorded.
|
|
407
|
+
// With one turn pending — the ordinary case — this is the single call it
|
|
408
|
+
// always was.
|
|
409
|
+
const userRows = [];
|
|
410
|
+
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
411
|
+
const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
|
|
412
|
+
userRows.push(await recordCodexUserTurns(target, pending.turns[index], previousStartedAt));
|
|
413
|
+
}
|
|
414
|
+
const lastRecordAt = lastCodexRecordAt(parsed.records);
|
|
403
415
|
let captured = false;
|
|
404
416
|
for (let index = 0; index < pending.turns.length; index += 1) {
|
|
405
417
|
const turn = pending.turns[index];
|
|
406
|
-
|
|
407
|
-
const lastUserRow = await recordCodexUserTurns(target, turn, previousStartedAt);
|
|
408
|
-
captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, lastUserRow), path);
|
|
418
|
+
captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path);
|
|
409
419
|
}
|
|
410
420
|
return captured;
|
|
411
421
|
}
|
|
@@ -544,20 +554,79 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
|
|
|
544
554
|
/**
|
|
545
555
|
* When the assistant row for this turn is dated.
|
|
546
556
|
*
|
|
547
|
-
* The turn's
|
|
548
|
-
*
|
|
557
|
+
* **The turn's LAST record, not its first (Issue #2273).** #2197 dated the reply
|
|
558
|
+
* by the first record bearing the `turn_id` so that a row written a poll late
|
|
559
|
+
* still sorted where the conversation put it, and #2196 moved it one millisecond
|
|
560
|
+
* past the last prompt so that `groupMessagesIntoPairs` — which orders by
|
|
561
|
+
* timestamp and nothing else — could never return the answer above the question.
|
|
562
|
+
* Both properties survive: `earliest` is a floor this never goes under, and for
|
|
563
|
+
* codex it is the floor that matters most, because a turn can carry SEVERAL
|
|
564
|
+
* prompts (measured at more than one on 23 of 326 archived turns) and the reply
|
|
565
|
+
* has to sort past all of them.
|
|
566
|
+
*
|
|
567
|
+
* What neither accounted for is the row that lands BETWEEN the prompt and the
|
|
568
|
+
* reply. A tool approval is written when the dialog appears, seconds into the
|
|
569
|
+
* turn, and the chat surface orders its rows by timestamp — so a reply dated at
|
|
570
|
+
* the turn's start draws ABOVE an approval that really happened before it. The
|
|
571
|
+
* turn's last record — for codex, the `task_complete` that closes it — is the
|
|
572
|
+
* moment the turn ended, so everything it produced on the way sorts before it.
|
|
573
|
+
*
|
|
574
|
+
* `nextTurnOpensAt` is the ceiling. The next turn's prompt row may be a `/send`
|
|
575
|
+
* row written while THIS turn was still running — a queued prompt — and a reply
|
|
576
|
+
* that overtook it would be paired with the wrong question.
|
|
577
|
+
*
|
|
578
|
+
* @param lastRecordAt - Epoch ms of the turn's last record, or 0 when unknown
|
|
579
|
+
* @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
|
|
580
|
+
* this is the newest turn in the window
|
|
581
|
+
*/
|
|
582
|
+
function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
|
|
583
|
+
const earliest = userRow.timestampMs === null
|
|
584
|
+
? turn.startedAt
|
|
585
|
+
: Math.max(turn.startedAt, userRow.timestampMs + 1);
|
|
586
|
+
const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
|
|
587
|
+
return Math.max(earliest, Math.min(lastRecordAt, latest));
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* When each turn's last record was written (Issue #2273).
|
|
591
|
+
*
|
|
592
|
+
* Keyed by `turn_id` and walked over the same records {@link buildCodexTurns}
|
|
593
|
+
* walks, with the same `response_item` exclusion — that stream is codex's
|
|
594
|
+
* duplicate of the same events and counting it would be counting each record
|
|
595
|
+
* twice. It is a second pass rather than a field on the accumulator because
|
|
596
|
+
* `./transcript` is not this Issue's to change.
|
|
597
|
+
*
|
|
598
|
+
* Every record of the turn counts, `task_complete` included: that one IS the
|
|
599
|
+
* turn's end and is exactly the instant the reply should be dated by.
|
|
549
600
|
*
|
|
550
|
-
*
|
|
551
|
-
* `groupMessagesIntoPairs` orders by timestamp and nothing else — a tie there is
|
|
552
|
-
* decided by whichever row the database returned first, and the losing
|
|
553
|
-
* arrangement (assistant, then user) is exactly the `orphan` pair #2196 exists
|
|
554
|
-
* to remove. So the reply is moved to the first millisecond after the last
|
|
555
|
-
* prompt: the smallest change that makes the order a property of the data.
|
|
601
|
+
* @returns `turn_id` → epoch ms; absent for a turn with no timestamped record
|
|
556
602
|
*/
|
|
557
|
-
function
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
603
|
+
function lastCodexRecordAt(records) {
|
|
604
|
+
const at = new Map();
|
|
605
|
+
for (const record of records) {
|
|
606
|
+
if (record.type === 'response_item')
|
|
607
|
+
continue;
|
|
608
|
+
const turnId = record.turnId;
|
|
609
|
+
if (!turnId || record.timestampMs === null)
|
|
610
|
+
continue;
|
|
611
|
+
if (record.timestampMs > (at.get(turnId) ?? 0))
|
|
612
|
+
at.set(turnId, record.timestampMs);
|
|
613
|
+
}
|
|
614
|
+
return at;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* The instant the next pending turn's prompt row carries, or null (Issue #2273).
|
|
618
|
+
*
|
|
619
|
+
* The user row's own timestamp when there is one, because that is what History
|
|
620
|
+
* sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
|
|
621
|
+
* was written when CommandMate handed the text to the pane, which for a queued
|
|
622
|
+
* prompt is while the previous turn was still running. The turn's start is the
|
|
623
|
+
* fallback for a turn that produced no row at all.
|
|
624
|
+
*/
|
|
625
|
+
function nextTurnOpensAt(turns, userRows, index) {
|
|
626
|
+
const next = turns[index + 1];
|
|
627
|
+
if (!next)
|
|
628
|
+
return null;
|
|
629
|
+
return userRows[index + 1]?.timestampMs ?? next.startedAt;
|
|
561
630
|
}
|
|
562
631
|
/**
|
|
563
632
|
* Write one rendered turn, unless it is already there.
|