commandmate 0.29.1 → 0.30.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 +468 -417
- package/.next/app-path-routes-manifest.json +30 -23
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +15 -15
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +25 -8
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +2 -0
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agents/versions/route.js +1 -0
- package/.next/server/app/api/agents/versions/route.js.nft.json +1 -0
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -0
- 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 +18 -18
- 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 +19 -19
- 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.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +1 -7
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js +1 -7
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +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.js +2 -2
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +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 +7 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +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 +7 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +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 -0
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route.js +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidebar/group-order/route.js +1 -7
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +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 +2 -2
- 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.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +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 +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.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 -0
- package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/{start-polling → 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.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -2
- 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.js.nft.json +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.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +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 +3 -3
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +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 +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 -7
- 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 +1 -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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +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 +2 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -0
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -0
- 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.js +2 -2
- package/.next/server/app/login/page.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +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 +2 -2
- 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.js +2 -2
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +12 -12
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +30 -23
- package/.next/server/chunks/1058.js +1 -1
- package/.next/server/chunks/1068.js +1 -1
- package/.next/server/chunks/1191.js +1 -1
- package/.next/server/chunks/1341.js +1 -0
- package/.next/server/chunks/1501.js +5 -0
- package/.next/server/chunks/1886.js +3 -4
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/261.js +1 -0
- package/.next/server/chunks/2739.js +1 -0
- package/.next/server/chunks/2816.js +1 -1
- package/.next/server/chunks/2827.js +29 -0
- package/.next/server/chunks/3123.js +1 -0
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3707.js +15 -0
- package/.next/server/chunks/3722.js +25 -1
- package/.next/server/chunks/3869.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4299.js +1 -1
- package/.next/server/chunks/4325.js +1 -0
- package/.next/server/chunks/4390.js +1 -0
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/4443.js +6 -0
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5120.js +1 -0
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6337.js +1 -1
- package/.next/server/chunks/663.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/6894.js +8 -0
- package/.next/server/chunks/7366.js +5 -0
- package/.next/server/chunks/7685.js +1 -1
- package/.next/server/chunks/7824.js +1 -1
- package/.next/server/chunks/7836.js +1 -0
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8118.js +1 -0
- package/.next/server/chunks/8356.js +1 -1
- package/.next/server/chunks/848.js +1 -1
- package/.next/server/chunks/880.js +3 -3
- package/.next/server/chunks/8800.js +3 -0
- package/.next/server/chunks/8807.js +1 -1
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +3 -3
- package/.next/server/chunks/9627.js +71 -43
- package/.next/server/chunks/9696.js +3 -0
- package/.next/server/chunks/9798.js +1 -1
- 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/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/7K0XXFu_ty4wRSkl4X21E/_buildManifest.js +1 -0
- package/.next/static/chunks/{2053-c0e931eb4391baa1.js → 2053-3f299a7a2c7d6767.js} +1 -1
- package/.next/static/chunks/{3968-8d8ca15657748bfb.js → 3916-0e929d089282dc5d.js} +1 -1
- package/.next/static/chunks/3922.9c1ec01fff819c88.js +1 -0
- package/.next/static/chunks/5229-6c89475b61bd2c8b.js +1 -0
- package/.next/static/chunks/6022-7a7d1760fc9814c7.js +1 -0
- package/.next/static/chunks/6381-28d0e95620aa018e.js +1 -0
- package/.next/static/chunks/8019-f8e73c1fb5f6f0d3.js +1 -0
- package/.next/static/chunks/{1188-8567ee5ecfef02ee.js → 8593-fa0eb2802e0ce68a.js} +1 -1
- package/.next/static/chunks/app/api/agents/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/agents/versions/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/settings/default-agents/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/settings/default-surface-mode/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/skills/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/templates/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/chat/{page-231df45127e876c2.js → page-9aa2011410895b0d.js} +1 -1
- package/.next/static/chunks/app/login/{page-03659dded846ef1d.js → page-af7241bb4c4a8e59.js} +1 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/more/page-333bba1c8bbc9c11.js +1 -0
- package/.next/static/chunks/app/{page-0305431f43195431.js → page-214f7ffa13a0cf10.js} +1 -1
- package/.next/static/chunks/app/proxy/[...path]/route-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/repositories/{page-ae8fa55749976f79.js → page-4951cac905e50224.js} +1 -1
- package/.next/static/chunks/app/review/page-a0899b2d285318c3.js +1 -0
- package/.next/static/chunks/app/sessions/page-fb36145ec732092a.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-aaf0bcb1dfb558b9.js → page-9099e26b60442873.js} +1 -1
- package/.next/static/chunks/app/skills/installed/{page-dafc486410e839b7.js → page-182e32368696d824.js} +1 -1
- package/.next/static/chunks/app/skills/{page-9e3c91da31514893.js → page-d3fdc88239ebe0ab.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-90f96977c741bbf8.js → page-f3361237420719b4.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-ee11f7b8a34cba8c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-d48b95ed554bcd13.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-2631bc5c4b0a9fb8.js +1 -0
- package/.next/static/chunks/{webpack-7e79064bfce988d7.js → webpack-9f75198882fdaf08.js} +1 -1
- package/.next/static/css/61e10d4b1b11b193.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/agents/update/route.ts +347 -0
- package/.next/types/app/api/agents/versions/route.ts +347 -0
- package/.next/types/app/api/settings/default-agents/route.ts +347 -0
- package/.next/types/app/api/settings/default-surface-mode/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/{start-polling → cli-reference}/route.ts +3 -3
- package/.next/types/app/api/worktrees/[id]/verify/config/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.ts +347 -0
- package/.next/types/app/api/worktrees/apply-default-agents/route.ts +347 -0
- package/.next/types/routes.d.ts +9 -2
- package/.next/types/validator.ts +72 -9
- package/dist/cli/commands/agents.d.ts +35 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +212 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +18 -0
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +111 -0
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +11 -0
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +30 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +58 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +8 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/preflight.d.ts.map +1 -1
- package/dist/cli/utils/preflight.js +6 -0
- package/dist/config/system-directories.d.ts +101 -0
- package/dist/config/system-directories.d.ts.map +1 -0
- package/dist/config/system-directories.js +211 -0
- package/dist/lib/cli-tools/types.d.ts +15 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/status-reason.d.ts +92 -0
- package/dist/lib/detection/status-reason.d.ts.map +1 -0
- package/dist/lib/detection/status-reason.js +94 -0
- package/dist/lib/updates/agent-updater.d.ts +247 -0
- package/dist/lib/updates/agent-updater.d.ts.map +1 -0
- package/dist/lib/updates/agent-updater.js +373 -0
- package/dist/lib/updates/agent-versions.d.ts +77 -0
- package/dist/lib/updates/agent-versions.d.ts.map +1 -0
- package/dist/lib/updates/agent-versions.js +138 -0
- package/dist/lib/updates/codex-version.d.ts +184 -0
- package/dist/lib/updates/codex-version.d.ts.map +1 -0
- package/dist/lib/updates/codex-version.js +215 -0
- package/dist/lib/verification/verify-config.d.ts +202 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -0
- package/dist/lib/verification/verify-config.js +429 -0
- package/dist/lib/verification/verify-draft.d.ts +182 -0
- package/dist/lib/verification/verify-draft.d.ts.map +1 -0
- package/dist/lib/verification/verify-draft.js +570 -0
- package/dist/server/server.js +58 -0
- package/dist/server/src/cli/types/api-responses.js +9 -0
- package/dist/server/src/config/cli-tool-timing-config.js +15 -1
- package/dist/server/src/config/codex-update-dialog-config.js +154 -0
- package/dist/server/src/config/default-agents.js +138 -0
- package/dist/server/src/lib/claude-output.js +1 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +36 -12
- package/dist/server/src/lib/cli-tools/base.js +131 -0
- package/dist/server/src/lib/cli-tools/codex.js +350 -100
- package/dist/server/src/lib/cli-tools/copilot.js +34 -10
- package/dist/server/src/lib/cli-tools/gemini.js +34 -10
- package/dist/server/src/lib/cli-tools/liveness-spec.js +214 -0
- package/dist/server/src/lib/cli-tools/opencode.js +72 -19
- package/dist/server/src/lib/cli-tools/session-liveness.js +64 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +30 -10
- package/dist/server/src/lib/db/app-settings-db.js +202 -0
- package/dist/server/src/lib/db/chat-db.js +120 -7
- package/dist/server/src/lib/db/worktree-db.js +178 -3
- package/dist/server/src/lib/detection/status-detector.js +3 -2
- package/dist/server/src/lib/detection/status-reason.js +17 -0
- package/dist/server/src/lib/detection/tool-liveness.js +233 -0
- package/dist/server/src/lib/detection/version-probes.js +290 -0
- package/dist/server/src/lib/env.js +122 -0
- package/dist/server/src/lib/git/worktrees.js +164 -0
- package/dist/server/src/lib/history/transcript-tail.js +80 -0
- package/dist/server/src/lib/history/user-turn-recorder.js +247 -0
- package/dist/server/src/lib/hooks/permission-decision-service.js +85 -1
- package/dist/server/src/lib/hooks/sources/antigravity/history.js +519 -0
- package/dist/server/src/lib/hooks/sources/antigravity/source.js +7 -0
- package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +407 -0
- package/dist/server/src/lib/hooks/sources/claude/history.js +654 -0
- package/dist/server/src/lib/hooks/sources/claude/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +518 -0
- package/dist/server/src/lib/hooks/sources/codex/history.js +576 -0
- package/dist/server/src/lib/hooks/sources/codex/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/codex/transcript.js +448 -0
- package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
- package/dist/server/src/lib/hooks/sources/legacy-relay.js +3 -0
- package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -0
- package/dist/server/src/lib/hooks/sources/opencode/source.js +4 -0
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +10 -28
- package/dist/server/src/lib/hooks/sources/turn-body.js +118 -0
- package/dist/server/src/lib/polling/prompt-dedup.js +2 -4
- package/dist/server/src/lib/polling/response-checker.js +44 -3
- package/dist/server/src/lib/polling/response-dedup.js +2 -4
- package/dist/server/src/lib/polling/response-poller-core.js +191 -29
- package/dist/server/src/lib/polling/structured-history-gate.js +147 -16
- package/dist/server/src/lib/push/push-sender.js +21 -1
- package/dist/server/src/lib/push/waiting-push-notifier.js +126 -8
- package/dist/server/src/lib/realtime/publisher-registry.js +171 -0
- package/dist/server/src/lib/realtime/terminal-broadcast.js +14 -1
- package/dist/server/src/lib/realtime/types.js +96 -1
- package/dist/server/src/lib/repo-config/agents-config.js +298 -0
- package/dist/server/src/lib/selected-agents-validator.js +93 -23
- package/dist/server/src/lib/session/claude-session.js +39 -108
- package/dist/server/src/lib/session/current-output-builder.js +263 -4
- package/dist/server/src/lib/session/send-user-message.js +90 -2
- package/dist/server/src/lib/tmux/tmux.js +29 -0
- package/dist/server/src/lib/tui-accumulator.js +2 -8
- package/dist/server/src/lib/updates/agent-updater.js +373 -0
- package/dist/server/src/lib/updates/agent-versions.js +138 -0
- package/dist/server/src/lib/updates/codex-version.js +215 -0
- package/dist/server/src/lib/updates/index.js +42 -0
- package/dist/server/src/lib/verification/gate-runner.js +298 -37
- package/dist/server/src/lib/verification/machine-lock.js +11 -0
- package/dist/server/src/lib/verification/run-verdict-vocabulary.js +151 -0
- package/dist/server/src/lib/verification/verify-config.js +33 -0
- package/dist/server/src/lib/ws-server.js +143 -6
- package/dist/server/src/types/agent-transcript.js +241 -5
- package/dist/server/src/types/sidebar.js +40 -9
- package/dist/server/src/types/ui-state.js +24 -1
- package/dist/types/cli-tool-contracts.d.ts +119 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/package.json +1 -1
- package/public/sw.js +15 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +0 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +0 -1
- package/.next/server/chunks/1601.js +0 -7
- package/.next/server/chunks/1714.js +0 -7
- package/.next/server/chunks/221.js +0 -19
- package/.next/server/chunks/222.js +0 -1
- package/.next/server/chunks/2366.js +0 -1
- package/.next/server/chunks/2759.js +0 -8
- package/.next/server/chunks/3558.js +0 -1
- package/.next/server/chunks/4689.js +0 -25
- package/.next/server/chunks/5089.js +0 -1
- package/.next/server/chunks/6274.js +0 -14
- package/.next/server/chunks/9067.js +0 -1
- package/.next/server/chunks/9373.js +0 -9
- package/.next/server/chunks/9508.js +0 -1
- package/.next/static/Dvfs4ZThl5vBhJGP-ZQuJ/_buildManifest.js +0 -1
- package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +0 -1
- package/.next/static/chunks/3922.0d2e64daf9f187da.js +0 -1
- package/.next/static/chunks/5229-580b581fce5aeb52.js +0 -1
- package/.next/static/chunks/6381-9a929249196a0e77.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +0 -1
- package/.next/static/chunks/app/sessions/page-4d5382b257077c14.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-817378dd7c580774.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +0 -1
- package/.next/static/css/6266bde3bce465a2.css +0 -1
- /package/.next/static/{Dvfs4ZThl5vBhJGP-ZQuJ → 7K0XXFu_ty4wRSkl4X21E}/_ssgManifest.js +0 -0
|
@@ -1,32 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Whether somebody better-informed is already recording this turn (Issue #2041
|
|
3
|
+
* Whether somebody better-informed is already recording this turn (Issue #2041,
|
|
4
|
+
* extended for Claude Code in #2121, codex in #2197 and antigravity in #2198).
|
|
4
5
|
*
|
|
5
6
|
* The poller's job has always been to be the only writer of conversation
|
|
6
|
-
* history, because for
|
|
7
|
-
* reply exists.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* drew it — so one of them has to stand
|
|
12
|
-
* screen.
|
|
7
|
+
* history, because for most of the six tools the terminal is the only place the
|
|
8
|
+
* reply exists. Four of them now have a second writer: opencode publishes its
|
|
9
|
+
* replies over the SSE stream CommandMate subscribes to (#1763/#2041), and
|
|
10
|
+
* claude, codex and antigravity each keep their own transcript file on disk.
|
|
11
|
+
* Two writers for one turn would put the same answer in History twice — once as
|
|
12
|
+
* the agent wrote it and once as its TUI drew it — so one of them has to stand
|
|
13
|
+
* down, and it is the one reading the screen.
|
|
13
14
|
*
|
|
14
15
|
* ## Why this is a module and not an `if`
|
|
15
16
|
*
|
|
16
17
|
* Two reasons, and the second is the one that matters. The obvious one is that
|
|
17
18
|
* `response-checker` is 1,000 lines with a single tool-agnostic spine, and a
|
|
18
19
|
* `cliToolId === 'opencode' && …` in the middle of the save path is exactly the
|
|
19
|
-
* kind of branch that gets copied to the next tool that grows a
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* kind of branch that gets copied to the next tool that grows a reader. The real
|
|
21
|
+
* one is the import: `@/lib/hooks/sources/opencode/subscription` reaches the
|
|
22
|
+
* whole opencode client through its module graph, and the poller's tests replace
|
|
23
|
+
* that graph wholesale. One named seam is one thing to stub.
|
|
24
|
+
*
|
|
25
|
+
* ## The tool names are gone (Issue #2197)
|
|
26
|
+
*
|
|
27
|
+
* Until this Issue the two functions below opened with `if (cliToolId !==
|
|
28
|
+
* 'opencode')` and `if (cliToolId !== CLAUDE_CLI_TOOL_ID)`, which is the branch
|
|
29
|
+
* the module comment above says it exists to prevent — the third tool arrived
|
|
30
|
+
* and the third `!==` was about to be written. What replaces them is a value the
|
|
31
|
+
* source declares about itself:
|
|
32
|
+
* `AgentSourceCapabilities.transcriptHistory` (`'pull' | 'push' | null`, see
|
|
33
|
+
* `lib/hooks/agent-event-types`). A tool with no second writer says `null` and
|
|
34
|
+
* both questions below answer false for it without naming it — which is what let
|
|
35
|
+
* #2198 add antigravity by editing its own `source.ts` and this file's reader
|
|
36
|
+
* table and nothing else, and what leaves gemini and copilot on the scraper
|
|
37
|
+
* without a line of code mentioning them.
|
|
38
|
+
*
|
|
39
|
+
* The word has three values rather than two because the two shapes are asked
|
|
40
|
+
* *different questions*:
|
|
41
|
+
*
|
|
42
|
+
* - **push** — a subscription is already receiving the reply, so the only thing
|
|
43
|
+
* to ask is whether that connection is live
|
|
44
|
+
* ({@link isStructuredHistoryWriterLive}).
|
|
45
|
+
* - **pull** — there is no connection, only a file, and nothing reads it until
|
|
46
|
+
* something asks. So the question is not "is anyone recording?" but "record
|
|
47
|
+
* it now, and tell me whether you did"
|
|
48
|
+
* ({@link captureStructuredHistoryTurn}). The call has to be here rather than
|
|
49
|
+
* in the hook receiver for a reason beyond tidiness: a hook post is answered
|
|
50
|
+
* and forgotten, so the only moment CommandMate knows a turn is *finished and
|
|
51
|
+
* about to be written* is this one, and doing the handover at the point of
|
|
52
|
+
* the write is what makes it impossible for both writers to run.
|
|
23
53
|
*
|
|
24
54
|
* ## What is NOT gated
|
|
25
55
|
*
|
|
26
56
|
* Only the two calls that *record the reply* — the `chat_messages` row and the
|
|
27
57
|
* Markdown conversation log. Prompt rows, Auto-Yes, the waiting-episode edges,
|
|
28
58
|
* push notifications, task events and the session-state cursor all stay on the
|
|
29
|
-
* scraper, because none of them are things the
|
|
59
|
+
* scraper, because none of them are things the second writer duplicates: a
|
|
30
60
|
* `permission.asked` becomes a pending decision, never a history row, and the
|
|
31
61
|
* push fan-out has no second producer at all. Gating them would trade a
|
|
32
62
|
* duplicated reply for a silent notification, which is the worse failure.
|
|
@@ -35,14 +65,61 @@
|
|
|
35
65
|
*/
|
|
36
66
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
67
|
exports.isStructuredHistoryWriterLive = isStructuredHistoryWriterLive;
|
|
68
|
+
exports.captureStructuredHistoryTurn = captureStructuredHistoryTurn;
|
|
38
69
|
const logger_1 = require("../../lib/logger");
|
|
39
70
|
const subscription_1 = require("../../lib/hooks/sources/opencode/subscription");
|
|
71
|
+
const history_1 = require("../../lib/hooks/sources/claude/history");
|
|
72
|
+
const history_2 = require("../../lib/hooks/sources/codex/history");
|
|
73
|
+
const history_3 = require("../../lib/hooks/sources/antigravity/history");
|
|
74
|
+
const tool_id_1 = require("../../lib/hooks/sources/claude/tool-id");
|
|
75
|
+
const tool_id_2 = require("../../lib/hooks/sources/codex/tool-id");
|
|
76
|
+
const tool_id_3 = require("../../lib/hooks/sources/antigravity/tool-id");
|
|
77
|
+
const registry_1 = require("../../lib/hooks/sources/registry");
|
|
40
78
|
const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate');
|
|
79
|
+
/**
|
|
80
|
+
* Which reader answers for which tool.
|
|
81
|
+
*
|
|
82
|
+
* The one place a tool id still appears, and it is a dispatch table rather than
|
|
83
|
+
* a decision: *whether* to ask is
|
|
84
|
+
* `AgentSourceCapabilities.transcriptHistory === 'pull'`, and this only says who
|
|
85
|
+
* to ask. It cannot be folded into the capability itself because #1921 D3
|
|
86
|
+
* requires every declared capability to be JSON-serialisable — the block is
|
|
87
|
+
* copied onto the wire in `structuredEvents.source`, so a capability that were a
|
|
88
|
+
* function would vanish silently on the way out.
|
|
89
|
+
*
|
|
90
|
+
* A tool that declares `'pull'` and is missing here is a bug, and a loud one:
|
|
91
|
+
* {@link captureStructuredHistoryTurn} logs it and falls back to the scraper.
|
|
92
|
+
*/
|
|
93
|
+
const PULL_TRANSCRIPT_READERS = {
|
|
94
|
+
[tool_id_1.CLAUDE_CLI_TOOL_ID]: (target, capture) => (0, history_1.captureClaudeTranscriptTurn)(target, capture),
|
|
95
|
+
[tool_id_2.CODEX_CLI_TOOL_ID]: (target, capture) => (0, history_2.captureCodexTranscriptTurn)(target, capture),
|
|
96
|
+
[tool_id_3.ANTIGRAVITY_CLI_TOOL_ID]: (target, capture) => (0, history_3.captureAntigravityTranscriptTurn)(target, capture),
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* What this tool's source says about who records its replies.
|
|
100
|
+
*
|
|
101
|
+
* Never throws: a registry that cannot be reached is one that declares nothing,
|
|
102
|
+
* and nothing means the scraper keeps writing — the safe direction, as
|
|
103
|
+
* everywhere else in this module.
|
|
104
|
+
*/
|
|
105
|
+
function transcriptHistoryModeOf(cliToolId) {
|
|
106
|
+
try {
|
|
107
|
+
return (0, registry_1.getAgentEventSource)(cliToolId).capabilities.transcriptHistory ?? null;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.warn('structured-history-capability-unavailable', {
|
|
111
|
+
cliToolId,
|
|
112
|
+
error: error instanceof Error ? error.message : String(error),
|
|
113
|
+
});
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
41
117
|
/**
|
|
42
118
|
* Whether the agent's own server is recording this instance's replies.
|
|
43
119
|
*
|
|
44
|
-
* False for every tool
|
|
45
|
-
*
|
|
120
|
+
* False for every tool whose source does not declare `transcriptHistory: 'push'`
|
|
121
|
+
* — today that is all of them but opencode — and false for an opencode instance
|
|
122
|
+
* whose subscription is anything other than `live`; see
|
|
46
123
|
* {@link isOpencodeStructuredHistoryLive} for why `lost` counts as "nobody is
|
|
47
124
|
* writing this down" rather than as "somebody will". The fallback direction is
|
|
48
125
|
* the safe one: two writers duplicate a reply, no writer loses it.
|
|
@@ -54,9 +131,12 @@ const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate')
|
|
|
54
131
|
* @param instanceId - The agent instance; defaults to the primary
|
|
55
132
|
*/
|
|
56
133
|
function isStructuredHistoryWriterLive(worktreeId, cliToolId, instanceId) {
|
|
57
|
-
if (cliToolId !== '
|
|
134
|
+
if (transcriptHistoryModeOf(cliToolId) !== 'push')
|
|
58
135
|
return false;
|
|
59
136
|
try {
|
|
137
|
+
// One probe, because there is one push source. A second one adds a table
|
|
138
|
+
// here of the shape `PULL_TRANSCRIPT_READERS` already has; it does not add
|
|
139
|
+
// another `cliToolId ===`.
|
|
60
140
|
return (0, subscription_1.isOpencodeStructuredHistoryLive)({
|
|
61
141
|
worktreeId,
|
|
62
142
|
cliToolId,
|
|
@@ -73,3 +153,54 @@ function isStructuredHistoryWriterLive(worktreeId, cliToolId, instanceId) {
|
|
|
73
153
|
return false;
|
|
74
154
|
}
|
|
75
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Ask the pull-mode structured writer to record this turn now (#2121, #2197).
|
|
158
|
+
*
|
|
159
|
+
* The file-backed half of the stand-down. Returns true when `chat_messages`
|
|
160
|
+
* holds this turn as the agent's own Markdown — because this call wrote it, or
|
|
161
|
+
* because an earlier poll of the same finished turn already did — and the caller
|
|
162
|
+
* must therefore drop the scraped copy.
|
|
163
|
+
*
|
|
164
|
+
* False for every tool that does not declare `transcriptHistory: 'pull'`, and
|
|
165
|
+
* false for one that does whenever anything at all prevented the write: no
|
|
166
|
+
* session pointer (a pane started without hooks, or with hooks codex has not
|
|
167
|
+
* been told to trust), no transcript file, an unreadable one, a window with no
|
|
168
|
+
* prompt in it, or a turn the agent has not finished writing. That is the
|
|
169
|
+
* fail-open every one of these Issues' acceptance criteria asks for in as many
|
|
170
|
+
* words — 転写ファイルが無い / 読めない場合は従来のスクレイプ経路にフォール
|
|
171
|
+
* バックする. Two writers duplicate a reply; no writer loses one.
|
|
172
|
+
*
|
|
173
|
+
* Never throws, for the same reason {@link isStructuredHistoryWriterLive} does
|
|
174
|
+
* not: this runs inside the poller's save path, and an exception here would cost
|
|
175
|
+
* the scraped reply as well as the structured one.
|
|
176
|
+
*
|
|
177
|
+
* @param worktreeId - The worktree
|
|
178
|
+
* @param cliToolId - The tool driving the pane
|
|
179
|
+
* @param instanceId - The agent instance; defaults to the primary
|
|
180
|
+
* @param capture - Where to look; see {@link StructuredHistoryCapture}
|
|
181
|
+
*/
|
|
182
|
+
async function captureStructuredHistoryTurn(worktreeId, cliToolId, instanceId, capture) {
|
|
183
|
+
if (transcriptHistoryModeOf(cliToolId) !== 'pull')
|
|
184
|
+
return false;
|
|
185
|
+
const reader = PULL_TRANSCRIPT_READERS[cliToolId];
|
|
186
|
+
if (!reader) {
|
|
187
|
+
logger.warn('structured-history-reader-missing', {
|
|
188
|
+
worktreeId,
|
|
189
|
+
cliToolId,
|
|
190
|
+
instanceId: instanceId ?? cliToolId,
|
|
191
|
+
});
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
return await reader({ worktreeId, cliToolId, instanceId: instanceId ?? cliToolId }, capture);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
logger.warn('structured-history-capture-unavailable', {
|
|
199
|
+
worktreeId,
|
|
200
|
+
cliToolId,
|
|
201
|
+
instanceId: instanceId ?? cliToolId,
|
|
202
|
+
error: error instanceof Error ? error.message : String(error),
|
|
203
|
+
});
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -317,9 +317,29 @@ async function notifyPushSubscribers(event, now = Date.now()) {
|
|
|
317
317
|
// from one that was never attempted — `push-send-failed` is per device and
|
|
318
318
|
// sits below the default log level's attention, and success said nothing at
|
|
319
319
|
// all. One line per fan-out names both halves, and no endpoint.
|
|
320
|
+
//
|
|
321
|
+
// Issue #2133: it also names *whose* fan-out it was. Without the subject,
|
|
322
|
+
// two worktrees notifying in the same second print two identical lines, so
|
|
323
|
+
// the UAT steps that pass by counting zero notifications
|
|
324
|
+
// (`docs/qa/2001-cross-device-dismissal-uat.md` T-4 / T-6 / T-7) read a
|
|
325
|
+
// neighbour's push as their own — which is what the Epic #2002 run hit on
|
|
326
|
+
// 2026-08-29, and only the co-timed `resolution-push-sent` (which does carry
|
|
327
|
+
// `worktreeId`) rescued the reading. A waiting push has no such partner.
|
|
328
|
+
//
|
|
329
|
+
// The key names match `resolution-push-notifier`'s context on purpose, so
|
|
330
|
+
// both halves of one episode grep together. `instanceId` resolves exactly as
|
|
331
|
+
// the episode dedup key above does, and is left absent — `JSON.stringify`
|
|
332
|
+
// drops `undefined` — rather than logged as an empty string when no producer
|
|
333
|
+
// named an instance.
|
|
320
334
|
const delivered = outcomes.filter(Boolean).length;
|
|
321
335
|
const failed = outcomes.length - delivered;
|
|
322
|
-
logger.info('push-fanout-complete', {
|
|
336
|
+
logger.info('push-fanout-complete', {
|
|
337
|
+
kind: event.kind,
|
|
338
|
+
worktreeId: event.worktreeId,
|
|
339
|
+
instanceId: event.instanceId ?? event.agentName,
|
|
340
|
+
delivered,
|
|
341
|
+
failed,
|
|
342
|
+
});
|
|
323
343
|
}
|
|
324
344
|
catch (err) {
|
|
325
345
|
logger.warn('push-fanout-error', {
|
|
@@ -39,19 +39,31 @@
|
|
|
39
39
|
* closes — so an install with nothing waiting has no timer, and one that never
|
|
40
40
|
* configured VAPID never even gets that far.
|
|
41
41
|
*
|
|
42
|
+
* ## Holding a wait that has not named itself
|
|
43
|
+
*
|
|
44
|
+
* The edge fires once, and for a dialog drawn between two probes it fires
|
|
45
|
+
* before anything on the pane can be classified — so #2156's `AskUserQuestion`
|
|
46
|
+
* arrived here as `unclassified` and was announced as "check the terminal"
|
|
47
|
+
* although the app could answer it. The kind is refreshed in place afterwards
|
|
48
|
+
* and that refresh is deliberately not an edge, so the fix is on this side:
|
|
49
|
+
* an unnamed wait is held for {@link CLASSIFICATION_GRACE_MS} and then sent
|
|
50
|
+
* under whatever the episode is called at that point. One notification either
|
|
51
|
+
* way — no correction push, and nothing at all if the wait ended meanwhile.
|
|
52
|
+
*
|
|
42
53
|
* Everything here is advisory: a failure must not disturb the status read that
|
|
43
54
|
* observed the edge (`emit` contains listener throws) nor the poller.
|
|
44
55
|
*
|
|
45
56
|
* @module lib/push/waiting-push-notifier
|
|
46
57
|
*/
|
|
47
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.ESCALATION_TICK_MS = void 0;
|
|
59
|
+
exports.CLASSIFICATION_GRACE_MS = exports.ESCALATION_TICK_MS = void 0;
|
|
49
60
|
exports.handleWaitingTransition = handleWaitingTransition;
|
|
50
61
|
exports.runEscalationTick = runEscalationTick;
|
|
51
62
|
exports.startWaitingPushNotifier = startWaitingPushNotifier;
|
|
52
63
|
exports.stopWaitingPushNotifier = stopWaitingPushNotifier;
|
|
53
64
|
exports.isWaitingPushNotifierActive = isWaitingPushNotifierActive;
|
|
54
65
|
exports.pendingEscalationCount = pendingEscalationCount;
|
|
66
|
+
exports.heldWaitCount = heldWaitCount;
|
|
55
67
|
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
56
68
|
const db_instance_1 = require("../../lib/db/db-instance");
|
|
57
69
|
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
@@ -65,8 +77,33 @@ const vapid_1 = require("./vapid");
|
|
|
65
77
|
const logger = (0, logger_1.createLogger)('push/waiting-notifier');
|
|
66
78
|
/** How often outstanding waits are re-checked. Minute granularity is enough. */
|
|
67
79
|
exports.ESCALATION_TICK_MS = 60_000;
|
|
80
|
+
/**
|
|
81
|
+
* How long a wait that has not named itself yet is held before it notifies
|
|
82
|
+
* (Issue #2156).
|
|
83
|
+
*
|
|
84
|
+
* `AskUserQuestion` opens the episode before the pane carries anything the
|
|
85
|
+
* screen scraper can read, so the *first* classification of that wait is
|
|
86
|
+
* `unclassified` and the body would say "check the terminal" about a dialog the
|
|
87
|
+
* app can answer. `waiting-episode-state` refreshes the kind in place on the
|
|
88
|
+
* next probe and deliberately emits nothing for it (a wait that changes
|
|
89
|
+
* character is still one wait), so the notifier only ever saw the provisional
|
|
90
|
+
* verdict.
|
|
91
|
+
*
|
|
92
|
+
* Measured on the session in the Issue: the edge opened at 00:08:38.837 with no
|
|
93
|
+
* usable classification and the next status probe refined it to `prompt` at
|
|
94
|
+
* 00:08:44.863 — 6.03 s later; 8 s is that measurement plus one probe's jitter
|
|
95
|
+
* and nothing more, because the hold is silence on the phone and it is meant to
|
|
96
|
+
* buy exactly one reclassification.
|
|
97
|
+
*
|
|
98
|
+
* Only an unnamed wait pays it: `prompt` and `menu` are positive verdicts and
|
|
99
|
+
* still notify on the edge itself.
|
|
100
|
+
*/
|
|
101
|
+
exports.CLASSIFICATION_GRACE_MS = 8_000;
|
|
68
102
|
const pending = globalThis.__waitingPushPending ??
|
|
69
103
|
(globalThis.__waitingPushPending = new Map());
|
|
104
|
+
/** Composite key -> the timer holding that wait's first notification (#2156). */
|
|
105
|
+
const graceTimers = globalThis.__waitingPushGraceTimers ??
|
|
106
|
+
(globalThis.__waitingPushGraceTimers = new Map());
|
|
70
107
|
/**
|
|
71
108
|
* The worktree's display name, for the notification title.
|
|
72
109
|
*
|
|
@@ -109,6 +146,73 @@ async function sendWaitingPush(wait, escalated, now) {
|
|
|
109
146
|
});
|
|
110
147
|
}
|
|
111
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Whether this classification is still provisional (Issue #2156).
|
|
151
|
+
*
|
|
152
|
+
* `unclassified` is what `deriveWaitingKind` returns for a frame the scraper
|
|
153
|
+
* could not read at all, and a null kind is the same admission from a producer
|
|
154
|
+
* that passed none — both mean "waiting, but nobody has said what for" and both
|
|
155
|
+
* are the verdict that arrives first when a dialog is drawn between two probes.
|
|
156
|
+
* `prompt` and `menu` are positive readings of the pane and are taken at once.
|
|
157
|
+
*/
|
|
158
|
+
function isUnnamedWait(kind) {
|
|
159
|
+
return kind === null || kind === undefined || kind === 'unclassified';
|
|
160
|
+
}
|
|
161
|
+
/** Drop the hold on this wait without sending anything. */
|
|
162
|
+
function cancelGrace(key) {
|
|
163
|
+
const timer = graceTimers.get(key);
|
|
164
|
+
if (timer === undefined)
|
|
165
|
+
return;
|
|
166
|
+
clearTimeout(timer);
|
|
167
|
+
graceTimers.delete(key);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The Auto-Yes gate, then the fan-out.
|
|
171
|
+
*
|
|
172
|
+
* In that order because `shouldSendWaitingPush` records the episode at the
|
|
173
|
+
* moment it decides to send, so a notification dropped after the fan-out began
|
|
174
|
+
* would still consume the episode's one slot — see `prompt-push-gate`.
|
|
175
|
+
*/
|
|
176
|
+
function gateAndSend(wait, now) {
|
|
177
|
+
if ((0, prompt_push_gate_1.isPromptPushSuppressed)({
|
|
178
|
+
worktreeId: wait.worktreeId,
|
|
179
|
+
cliToolId: wait.cliToolId,
|
|
180
|
+
instanceId: wait.instanceId,
|
|
181
|
+
waitingSince: wait.since,
|
|
182
|
+
})) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
void sendWaitingPush(wait, false, now);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The grace elapsed: send the held wait with whatever it is called *now*
|
|
189
|
+
* (Issue #2156).
|
|
190
|
+
*
|
|
191
|
+
* The episode store is the authority here for the same reason it is in
|
|
192
|
+
* {@link runEscalationTick}: it carries the classification every later probe
|
|
193
|
+
* refined, and its absence is the wait having ended. Nothing is sent in that
|
|
194
|
+
* case — a wait answered inside the grace never needed a notification, and
|
|
195
|
+
* dropping it is the direction #1999/#2000 asked for rather than a correction
|
|
196
|
+
* push chasing one that was already wrong.
|
|
197
|
+
*/
|
|
198
|
+
function releaseHeldWait(key) {
|
|
199
|
+
graceTimers.delete(key);
|
|
200
|
+
const held = pending.get(key);
|
|
201
|
+
// Gone means the closing edge dropped it, or a reminder already claimed it.
|
|
202
|
+
if (held === undefined)
|
|
203
|
+
return;
|
|
204
|
+
const episode = (0, waiting_episode_state_1.getWaitingEpisode)(held.worktreeId, held.cliToolId, held.instanceId);
|
|
205
|
+
if (episode === null || episode.since !== held.since) {
|
|
206
|
+
pending.delete(key);
|
|
207
|
+
stopEscalationTimerIfIdle();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Written back so the reminder quotes the settled kind even if the episode is
|
|
211
|
+
// gone by the time it runs.
|
|
212
|
+
const settled = { ...held, kind: episode.kind };
|
|
213
|
+
pending.set(key, settled);
|
|
214
|
+
gateAndSend(settled, Date.now());
|
|
215
|
+
}
|
|
112
216
|
function startEscalationTimer() {
|
|
113
217
|
if (globalThis.__waitingPushEscalationTimer !== undefined)
|
|
114
218
|
return;
|
|
@@ -143,6 +247,8 @@ function handleWaitingTransition(transition) {
|
|
|
143
247
|
return;
|
|
144
248
|
const key = (0, auto_yes_state_1.buildCompositeKey)(transition.worktreeId, transition.cliToolId, transition.instanceId);
|
|
145
249
|
if (!transition.waiting || transition.since === null) {
|
|
250
|
+
// Issue #2156: a wait still inside its grace is answered, not notified.
|
|
251
|
+
cancelGrace(key);
|
|
146
252
|
pending.delete(key);
|
|
147
253
|
stopEscalationTimerIfIdle();
|
|
148
254
|
// Issue #2001: this is the moment the notification on every *other* device
|
|
@@ -180,15 +286,20 @@ function handleWaitingTransition(transition) {
|
|
|
180
286
|
// episode at the moment it decides to send.
|
|
181
287
|
pending.set(key, wait);
|
|
182
288
|
startEscalationTimer();
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
289
|
+
// Issue #2156: a wait nobody has named yet is held for one probe interval so
|
|
290
|
+
// it can notify under the kind it turns out to be, rather than under the
|
|
291
|
+
// placeholder it opened with. A named wait notifies on the edge, as before.
|
|
292
|
+
if (isUnnamedWait(wait.kind)) {
|
|
293
|
+
cancelGrace(key);
|
|
294
|
+
const timer = setTimeout(() => {
|
|
295
|
+
releaseHeldWait(key);
|
|
296
|
+
}, exports.CLASSIFICATION_GRACE_MS);
|
|
297
|
+
// Same reasoning as the escalation interval: never hold the process open.
|
|
298
|
+
timer.unref?.();
|
|
299
|
+
graceTimers.set(key, timer);
|
|
189
300
|
return;
|
|
190
301
|
}
|
|
191
|
-
|
|
302
|
+
gateAndSend(wait, transition.at);
|
|
192
303
|
}
|
|
193
304
|
/**
|
|
194
305
|
* Re-notify every wait that has outlived the threshold, once each.
|
|
@@ -267,6 +378,9 @@ function stopWaitingPushNotifier() {
|
|
|
267
378
|
existing();
|
|
268
379
|
globalThis.__waitingPushUnsubscribe = undefined;
|
|
269
380
|
}
|
|
381
|
+
for (const timer of graceTimers.values())
|
|
382
|
+
clearTimeout(timer);
|
|
383
|
+
graceTimers.clear();
|
|
270
384
|
pending.clear();
|
|
271
385
|
stopEscalationTimerIfIdle();
|
|
272
386
|
}
|
|
@@ -278,3 +392,7 @@ function isWaitingPushNotifierActive() {
|
|
|
278
392
|
function pendingEscalationCount() {
|
|
279
393
|
return pending.size;
|
|
280
394
|
}
|
|
395
|
+
/** How many waits are held waiting to be classified (#2156). Test seam. */
|
|
396
|
+
function heldWaitCount() {
|
|
397
|
+
return graceTimers.size;
|
|
398
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Process-local registry naming the one module instance that owns live
|
|
4
|
+
* WebSocket rooms (Issue #2220).
|
|
5
|
+
*
|
|
6
|
+
* ## The failure this exists to close
|
|
7
|
+
*
|
|
8
|
+
* `ws-server` keeps `wss`, `clients` and `rooms` in its module scope, and only
|
|
9
|
+
* the instance the custom server called `setupWebSocket()` on ever holds a
|
|
10
|
+
* socket. That was believed to be a `next dev` nicety; it is not. A production
|
|
11
|
+
* build has two graphs, and the build artifacts say so:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* dist/server/server.js -> require("./src/lib/ws-server") // owner
|
|
15
|
+
* .next/server/app/api/**\/route.js -> .next/server/chunks/<n>.js // a second copy
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* `setupWebSocket` appears in the `.next` chunk only as an exported binding —
|
|
19
|
+
* grep it and the sole hit is the export map, never a call. So the route
|
|
20
|
+
* bundle's `rooms` is empty for the life of the process, and every
|
|
21
|
+
* `broadcast()` reached from a route handler returned in silence.
|
|
22
|
+
*
|
|
23
|
+
* ## What is shared and what is not
|
|
24
|
+
*
|
|
25
|
+
* Only the *capability* crosses the boundary: four functions the owner hands
|
|
26
|
+
* over. `wss`, the socket set, `clients` and `rooms` stay inside the owner's
|
|
27
|
+
* module scope, so a route bundle can ask for a frame to be published but can
|
|
28
|
+
* neither enumerate nor mutate the connection state. Putting the maps
|
|
29
|
+
* themselves on `globalThis` would work — same process, same `globalThis` — but
|
|
30
|
+
* it exposes the central state to every bundle and leaves ownership undefined
|
|
31
|
+
* once two instances have both initialised.
|
|
32
|
+
*
|
|
33
|
+
* This is the shape #1788 already uses for the waiting edge
|
|
34
|
+
* (`waiting-episode-state`'s `globalThis` listener set, written by
|
|
35
|
+
* `ws-server`'s `setupWebSocket`), and it is measurably cross-bundle in the same
|
|
36
|
+
* build: `__sessionWaitingTransitionListeners` appears in both `dist/server` and
|
|
37
|
+
* the `.next` chunks.
|
|
38
|
+
*
|
|
39
|
+
* ## Ownership
|
|
40
|
+
*
|
|
41
|
+
* Registration is a generation counter that only ever moves forward, and
|
|
42
|
+
* withdrawal is authorised by the token handed out at registration. A stale
|
|
43
|
+
* instance calling `closeWebSocket()` after a newer one has taken over
|
|
44
|
+
* therefore cannot silence the live server — the classic HMR / re-entered
|
|
45
|
+
* `setupWebSocket` hazard.
|
|
46
|
+
*
|
|
47
|
+
* ## Import discipline
|
|
48
|
+
*
|
|
49
|
+
* This module must stay a leaf: it imports the logger and nothing else. Both
|
|
50
|
+
* `ws-server` and every producer reach it, so an edge back into either would
|
|
51
|
+
* rebuild the module-scope cycle `tests/unit/guards/no-ws-server-manager-cycle-1984.test.ts`
|
|
52
|
+
* exists to forbid.
|
|
53
|
+
*
|
|
54
|
+
* @module lib/realtime/publisher-registry
|
|
55
|
+
*/
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.UNROUTED_PUBLISH_WARN_INTERVAL_MS = void 0;
|
|
58
|
+
exports.registerRoomPublisher = registerRoomPublisher;
|
|
59
|
+
exports.unregisterRoomPublisher = unregisterRoomPublisher;
|
|
60
|
+
exports.getRoomPublisher = getRoomPublisher;
|
|
61
|
+
exports.getRoomPublisherGeneration = getRoomPublisherGeneration;
|
|
62
|
+
exports.recordUnroutedPublish = recordUnroutedPublish;
|
|
63
|
+
exports.getUnroutedPublishStats = getUnroutedPublishStats;
|
|
64
|
+
exports.__resetRoomPublisherRegistryForTest = __resetRoomPublisherRegistryForTest;
|
|
65
|
+
const logger_1 = require("../../lib/logger");
|
|
66
|
+
const logger = (0, logger_1.createLogger)('publisher-registry');
|
|
67
|
+
/** At most one warning per minute; the rest are counted, not printed. */
|
|
68
|
+
exports.UNROUTED_PUBLISH_WARN_INTERVAL_MS = 60_000;
|
|
69
|
+
function unroutedState() {
|
|
70
|
+
return (globalThis.__realtimeUnroutedPublish ??= {
|
|
71
|
+
total: 0,
|
|
72
|
+
suppressed: 0,
|
|
73
|
+
lastWarnedAt: null,
|
|
74
|
+
operations: {},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Claim ownership of the process's rooms.
|
|
79
|
+
*
|
|
80
|
+
* Called from `setupWebSocket()` and nowhere else. A second call supersedes the
|
|
81
|
+
* first rather than being rejected: re-entering `setupWebSocket` builds a new
|
|
82
|
+
* `WebSocketServer`, and the newest one is the one holding sockets.
|
|
83
|
+
*
|
|
84
|
+
* @param publisher - The owner's implementation, closed over its own maps.
|
|
85
|
+
* @returns A handle whose `unregister()` is honoured only while it is current.
|
|
86
|
+
*/
|
|
87
|
+
function registerRoomPublisher(publisher) {
|
|
88
|
+
const token = (globalThis.__realtimeRoomPublisherGeneration ?? 0) + 1;
|
|
89
|
+
globalThis.__realtimeRoomPublisherGeneration = token;
|
|
90
|
+
globalThis.__realtimeRoomPublisher = { generation: token, publisher };
|
|
91
|
+
// A live owner means the frames counted below are no longer being dropped;
|
|
92
|
+
// carrying the old totals forward would keep warning about a fixed process.
|
|
93
|
+
globalThis.__realtimeUnroutedPublish = undefined;
|
|
94
|
+
return {
|
|
95
|
+
token,
|
|
96
|
+
unregister: () => unregisterRoomPublisher(token),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Withdraw the registration identified by `token`.
|
|
101
|
+
*
|
|
102
|
+
* A token that is not the current generation is ignored. That is the whole
|
|
103
|
+
* point: under HMR — or in a suite that stands two servers up — the instance
|
|
104
|
+
* being torn down is frequently *not* the one that owns the live sockets, and
|
|
105
|
+
* its `closeWebSocket()` must not take the running server's publisher with it.
|
|
106
|
+
*
|
|
107
|
+
* @returns Whether this call actually cleared the registration.
|
|
108
|
+
*/
|
|
109
|
+
function unregisterRoomPublisher(token) {
|
|
110
|
+
const current = globalThis.__realtimeRoomPublisher;
|
|
111
|
+
if (!current || current.generation !== token)
|
|
112
|
+
return false;
|
|
113
|
+
globalThis.__realtimeRoomPublisher = undefined;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
/** The owner's publisher, or null when no instance has claimed the rooms. */
|
|
117
|
+
function getRoomPublisher() {
|
|
118
|
+
return globalThis.__realtimeRoomPublisher?.publisher ?? null;
|
|
119
|
+
}
|
|
120
|
+
/** Generation of the current registration; 0 when there is none. */
|
|
121
|
+
function getRoomPublisherGeneration() {
|
|
122
|
+
return globalThis.__realtimeRoomPublisher?.generation ?? 0;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Note that a publish found no owner, warning at most once a minute.
|
|
126
|
+
*
|
|
127
|
+
* Without this the failure has no symptom at all. The room lookup returns
|
|
128
|
+
* `undefined`, the function returns, and the browser still shows the socket as
|
|
129
|
+
* `connected` — because it is: the socket is healthy and only the server-side
|
|
130
|
+
* publisher is missing. That is the state #2220 sat in unnoticed. The counters
|
|
131
|
+
* are readable through {@link getUnroutedPublishStats} so a test can assert the
|
|
132
|
+
* signal exists rather than trusting a log line.
|
|
133
|
+
*
|
|
134
|
+
* @param operation - The surface that lost the frame, e.g. `'broadcast'`.
|
|
135
|
+
* @param worktreeId - Room the frame was addressed to.
|
|
136
|
+
*/
|
|
137
|
+
function recordUnroutedPublish(operation, worktreeId, now = Date.now()) {
|
|
138
|
+
const state = unroutedState();
|
|
139
|
+
state.total += 1;
|
|
140
|
+
state.operations[operation] = (state.operations[operation] ?? 0) + 1;
|
|
141
|
+
if (state.lastWarnedAt !== null && now - state.lastWarnedAt < exports.UNROUTED_PUBLISH_WARN_INTERVAL_MS) {
|
|
142
|
+
state.suppressed += 1;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const suppressed = state.suppressed;
|
|
146
|
+
state.suppressed = 0;
|
|
147
|
+
state.lastWarnedAt = now;
|
|
148
|
+
logger.warn('realtime:no-room-publisher', {
|
|
149
|
+
operation,
|
|
150
|
+
worktreeId,
|
|
151
|
+
total: state.total,
|
|
152
|
+
suppressedSinceLastWarning: suppressed,
|
|
153
|
+
operations: { ...state.operations },
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/** Read-only view of the unrouted-publish counters. */
|
|
157
|
+
function getUnroutedPublishStats() {
|
|
158
|
+
const state = unroutedState();
|
|
159
|
+
return { ...state, operations: { ...state.operations } };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Drop the registration and the counters.
|
|
163
|
+
*
|
|
164
|
+
* Test seam. The generation counter is deliberately NOT reset — a suite that
|
|
165
|
+
* reset it could hand two different registrations the same token and stop
|
|
166
|
+
* exercising the ownership rule this module is built around.
|
|
167
|
+
*/
|
|
168
|
+
function __resetRoomPublisherRegistryForTest() {
|
|
169
|
+
globalThis.__realtimeRoomPublisher = undefined;
|
|
170
|
+
globalThis.__realtimeUnroutedPublish = undefined;
|
|
171
|
+
}
|
|
@@ -23,7 +23,8 @@ const logger_1 = require("../../lib/logger");
|
|
|
23
23
|
const manager_1 = require("../../lib/cli-tools/manager");
|
|
24
24
|
const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
|
|
25
25
|
const logger = (0, logger_1.createLogger)('terminal-broadcast');
|
|
26
|
-
const versionCounters =
|
|
26
|
+
const versionCounters = globalThis.__terminalSnapshotVersions ??
|
|
27
|
+
(globalThis.__terminalSnapshotVersions = new Map());
|
|
27
28
|
exports.INTERACTION_SNAPSHOT_RETRY_DELAYS_MS = [100, 250, 500, 750];
|
|
28
29
|
function nextVersion(key) {
|
|
29
30
|
const version = (versionCounters.get(key) ?? 0) + 1;
|
|
@@ -54,6 +55,12 @@ function snapshotFingerprint(payload) {
|
|
|
54
55
|
return JSON.stringify([
|
|
55
56
|
payload.fullOutput ?? '',
|
|
56
57
|
payload.isRunning,
|
|
58
|
+
// Issue #2240: part of the frame since the snapshot started carrying it, so
|
|
59
|
+
// a redraw whose only change is the verdict (`waiting` -> `running` on an
|
|
60
|
+
// answered dialog, say) is still published. Leaving it out would put the
|
|
61
|
+
// field back in the position this issue took it out of — present on the
|
|
62
|
+
// wire, but not deliverable by the path that actually feeds a live turn.
|
|
63
|
+
payload.sessionStatus,
|
|
57
64
|
payload.thinking ?? false,
|
|
58
65
|
payload.isPromptWaiting ?? false,
|
|
59
66
|
payload.isSelectionListActive ?? false,
|
|
@@ -76,6 +83,12 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
|
|
|
76
83
|
instanceId: resolvedInstanceId,
|
|
77
84
|
output: payload.fullOutput ?? '',
|
|
78
85
|
isRunning: payload.isRunning,
|
|
86
|
+
// Issue #2240: straight through, so push and poll answer the same question
|
|
87
|
+
// with the same value. `/current-output` returns this very payload, so the
|
|
88
|
+
// two paths differ only in transport. Not `?? something` — the builder
|
|
89
|
+
// types it as a required `string` and publishes `'idle'` for a session that
|
|
90
|
+
// is not running, so there is no absent case to invent a default for.
|
|
91
|
+
sessionStatus: payload.sessionStatus,
|
|
79
92
|
thinking: payload.thinking ?? false,
|
|
80
93
|
isPromptWaiting: payload.isPromptWaiting ?? false,
|
|
81
94
|
promptData: payload.promptData ?? null,
|