commandmate 0.27.1 → 0.29.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/.env.example +28 -0
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +441 -404
- package/.next/app-path-routes-manifest.json +34 -29
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +0 -6
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +32 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +1 -1
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +32 -1
- 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 +34 -3
- 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.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.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.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 -1
- 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 -1
- 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 +1 -1
- 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 +1 -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 +7 -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 +1 -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.js +2 -0
- package/.next/server/app/api/remote/pair/route.js.nft.json +1 -0
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -0
- 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/sidebar/group-order/route.js +1 -1
- 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.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +1 -1
- 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.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.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-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 +2 -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 -0
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -0
- 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 +4 -4
- 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 -0
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -0
- 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 +5 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +6 -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 +7 -3
- 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]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/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 -3
- 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/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]/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/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_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page.js +2 -2
- 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 +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- 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 +15 -10
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +2 -2
- 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 +34 -29
- package/.next/server/chunks/1058.js +1 -0
- package/.next/server/chunks/1068.js +1 -3
- package/.next/server/chunks/1162.js +1 -1
- package/.next/server/chunks/1191.js +13 -0
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1714.js +7 -0
- package/.next/server/chunks/1886.js +5 -0
- package/.next/server/chunks/1944.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/221.js +19 -0
- package/.next/server/chunks/222.js +1 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2366.js +1 -0
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/243.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2759.js +1 -1
- package/.next/server/chunks/3346.js +1 -1
- package/.next/server/chunks/3440.js +1 -1
- package/.next/server/chunks/3480.js +17 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3558.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- package/.next/server/chunks/4299.js +1 -0
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5089.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +11 -10
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6337.js +1 -0
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/663.js +78 -0
- package/.next/server/chunks/7472.js +1 -1
- package/.next/server/chunks/7824.js +1 -0
- package/.next/server/chunks/7905.js +1 -0
- package/.next/server/chunks/880.js +6 -6
- package/.next/server/chunks/8807.js +84 -18
- package/.next/server/chunks/9123.js +2 -2
- package/.next/server/chunks/9130.js +5 -0
- package/.next/server/chunks/9328.js +1 -1
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9508.js +1 -1
- package/.next/server/chunks/9584.js +1 -0
- package/.next/server/chunks/9627.js +274 -0
- package/.next/server/chunks/9798.js +2 -0
- package/.next/server/chunks/9938.js +1 -1
- package/.next/server/functions-config-manifest.json +3 -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/chunks/1188-8567ee5ecfef02ee.js +1 -0
- package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +1 -0
- package/.next/static/chunks/3968-8d8ca15657748bfb.js +1 -0
- package/.next/static/chunks/5229-580b581fce5aeb52.js +1 -0
- package/.next/static/chunks/6381-c8d93ec301dbc380.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/login/page-03659dded846ef1d.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-c07b23b6ca58091c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +1 -0
- package/.next/static/chunks/webpack-7e79064bfce988d7.js +1 -0
- package/.next/static/css/b6990f889f4f9515.css +1 -0
- package/.next/static/uulKcSOgyxChTo4SipUSF/_buildManifest.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/remote/pair/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/instances/opencode/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/diff/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/session/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/share/route.ts +347 -0
- package/.next/types/routes.d.ts +6 -1
- package/.next/types/validator.ts +45 -0
- package/README.md +24 -4
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +66 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +46 -1
- package/dist/cli/commands/interrupt.d.ts +25 -0
- package/dist/cli/commands/interrupt.d.ts.map +1 -0
- package/dist/cli/commands/interrupt.js +146 -0
- package/dist/cli/commands/remote.d.ts +248 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/remote.js +849 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +11 -4
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +146 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +104 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +39 -1
- package/dist/cli/config/agent-target-options.d.ts +12 -0
- package/dist/cli/config/agent-target-options.d.ts.map +1 -1
- package/dist/cli/config/agent-target-options.js +15 -1
- package/dist/cli/config/security-messages.d.ts +25 -0
- package/dist/cli/config/security-messages.d.ts.map +1 -1
- package/dist/cli/config/security-messages.js +43 -1
- 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 +34 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +12 -0
- package/dist/cli/types/api-responses.d.ts +375 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +83 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +31 -1
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +3 -0
- package/dist/cli/utils/env-setup.d.ts +24 -0
- package/dist/cli/utils/env-setup.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.js +70 -0
- package/dist/cli/utils/qr-terminal.d.ts +54 -0
- package/dist/cli/utils/qr-terminal.d.ts.map +1 -0
- package/dist/cli/utils/qr-terminal.js +181 -0
- package/dist/cli/utils/remote-state.d.ts +123 -0
- package/dist/cli/utils/remote-state.d.ts.map +1 -0
- package/dist/cli/utils/remote-state.js +193 -0
- package/dist/cli/utils/vapid-keygen.d.ts +74 -0
- package/dist/cli/utils/vapid-keygen.d.ts.map +1 -0
- package/dist/cli/utils/vapid-keygen.js +111 -0
- package/dist/config/auth-config.d.ts +1 -1
- package/dist/config/auth-config.d.ts.map +1 -1
- package/dist/config/auth-config.js +5 -0
- package/dist/lib/cli-tools/types.d.ts +11 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +14 -3
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +14 -3
- package/dist/lib/push/vapid.d.ts +178 -0
- package/dist/lib/push/vapid.d.ts.map +1 -0
- package/dist/lib/push/vapid.js +293 -0
- package/dist/lib/remote/cloudflare.d.ts +285 -0
- package/dist/lib/remote/cloudflare.d.ts.map +1 -0
- package/dist/lib/remote/cloudflare.js +619 -0
- package/dist/lib/remote/index.d.ts +17 -0
- package/dist/lib/remote/index.d.ts.map +1 -0
- package/dist/lib/remote/index.js +64 -0
- package/dist/lib/remote/provider-registry.d.ts +29 -0
- package/dist/lib/remote/provider-registry.d.ts.map +1 -0
- package/dist/lib/remote/provider-registry.js +73 -0
- package/dist/lib/remote/tailscale.d.ts +268 -0
- package/dist/lib/remote/tailscale.d.ts.map +1 -0
- package/dist/lib/remote/tailscale.js +546 -0
- package/dist/lib/remote/types.d.ts +127 -0
- package/dist/lib/remote/types.d.ts.map +1 -0
- package/dist/lib/remote/types.js +53 -0
- package/dist/lib/security/pairing-code.d.ts +182 -0
- package/dist/lib/security/pairing-code.d.ts.map +1 -0
- package/dist/lib/security/pairing-code.js +265 -0
- package/dist/lib/server/localhost-self-check.d.ts +203 -0
- package/dist/lib/server/localhost-self-check.d.ts.map +1 -0
- package/dist/lib/server/localhost-self-check.js +333 -0
- package/dist/server/locales/en/notifications.json +23 -1
- package/dist/server/locales/ja/notifications.json +23 -1
- package/dist/server/server.js +103 -0
- package/dist/server/src/config/auth-config.js +5 -0
- package/dist/server/src/config/image-extensions.js +244 -0
- package/dist/server/src/config/opencode-constants.js +69 -0
- package/dist/server/src/config/tmux-pane-config.js +100 -1
- package/dist/server/src/lib/cli-tools/base.js +33 -48
- package/dist/server/src/lib/cli-tools/opencode-config.js +12 -0
- package/dist/server/src/lib/cli-tools/opencode.js +435 -7
- package/dist/server/src/lib/cli-tools/start-availability.js +160 -0
- package/dist/server/src/lib/cmate-cli-tool-parser.js +328 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/db/agent-instances-db.js +129 -0
- package/dist/server/src/lib/db/agent-session-cost-db.js +204 -0
- package/dist/server/src/lib/db/agent-session-cost-sampler.js +194 -0
- package/dist/server/src/lib/db/chat-db.js +33 -0
- package/dist/server/src/lib/db/db-instance.js +11 -0
- package/dist/server/src/lib/db/db.js +8 -3
- package/dist/server/src/lib/db/migrations/index.js +6 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v57-push-subscription-defaults-notice.js +54 -0
- package/dist/server/src/lib/db/migrations/v58-agent-session-costs.js +100 -0
- package/dist/server/src/lib/db/migrations/v59-opencode-instance-settings.js +71 -0
- package/dist/server/src/lib/db/push-subscriptions-db.js +56 -5
- package/dist/server/src/lib/detection/cli-patterns.js +17 -6
- package/dist/server/src/lib/detection/excerpt.js +48 -0
- package/dist/server/src/lib/detection/model-info-extractor.js +26 -3
- package/dist/server/src/lib/detection/opencode-modal-overlay.js +400 -0
- package/dist/server/src/lib/detection/opencode-pane-obstruction.js +181 -0
- package/dist/server/src/lib/detection/status-detector.js +7 -0
- package/dist/server/src/lib/detection/status-reason.js +20 -0
- package/dist/server/src/lib/detection/terminal-columns.js +94 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +43 -0
- package/dist/server/src/lib/detection/tools/opencode/prompt.js +20 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +14 -3
- package/dist/server/src/lib/detection/upstream-faults.js +7 -22
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +324 -0
- package/dist/server/src/lib/hooks/pending-decision-kind.js +72 -0
- package/dist/server/src/lib/hooks/sources/define-source.js +88 -0
- package/dist/server/src/lib/hooks/sources/opencode/client.js +907 -2
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +336 -0
- package/dist/server/src/lib/hooks/sources/opencode/history.js +480 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +76 -7
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +222 -0
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +31 -0
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +45 -0
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +16 -0
- package/dist/server/src/lib/hooks/sources/opencode/push.js +307 -0
- package/dist/server/src/lib/hooks/sources/opencode/reattach.js +284 -0
- package/dist/server/src/lib/hooks/sources/opencode/runtime.js +165 -2
- package/dist/server/src/lib/hooks/sources/opencode/source.js +46 -2
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +407 -4
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +383 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +460 -0
- package/dist/server/src/lib/job-executor.js +43 -20
- package/dist/server/src/lib/polling/response-checker.js +43 -16
- package/dist/server/src/lib/polling/structured-history-gate.js +75 -0
- package/dist/server/src/lib/prompt-answer-sender.js +153 -2
- package/dist/server/src/lib/push/delivery-health.js +237 -0
- package/dist/server/src/lib/push/failure-push-notifier.js +109 -7
- package/dist/server/src/lib/push/index.js +25 -1
- package/dist/server/src/lib/push/prompt-card-state.js +254 -14
- package/dist/server/src/lib/push/push-sender.js +63 -12
- package/dist/server/src/lib/push/resolution-push-notifier.js +15 -3
- package/dist/server/src/lib/push/vapid.js +264 -5
- package/dist/server/src/lib/push/waiting-push-notifier.js +7 -0
- package/dist/server/src/lib/server/localhost-self-check.js +333 -0
- package/dist/server/src/lib/session/agent-event-state.js +169 -4
- package/dist/server/src/lib/session/claude-executor.js +152 -15
- package/dist/server/src/lib/session/current-output-builder.js +182 -15
- package/dist/server/src/lib/session/opencode-session-api.js +214 -0
- package/dist/server/src/lib/session/opencode-session-recall.js +168 -0
- package/dist/server/src/lib/session/opencode-session-store.js +274 -0
- package/dist/server/src/lib/session/provisional-turn.js +54 -1
- package/dist/server/src/lib/session/send-user-message.js +6 -5
- package/dist/server/src/lib/session/structured-prompt.js +53 -2
- package/dist/server/src/lib/skills/compatibility-matrix.js +50 -1
- package/dist/server/src/lib/tmux/tmux.js +74 -4
- package/dist/server/src/lib/verification/gate-runner.js +71 -8
- package/dist/server/src/types/agent-session.js +63 -0
- package/dist/server/src/types/agent-transcript.js +80 -0
- package/dist/server/src/types/opencode-export.js +228 -0
- package/dist/server/src/types/opencode-instance-settings.js +140 -0
- package/dist/server/src/types/opencode-share.js +111 -0
- package/dist/server/src/types/terminal-keys.js +69 -1
- package/dist/types/cli-tool-contracts.d.ts +48 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/terminal-keys.d.ts +89 -0
- package/dist/types/terminal-keys.d.ts.map +1 -0
- package/dist/types/terminal-keys.js +105 -0
- package/package.json +2 -1
- package/.next/server/chunks/1029.js +0 -1
- package/.next/server/chunks/1239.js +0 -1
- package/.next/server/chunks/1538.js +0 -7
- package/.next/server/chunks/2546.js +0 -1
- package/.next/server/chunks/2689.js +0 -13
- package/.next/server/chunks/3292.js +0 -1
- package/.next/server/chunks/3417.js +0 -1
- package/.next/server/chunks/3736.js +0 -1
- package/.next/server/chunks/4423.js +0 -1
- package/.next/server/chunks/4444.js +0 -32
- package/.next/server/chunks/4565.js +0 -3
- package/.next/server/chunks/467.js +0 -1
- package/.next/server/chunks/4905.js +0 -5
- package/.next/server/chunks/552.js +0 -19
- package/.next/server/chunks/5998.js +0 -74
- package/.next/server/chunks/6919.js +0 -1
- package/.next/server/chunks/7970.js +0 -229
- package/.next/server/chunks/8536.js +0 -1
- package/.next/server/chunks/9284.js +0 -1
- package/.next/static/9IXgWfBUtnEnRqnbmErTp/_buildManifest.js +0 -1
- package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +0 -1
- package/.next/static/chunks/5229-1f5f19740a8d6c11.js +0 -1
- package/.next/static/chunks/6271.295ced91b6335f18.js +0 -1
- package/.next/static/chunks/6381-8cfe50a5ca5425b1.js +0 -1
- package/.next/static/chunks/8521-c43994fb58501d13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/login/page-adc51f0f7cbb7ac6.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/more/page-3266dfa945972649.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/review/page-8f63aff862fee421.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f7b3dfbe757dc6b8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
- package/.next/static/chunks/webpack-6a9668cf54a26eba.js +0 -1
- package/.next/static/css/928e5a8830fbf997.css +0 -1
- /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → uulKcSOgyxChTo4SipUSF}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Terminal COLUMNS, as distinct from UTF-16 units (Issue #2112).
|
|
4
|
+
*
|
|
5
|
+
* Extracted verbatim from `opencode-pane-obstruction.ts`, where Issue #2095
|
|
6
|
+
* introduced it as a private helper, because #2112 reads a second geometry off
|
|
7
|
+
* the same frames — a rectangle's left and right edges rather than a box's right
|
|
8
|
+
* edge — and needs the identical answer to "which character sits at column N".
|
|
9
|
+
* Two copies of a column-counting rule is how the two readings would come to
|
|
10
|
+
* disagree about the same frame while both claiming to measure columns; the
|
|
11
|
+
* repository already makes that argument for `excerpt.ts` and for
|
|
12
|
+
* `status-evidence.ts`.
|
|
13
|
+
*
|
|
14
|
+
* A leaf module by design: it imports nothing, so the detector modules, the
|
|
15
|
+
* payload builder and the client components can all share it.
|
|
16
|
+
*
|
|
17
|
+
* @module lib/detection/terminal-columns
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.indexAtColumn = indexAtColumn;
|
|
21
|
+
exports.sliceColumns = sliceColumns;
|
|
22
|
+
exports.visibleWidth = visibleWidth;
|
|
23
|
+
/** One code point that occupies no terminal column. See {@link indexAtColumn}. */
|
|
24
|
+
const COMBINING_MARK = /^\p{M}$/u;
|
|
25
|
+
/**
|
|
26
|
+
* The UTF-16 index at which terminal column `column` begins.
|
|
27
|
+
*
|
|
28
|
+
* `String.prototype.slice` counts UTF-16 units and this rule is about terminal
|
|
29
|
+
* COLUMNS. The two disagree in two ways, and only one of them can invent a
|
|
30
|
+
* column that is not there:
|
|
31
|
+
*
|
|
32
|
+
* - **Combining marks are one code point and ZERO columns**, so a row of
|
|
33
|
+
* heavily-combining script — Thai, Devanagari, Hebrew with nikud, macOS's
|
|
34
|
+
* NFD Latin — is LONGER in units than in columns. Uncorrected, a box that
|
|
35
|
+
* owns the full pane width could slice to a non-empty tail and report a
|
|
36
|
+
* sidebar on a pane that has none. This skips them, which removes the case
|
|
37
|
+
* rather than making it unlikely. They are consumed greedily once the column
|
|
38
|
+
* is reached, too: a lone mark left in the tail would survive `trim()` and be
|
|
39
|
+
* counted as evidence.
|
|
40
|
+
* - **East Asian wide characters are one code point and TWO columns**, so a row
|
|
41
|
+
* of Japanese is SHORTER in units than in columns. That is NOT corrected
|
|
42
|
+
* here, deliberately: undercounting cuts LATER than the true column, which
|
|
43
|
+
* can only shorten an excerpt or miss a second column — never invent one.
|
|
44
|
+
* It is also exactly what a plain `slice` already did, so nothing regresses.
|
|
45
|
+
* Carrying a wcwidth table to buy back a few characters of excerpt would put
|
|
46
|
+
* a second source of truth about character widths in the repository for no
|
|
47
|
+
* verdict's benefit.
|
|
48
|
+
*
|
|
49
|
+
* Iterates code points, never UTF-16 units, so a surrogate pair is one step.
|
|
50
|
+
*/
|
|
51
|
+
function indexAtColumn(line, column) {
|
|
52
|
+
// Exact, not an approximation: counted columns can never exceed the unit
|
|
53
|
+
// count, so a line this short consumes whole in the loop below and returns
|
|
54
|
+
// the same answer. It is here because it is the case every full-width box row
|
|
55
|
+
// takes, on every poll and every render.
|
|
56
|
+
if (line.length <= column)
|
|
57
|
+
return line.length;
|
|
58
|
+
let columns = 0;
|
|
59
|
+
let index = 0;
|
|
60
|
+
for (const char of line) {
|
|
61
|
+
const width = COMBINING_MARK.test(char) ? 0 : 1;
|
|
62
|
+
if (width === 1 && columns >= column)
|
|
63
|
+
break;
|
|
64
|
+
columns += width;
|
|
65
|
+
index += char.length;
|
|
66
|
+
}
|
|
67
|
+
return index;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The text occupying terminal columns `[left, right)` of one already-stripped
|
|
71
|
+
* row.
|
|
72
|
+
*
|
|
73
|
+
* Both edges go through {@link indexAtColumn}, so the same undercounting applies
|
|
74
|
+
* to both and a slice can only be SHORTER than the true column range — never
|
|
75
|
+
* wider than the rectangle a caller asked about.
|
|
76
|
+
*/
|
|
77
|
+
function sliceColumns(line, left, right) {
|
|
78
|
+
return line.slice(indexAtColumn(line, left), indexAtColumn(line, right));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* How many terminal columns an already-stripped row occupies.
|
|
82
|
+
*
|
|
83
|
+
* Counted with the same rule {@link indexAtColumn} walks, so "column
|
|
84
|
+
* `visibleWidth(line)`" is always one past the row's last cell and never lands
|
|
85
|
+
* inside it.
|
|
86
|
+
*/
|
|
87
|
+
function visibleWidth(line) {
|
|
88
|
+
let columns = 0;
|
|
89
|
+
for (const char of line) {
|
|
90
|
+
if (!COMBINING_MARK.test(char))
|
|
91
|
+
columns += 1;
|
|
92
|
+
}
|
|
93
|
+
return columns;
|
|
94
|
+
}
|
|
@@ -12,6 +12,7 @@ exports.opencodeStatusDetector = exports.VERIFIED_AGAINST = void 0;
|
|
|
12
12
|
exports.readIdleEvidence = readIdleEvidence;
|
|
13
13
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
14
14
|
const status_reason_1 = require("../../status-reason");
|
|
15
|
+
const opencode_modal_overlay_1 = require("../../opencode-modal-overlay");
|
|
15
16
|
const prompt_1 = require("./prompt");
|
|
16
17
|
const frame_1 = require("../frame");
|
|
17
18
|
const run_detection_1 = require("../run-detection");
|
|
@@ -90,6 +91,7 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
90
91
|
// A. "esc interrupt" in footer → actively processing (running)
|
|
91
92
|
// B. Find footer boundary via "ctrl+t" keybinding line, extract content above it, check for thinking → running
|
|
92
93
|
// C. Same content window, check for a selection list → waiting
|
|
94
|
+
// C2. A modal overlay painted over the transcript → waiting (Issue #2112)
|
|
93
95
|
// D. Same content window, check for ▣ Build completion WITH a duration → ready
|
|
94
96
|
// E. Idle composer placeholder inside the input box gutter → ready (Issue #1883)
|
|
95
97
|
// A0. Permission dialog (Issue #1893) — ahead of every other opencode branch.
|
|
@@ -170,6 +172,47 @@ exports.opencodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
|
|
|
170
172
|
evidence: 'positive',
|
|
171
173
|
};
|
|
172
174
|
}
|
|
175
|
+
// C2. A modal overlay painted over the transcript (Issue #2112).
|
|
176
|
+
//
|
|
177
|
+
// Branch C above only recognises three ALLOWLISTED headings (`Select model`
|
|
178
|
+
// / `Select provider` / `Connect a provider`, narrowed there by #1896), and
|
|
179
|
+
// opencode has five more dialogs drawn in the same chrome. `Select agent`,
|
|
180
|
+
// `Sessions` and `Timeline` all fell through to branch D, which matched the
|
|
181
|
+
// `▣ Build · <model> · 2.8s` marker of the turn BEFORE the dialog was
|
|
182
|
+
// opened and published a pane blocked on a human as `ready` /
|
|
183
|
+
// `opencode_response_complete` — measured on the #2046 fixtures
|
|
184
|
+
// `dialog-{agent-list,session-list,timeline}.txt`.
|
|
185
|
+
//
|
|
186
|
+
// This has to be a GATE ahead of branch D and not a wider allowlist. A
|
|
187
|
+
// wider allowlist fixes only the missing NavigationButtons; the false
|
|
188
|
+
// completion is the `ready` itself, and `ready` is POSITIVE evidence, so
|
|
189
|
+
// the frame never reaches the unclassified path #1017 / #1494 built for
|
|
190
|
+
// unknown overlays. `claude`'s `/help` is the benign shape of the same
|
|
191
|
+
// thing — it lands on `running` / `default`, where the 60-second hatch
|
|
192
|
+
// opens; these landed on `ready`, where `commandmate wait` exits 0.
|
|
193
|
+
//
|
|
194
|
+
// The rule is the LAYOUT, never the heading: a background-painted rectangle
|
|
195
|
+
// whose rows share both edges and whose header carries opencode's own `esc`
|
|
196
|
+
// hatch right-aligned inside it. See `lib/detection/opencode-modal-overlay`
|
|
197
|
+
// for why a word list is not an option here (it is the inference #1883
|
|
198
|
+
// deleted) and for what a non-match does and does not mean.
|
|
199
|
+
//
|
|
200
|
+
// Ordered AFTER branches A0/A/B on purpose. A permission dialog, an `esc
|
|
201
|
+
// interrupt` footer and a spinner all already answer something that is not
|
|
202
|
+
// `ready`, and putting this first would only rename their verdicts.
|
|
203
|
+
//
|
|
204
|
+
// `frame.raw` rather than `frame.clean`: the rectangle is SGR, and every
|
|
205
|
+
// production caller of `detectSessionStatus` passes the `capture-pane -e`
|
|
206
|
+
// bytes (`lib/tmux/tmux.ts` always passes `-e`).
|
|
207
|
+
if ((0, opencode_modal_overlay_1.detectOpenCodeModalOverlay)(frame.raw) !== null) {
|
|
208
|
+
return {
|
|
209
|
+
status: 'waiting',
|
|
210
|
+
confidence: 'high',
|
|
211
|
+
reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
|
|
212
|
+
hasActivePrompt: false,
|
|
213
|
+
evidence: 'positive',
|
|
214
|
+
};
|
|
215
|
+
}
|
|
173
216
|
// D. Check last few content lines for the finished-turn marker.
|
|
174
217
|
//
|
|
175
218
|
// Issue #1893 made the duration mandatory here (OPENCODE_TURN_COMPLETE_PATTERN
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
45
|
exports.detectOpenCodeDialog = detectOpenCodeDialog;
|
|
46
46
|
const cli_patterns_1 = require("../../cli-patterns");
|
|
47
|
+
const opencode_modal_overlay_1 = require("../../opencode-modal-overlay");
|
|
47
48
|
/** Splits the button strip into its buttons: two or more spaces separate them. */
|
|
48
49
|
const BUTTON_SEPARATOR = /\s{2,}/;
|
|
49
50
|
/**
|
|
@@ -81,5 +82,24 @@ function detectOpenCodeDialog(frame, context) {
|
|
|
81
82
|
if (cli_patterns_1.OPENCODE_SELECTION_LIST_PATTERN.test(context.contentWindow)) {
|
|
82
83
|
return { kind: 'picker', options: [], answerMode: 'keys' };
|
|
83
84
|
}
|
|
85
|
+
// Issue #2112: the five dialogs the allowlist above does not name — session
|
|
86
|
+
// list, agent list, timeline, command palette — recognised from the rectangle
|
|
87
|
+
// they are painted as. Reported here as well as in `detect.ts` branch C2 so
|
|
88
|
+
// this seam keeps the promise the branch-C comment makes: the dialog rule
|
|
89
|
+
// reports the dialog the status branch reports.
|
|
90
|
+
//
|
|
91
|
+
// `answerMode: 'keys'`, like every other opencode surface, for the reason the
|
|
92
|
+
// docblock above gives — a typed number is swallowed and the Enter after it
|
|
93
|
+
// confirms whatever is highlighted. `options` is empty because opencode draws
|
|
94
|
+
// no numbers to enumerate.
|
|
95
|
+
//
|
|
96
|
+
// On the Auto-Yes path this cannot match: that caller hands over a frame whose
|
|
97
|
+
// ANSI has already been removed (`captureAndCleanOutput`) and the rectangle IS
|
|
98
|
+
// the SGR. The gate outcome is identical either way — `null` and `keys` both
|
|
99
|
+
// mean "do not send" — which is the same trade the permission branch's gutter
|
|
100
|
+
// anchor makes two paragraphs up.
|
|
101
|
+
if ((0, opencode_modal_overlay_1.detectOpenCodeModalOverlay)(frame.raw) !== null) {
|
|
102
|
+
return { kind: 'picker', options: [], answerMode: 'keys' };
|
|
103
|
+
}
|
|
84
104
|
return null;
|
|
85
105
|
}
|
|
@@ -45,10 +45,21 @@ exports.COPILOT_VERIFIED_AGAINST = {
|
|
|
45
45
|
capturedAt: '2026-08-21',
|
|
46
46
|
paneGeometry: '200x1000',
|
|
47
47
|
};
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* opencode these rules were read off (#1883 / #1893 / #1896 fixtures; re-measured
|
|
50
|
+
* against 1.18.22 by the canary in #2050).
|
|
51
|
+
*
|
|
52
|
+
* Bumped from 1.18.21 because the frames were RE-CAPTURED, not because the
|
|
53
|
+
* version number moved: `npm run canary -- --tool opencode` drove 1.18.22 into
|
|
54
|
+
* all five states branches A0-E read (idle composer / `esc interrupt` /
|
|
55
|
+
* `Allow once Allow always Reject` / `/models` picker / `▣ … · <duration>`)
|
|
56
|
+
* at the production 80x200 geometry and every rule answered as it did on
|
|
57
|
+
* 1.18.21. The frames are `tests/fixtures/canary/opencode-*.ts` and the run is
|
|
58
|
+
* written up in `docs/design/opencode-server-live-verification.md` §18.
|
|
59
|
+
*/
|
|
49
60
|
exports.OPENCODE_VERIFIED_AGAINST = {
|
|
50
|
-
version: '1.18.
|
|
51
|
-
capturedAt: '2026-08-
|
|
61
|
+
version: '1.18.22',
|
|
62
|
+
capturedAt: '2026-08-26',
|
|
52
63
|
paneGeometry: '80x200',
|
|
53
64
|
};
|
|
54
65
|
/** agy these rules were read off (#988 / #995). */
|
|
@@ -29,6 +29,7 @@ exports.UPSTREAM_FAULT_TRUNCATION_MARKER = exports.UPSTREAM_FAULT_EXCERPT_MAX_BY
|
|
|
29
29
|
exports.matchUpstreamFault = matchUpstreamFault;
|
|
30
30
|
exports.findUpstreamFault = findUpstreamFault;
|
|
31
31
|
const ansi_1 = require("./ansi");
|
|
32
|
+
const excerpt_1 = require("./excerpt");
|
|
32
33
|
/**
|
|
33
34
|
* Patterns are anchored on ERROR wording, not on the words "usage limit".
|
|
34
35
|
* Claude's own banner advertises "up to 50% of your weekly usage limit on
|
|
@@ -61,31 +62,15 @@ exports.UPSTREAM_FAULT_EXCERPT_MAX_BYTES = 200;
|
|
|
61
62
|
/** Appended when {@link UPSTREAM_FAULT_EXCERPT_MAX_BYTES} cut the excerpt. */
|
|
62
63
|
exports.UPSTREAM_FAULT_TRUNCATION_MARKER = '…[truncated]';
|
|
63
64
|
/**
|
|
64
|
-
* Truncate to
|
|
65
|
+
* Truncate to this module's UTF-8 byte budget.
|
|
65
66
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
67
|
+
* The arithmetic moved to `./excerpt` when Issue #2095 published a second
|
|
68
|
+
* screen-read excerpt under the same rules; still not `truncateToUtf8Bytes`
|
|
69
|
+
* from `lib/auto-yes-state`, which reaches the database and the Auto-Yes state
|
|
70
|
+
* machine, because this module is a leaf the canary imports from outside Next.
|
|
70
71
|
*/
|
|
71
72
|
function truncateExcerpt(text) {
|
|
72
|
-
|
|
73
|
-
if (encoder.encode(text).length <= exports.UPSTREAM_FAULT_EXCERPT_MAX_BYTES)
|
|
74
|
-
return text;
|
|
75
|
-
// The marker is inside the budget, not on top of it: the bound is a promise
|
|
76
|
-
// about the published field, and a caller sizing a log line by it must not be
|
|
77
|
-
// handed twelve more characters than it asked for.
|
|
78
|
-
const budget = exports.UPSTREAM_FAULT_EXCERPT_MAX_BYTES - encoder.encode(exports.UPSTREAM_FAULT_TRUNCATION_MARKER).length;
|
|
79
|
-
let bytes = 0;
|
|
80
|
-
let out = '';
|
|
81
|
-
for (const char of text) {
|
|
82
|
-
const size = encoder.encode(char).length;
|
|
83
|
-
if (bytes + size > budget)
|
|
84
|
-
break;
|
|
85
|
-
bytes += size;
|
|
86
|
-
out += char;
|
|
87
|
-
}
|
|
88
|
-
return `${out}${exports.UPSTREAM_FAULT_TRUNCATION_MARKER}`;
|
|
73
|
+
return (0, excerpt_1.truncateToByteBudget)(text, exports.UPSTREAM_FAULT_EXCERPT_MAX_BYTES, exports.UPSTREAM_FAULT_TRUNCATION_MARKER);
|
|
89
74
|
}
|
|
90
75
|
/**
|
|
91
76
|
* The first upstream fault visible in the frame, with its line.
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What the agent says about the conversation this instance is in (Issue #2040).
|
|
4
|
+
*
|
|
5
|
+
* `capture --json` could say what a session is *doing* — running, waiting, which
|
|
6
|
+
* dialog is open — and nothing at all about what it has *spent*. An orchestrator
|
|
7
|
+
* watching a fleet has to be able to answer "is this worker still worth its
|
|
8
|
+
* budget?" and "which model is it actually on?", and neither question is
|
|
9
|
+
* answerable from a terminal frame: the numbers exist only inside the agent.
|
|
10
|
+
*
|
|
11
|
+
* opencode publishes them. `session.updated` carries the whole `Session` object
|
|
12
|
+
* on the SSE stream CommandMate already subscribes to — measured against
|
|
13
|
+
* 1.18.22's own OpenAPI document (`GET /doc`): `Session` declares `title`,
|
|
14
|
+
* `agent`, `model: { id, providerID, variant? }`, `cost: number` and
|
|
15
|
+
* `tokens: { input, output, reasoning, cache: { read, write } }`. So this record
|
|
16
|
+
* costs no request: it is read off a frame that was already arriving and that
|
|
17
|
+
* mapped to none of the seven event words.
|
|
18
|
+
*
|
|
19
|
+
* ## Exposure only
|
|
20
|
+
*
|
|
21
|
+
* Nothing reads this back to decide anything — not `sessionStatus`, not
|
|
22
|
+
* Auto-Yes, not `wait`. It is published as `structuredEvents.session` and that
|
|
23
|
+
* is the whole contract, exactly like `./permission-decision-state` (#1898) and
|
|
24
|
+
* `./tool-input-normalization-state` (#1902). A number that steered a verdict
|
|
25
|
+
* would need a staleness policy this record deliberately does not have.
|
|
26
|
+
*
|
|
27
|
+
* ## Why the shape is not the agent's shape, in one respect
|
|
28
|
+
*
|
|
29
|
+
* The values are verbatim — nothing here rounds a cost, renames a model or
|
|
30
|
+
* totals a token count, for the reason `CurrentOutputPayload.model` states: a
|
|
31
|
+
* reader compares them against what the agent reports about itself, and any
|
|
32
|
+
* tidying on the way out breaks that comparison exactly when it matters. What
|
|
33
|
+
* IS changed is the nesting: `tokens.cache.read` is published as
|
|
34
|
+
* `tokens.cacheRead`, so a CLI contract has one optional level rather than two.
|
|
35
|
+
*
|
|
36
|
+
* ## Lifetime
|
|
37
|
+
*
|
|
38
|
+
* One record per (worktree, tool, instance), overwritten by every frame, and
|
|
39
|
+
* dropped when the subscription that fills it is closed — which is when the pane
|
|
40
|
+
* is killed. That is the honest bound: the record describes a conversation a
|
|
41
|
+
* process was having, so outliving the process would make it assert something
|
|
42
|
+
* false, the same argument `buildCurrentOutput` makes for blanking `model` on a
|
|
43
|
+
* session that is not running. {@link AgentSessionRecord.at} dates it for the
|
|
44
|
+
* window in between.
|
|
45
|
+
*
|
|
46
|
+
* The `globalThis` indirection is load-bearing for the reason it is everywhere
|
|
47
|
+
* else in this subsystem (#1736): the writer is the opencode subscription and
|
|
48
|
+
* the reader is `/api/worktrees/:id/current-output`, which `next dev` bundles
|
|
49
|
+
* separately and would otherwise give a private copy of this map each.
|
|
50
|
+
*
|
|
51
|
+
* ## What the record deliberately does not answer (Issue #2042)
|
|
52
|
+
*
|
|
53
|
+
* "How full is the context?" is not in here, and cannot be derived from what
|
|
54
|
+
* is: `Session.tokens` is **cumulative for the session** — measured over two
|
|
55
|
+
* turns it read `input 6 / output 11 / cache.read 8482 / cache.write 8500`,
|
|
56
|
+
* which is exactly what `opencode stats` prints — while opencode's own footer
|
|
57
|
+
* shows the **last assistant message's** footprint, 8,508. Summing the record
|
|
58
|
+
* would have answered 16,999 and `2%` where the agent says 8,508 and `1%`, and
|
|
59
|
+
* the gap grows with every turn. The second half of this file therefore asks the
|
|
60
|
+
* agent's server two further questions and keeps the arithmetic in a record of
|
|
61
|
+
* its own — see {@link AgentSessionContextUsage} and
|
|
62
|
+
* `docs/design/opencode-server-live-verification.md` §14.
|
|
63
|
+
*
|
|
64
|
+
* @module lib/hooks/agent-session-telemetry
|
|
65
|
+
*/
|
|
66
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
+
exports.MAX_AGENT_SESSION_NAME_LENGTH = exports.MAX_AGENT_SESSION_TITLE_LENGTH = void 0;
|
|
68
|
+
exports.recordAgentSessionTelemetry = recordAgentSessionTelemetry;
|
|
69
|
+
exports.getAgentSessionTelemetry = getAgentSessionTelemetry;
|
|
70
|
+
exports.forgetAgentSessionTelemetry = forgetAgentSessionTelemetry;
|
|
71
|
+
exports.resetAgentSessionTelemetry = resetAgentSessionTelemetry;
|
|
72
|
+
exports.readOpencodeSessionFrame = readOpencodeSessionFrame;
|
|
73
|
+
exports.agentSessionContextPercent = agentSessionContextPercent;
|
|
74
|
+
exports.getAgentSessionContextUsage = getAgentSessionContextUsage;
|
|
75
|
+
exports.recordAgentSessionContextUsage = recordAgentSessionContextUsage;
|
|
76
|
+
exports.forgetAgentSessionContextUsage = forgetAgentSessionContextUsage;
|
|
77
|
+
exports.resetAgentSessionContextUsage = resetAgentSessionContextUsage;
|
|
78
|
+
exports.ensureAgentSessionContextUsage = ensureAgentSessionContextUsage;
|
|
79
|
+
exports.refreshAgentSessionContextUsage = refreshAgentSessionContextUsage;
|
|
80
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
81
|
+
const client_1 = require("./sources/opencode/client");
|
|
82
|
+
const ports_1 = require("./sources/opencode/ports");
|
|
83
|
+
/**
|
|
84
|
+
* Longest session title kept.
|
|
85
|
+
*
|
|
86
|
+
* opencode titles a session after its first prompt, so this is prose the agent
|
|
87
|
+
* wrote and the payload is served over HTTP. Truncated rather than refused,
|
|
88
|
+
* unlike an id (#1932 DR4-001): nothing matches on a title, it is displayed, so
|
|
89
|
+
* a shortened one misinforms visibly instead of colliding silently.
|
|
90
|
+
*/
|
|
91
|
+
exports.MAX_AGENT_SESSION_TITLE_LENGTH = 200;
|
|
92
|
+
/**
|
|
93
|
+
* Longest model / agent / provider name kept.
|
|
94
|
+
*
|
|
95
|
+
* Same rule as the title, a tighter bound: these are identifiers a provider
|
|
96
|
+
* chose (`claude-sonnet-4.6`, `github-copilot`, `build`), not sentences.
|
|
97
|
+
*/
|
|
98
|
+
exports.MAX_AGENT_SESSION_NAME_LENGTH = 120;
|
|
99
|
+
/** compositeKey -> the most recent session description for that instance. */
|
|
100
|
+
const records = globalThis.__agentSessionTelemetry ??
|
|
101
|
+
(globalThis.__agentSessionTelemetry = new Map());
|
|
102
|
+
/** Record what the agent last said about this instance's session. */
|
|
103
|
+
function recordAgentSessionTelemetry(target, record) {
|
|
104
|
+
records.set((0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId), record);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @returns What the agent last said, or null — the ordinary answer for every
|
|
108
|
+
* tool that publishes none, and for an opencode pane whose stream has not
|
|
109
|
+
* reported a session yet.
|
|
110
|
+
*/
|
|
111
|
+
function getAgentSessionTelemetry(worktreeId, cliToolId, instanceId) {
|
|
112
|
+
return records.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Drop one instance's record. Called when its subscription closes.
|
|
116
|
+
*
|
|
117
|
+
* Issue #2042 hangs the derived context measurement off the same call rather
|
|
118
|
+
* than off a second one at the call site: the measurement describes the record,
|
|
119
|
+
* so a lifetime it did not share would leave a pane reporting "87% full" about a
|
|
120
|
+
* conversation that ended.
|
|
121
|
+
*/
|
|
122
|
+
function forgetAgentSessionTelemetry(target) {
|
|
123
|
+
records.delete((0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
124
|
+
forgetAgentSessionContextUsage(target);
|
|
125
|
+
}
|
|
126
|
+
/** Drop every record. Test seam. */
|
|
127
|
+
function resetAgentSessionTelemetry() {
|
|
128
|
+
records.clear();
|
|
129
|
+
}
|
|
130
|
+
function isPlainObject(value) {
|
|
131
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
132
|
+
}
|
|
133
|
+
/** A bounded string, or null when the field is absent or not a string. */
|
|
134
|
+
function readBoundedString(source, key, max) {
|
|
135
|
+
const value = source[key];
|
|
136
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
137
|
+
return null;
|
|
138
|
+
return value.slice(0, max);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* A finite number, or null.
|
|
142
|
+
*
|
|
143
|
+
* `Number.isFinite` rather than `typeof === 'number'`: `NaN` and `Infinity` are
|
|
144
|
+
* numbers that survive `JSON.parse` and would reach `capture --json` as `null`
|
|
145
|
+
* anyway (`JSON.stringify(NaN)` is `null`), so admitting them would publish a
|
|
146
|
+
* null that means "the agent said NaN" next to a null that means "the agent said
|
|
147
|
+
* nothing", with no way to tell them apart.
|
|
148
|
+
*/
|
|
149
|
+
function readFiniteNumber(source, key) {
|
|
150
|
+
const value = source[key];
|
|
151
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
152
|
+
}
|
|
153
|
+
/** The empty usage, for a session that has reported no counts. */
|
|
154
|
+
function noTokenUsage() {
|
|
155
|
+
return { input: null, output: null, reasoning: null, cacheRead: null, cacheWrite: null, total: null };
|
|
156
|
+
}
|
|
157
|
+
function readTokenUsage(info) {
|
|
158
|
+
const tokens = isPlainObject(info.tokens) ? info.tokens : null;
|
|
159
|
+
if (!tokens)
|
|
160
|
+
return noTokenUsage();
|
|
161
|
+
const cache = isPlainObject(tokens.cache) ? tokens.cache : {};
|
|
162
|
+
return {
|
|
163
|
+
input: readFiniteNumber(tokens, 'input'),
|
|
164
|
+
output: readFiniteNumber(tokens, 'output'),
|
|
165
|
+
reasoning: readFiniteNumber(tokens, 'reasoning'),
|
|
166
|
+
cacheRead: readFiniteNumber(cache, 'read'),
|
|
167
|
+
cacheWrite: readFiniteNumber(cache, 'write'),
|
|
168
|
+
total: readFiniteNumber(tokens, 'total'),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Read a `session.updated` frame, or answer null (Issue #2040).
|
|
173
|
+
*
|
|
174
|
+
* ## Why a sub-agent's session is refused
|
|
175
|
+
*
|
|
176
|
+
* `Session.parentID` is present only on a session opencode opened *inside*
|
|
177
|
+
* another one (a `task` tool call), and its cost is the sub-agent's rather than
|
|
178
|
+
* the pane's. Recording it would make `structuredEvents.session` flip between
|
|
179
|
+
* the conversation the operator is having and a background job that is about to
|
|
180
|
+
* end, on a field whose whole purpose is to be compared over time. The gate is
|
|
181
|
+
* frame-local on purpose — `./sources/opencode/turn-gate` learns parentage from
|
|
182
|
+
* the same field, and a second reader of one fact is cheaper than a dependency
|
|
183
|
+
* between the two.
|
|
184
|
+
*
|
|
185
|
+
* @param frame - The raw `{ type, properties }` frame off the stream
|
|
186
|
+
* @param at - Epoch ms the frame was received
|
|
187
|
+
* @returns The record to store, or null when this frame is not one to store
|
|
188
|
+
*/
|
|
189
|
+
function readOpencodeSessionFrame(frame, at) {
|
|
190
|
+
const properties = isPlainObject(frame.properties) ? frame.properties : null;
|
|
191
|
+
if (!properties)
|
|
192
|
+
return null;
|
|
193
|
+
const info = isPlainObject(properties.info) ? properties.info : null;
|
|
194
|
+
if (!info)
|
|
195
|
+
return null;
|
|
196
|
+
if (typeof info.parentID === 'string' && info.parentID.length > 0)
|
|
197
|
+
return null;
|
|
198
|
+
const model = isPlainObject(info.model) ? info.model : {};
|
|
199
|
+
return {
|
|
200
|
+
id: readBoundedString(info, 'id', exports.MAX_AGENT_SESSION_NAME_LENGTH),
|
|
201
|
+
title: readBoundedString(info, 'title', exports.MAX_AGENT_SESSION_TITLE_LENGTH),
|
|
202
|
+
agent: readBoundedString(info, 'agent', exports.MAX_AGENT_SESSION_NAME_LENGTH),
|
|
203
|
+
model: readBoundedString(model, 'id', exports.MAX_AGENT_SESSION_NAME_LENGTH),
|
|
204
|
+
provider: readBoundedString(model, 'providerID', exports.MAX_AGENT_SESSION_NAME_LENGTH),
|
|
205
|
+
cost: readFiniteNumber(info, 'cost'),
|
|
206
|
+
tokens: readTokenUsage(info),
|
|
207
|
+
at,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/** compositeKey -> the last context occupancy measured for that instance. */
|
|
211
|
+
const contextUsages = globalThis.__agentSessionContextUsage ??
|
|
212
|
+
(globalThis.__agentSessionContextUsage = new Map());
|
|
213
|
+
/** compositeKeys with a refresh in flight, so a poll storm makes one request. */
|
|
214
|
+
const contextRefreshes = globalThis.__agentSessionContextRefreshes ??
|
|
215
|
+
(globalThis.__agentSessionContextRefreshes = new Set());
|
|
216
|
+
/**
|
|
217
|
+
* The percentage opencode's own footer shows, by opencode's own rule.
|
|
218
|
+
*
|
|
219
|
+
* `Math.round(tokens / limit * 100)`, transcribed from the 1.18.22 bundle
|
|
220
|
+
* (`docs/design/opencode-server-live-verification.md` §14.2) rather than
|
|
221
|
+
* guessed, because the alternatives are all plausible and all wrong: the
|
|
222
|
+
* denominator is `limit.context` and not `limit.input` (1,000,000 not 936,000 on
|
|
223
|
+
* the measured model), and the rounding is `round` and not `ceil`, so a session
|
|
224
|
+
* holding less than half a percent reads `0%` rather than `1%`.
|
|
225
|
+
*
|
|
226
|
+
* @returns The whole-number percentage, or null when either input is unknown
|
|
227
|
+
*/
|
|
228
|
+
function agentSessionContextPercent(tokens, limit) {
|
|
229
|
+
if (tokens === null || limit === null)
|
|
230
|
+
return null;
|
|
231
|
+
if (!Number.isFinite(tokens) || !Number.isFinite(limit) || limit <= 0)
|
|
232
|
+
return null;
|
|
233
|
+
return Math.round((tokens / limit) * 100);
|
|
234
|
+
}
|
|
235
|
+
/** What this instance's context last measured, or null. Synchronous. */
|
|
236
|
+
function getAgentSessionContextUsage(worktreeId, cliToolId, instanceId) {
|
|
237
|
+
return contextUsages.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
|
|
238
|
+
}
|
|
239
|
+
/** Store one measurement. Exported for the suites that stand in for the fetch. */
|
|
240
|
+
function recordAgentSessionContextUsage(target, usage) {
|
|
241
|
+
contextUsages.set((0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId), usage);
|
|
242
|
+
}
|
|
243
|
+
/** Drop one instance's measurement. */
|
|
244
|
+
function forgetAgentSessionContextUsage(target) {
|
|
245
|
+
contextUsages.delete((0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId));
|
|
246
|
+
}
|
|
247
|
+
/** Drop every measurement and every in-flight marker. Test seam. */
|
|
248
|
+
function resetAgentSessionContextUsage() {
|
|
249
|
+
contextUsages.clear();
|
|
250
|
+
contextRefreshes.clear();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Answer with what is cached, and start a refresh when it is stale (#2042).
|
|
254
|
+
*
|
|
255
|
+
* **Never awaits and never throws**, which is the whole shape of it. The caller
|
|
256
|
+
* is `buildCurrentOutput`, on the path `commandmate capture` and every terminal
|
|
257
|
+
* pane poll take several times a second, and the two numbers here need two HTTP
|
|
258
|
+
* round trips to an agent's own server. Awaiting them would put a foreign
|
|
259
|
+
* process's latency in front of a payload that is mostly a terminal frame; so
|
|
260
|
+
* the poll that notices the record moved answers `null` (or the previous turn's
|
|
261
|
+
* numbers) and the next one, a second or two later, answers the new ones.
|
|
262
|
+
*
|
|
263
|
+
* Staleness is `record.at`, not a clock: `session.updated` fires a handful of
|
|
264
|
+
* times per turn, so a refresh happens per *turn* rather than per poll, and a
|
|
265
|
+
* session nobody is talking to makes no requests at all.
|
|
266
|
+
*
|
|
267
|
+
* @param target - The instance whose context is being described
|
|
268
|
+
* @param record - Its current telemetry, or null when the agent has said nothing
|
|
269
|
+
* @returns The cached measurement, or null when there is none yet
|
|
270
|
+
*/
|
|
271
|
+
function ensureAgentSessionContextUsage(target, record) {
|
|
272
|
+
const key = (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
273
|
+
const cached = contextUsages.get(key) ?? null;
|
|
274
|
+
// No session, or one the agent has not named: nothing to ask about. The
|
|
275
|
+
// cached value is left in place rather than cleared — the subscription's
|
|
276
|
+
// close is what retires it, the same lifetime the record itself has.
|
|
277
|
+
if (!record || !record.id)
|
|
278
|
+
return cached;
|
|
279
|
+
if (cached && cached.sessionAt === record.at)
|
|
280
|
+
return cached;
|
|
281
|
+
if (contextRefreshes.has(key))
|
|
282
|
+
return cached;
|
|
283
|
+
contextRefreshes.add(key);
|
|
284
|
+
void refreshAgentSessionContextUsage(target, record).finally(() => {
|
|
285
|
+
contextRefreshes.delete(key);
|
|
286
|
+
});
|
|
287
|
+
return cached;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Ask the instance's own server the two questions and store the answer.
|
|
291
|
+
*
|
|
292
|
+
* Exported so a caller that *can* wait — a test, or a future CLI path — can,
|
|
293
|
+
* and so the fire-and-forget above has a name to point at. Resolves to the
|
|
294
|
+
* measurement it stored, or null when the instance has no reachable server:
|
|
295
|
+
* `getAssignedOpencodePort` answers null for every tool but opencode and for an
|
|
296
|
+
* opencode pane whose port was never written down.
|
|
297
|
+
*/
|
|
298
|
+
async function refreshAgentSessionContextUsage(target, record) {
|
|
299
|
+
const sessionId = record.id;
|
|
300
|
+
if (!sessionId)
|
|
301
|
+
return null;
|
|
302
|
+
const port = (0, ports_1.getAssignedOpencodePort)(target);
|
|
303
|
+
if (port === null)
|
|
304
|
+
return null;
|
|
305
|
+
const [tokens, limit] = await Promise.all([
|
|
306
|
+
(0, client_1.fetchOpencodeContextTokens)(port, sessionId),
|
|
307
|
+
record.provider && record.model
|
|
308
|
+
? (0, client_1.fetchOpencodeModelContextLimit)(port, record.provider, record.model)
|
|
309
|
+
: Promise.resolve(null),
|
|
310
|
+
]);
|
|
311
|
+
// Both null means the two calls found nothing to say — a fresh session and an
|
|
312
|
+
// unrecognised model. Stored anyway, with `sessionAt` set: the point of the
|
|
313
|
+
// record is to stop this pair of requests repeating every poll, and a null
|
|
314
|
+
// that is dated is what says "asked, and the answer was nothing".
|
|
315
|
+
const usage = {
|
|
316
|
+
tokens,
|
|
317
|
+
limit,
|
|
318
|
+
percent: agentSessionContextPercent(tokens, limit),
|
|
319
|
+
sessionAt: record.at,
|
|
320
|
+
at: Date.now(),
|
|
321
|
+
};
|
|
322
|
+
recordAgentSessionContextUsage(target, usage);
|
|
323
|
+
return usage;
|
|
324
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Telling an approval from a question in the *retained* dialog record
|
|
4
|
+
* (Issue #2040).
|
|
5
|
+
*
|
|
6
|
+
* `AgentEventSource.listPending()` answers with a `PendingDecision`, which
|
|
7
|
+
* carries `kind: 'permission' | 'question'` because the source read it off the
|
|
8
|
+
* agent's own payload. `structuredEvents.pendingDecisions` does not come from
|
|
9
|
+
* there: it comes from `agent-event-state`'s retained record, which is written
|
|
10
|
+
* from hook events and from the opencode ingest and has never carried a kind.
|
|
11
|
+
* A reader of `capture --json` therefore could not tell "this worker is blocked
|
|
12
|
+
* on `rm -rf`" from "this worker is being asked which colour" — two situations
|
|
13
|
+
* an orchestrator answers completely differently.
|
|
14
|
+
*
|
|
15
|
+
* The kind is not stored, it is **recovered**, and this module is the one place
|
|
16
|
+
* that says how. Both writers already mark the record: a question opens it with
|
|
17
|
+
* a tool name of its own, and the two names below are the two markers in use.
|
|
18
|
+
* Naming them here rather than repeating the strings is what keeps the writer
|
|
19
|
+
* and the reader from drifting apart — {@link OPENCODE_QUESTION_TOOL_NAME} is
|
|
20
|
+
* imported by `./sources/opencode/ingest`, which is what writes it.
|
|
21
|
+
*
|
|
22
|
+
* ## Why this is a derivation and not a new field
|
|
23
|
+
*
|
|
24
|
+
* Adding `kind` to `StructuredPendingDecision` would be the direct fix, and it
|
|
25
|
+
* is the right one eventually. It is not this Issue's: the record is written on
|
|
26
|
+
* five paths across `agent-event-state` and `permission-decision-service`, and a
|
|
27
|
+
* field that four of them leave undefined is a field whose absence has to be
|
|
28
|
+
* interpreted anyway. Deriving it from what the writers already record has the
|
|
29
|
+
* same answer today and no half-filled column tomorrow.
|
|
30
|
+
*
|
|
31
|
+
* @module lib/hooks/pending-decision-kind
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.QUESTION_DECISION_TOOL_NAMES = exports.OPENCODE_QUESTION_TOOL_NAME = void 0;
|
|
35
|
+
exports.pendingDecisionKind = pendingDecisionKind;
|
|
36
|
+
const permission_request_payload_1 = require("./permission-request-payload");
|
|
37
|
+
/**
|
|
38
|
+
* The tool name the opencode ingest opens a `question.asked` record under.
|
|
39
|
+
*
|
|
40
|
+
* Not a tool at all — opencode's question is a first-class event rather than a
|
|
41
|
+
* tool call, so there is no name to copy and this word is the marker CommandMate
|
|
42
|
+
* chose. Exported so the writer and this reader cannot disagree about it.
|
|
43
|
+
*/
|
|
44
|
+
exports.OPENCODE_QUESTION_TOOL_NAME = 'question';
|
|
45
|
+
/**
|
|
46
|
+
* The tool names that mean "a human is being asked to choose", not "a human is
|
|
47
|
+
* being asked to approve".
|
|
48
|
+
*
|
|
49
|
+
* Claude's is a real tool (`AskUserQuestion`, which raises a `PermissionRequest`
|
|
50
|
+
* that is never allowed — allowing it does not dismiss the picker); opencode's
|
|
51
|
+
* is the marker above.
|
|
52
|
+
*/
|
|
53
|
+
exports.QUESTION_DECISION_TOOL_NAMES = [
|
|
54
|
+
permission_request_payload_1.ASK_USER_QUESTION_TOOL,
|
|
55
|
+
exports.OPENCODE_QUESTION_TOOL_NAME,
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Recover the kind of one retained dialog record.
|
|
59
|
+
*
|
|
60
|
+
* `'permission'` is the default rather than a third "unknown" value, and that
|
|
61
|
+
* asymmetry is deliberate: a record with no tool name is a `PermissionRequest`
|
|
62
|
+
* this server declined to decide — the overwhelmingly common case — and a reader
|
|
63
|
+
* that has to handle a third value would end up defaulting it to the same thing
|
|
64
|
+
* with less information about why.
|
|
65
|
+
*
|
|
66
|
+
* @param toolName - `StructuredPendingDecision.toolName`, as retained
|
|
67
|
+
*/
|
|
68
|
+
function pendingDecisionKind(toolName) {
|
|
69
|
+
return toolName !== null && exports.QUESTION_DECISION_TOOL_NAMES.includes(toolName)
|
|
70
|
+
? 'question'
|
|
71
|
+
: 'permission';
|
|
72
|
+
}
|