commandmate 0.27.0 → 0.28.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 +286 -256
- package/.next/app-path-routes-manifest.json +36 -32
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +1 -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/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_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 +36 -32
- package/.next/server/chunks/1058.js +1 -0
- package/.next/server/chunks/1068.js +1 -3
- 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 +2 -2
- 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/3480.js +17 -1
- package/.next/server/chunks/3558.js +1 -0
- 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 +1 -1
- package/.next/server/chunks/8807.js +84 -18
- 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/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/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/6381-d921ab728eda1191.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/templates/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-27b7cb2e77099eec.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +1 -0
- package/.next/static/css/98722bc4152cedcc.css +1 -0
- package/.next/trace +13 -13
- 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 +5 -1
- package/.next/types/validator.ts +36 -0
- package/README.md +9 -1
- 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/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/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 +6 -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 +63 -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/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/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/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/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 +1 -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/chunks/3361-5d6e93fba8a92bc1.js +0 -1
- package/.next/static/chunks/6381-b7250e8ca7a44c6c.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/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-e4f28966b4fc0ce1.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
- package/.next/static/css/928e5a8830fbf997.css +0 -1
- /package/.next/static/{t0BoV4H46ZgKmTjSi7GIz → 0GHE2JGlFzqvSBZAcBFSt}/_buildManifest.js +0 -0
- /package/.next/static/{t0BoV4H46ZgKmTjSi7GIz → 0GHE2JGlFzqvSBZAcBFSt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Whether somebody better-informed is already recording this turn (Issue #2041).
|
|
4
|
+
*
|
|
5
|
+
* The poller's job has always been to be the only writer of conversation
|
|
6
|
+
* history, because for five of the six tools the terminal is the only place the
|
|
7
|
+
* reply exists. opencode is the exception: since #1763 CommandMate holds an SSE
|
|
8
|
+
* connection to the agent's own server, and since this Issue that connection
|
|
9
|
+
* carries the reply's Markdown source. Two writers for one turn would put the
|
|
10
|
+
* same answer in History twice — once as the agent wrote it and once as its TUI
|
|
11
|
+
* drew it — so one of them has to stand down, and it is the one reading the
|
|
12
|
+
* screen.
|
|
13
|
+
*
|
|
14
|
+
* ## Why this is a module and not an `if`
|
|
15
|
+
*
|
|
16
|
+
* Two reasons, and the second is the one that matters. The obvious one is that
|
|
17
|
+
* `response-checker` is 1,000 lines with a single tool-agnostic spine, and a
|
|
18
|
+
* `cliToolId === 'opencode' && …` in the middle of the save path is exactly the
|
|
19
|
+
* kind of branch that gets copied to the next tool that grows a server. The
|
|
20
|
+
* real one is the import: `@/lib/hooks/sources/opencode/subscription` reaches
|
|
21
|
+
* the whole opencode client through its module graph, and the poller's tests
|
|
22
|
+
* replace that graph wholesale. One named seam is one thing to stub.
|
|
23
|
+
*
|
|
24
|
+
* ## What is NOT gated
|
|
25
|
+
*
|
|
26
|
+
* Only the two calls that *record the reply* — the `chat_messages` row and the
|
|
27
|
+
* Markdown conversation log. Prompt rows, Auto-Yes, the waiting-episode edges,
|
|
28
|
+
* push notifications, task events and the session-state cursor all stay on the
|
|
29
|
+
* scraper, because none of them are things the event stream duplicates: a
|
|
30
|
+
* `permission.asked` becomes a pending decision, never a history row, and the
|
|
31
|
+
* push fan-out has no second producer at all. Gating them would trade a
|
|
32
|
+
* duplicated reply for a silent notification, which is the worse failure.
|
|
33
|
+
*
|
|
34
|
+
* @module lib/polling/structured-history-gate
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.isStructuredHistoryWriterLive = isStructuredHistoryWriterLive;
|
|
38
|
+
const logger_1 = require("../../lib/logger");
|
|
39
|
+
const subscription_1 = require("../../lib/hooks/sources/opencode/subscription");
|
|
40
|
+
const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate');
|
|
41
|
+
/**
|
|
42
|
+
* Whether the agent's own server is recording this instance's replies.
|
|
43
|
+
*
|
|
44
|
+
* False for every tool but opencode, and false for an opencode instance whose
|
|
45
|
+
* subscription is anything other than `live` — see
|
|
46
|
+
* {@link isOpencodeStructuredHistoryLive} for why `lost` counts as "nobody is
|
|
47
|
+
* writing this down" rather than as "somebody will". The fallback direction is
|
|
48
|
+
* the safe one: two writers duplicate a reply, no writer loses it.
|
|
49
|
+
*
|
|
50
|
+
* Never throws. A source that cannot be asked is one that is not writing.
|
|
51
|
+
*
|
|
52
|
+
* @param worktreeId - The worktree
|
|
53
|
+
* @param cliToolId - The tool driving the pane
|
|
54
|
+
* @param instanceId - The agent instance; defaults to the primary
|
|
55
|
+
*/
|
|
56
|
+
function isStructuredHistoryWriterLive(worktreeId, cliToolId, instanceId) {
|
|
57
|
+
if (cliToolId !== 'opencode')
|
|
58
|
+
return false;
|
|
59
|
+
try {
|
|
60
|
+
return (0, subscription_1.isOpencodeStructuredHistoryLive)({
|
|
61
|
+
worktreeId,
|
|
62
|
+
cliToolId,
|
|
63
|
+
instanceId: instanceId ?? cliToolId,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.warn('structured-history-gate-unavailable', {
|
|
68
|
+
worktreeId,
|
|
69
|
+
cliToolId,
|
|
70
|
+
instanceId: instanceId ?? cliToolId,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error),
|
|
72
|
+
});
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -7,13 +7,150 @@
|
|
|
7
7
|
* the promptType/defaultOptionNumber fallback introduced in Bug1).
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.PromptAnswerRejectedError = exports.ANSWER_MODE_KEYS_REASON = void 0;
|
|
10
11
|
exports.sendPromptAnswer = sendPromptAnswer;
|
|
11
12
|
const tmux_1 = require("./tmux/tmux");
|
|
13
|
+
const frame_1 = require("../lib/detection/tools/frame");
|
|
14
|
+
const registry_1 = require("../lib/detection/tools/registry");
|
|
12
15
|
const models_1 = require("../types/models");
|
|
13
16
|
const tmux_capture_cache_1 = require("./tmux/tmux-capture-cache");
|
|
14
17
|
const cli_tool_timing_config_1 = require("../config/cli-tool-timing-config");
|
|
15
18
|
/** Regex pattern to detect checkbox-style multi-select options */
|
|
16
19
|
const CHECKBOX_OPTION_PATTERN = /^\[[ x]\] /;
|
|
20
|
+
/**
|
|
21
|
+
* The reason code a caller gets back when a digit meets a `keys`-mode dialog
|
|
22
|
+
* (Issue #2033).
|
|
23
|
+
*
|
|
24
|
+
* Spelled as a constant because it crosses two boundaries: the API refusal body
|
|
25
|
+
* `respond` reads (`/prompt-response`), and the assertions that pin it.
|
|
26
|
+
*/
|
|
27
|
+
exports.ANSWER_MODE_KEYS_REASON = 'answer_mode_keys';
|
|
28
|
+
/**
|
|
29
|
+
* The only {@link DialogAnswerMode} a typed digit can actually drive.
|
|
30
|
+
*
|
|
31
|
+
* Named rather than compared inline so the test that would have to change is
|
|
32
|
+
* the one that states the rule, not five call sites of `=== 'keys'`.
|
|
33
|
+
*/
|
|
34
|
+
const TEXT_ANSWERABLE_ANSWER_MODE = 'numbered';
|
|
35
|
+
/**
|
|
36
|
+
* How much scrollback the guard reads when the caller supplied no frame.
|
|
37
|
+
*
|
|
38
|
+
* The dialog rules window the LAST rows of the pane (`STATUS_CHECK_LINE_COUNT`
|
|
39
|
+
* for the strips, the content run for the pickers), so this only has to be
|
|
40
|
+
* comfortably larger than a screen — not the 1000-row default `capturePane`
|
|
41
|
+
* would otherwise take on a path that runs before every keystroke.
|
|
42
|
+
*/
|
|
43
|
+
const GUARD_CAPTURE_LINES = 200;
|
|
44
|
+
/**
|
|
45
|
+
* A prompt answer that was refused BEFORE any key reached the pane.
|
|
46
|
+
*
|
|
47
|
+
* The distinction matters to every caller: a throw from `sendKeys` leaves the
|
|
48
|
+
* terminal in an unknown state, whereas this one is a guarantee that nothing was
|
|
49
|
+
* typed and the dialog is still exactly as the operator left it.
|
|
50
|
+
*/
|
|
51
|
+
class PromptAnswerRejectedError extends Error {
|
|
52
|
+
/** Machine-readable code, currently always {@link ANSWER_MODE_KEYS_REASON}. */
|
|
53
|
+
reason;
|
|
54
|
+
/** The dialog family the tool vouched for, e.g. `permission` / `picker`. */
|
|
55
|
+
dialogKind;
|
|
56
|
+
/** How that dialog actually takes its answer. */
|
|
57
|
+
answerMode;
|
|
58
|
+
constructor(cliToolId, answer, dialog) {
|
|
59
|
+
super(`Refused to send "${answer}" to ${cliToolId}: its ${dialog.kind} dialog takes `
|
|
60
|
+
+ `'${dialog.answerMode}' input, not a typed number (${exports.ANSWER_MODE_KEYS_REASON}). `
|
|
61
|
+
+ 'The digit would be swallowed and the Enter after it would confirm whatever is '
|
|
62
|
+
+ 'highlighted. Nothing was sent.');
|
|
63
|
+
this.name = 'PromptAnswerRejectedError';
|
|
64
|
+
this.reason = exports.ANSWER_MODE_KEYS_REASON;
|
|
65
|
+
this.dialogKind = dialog.kind;
|
|
66
|
+
this.answerMode = dialog.answerMode;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.PromptAnswerRejectedError = PromptAnswerRejectedError;
|
|
70
|
+
/**
|
|
71
|
+
* The pane to judge the tool's own dialog rules against.
|
|
72
|
+
*
|
|
73
|
+
* Prefers the capture the caller already took — `/prompt-response` captures a
|
|
74
|
+
* fresh frame two statements before it calls in, and re-reading the pane there
|
|
75
|
+
* would be a second tmux round trip AND a second, later frame, i.e. a different
|
|
76
|
+
* screen from the one whose prompt was verified.
|
|
77
|
+
*
|
|
78
|
+
* Falls back to reading the pane here so that a caller with no frame (the chat
|
|
79
|
+
* button route, `auto-yes-manager`) is still covered: the point of Issue #2033
|
|
80
|
+
* is that this function must not be dangerous on its own.
|
|
81
|
+
*
|
|
82
|
+
* Returns null when the pane cannot be read at all. That is deliberately
|
|
83
|
+
* fail-OPEN, and it is the same call `/prompt-response` already makes for its
|
|
84
|
+
* own pre-send verification ("If capture fails, proceed with caution - don't
|
|
85
|
+
* block manual responses"): a session whose pane is unreadable is far more often
|
|
86
|
+
* a mocked or racing transport than an open dialog, and turning every such case
|
|
87
|
+
* into a refusal would make the operator's only way out stop working.
|
|
88
|
+
*/
|
|
89
|
+
async function readGuardFrame(params) {
|
|
90
|
+
if (params.frame !== undefined)
|
|
91
|
+
return params.frame;
|
|
92
|
+
try {
|
|
93
|
+
return await (0, tmux_1.capturePane)(params.sessionName, GUARD_CAPTURE_LINES);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Refuse a numeric answer the tool's own dialog cannot take (Issue #2033).
|
|
101
|
+
*
|
|
102
|
+
* ## Why this is keyed on `answerMode` and not on the tool id
|
|
103
|
+
*
|
|
104
|
+
* The branch below has always asked "which tool is this?", and the comment above
|
|
105
|
+
* it classified opencode as a tool that "accepts N + Enter as text". That was
|
|
106
|
+
* measured to be false (#1893): opencode's permission strip is a row of
|
|
107
|
+
* unnumbered buttons driven by ←/→, the digit is swallowed, and the Enter after
|
|
108
|
+
* it confirms whatever is HIGHLIGHTED — which defaults to `Allow once`. So
|
|
109
|
+
* `respond <id> 3`, meaning Reject, approved.
|
|
110
|
+
*
|
|
111
|
+
* Fixing that by adding `opencode` to a list would have re-opened on the eighth
|
|
112
|
+
* tool. `answerMode` is the measurement itself, declared per DIALOG by the
|
|
113
|
+
* module that read the tool's own frames (`DialogVerdict.answerMode`), and it is
|
|
114
|
+
* already what {@link evaluateAutoYesDialogGate} gates Auto-Yes on. Reading the
|
|
115
|
+
* same field here puts the operator's `respond` behind the same measurement that
|
|
116
|
+
* Auto-Yes is behind, instead of behind a second opinion about tool names.
|
|
117
|
+
*
|
|
118
|
+
* Per-dialog rather than per-tool is load-bearing, not pedantry: copilot reports
|
|
119
|
+
* `numbered` for its permission block and `keys` for its picker
|
|
120
|
+
* (`detection/tools/copilot/prompt.ts`), so any per-tool verdict would be wrong
|
|
121
|
+
* for one of the two.
|
|
122
|
+
*
|
|
123
|
+
* ## What it deliberately does NOT do
|
|
124
|
+
*
|
|
125
|
+
* - It judges only NUMERIC answers. `y` / `no` / free text on a `keys` dialog is
|
|
126
|
+
* a different failure and a different fix (`resolvePromptAnswer`, #1681).
|
|
127
|
+
* - It never fires for a tool with no measured dialog rules
|
|
128
|
+
* (`hasDialogRules === false`: gemini, antigravity, vibe-local). Gating on
|
|
129
|
+
* rules that do not exist would silence those tools, which is the rollout
|
|
130
|
+
* mistake `auto-yes-dialog-gate` documents.
|
|
131
|
+
* - It does not MAP the answer onto the dialog's buttons. Turning "3" into the
|
|
132
|
+
* two ←/→ presses that reach `Reject` is Issue P1-7's structured-decision
|
|
133
|
+
* work; this Issue only stops the wrong keystroke.
|
|
134
|
+
*
|
|
135
|
+
* @throws {PromptAnswerRejectedError} when the tool vouched for a dialog on this
|
|
136
|
+
* frame whose `answerMode` is not {@link TEXT_ANSWERABLE_ANSWER_MODE}.
|
|
137
|
+
*/
|
|
138
|
+
async function assertAnswerModeAcceptsNumber(params) {
|
|
139
|
+
if (!/^\d+$/.test(params.answer))
|
|
140
|
+
return;
|
|
141
|
+
const detector = (0, registry_1.getToolStatusDetector)(params.cliToolId);
|
|
142
|
+
if (!detector.hasDialogRules)
|
|
143
|
+
return;
|
|
144
|
+
const frame = await readGuardFrame(params);
|
|
145
|
+
if (frame === null)
|
|
146
|
+
return;
|
|
147
|
+
const dialog = detector.detectDialog((0, frame_1.normalizeFrame)(frame));
|
|
148
|
+
if (dialog === null)
|
|
149
|
+
return;
|
|
150
|
+
if (dialog.answerMode === TEXT_ANSWERABLE_ANSWER_MODE)
|
|
151
|
+
return;
|
|
152
|
+
throw new PromptAnswerRejectedError(params.cliToolId, params.answer, dialog);
|
|
153
|
+
}
|
|
17
154
|
/**
|
|
18
155
|
* Resolve the effective SubmitMode from promptData, fallback, and default.
|
|
19
156
|
* Resolution order: promptData.submitMode -> fallbackSubmitMode -> 'answer_then_enter'.
|
|
@@ -60,11 +197,25 @@ function buildNavigationKeys(offset) {
|
|
|
60
197
|
*/
|
|
61
198
|
async function sendPromptAnswer(params) {
|
|
62
199
|
const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber } = params;
|
|
200
|
+
// Issue #2033: before ANY key is chosen, let the tool's own dialog rules
|
|
201
|
+
// refuse a digit its dialog cannot take. Placed above the branch rather than
|
|
202
|
+
// inside the text arm because the number->offset arithmetic the cursor arm
|
|
203
|
+
// does is just as meaningless on an unnumbered button strip as typing the
|
|
204
|
+
// digit is.
|
|
205
|
+
await assertAnswerModeAcceptsNumber(params);
|
|
63
206
|
// Determine if this is an arrow-key-navigated multiple-choice prompt.
|
|
64
207
|
// Claude Code and Antigravity (agy) both render selection menus that only
|
|
65
208
|
// respond to cursor navigation + Enter, not to typed option numbers
|
|
66
|
-
// ([Issue #999] agy's "Do you want to proceed?" permission menu).
|
|
67
|
-
//
|
|
209
|
+
// ([Issue #999] agy's "Do you want to proceed?" permission menu).
|
|
210
|
+
//
|
|
211
|
+
// [Issue #2033] The comment that used to sit here said "everything else
|
|
212
|
+
// (codex/gemini/copilot/opencode) accepts 'N' + Enter as text". That was
|
|
213
|
+
// measured to be wrong for opencode (#1893) and for copilot's picker (#1895),
|
|
214
|
+
// and the correction is NOT another tool id in this condition: it is
|
|
215
|
+
// `assertAnswerModeAcceptsNumber` above, which asks the tool's own
|
|
216
|
+
// `detectDialog` what the dialog ON SCREEN takes. This condition is now only
|
|
217
|
+
// about which INPUT METHOD to use for a dialog that was already cleared as
|
|
218
|
+
// answerable by number.
|
|
68
219
|
const isCursorNavMultiChoice = (cliToolId === 'claude' || cliToolId === 'antigravity')
|
|
69
220
|
&& (promptData?.type === 'multiple_choice' || fallbackPromptType === 'multiple_choice')
|
|
70
221
|
&& /^\d+$/.test(answer);
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Per-device Web Push delivery health (Issues #2124 / #2123, extensible for #2126).
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* `push-sender` has always answered a failed send in the log and nowhere else:
|
|
8
|
+
*
|
|
9
|
+
* 404 / 410 -> the row is deleted (the endpoint is gone at the push service)
|
|
10
|
+
* anything -> `logger.warn('push-send-failed')`, and the subscription stays
|
|
11
|
+
*
|
|
12
|
+
* Both are the right handling. Neither is observable by the person holding the
|
|
13
|
+
* phone. Measured by the orchestrator during the Epic #2002 device UAT
|
|
14
|
+
* (2026-08-27, develop e8d09989): an APNs 403 caused by the old default
|
|
15
|
+
* `CM_VAPID_SUBJECT` (#2124) silenced an iPad for an entire session while
|
|
16
|
+
* Android kept receiving, and a 410 removed the Android subscription without a
|
|
17
|
+
* single line reaching the UI — the reader's whole experience was "notifications
|
|
18
|
+
* stopped at some point". This module is the state that lets the More screen say
|
|
19
|
+
* "this device is not receiving" instead.
|
|
20
|
+
*
|
|
21
|
+
* ## What it records, and what it deliberately does not
|
|
22
|
+
*
|
|
23
|
+
* One row per endpoint that is CURRENTLY unhealthy. A successful send deletes the
|
|
24
|
+
* row, so the store holds failures only and a device that recovers leaves nothing
|
|
25
|
+
* behind. It is not a history and not a metric: the UI question is "is this phone
|
|
26
|
+
* getting notifications right now, and if not, what did the push service say".
|
|
27
|
+
*
|
|
28
|
+
* `state` separates the two outcomes the sender already distinguishes:
|
|
29
|
+
*
|
|
30
|
+
* 'removed' — 404/410; the subscription row is gone and the device must
|
|
31
|
+
* re-subscribe. The health row OUTLIVES the subscription on
|
|
32
|
+
* purpose: it is the only remaining evidence of why the device
|
|
33
|
+
* went quiet, and `GET /api/push/subscriptions` reads it for an
|
|
34
|
+
* endpoint that no longer has a subscription.
|
|
35
|
+
* 'failing' — everything else (403 from APNs over a bad `sub`, and the 4xx
|
|
36
|
+
* #2126 is about). The subscription is untouched — a configuration
|
|
37
|
+
* mistake must never delete a reader's subscription — so the row
|
|
38
|
+
* is purely advisory.
|
|
39
|
+
*
|
|
40
|
+
* ## Why `app_settings`, and why the SQL is here
|
|
41
|
+
*
|
|
42
|
+
* The same trade `escalation-settings` and `prompt-card-state` made in this
|
|
43
|
+
* directory: `app_settings` (migration v27) is the generic key-value table, so
|
|
44
|
+
* this needs **no migration**, and the accessor lives beside its only two
|
|
45
|
+
* consumers. One row per unhealthy endpoint rather than one JSON map, so record
|
|
46
|
+
* and clear are single statements with no read-modify-write between processes
|
|
47
|
+
* sharing the database file.
|
|
48
|
+
*
|
|
49
|
+
* ## Why the key is a hash
|
|
50
|
+
*
|
|
51
|
+
* A push endpoint is a bearer capability — anyone holding it can send to that
|
|
52
|
+
* device — which is why this repository never logs one. An `app_settings` key is
|
|
53
|
+
* plainly readable by anything that opens the database, and `commandmate` shows
|
|
54
|
+
* that database to the user, so the key is `sha256(endpoint)` and the endpoint
|
|
55
|
+
* itself is never stored. Lookup still works because every reader (the sender,
|
|
56
|
+
* and the API route serving a client that knows its own endpoint) has the
|
|
57
|
+
* endpoint in hand and can hash it.
|
|
58
|
+
*
|
|
59
|
+
* Every database call here is total: an unopenable database, a missing table or
|
|
60
|
+
* a malformed value all resolve to "healthy" rather than throwing. The callers
|
|
61
|
+
* are a push fan-out and a settings route; neither may be disturbed by storage.
|
|
62
|
+
*
|
|
63
|
+
* @module lib/push/delivery-health
|
|
64
|
+
*/
|
|
65
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
+
exports.PUSH_DELIVERY_HEALTH_MAX_AGE_MS = exports.PUSH_DELIVERY_HEALTH_KEY_PREFIX = void 0;
|
|
67
|
+
exports.getPushDeliveryHealth = getPushDeliveryHealth;
|
|
68
|
+
exports.recordPushDeliveryFailure = recordPushDeliveryFailure;
|
|
69
|
+
exports.clearPushDeliveryHealth = clearPushDeliveryHealth;
|
|
70
|
+
exports.clearAllPushDeliveryHealth = clearAllPushDeliveryHealth;
|
|
71
|
+
const crypto_1 = require("crypto");
|
|
72
|
+
const db_instance_1 = require("../../lib/db/db-instance");
|
|
73
|
+
const logger_1 = require("../../lib/logger");
|
|
74
|
+
const logger = (0, logger_1.createLogger)('push/delivery-health');
|
|
75
|
+
/** `app_settings` key prefix for a delivery-health row. */
|
|
76
|
+
exports.PUSH_DELIVERY_HEALTH_KEY_PREFIX = 'push_delivery_health:';
|
|
77
|
+
/**
|
|
78
|
+
* How long an unhealthy record is kept.
|
|
79
|
+
*
|
|
80
|
+
* 30 days: long enough that a phone left in a drawer still gets an explanation
|
|
81
|
+
* when it is picked up, short enough that a device the reader has abandoned does
|
|
82
|
+
* not keep a row forever. Pruned lazily on read and on write, so no sweeper task
|
|
83
|
+
* has to exist.
|
|
84
|
+
*/
|
|
85
|
+
exports.PUSH_DELIVERY_HEALTH_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
86
|
+
function keyFor(endpoint) {
|
|
87
|
+
return `${exports.PUSH_DELIVERY_HEALTH_KEY_PREFIX}${(0, crypto_1.createHash)('sha256').update(endpoint).digest('hex')}`;
|
|
88
|
+
}
|
|
89
|
+
function isExpired(record, now) {
|
|
90
|
+
return now - record.lastFailureAt >= exports.PUSH_DELIVERY_HEALTH_MAX_AGE_MS;
|
|
91
|
+
}
|
|
92
|
+
/** Structural check for a record read back out of `app_settings`. */
|
|
93
|
+
function parseRecord(value) {
|
|
94
|
+
try {
|
|
95
|
+
const parsed = JSON.parse(value);
|
|
96
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
97
|
+
return null;
|
|
98
|
+
const r = parsed;
|
|
99
|
+
if (r.state !== 'removed' && r.state !== 'failing')
|
|
100
|
+
return null;
|
|
101
|
+
if (typeof r.failureCount !== 'number' || !Number.isFinite(r.failureCount))
|
|
102
|
+
return null;
|
|
103
|
+
if (typeof r.firstFailureAt !== 'number' || !Number.isFinite(r.firstFailureAt))
|
|
104
|
+
return null;
|
|
105
|
+
if (typeof r.lastFailureAt !== 'number' || !Number.isFinite(r.lastFailureAt))
|
|
106
|
+
return null;
|
|
107
|
+
const statusCode = typeof r.statusCode === 'number' && Number.isFinite(r.statusCode) ? r.statusCode : null;
|
|
108
|
+
return {
|
|
109
|
+
state: r.state,
|
|
110
|
+
statusCode,
|
|
111
|
+
failureCount: r.failureCount,
|
|
112
|
+
firstFailureAt: r.firstFailureAt,
|
|
113
|
+
lastFailureAt: r.lastFailureAt,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function writeRow(endpoint, record) {
|
|
121
|
+
try {
|
|
122
|
+
(0, db_instance_1.getDbInstance)()
|
|
123
|
+
.prepare(`
|
|
124
|
+
INSERT INTO app_settings (key, value, created_at, updated_at)
|
|
125
|
+
VALUES (?, ?, ?, ?)
|
|
126
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
127
|
+
value = excluded.value,
|
|
128
|
+
updated_at = excluded.updated_at
|
|
129
|
+
`)
|
|
130
|
+
.run(keyFor(endpoint), JSON.stringify(record), record.firstFailureAt, record.lastFailureAt);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
logger.debug('delivery-health-write-failed', {
|
|
134
|
+
error: error instanceof Error ? error.message : String(error),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function deleteRow(endpoint) {
|
|
139
|
+
try {
|
|
140
|
+
return ((0, db_instance_1.getDbInstance)().prepare('DELETE FROM app_settings WHERE key = ?').run(keyFor(endpoint))
|
|
141
|
+
.changes > 0);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger.debug('delivery-health-delete-failed', {
|
|
145
|
+
error: error instanceof Error ? error.message : String(error),
|
|
146
|
+
});
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Whether this endpoint is currently failing, and how.
|
|
152
|
+
*
|
|
153
|
+
* @returns The record, or `null` when the device is healthy (or the store cannot
|
|
154
|
+
* answer — "healthy" is the fail-open direction: a diagnostic that cannot be
|
|
155
|
+
* read must not turn into a warning banner on a working device).
|
|
156
|
+
*/
|
|
157
|
+
function getPushDeliveryHealth(endpoint, now = Date.now()) {
|
|
158
|
+
try {
|
|
159
|
+
const row = (0, db_instance_1.getDbInstance)()
|
|
160
|
+
.prepare('SELECT value FROM app_settings WHERE key = ?')
|
|
161
|
+
.get(keyFor(endpoint));
|
|
162
|
+
if (!row)
|
|
163
|
+
return null;
|
|
164
|
+
const record = parseRecord(row.value);
|
|
165
|
+
if (record === null)
|
|
166
|
+
return null;
|
|
167
|
+
if (isExpired(record, now)) {
|
|
168
|
+
deleteRow(endpoint);
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return record;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
logger.debug('delivery-health-read-failed', {
|
|
175
|
+
error: error instanceof Error ? error.message : String(error),
|
|
176
|
+
});
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Record that a send to this endpoint failed.
|
|
182
|
+
*
|
|
183
|
+
* Called from the ONE place that observes the failure (`push-sender.sendToOne`),
|
|
184
|
+
* for both handlings — the caller says which by passing `removed`.
|
|
185
|
+
*
|
|
186
|
+
* The streak continues across restarts: `failureCount` is read back and
|
|
187
|
+
* incremented, so "403 every time for two days" is distinguishable from "one
|
|
188
|
+
* blip", which is what #2126 will need when it decides whether a device is
|
|
189
|
+
* genuinely cut off.
|
|
190
|
+
*
|
|
191
|
+
* A `removed` record never re-opens as `failing`: once the push service has said
|
|
192
|
+
* the endpoint is gone, a later failure on the same endpoint is the same fact.
|
|
193
|
+
*
|
|
194
|
+
* Never throws.
|
|
195
|
+
*/
|
|
196
|
+
function recordPushDeliveryFailure(endpoint, options = {}, now = Date.now()) {
|
|
197
|
+
const previous = getPushDeliveryHealth(endpoint, now);
|
|
198
|
+
const state = options.removed === true || previous?.state === 'removed' ? 'removed' : 'failing';
|
|
199
|
+
const record = {
|
|
200
|
+
state,
|
|
201
|
+
statusCode: options.statusCode ?? null,
|
|
202
|
+
failureCount: (previous?.failureCount ?? 0) + 1,
|
|
203
|
+
firstFailureAt: previous?.firstFailureAt ?? now,
|
|
204
|
+
lastFailureAt: now,
|
|
205
|
+
};
|
|
206
|
+
writeRow(endpoint, record);
|
|
207
|
+
return record;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Record that a send to this endpoint succeeded, clearing any streak.
|
|
211
|
+
*
|
|
212
|
+
* @returns True when a record was actually cleared, i.e. when the device had been
|
|
213
|
+
* failing and has now recovered. The caller logs on that edge — it is the one
|
|
214
|
+
* push success worth a line, and the reason `push-sender` was silent about
|
|
215
|
+
* successes is that every OTHER success is unremarkable.
|
|
216
|
+
*/
|
|
217
|
+
function clearPushDeliveryHealth(endpoint) {
|
|
218
|
+
return deleteRow(endpoint);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Drop every delivery-health row. Test-only helper; the production paths clear
|
|
222
|
+
* one endpoint at a time.
|
|
223
|
+
*/
|
|
224
|
+
function clearAllPushDeliveryHealth() {
|
|
225
|
+
try {
|
|
226
|
+
// GLOB rather than LIKE: the prefix contains `_`, which LIKE treats as a
|
|
227
|
+
// single-character wildcard and would match neighbouring keys with.
|
|
228
|
+
(0, db_instance_1.getDbInstance)()
|
|
229
|
+
.prepare('DELETE FROM app_settings WHERE key GLOB ?')
|
|
230
|
+
.run(`${exports.PUSH_DELIVERY_HEALTH_KEY_PREFIX}*`);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
logger.debug('delivery-health-clear-failed', {
|
|
234
|
+
error: error instanceof Error ? error.message : String(error),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* |---------------------|--------------------------------------------|--------|
|
|
12
12
|
* | verification failed | `lib/verification/gate-runner` | event |
|
|
13
13
|
* | upstream API fault | `lib/polling/response-checker` (#1839 match)| level |
|
|
14
|
-
* | session start failed| `lib/cli-tools/
|
|
14
|
+
* | session start failed| `lib/cli-tools/start-availability` (#2009/#2022)| event |
|
|
15
15
|
*
|
|
16
16
|
* The shape column is the whole design. An **event** fires once by construction
|
|
17
17
|
* — a run closes once, a start attempt throws once — so its only guard is the
|
|
@@ -29,6 +29,17 @@
|
|
|
29
29
|
* `no-fault` — a clean frame — which is the outcome of most polls of most
|
|
30
30
|
* sessions and would drown the log it exists to make readable.
|
|
31
31
|
*
|
|
32
|
+
* ## The card has to say *which* instance (Issue #2125)
|
|
33
|
+
*
|
|
34
|
+
* `push-sender` builds the title as `<worktree>` plus ` (<agentName>)`, and
|
|
35
|
+
* omits the suffix when the producer has no agent to name. A bare
|
|
36
|
+
* `commandmate verify <id>` names none, so the failure card carried the branch
|
|
37
|
+
* name alone while the waiting card next to it said `(claude)` — and a worktree
|
|
38
|
+
* running `claude` / `claude-2` / `codex` in parallel could not be told which
|
|
39
|
+
* one had gone red. {@link formatWorktreeWideAgentLabel} is the answer: a run
|
|
40
|
+
* that named no instance is labelled with the worktree's resolved default
|
|
41
|
+
* *marked as such*, never substituted for a report that that instance ran.
|
|
42
|
+
*
|
|
32
43
|
* ## Why none of this goes through `prompt-push-gate`
|
|
33
44
|
*
|
|
34
45
|
* #1999 mutes prompts that Auto-Yes is about to answer. No such claim can be
|
|
@@ -45,12 +56,14 @@
|
|
|
45
56
|
* @module lib/push/failure-push-notifier
|
|
46
57
|
*/
|
|
47
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
|
+
exports.formatWorktreeWideAgentLabel = formatWorktreeWideAgentLabel;
|
|
48
60
|
exports.notifyVerificationFailurePush = notifyVerificationFailurePush;
|
|
49
61
|
exports.notifyUpstreamFaultPush = notifyUpstreamFaultPush;
|
|
50
62
|
exports.notifySessionStartFailurePush = notifySessionStartFailurePush;
|
|
51
63
|
const db_instance_1 = require("../../lib/db/db-instance");
|
|
52
64
|
const worktree_db_1 = require("../../lib/db/worktree-db");
|
|
53
65
|
const logger_1 = require("../../lib/logger");
|
|
66
|
+
const resolve_session_target_1 = require("../../lib/session/resolve-session-target");
|
|
54
67
|
const session_start_error_1 = require("../../lib/session/session-start-error");
|
|
55
68
|
const failure_episode_state_1 = require("./failure-episode-state");
|
|
56
69
|
const push_sender_1 = require("./push-sender");
|
|
@@ -71,6 +84,80 @@ function resolveWorktreeName(worktreeId) {
|
|
|
71
84
|
return worktreeId;
|
|
72
85
|
}
|
|
73
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Prefix for the title suffix of a run that named no agent instance (#2125).
|
|
89
|
+
*
|
|
90
|
+
* Chosen so the label can never be read as an instance id: `isValidInstanceId`
|
|
91
|
+
* admits only `[A-Za-z0-9_-]{1,64}`, and both the colon and the space are
|
|
92
|
+
* outside it. A worktree whose operator really did register an instance called
|
|
93
|
+
* `worktree` therefore still renders differently from a worktree-wide run.
|
|
94
|
+
*/
|
|
95
|
+
const WORKTREE_WIDE_AGENT_PREFIX = 'worktree: ';
|
|
96
|
+
/**
|
|
97
|
+
* What the label says when not even the worktree's default target can be named.
|
|
98
|
+
* A question mark rather than an omission, because "we could not tell" and
|
|
99
|
+
* "there was nothing to tell" are different facts and #2125 is about a title
|
|
100
|
+
* that dropped one of them silently.
|
|
101
|
+
*/
|
|
102
|
+
const UNKNOWN_AGENT_MARK = '?';
|
|
103
|
+
/**
|
|
104
|
+
* Title suffix for a verification run that judged the worktree rather than a
|
|
105
|
+
* named instance (Issue #2125).
|
|
106
|
+
*
|
|
107
|
+
* Exported for the tests that pin the two spellings; producers go through
|
|
108
|
+
* {@link resolveVerificationAgentLabel}.
|
|
109
|
+
*/
|
|
110
|
+
function formatWorktreeWideAgentLabel(instanceId) {
|
|
111
|
+
return `${WORKTREE_WIDE_AGENT_PREFIX}${instanceId ?? UNKNOWN_AGENT_MARK}`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Decide what the failure card should call the agent (Issue #2125).
|
|
115
|
+
*
|
|
116
|
+
* ## Why a bare `commandmate verify` had no suffix at all
|
|
117
|
+
*
|
|
118
|
+
* `push-sender` renders ` (${agentName})` and omits it when `agentName` is
|
|
119
|
+
* empty, and `commandmate verify <id>` names no `--instance`, so the run
|
|
120
|
+
* carried `instanceId: null` all the way from `gate-runner` and the card said
|
|
121
|
+
* only the worktree name (measured by the orchestrator on 2026-08-27, iPadOS
|
|
122
|
+
* 18.7 / APNs: `uat/push-2002` with body `検証ゲート不合格:lint`). Silence is
|
|
123
|
+
* the one thing that could not be read: the reader cannot tell "this run was
|
|
124
|
+
* about the whole worktree" from "the instance was dropped on the way".
|
|
125
|
+
*
|
|
126
|
+
* ## Why the resolved target is labelled rather than substituted
|
|
127
|
+
*
|
|
128
|
+
* A run that named no instance is asked about here through
|
|
129
|
+
* `resolveSessionTarget` — the #1925 authority that `GET
|
|
130
|
+
* /api/worktrees/:id/resolve-target` is the HTTP face of — so the card can name
|
|
131
|
+
* the agent the worktree would send to. But the answer is a *default*, not a
|
|
132
|
+
* report that this agent ran the gates, so it is rendered with the
|
|
133
|
+
* {@link WORKTREE_WIDE_AGENT_PREFIX} rather than as a plain instance id. The
|
|
134
|
+
* distinction is what stops a two-instance worktree from blaming whichever one
|
|
135
|
+
* happens to be the default.
|
|
136
|
+
*
|
|
137
|
+
* The resolution deliberately stops here and never reaches
|
|
138
|
+
* `RunVerificationInput.instanceId`: #2043 rests on an unnamed instance
|
|
139
|
+
* answering `false` to `namesOpencodeInstance`, so writing a resolved id onto
|
|
140
|
+
* the run would move a *verdict* (an opencode worktree's work-evidence gate)
|
|
141
|
+
* for the sake of a title.
|
|
142
|
+
*
|
|
143
|
+
* `resolvedBy: 'fallback'` is not a fact about this worktree — it is
|
|
144
|
+
* `resolve-session-target`'s own last-resort literal, reached when the row is
|
|
145
|
+
* gone — so it degrades to {@link UNKNOWN_AGENT_MARK} instead of asserting
|
|
146
|
+
* `claude`.
|
|
147
|
+
*/
|
|
148
|
+
function resolveVerificationAgentLabel(worktreeId, instanceId) {
|
|
149
|
+
if (instanceId !== undefined)
|
|
150
|
+
return instanceId;
|
|
151
|
+
try {
|
|
152
|
+
const target = (0, resolve_session_target_1.resolveSessionTarget)((0, db_instance_1.getDbInstance)(), worktreeId);
|
|
153
|
+
return formatWorktreeWideAgentLabel(target.resolvedBy === 'fallback' ? undefined : target.instanceId);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// A database that cannot answer is a reason for a vaguer title, never for
|
|
157
|
+
// dropping the notification — the position `resolveWorktreeName` takes.
|
|
158
|
+
return formatWorktreeWideAgentLabel();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
74
161
|
/**
|
|
75
162
|
* Fan one failure notification out, logging the decision. Never throws.
|
|
76
163
|
*
|
|
@@ -81,6 +168,9 @@ async function raiseFailurePush(input) {
|
|
|
81
168
|
const context = {
|
|
82
169
|
worktreeId: input.worktreeId,
|
|
83
170
|
instanceId: input.instanceId,
|
|
171
|
+
// Only the verification producer sets one (#2125); logging it unconditionally
|
|
172
|
+
// would repeat `instanceId` on every other line.
|
|
173
|
+
...(input.agentLabel !== undefined ? { agentLabel: input.agentLabel } : {}),
|
|
84
174
|
failureReason: input.reason,
|
|
85
175
|
signature: input.signature,
|
|
86
176
|
...input.logContext,
|
|
@@ -96,12 +186,16 @@ async function raiseFailurePush(input) {
|
|
|
96
186
|
try {
|
|
97
187
|
await (0, push_sender_1.notifyPushSubscribers)({
|
|
98
188
|
worktreeId: input.worktreeId,
|
|
99
|
-
|
|
189
|
+
// Issue #2022: a subject that is not a worktree row names itself. The
|
|
190
|
+
// worktree lookup is not merely redundant for one — it would answer with
|
|
191
|
+
// the raw id, which for Assistant Chat is a uuid nobody recognises.
|
|
192
|
+
worktreeName: input.subject?.name ?? resolveWorktreeName(input.worktreeId),
|
|
100
193
|
kind: 'failure',
|
|
101
|
-
agentName: input.instanceId,
|
|
194
|
+
agentName: input.agentLabel ?? input.instanceId,
|
|
102
195
|
instanceId: input.instanceId,
|
|
103
196
|
excerpt: input.excerpt,
|
|
104
197
|
failure: { reason: input.reason, signature: input.signature },
|
|
198
|
+
...(input.subject ? { url: input.subject.url } : {}),
|
|
105
199
|
});
|
|
106
200
|
}
|
|
107
201
|
catch (error) {
|
|
@@ -178,6 +272,9 @@ async function notifyVerificationFailurePush(input) {
|
|
|
178
272
|
reason: 'verification-failed',
|
|
179
273
|
worktreeId: input.worktreeId,
|
|
180
274
|
instanceId,
|
|
275
|
+
// Resolved here rather than at the suppression checks above: it reads the
|
|
276
|
+
// database, and a run nobody is going to be told about must not pay for it.
|
|
277
|
+
agentLabel: resolveVerificationAgentLabel(input.worktreeId, instanceId),
|
|
181
278
|
// The run id, so two runs of the same worktree are two incidents even when
|
|
182
279
|
// the same gates fail with the same wording inside the 30 s window.
|
|
183
280
|
signature: `verification:${input.runId}`,
|
|
@@ -307,10 +404,14 @@ function readErrorCode(error) {
|
|
|
307
404
|
/**
|
|
308
405
|
* Notify that a CLI session could not be started. Never throws.
|
|
309
406
|
*
|
|
310
|
-
* Called from exactly one place — `
|
|
311
|
-
*
|
|
312
|
-
* `claude-session`'s throw site, which is why six of the seven
|
|
313
|
-
* silently: the other six never had a line to call it from.
|
|
407
|
+
* Called from exactly one place — `reportSessionStartFailure` in
|
|
408
|
+
* `lib/cli-tools/start-availability` (Issue #2009 / #2022). Before #2009 it was
|
|
409
|
+
* called from `claude-session`'s throw site, which is why six of the seven
|
|
410
|
+
* agents failed silently: the other six never had a line to call it from. #2009
|
|
411
|
+
* moved it to `BaseCLITool.startSession`, the method all seven tools inherit;
|
|
412
|
+
* #2022 moved the line itself one step further out, because Assistant Chat
|
|
413
|
+
* never reaches that method — it spawns `claude -p` rather than a tmux session —
|
|
414
|
+
* and the alternative was a second, private call site.
|
|
314
415
|
*
|
|
315
416
|
* No edge of its own, and deliberately: this is raised from a `throw`, so its
|
|
316
417
|
* rate is bounded by how often something asks to start the session rather than
|
|
@@ -340,5 +441,6 @@ async function notifySessionStartFailurePush(input) {
|
|
|
340
441
|
signature: verdict.signature,
|
|
341
442
|
excerpt: verdict.excerpt,
|
|
342
443
|
logContext: { cliToolId: input.cliToolId },
|
|
444
|
+
subject: input.subject,
|
|
343
445
|
});
|
|
344
446
|
}
|