commandmate 0.27.1 → 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 +278 -248
- package/.next/app-path-routes-manifest.json +30 -26
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +15 -15
- 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 +30 -26
- 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 +1 -1
- package/.next/server/chunks/243.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2759.js +1 -1
- package/.next/server/chunks/3346.js +1 -1
- package/.next/server/chunks/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-8cfe50a5ca5425b1.js +0 -1
- package/.next/static/chunks/8521-c43994fb58501d13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/more/page-3266dfa945972649.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/review/page-8f63aff862fee421.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f7b3dfbe757dc6b8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
- package/.next/static/css/928e5a8830fbf997.css +0 -1
- /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → 0GHE2JGlFzqvSBZAcBFSt}/_buildManifest.js +0 -0
- /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → 0GHE2JGlFzqvSBZAcBFSt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The opencode settings one instance is launched and prompted with (#2048).
|
|
4
|
+
*
|
|
5
|
+
* Issue #2048 adds three per-instance settings — persona, model and variant.
|
|
6
|
+
* The database holds them (`opencode_instance_settings`, migration v59) because
|
|
7
|
+
* they belong to a worktree and have to follow its renames and its deletion.
|
|
8
|
+
* This module is the **launcher's copy** of the same values, and it exists for
|
|
9
|
+
* the reason `../../../session/opencode-session-store` spells out for the resume
|
|
10
|
+
* flag, applied to a second value:
|
|
11
|
+
*
|
|
12
|
+
* 1. **The reader is the launcher.** `prepareOpencodeLaunch` builds a command
|
|
13
|
+
* line synchronously, from an `AgentLaunchContext` that five other tools
|
|
14
|
+
* share and that has nowhere to hand settings through; and
|
|
15
|
+
* `src/lib/cli-tools/opencode.ts` is deliberately outside `better-sqlite3`'s
|
|
16
|
+
* import graph. Reading the row here would either pull that graph into the
|
|
17
|
+
* launcher or make the launch path `await` a dynamic import — measured, that
|
|
18
|
+
* second option is not free: the three launch tests in
|
|
19
|
+
* `tests/unit/cli-tools/opencode.test.ts` drive `startSession` under fake
|
|
20
|
+
* timers, and a dynamic import does not resolve on the timer queue, so the
|
|
21
|
+
* command line was never composed at all.
|
|
22
|
+
* 2. **It is read on the send path too**, once per prompt, where an extra
|
|
23
|
+
* database round trip would sit in front of the operator's message.
|
|
24
|
+
*
|
|
25
|
+
* So: same shape as `./ports`, same `~/.commandmate` directory, same "never
|
|
26
|
+
* throws, a bad file means none" contract. `GET`/`PUT
|
|
27
|
+
* /api/worktrees/:id/instances/opencode` writes both — the row and this mirror —
|
|
28
|
+
* and the `GET` reconciles the mirror from the row, so opening the settings pane
|
|
29
|
+
* repairs a mirror that a worktree rename or a restored database left stale.
|
|
30
|
+
* The database is the source of truth; this is a cache with a file behind it.
|
|
31
|
+
*
|
|
32
|
+
* ## What the settings may and may not do
|
|
33
|
+
*
|
|
34
|
+
* Measured on opencode 1.18.22 (`docs/design/opencode-server-live-verification.md`
|
|
35
|
+
* §20): the TUI takes `--agent` and `-m provider/model` and has **no
|
|
36
|
+
* `--variant`** — passing one makes opencode print its usage and exit, so the
|
|
37
|
+
* pane would come up empty. {@link opencodeLaunchArguments} therefore never
|
|
38
|
+
* emits a variant, and the variant travels on the prompt instead
|
|
39
|
+
* ({@link opencodePromptSelection}), which is the one channel measured to apply
|
|
40
|
+
* it.
|
|
41
|
+
*
|
|
42
|
+
* @module lib/hooks/sources/opencode/launch-settings
|
|
43
|
+
*/
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.getOpencodeLaunchSettingsFilePath = getOpencodeLaunchSettingsFilePath;
|
|
46
|
+
exports.readPersistedOpencodeLaunchSettings = readPersistedOpencodeLaunchSettings;
|
|
47
|
+
exports.getOpencodeLaunchSettings = getOpencodeLaunchSettings;
|
|
48
|
+
exports.rememberOpencodeLaunchSettings = rememberOpencodeLaunchSettings;
|
|
49
|
+
exports.forgetOpencodeLaunchSettings = forgetOpencodeLaunchSettings;
|
|
50
|
+
exports.resetOpencodeLaunchSettings = resetOpencodeLaunchSettings;
|
|
51
|
+
exports.opencodeLaunchArguments = opencodeLaunchArguments;
|
|
52
|
+
exports.opencodePromptSelection = opencodePromptSelection;
|
|
53
|
+
const fs_1 = require("fs");
|
|
54
|
+
const os_1 = require("os");
|
|
55
|
+
const path_1 = require("path");
|
|
56
|
+
const safe_directory_1 = require("../../../../config/safe-directory");
|
|
57
|
+
const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
|
|
58
|
+
const logger_1 = require("../../../../lib/logger");
|
|
59
|
+
const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
|
|
60
|
+
const opencode_instance_settings_1 = require("../../../../types/opencode-instance-settings");
|
|
61
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/launch-settings');
|
|
62
|
+
const cache = (globalThis.__opencodeLaunchSettings ??= new Map());
|
|
63
|
+
function keyOf(target) {
|
|
64
|
+
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Where the mirror lives. `CM_OPENCODE_LAUNCH_SETTINGS_FILE` overrides.
|
|
68
|
+
*
|
|
69
|
+
* Guarded exactly as `getOpencodePortFilePath` is (Issue #1774): the write below
|
|
70
|
+
* creates this file's directory with a recursive mkdir, and for a path inside
|
|
71
|
+
* `/proc`, `/sys` or `/dev` that call does not throw — it spins the event loop
|
|
72
|
+
* forever, so the `try/catch` around it never runs. `resolveSafeDirectory`
|
|
73
|
+
* refuses such an override and hands back the default.
|
|
74
|
+
*/
|
|
75
|
+
function getOpencodeLaunchSettingsFilePath() {
|
|
76
|
+
const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'opencode-launch-settings.json');
|
|
77
|
+
return (0, safe_directory_1.resolveSafeDirectory)(process.env.CM_OPENCODE_LAUNCH_SETTINGS_FILE, fallback, 'CM_OPENCODE_LAUNCH_SETTINGS_FILE');
|
|
78
|
+
}
|
|
79
|
+
/** Read the mirror. Never throws — a bad file means "nothing is configured". */
|
|
80
|
+
function readPersistedOpencodeLaunchSettings() {
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(getOpencodeLaunchSettingsFilePath(), 'utf8'));
|
|
83
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
84
|
+
return {};
|
|
85
|
+
const result = {};
|
|
86
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
87
|
+
// Re-validated on the way out as well as in: this file is writable by
|
|
88
|
+
// anything running as the user, and `agent` / `model` end up on a shell
|
|
89
|
+
// command line.
|
|
90
|
+
const settings = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(value);
|
|
91
|
+
if ((0, opencode_instance_settings_1.hasOpencodeInstanceSettings)(settings))
|
|
92
|
+
result[key] = settings;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Absent on a first run, unreadable if somebody edited it. Both mean the
|
|
98
|
+
// same thing to a caller: nothing is configured.
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Write the mirror back. Never throws — losing it costs one launch's flags. */
|
|
103
|
+
function writePersistedOpencodeLaunchSettings(all) {
|
|
104
|
+
const path = getOpencodeLaunchSettingsFilePath();
|
|
105
|
+
try {
|
|
106
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
|
107
|
+
(0, fs_1.writeFileSync)(path, `${JSON.stringify(all, null, 2)}\n`, { mode: 0o600 });
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.warn('opencode-launch-settings-write-failed', {
|
|
111
|
+
path,
|
|
112
|
+
error: error instanceof Error ? error.message : String(error),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The settings this instance should launch with.
|
|
118
|
+
*
|
|
119
|
+
* **Synchronous, and that is the requirement** — {@link prepareOpencodeLaunch}
|
|
120
|
+
* calls it while composing a command line. Memory first, then the file, then
|
|
121
|
+
* all-unset, which is the state every instance is in until somebody opens the
|
|
122
|
+
* settings pane.
|
|
123
|
+
*/
|
|
124
|
+
function getOpencodeLaunchSettings(target) {
|
|
125
|
+
const key = keyOf(target);
|
|
126
|
+
const live = cache.get(key);
|
|
127
|
+
if (live)
|
|
128
|
+
return live;
|
|
129
|
+
const persisted = readPersistedOpencodeLaunchSettings()[key];
|
|
130
|
+
if (!persisted)
|
|
131
|
+
return { ...opencode_instance_settings_1.EMPTY_OPENCODE_INSTANCE_SETTINGS };
|
|
132
|
+
cache.set(key, persisted);
|
|
133
|
+
return persisted;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Record what this instance should launch with, in memory and on disk.
|
|
137
|
+
*
|
|
138
|
+
* An all-unset write **removes** the entry rather than storing four nulls: the
|
|
139
|
+
* two are indistinguishable to every reader, and the removal keeps the file to
|
|
140
|
+
* the instances somebody actually configured.
|
|
141
|
+
*
|
|
142
|
+
* @returns The normalised settings that were stored
|
|
143
|
+
*/
|
|
144
|
+
function rememberOpencodeLaunchSettings(target, settings) {
|
|
145
|
+
const key = keyOf(target);
|
|
146
|
+
const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
|
|
147
|
+
const all = readPersistedOpencodeLaunchSettings();
|
|
148
|
+
if (!(0, opencode_instance_settings_1.hasOpencodeInstanceSettings)(normalized)) {
|
|
149
|
+
cache.delete(key);
|
|
150
|
+
if (key in all) {
|
|
151
|
+
delete all[key];
|
|
152
|
+
writePersistedOpencodeLaunchSettings(all);
|
|
153
|
+
}
|
|
154
|
+
return normalized;
|
|
155
|
+
}
|
|
156
|
+
cache.set(key, normalized);
|
|
157
|
+
all[key] = normalized;
|
|
158
|
+
writePersistedOpencodeLaunchSettings(all);
|
|
159
|
+
return normalized;
|
|
160
|
+
}
|
|
161
|
+
/** Drop one instance's settings from memory and disk. */
|
|
162
|
+
function forgetOpencodeLaunchSettings(target) {
|
|
163
|
+
rememberOpencodeLaunchSettings(target, opencode_instance_settings_1.EMPTY_OPENCODE_INSTANCE_SETTINGS);
|
|
164
|
+
}
|
|
165
|
+
/** Drop every in-memory entry. Test seam; production only ever writes or forgets one. */
|
|
166
|
+
function resetOpencodeLaunchSettings() {
|
|
167
|
+
cache.clear();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The flags these settings add to an opencode launch line, or `''`.
|
|
171
|
+
*
|
|
172
|
+
* **`--variant` is deliberately absent and must stay absent.** The TUI does not
|
|
173
|
+
* declare it (`opencode --help`, 1.18.22): yargs answers an unknown option by
|
|
174
|
+
* printing the usage banner and exiting, so a launch line carrying it starts no
|
|
175
|
+
* agent at all — measured twice, once inside tmux and once directly (§20.3).
|
|
176
|
+
* `opencode run --variant` does exist, which is exactly the trap: the flag is
|
|
177
|
+
* real, on a different subcommand.
|
|
178
|
+
*
|
|
179
|
+
* Both values are shell-quoted even though {@link normalizeOpencodeInstanceSettings}
|
|
180
|
+
* has already refused everything with a metacharacter in it. The quoting is the
|
|
181
|
+
* second of two independent guards, and it is the cheaper one to keep.
|
|
182
|
+
*
|
|
183
|
+
* @param settings - The instance's settings; all-unset yields `''`
|
|
184
|
+
* @returns A string starting with a space, or `''` when nothing is configured
|
|
185
|
+
*/
|
|
186
|
+
function opencodeLaunchArguments(settings) {
|
|
187
|
+
const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
|
|
188
|
+
const parts = [];
|
|
189
|
+
if (normalized.agent)
|
|
190
|
+
parts.push(`--agent ${(0, hook_settings_generator_1.shellQuote)(normalized.agent)}`);
|
|
191
|
+
const model = (0, opencode_instance_settings_1.opencodeModelReference)(normalized);
|
|
192
|
+
if (model)
|
|
193
|
+
parts.push(`--model ${(0, hook_settings_generator_1.shellQuote)(model)}`);
|
|
194
|
+
return parts.length > 0 ? ` ${parts.join(' ')}` : '';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* The `prompt_async` keys these settings contribute, or null.
|
|
198
|
+
*
|
|
199
|
+
* Null — send nothing extra — when nothing is configured, so an unconfigured
|
|
200
|
+
* instance's request body is byte-identical to the pre-#2048 one. That matters
|
|
201
|
+
* more than it looks: a body with **no** `agent` runs the turn as `build` even
|
|
202
|
+
* on a pane launched `--agent plan` (§20.5), so the choice between "omit" and
|
|
203
|
+
* "send" is a behavioural one and the omission is only correct while the
|
|
204
|
+
* operator has expressed no preference.
|
|
205
|
+
*
|
|
206
|
+
* The model is sent alongside the variant rather than left to the launch flag
|
|
207
|
+
* because the two have to agree: a variant names an entry in one model's own
|
|
208
|
+
* `variants` map, and sending `high` against whichever model the pane happens to
|
|
209
|
+
* be on would be asserting something about a model the operator did not choose.
|
|
210
|
+
*/
|
|
211
|
+
function opencodePromptSelection(settings) {
|
|
212
|
+
const normalized = (0, opencode_instance_settings_1.normalizeOpencodeInstanceSettings)(settings ?? {});
|
|
213
|
+
const selection = {};
|
|
214
|
+
if (normalized.agent)
|
|
215
|
+
selection.agent = normalized.agent;
|
|
216
|
+
if (normalized.providerId && normalized.modelId) {
|
|
217
|
+
selection.model = { providerID: normalized.providerId, modelID: normalized.modelId };
|
|
218
|
+
}
|
|
219
|
+
if (normalized.variant)
|
|
220
|
+
selection.variant = normalized.variant;
|
|
221
|
+
return Object.keys(selection).length > 0 ? selection : null;
|
|
222
|
+
}
|
|
@@ -37,6 +37,7 @@ exports.OPENCODE_MAPPERS = exports.OPENCODE_ERROR_DETAIL = exports.OPENCODE_PERM
|
|
|
37
37
|
exports.frameProperties = frameProperties;
|
|
38
38
|
exports.frameSessionId = frameSessionId;
|
|
39
39
|
exports.frameModel = frameModel;
|
|
40
|
+
exports.frameVariant = frameVariant;
|
|
40
41
|
exports.partToolName = partToolName;
|
|
41
42
|
exports.partCallId = partCallId;
|
|
42
43
|
exports.repliedPermissionId = repliedPermissionId;
|
|
@@ -105,6 +106,36 @@ function frameModel(payload) {
|
|
|
105
106
|
return null;
|
|
106
107
|
return (0, event_mapper_1.readNestedString)(info, ['model', 'modelID']) ?? (0, event_mapper_1.readNestedString)(info, ['model', 'id']);
|
|
107
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* The model **variant** this frame reports, or null (Issue #2048).
|
|
111
|
+
*
|
|
112
|
+
* Two spellings, for the same reason {@link frameModel} has two: the value sits
|
|
113
|
+
* in a different place on the two frames that carry it, and both were measured
|
|
114
|
+
* on 1.18.22 in an isolated `HOME`
|
|
115
|
+
* (`docs/design/opencode-server-live-verification.md` §20.4).
|
|
116
|
+
*
|
|
117
|
+
* - `session.updated` -> `properties.info.model.variant`, because
|
|
118
|
+
* `Session.model` is a `ModelRef` (`{ id, providerID, variant? }`);
|
|
119
|
+
* - `message.updated` -> `properties.info.variant`, because `AssistantMessage`
|
|
120
|
+
* declares it as a flat field of its own.
|
|
121
|
+
*
|
|
122
|
+
* **Absent is the ordinary answer, not an error.** The `variant` key is missing
|
|
123
|
+
* altogether from both frames when the session is on a model's default, and from
|
|
124
|
+
* the assistant message a turn opens with. `agent-event-state` latches this
|
|
125
|
+
* rather than assigning it, which is what makes a frame without one mean
|
|
126
|
+
* "unchanged" instead of "cleared".
|
|
127
|
+
*
|
|
128
|
+
* opencode calls it a variant; CommandMate publishes it as the reasoning
|
|
129
|
+
* *effort*, which is what it is — the catalogue entry for `high` is literally
|
|
130
|
+
* `{ effort: "high" }` (§20.1) — and is the field every other tool's level is
|
|
131
|
+
* already shown in.
|
|
132
|
+
*/
|
|
133
|
+
function frameVariant(payload) {
|
|
134
|
+
const info = frameProperties(payload).info;
|
|
135
|
+
if (!(0, event_mapper_1.isPlainObject)(info))
|
|
136
|
+
return null;
|
|
137
|
+
return (0, event_mapper_1.readNestedString)(info, ['model', 'variant']) ?? (0, event_mapper_1.readNestedString)(info, ['variant']);
|
|
138
|
+
}
|
|
108
139
|
/** `properties.part.state.status` — `pending` / `running` / `completed` / `error`. */
|
|
109
140
|
function partStatus(payload) {
|
|
110
141
|
return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['part', 'state', 'status']);
|
|
@@ -37,6 +37,7 @@ exports.resetOpencodeToolCalls = resetOpencodeToolCalls;
|
|
|
37
37
|
exports.parseOpencodePermissionRequest = parseOpencodePermissionRequest;
|
|
38
38
|
exports.parseOpencodeQuestion = parseOpencodeQuestion;
|
|
39
39
|
exports.toOpencodePendingPermission = toOpencodePendingPermission;
|
|
40
|
+
exports.readOpencodePermissionSubject = readOpencodePermissionSubject;
|
|
40
41
|
exports.toOpencodePendingQuestion = toOpencodePendingQuestion;
|
|
41
42
|
const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
|
|
42
43
|
const event_mapper_1 = require("../event-mapper");
|
|
@@ -171,6 +172,50 @@ function toOpencodePendingPermission(payload, askedAt) {
|
|
|
171
172
|
askedAt,
|
|
172
173
|
};
|
|
173
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* What an approval is ABOUT, for the surfaces that have to show it
|
|
177
|
+
* (Issue #2031).
|
|
178
|
+
*
|
|
179
|
+
* Read back off {@link toOpencodePendingPermission} rather than re-parsed from
|
|
180
|
+
* the frame, and that is the point rather than an economy: the pending decision
|
|
181
|
+
* is what the adjudicator judges and what `Allow always` is delivered against,
|
|
182
|
+
* so a panel describing a *differently* parsed view of the same frame could
|
|
183
|
+
* tell the user one thing while the verdict did another. One parse, two
|
|
184
|
+
* readers.
|
|
185
|
+
*
|
|
186
|
+
* The tool name is the `message.part.updated` correlation
|
|
187
|
+
* ({@link lookupOpencodeToolName}) with the approval kind behind it, because
|
|
188
|
+
* `permission.asked` carries no tool name of its own (#1758 §5.4).
|
|
189
|
+
*
|
|
190
|
+
* `patterns` comes back as `toolInput.patterns`, which is NOT always the
|
|
191
|
+
* frame's top-level `properties.patterns`: `parseOpencodePermissionRequest`
|
|
192
|
+
* spreads `metadata` last, so an approval whose metadata carries its own
|
|
193
|
+
* `patterns` shadows the outer list. That is the behaviour to keep, not a wart
|
|
194
|
+
* to route around — the shadowed list is what the adjudicator judged and what
|
|
195
|
+
* `Allow always` is delivered against, and a panel showing the other one would
|
|
196
|
+
* describe a verdict nobody is about to take. Pinned in
|
|
197
|
+
* `opencode-permission-subject-2031`.
|
|
198
|
+
*
|
|
199
|
+
* `patterns` is left unbounded here on purpose. It is bounded where it is
|
|
200
|
+
* *retained* — `boundDecisionPatterns` in `lib/session/provisional-turn`,
|
|
201
|
+
* beside the bounds on `message` and `toolName` — so there is one place the
|
|
202
|
+
* footprint of a stored decision is decided, and a second bound here would be a
|
|
203
|
+
* second number to keep in step with it.
|
|
204
|
+
*
|
|
205
|
+
* @param payload - A `permission.asked` frame or a `GET /permission` entry
|
|
206
|
+
* @param askedAt - Epoch ms
|
|
207
|
+
* @returns The subject, or null when this is not an approval this server reads
|
|
208
|
+
*/
|
|
209
|
+
function readOpencodePermissionSubject(payload, askedAt) {
|
|
210
|
+
const pending = toOpencodePendingPermission(payload, askedAt);
|
|
211
|
+
if (!pending || pending.subject.kind !== 'permission')
|
|
212
|
+
return null;
|
|
213
|
+
const patterns = pending.subject.toolInput.patterns;
|
|
214
|
+
return {
|
|
215
|
+
toolName: pending.subject.toolName,
|
|
216
|
+
patterns: Array.isArray(patterns) ? patterns : [],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
174
219
|
/** Turn a question into a {@link PendingDecision}. */
|
|
175
220
|
function toOpencodePendingQuestion(payload, askedAt) {
|
|
176
221
|
const properties = unwrap(payload);
|
|
@@ -47,6 +47,7 @@ exports.OPENCODE_PORT_PROBE_HOSTS = exports.OPENCODE_PORT_RANGE = void 0;
|
|
|
47
47
|
exports.getOpencodePortFilePath = getOpencodePortFilePath;
|
|
48
48
|
exports.readPersistedOpencodePorts = readPersistedOpencodePorts;
|
|
49
49
|
exports.getAssignedOpencodePort = getAssignedOpencodePort;
|
|
50
|
+
exports.getAssignedOpencodeWorktreePath = getAssignedOpencodeWorktreePath;
|
|
50
51
|
exports.rememberOpencodePort = rememberOpencodePort;
|
|
51
52
|
exports.forgetOpencodePort = forgetOpencodePort;
|
|
52
53
|
exports.isPortFree = isPortFree;
|
|
@@ -138,6 +139,21 @@ function writePersistedOpencodePorts(all) {
|
|
|
138
139
|
function getAssignedOpencodePort(target) {
|
|
139
140
|
return assignments.get(keyOf(target))?.port ?? null;
|
|
140
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* The worktree an assignment was made for, in this process. Null when there is
|
|
144
|
+
* none (Issue #2038).
|
|
145
|
+
*
|
|
146
|
+
* Exists because `killSession` is handed `(worktreeId, instanceId)` and no
|
|
147
|
+
* path, and Issue #2038 has to answer "is the session opencode is about to
|
|
148
|
+
* forget rooted in THIS worktree?" at exactly that moment. The assignment is
|
|
149
|
+
* already the record of "this instance is running there" — `recoverOpencodePort`
|
|
150
|
+
* trusts the same field — so reading it is cheaper and more honest than
|
|
151
|
+
* re-deriving the path from the database inside a launcher that is deliberately
|
|
152
|
+
* kept out of the database's import graph.
|
|
153
|
+
*/
|
|
154
|
+
function getAssignedOpencodeWorktreePath(target) {
|
|
155
|
+
return assignments.get(keyOf(target))?.worktreePath ?? null;
|
|
156
|
+
}
|
|
141
157
|
/** Record an assignment in memory and on disk. */
|
|
142
158
|
function rememberOpencodePort(target, port, worktreePath, at = Date.now()) {
|
|
143
159
|
const key = keyOf(target);
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The phone notifications opencode's own stream raises (Issue #2045).
|
|
4
|
+
*
|
|
5
|
+
* ## Why opencode gets a producer of its own
|
|
6
|
+
*
|
|
7
|
+
* Every other tool's prompt notification is raised from the *waiting edge*
|
|
8
|
+
* (`push/waiting-push-notifier`), and that edge is only ever observed by a
|
|
9
|
+
* status probe — `worktree-status-helper` on a list/detail API read, or
|
|
10
|
+
* `response-checker` while the poller happens to be running. So for the five
|
|
11
|
+
* scraped tools a wait notifies when somebody is looking, and the phone is the
|
|
12
|
+
* consolation prize for when nobody is.
|
|
13
|
+
*
|
|
14
|
+
* opencode is the one tool where that trade is unaffordable. Measured on
|
|
15
|
+
* 1.18.22 (`docs/design/opencode-server-live-verification.md` §17): after
|
|
16
|
+
* `question.asked` the session stays `busy` and **no `session.idle` ever
|
|
17
|
+
* arrives** — `GET /session/status` still read `{"…":{"type":"busy"}}` twenty
|
|
18
|
+
* seconds later, with nothing else on the stream. Nothing in this repository
|
|
19
|
+
* answers an opencode question either (`grep` for a question-reply producer
|
|
20
|
+
* finds only the manual `respond` path), so Auto-Yes cannot end the wait and
|
|
21
|
+
* the turn is stopped until a human acts. A notification that waits for a page
|
|
22
|
+
* view is exactly the wrong shape for that.
|
|
23
|
+
*
|
|
24
|
+
* ## Closed to opencode, on purpose
|
|
25
|
+
*
|
|
26
|
+
* The Issue's constraint, and it is the reason this is a module in
|
|
27
|
+
* `sources/opencode/` rather than a hook on `notification` / `error` in the
|
|
28
|
+
* shared receiver: the other five tools reach `recordAgentEvent` through
|
|
29
|
+
* `POST /api/hooks/agent-event`, which does not import this file, so their push
|
|
30
|
+
* counts cannot move. `tests/unit/hooks/sources/opencode-push-2045.test.ts`
|
|
31
|
+
* pins that as a test rather than as a comment.
|
|
32
|
+
*
|
|
33
|
+
* ## One notification per wait, across both producers
|
|
34
|
+
*
|
|
35
|
+
* The question push carries `waitingSince: <the frame's receivedAt>`, which
|
|
36
|
+
* routes it through `shouldSendWaitingPush` — the episode-scoped guard #1790
|
|
37
|
+
* built — keyed `${worktreeId}::${instanceId}`. That is the *same* key and the
|
|
38
|
+
* *same* value the waiting edge will later use, because
|
|
39
|
+
* `worktree-status-helper` opens the episode with
|
|
40
|
+
* `structuredSince = peekPromptWaiting().structured?.at`, and that `at` is the
|
|
41
|
+
* `receivedAt` this module is handed. So the status probe's own notification is
|
|
42
|
+
* suppressed as a repeat of this one, and the reader gets one card per wait
|
|
43
|
+
* however many producers saw it. Passing no `waitingSince` would have fallen
|
|
44
|
+
* back to the 30 s content hash, whose key is a different map — two cards.
|
|
45
|
+
*
|
|
46
|
+
* ## Nothing here throws
|
|
47
|
+
*
|
|
48
|
+
* The same contract `./ingest` declares, for the same reason: a notification is
|
|
49
|
+
* advisory and must never cost the event that raised it.
|
|
50
|
+
*
|
|
51
|
+
* @module lib/hooks/sources/opencode/push
|
|
52
|
+
*/
|
|
53
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
54
|
+
if (k2 === undefined) k2 = k;
|
|
55
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
56
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
57
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
58
|
+
}
|
|
59
|
+
Object.defineProperty(o, k2, desc);
|
|
60
|
+
}) : (function(o, m, k, k2) {
|
|
61
|
+
if (k2 === undefined) k2 = k;
|
|
62
|
+
o[k2] = m[k];
|
|
63
|
+
}));
|
|
64
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
65
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
66
|
+
}) : function(o, v) {
|
|
67
|
+
o["default"] = v;
|
|
68
|
+
});
|
|
69
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
70
|
+
var ownKeys = function(o) {
|
|
71
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
72
|
+
var ar = [];
|
|
73
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
74
|
+
return ar;
|
|
75
|
+
};
|
|
76
|
+
return ownKeys(o);
|
|
77
|
+
};
|
|
78
|
+
return function (mod) {
|
|
79
|
+
if (mod && mod.__esModule) return mod;
|
|
80
|
+
var result = {};
|
|
81
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
82
|
+
__setModuleDefault(result, mod);
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
})();
|
|
86
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
87
|
+
exports.OPENCODE_INTERRUPT_ERROR_NAME = exports.OPENCODE_PUSH_EXCERPT_LENGTH = void 0;
|
|
88
|
+
exports.notifyOpencodeQuestionPush = notifyOpencodeQuestionPush;
|
|
89
|
+
exports.notifyOpencodeSessionErrorPush = notifyOpencodeSessionErrorPush;
|
|
90
|
+
exports.notifyOpencodeUpdateAvailablePush = notifyOpencodeUpdateAvailablePush;
|
|
91
|
+
const logger_1 = require("../../../../lib/logger");
|
|
92
|
+
const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/push');
|
|
93
|
+
/**
|
|
94
|
+
* How much of the question / error text the notification body carries.
|
|
95
|
+
*
|
|
96
|
+
* 80, from the Issue, and narrower than `push-sender`'s own 120 default: this
|
|
97
|
+
* is applied at the producer so the truncation is the one the Issue specifies
|
|
98
|
+
* rather than whatever the fan-out happens to default to. The re-truncation
|
|
99
|
+
* inside `buildPushPayload` is then a no-op.
|
|
100
|
+
*/
|
|
101
|
+
exports.OPENCODE_PUSH_EXCERPT_LENGTH = 80;
|
|
102
|
+
/**
|
|
103
|
+
* The one `session.error` name that is not a failure (measured, §17).
|
|
104
|
+
*
|
|
105
|
+
* `MessageAbortedError` is what a `POST /session/:id/abort` produces — the user
|
|
106
|
+
* pressed Escape, or CommandMate itself aborted the turn. Pushing "the agent
|
|
107
|
+
* stopped with an error" for a stop the reader just asked for would report
|
|
108
|
+
* their own action back to them as a fault. §5.3.2 of the design note already
|
|
109
|
+
* establishes the same reading for `wait`.
|
|
110
|
+
*
|
|
111
|
+
* The other seven names in opencode 1.18.22's `session.error` union
|
|
112
|
+
* (`APIError`, `ProviderAuthError`, `UnknownError`, `MessageOutputLengthError`,
|
|
113
|
+
* `StructuredOutputError`, `ContextOverflowError`, `ContentFilterError`) all
|
|
114
|
+
* describe a turn that ended badly, so the default is to notify: a name nobody
|
|
115
|
+
* enumerated here fails towards telling the human rather than towards silence.
|
|
116
|
+
*/
|
|
117
|
+
exports.OPENCODE_INTERRUPT_ERROR_NAME = 'MessageAbortedError';
|
|
118
|
+
/**
|
|
119
|
+
* The worktree's display name, for the notification title.
|
|
120
|
+
*
|
|
121
|
+
* Dynamic import for the reason `./ingest` documents at length: `../registry`
|
|
122
|
+
* statically imports `./source`, so anything this module's graph reaches
|
|
123
|
+
* eagerly would put `better-sqlite3` (and, through `@/lib/push`, `web-push`)
|
|
124
|
+
* into every import of `@/lib/hooks/sources`.
|
|
125
|
+
*
|
|
126
|
+
* Falls back to the id rather than dropping the notification — the same call
|
|
127
|
+
* `push/waiting-push-notifier` makes, and for the same reason: a database that
|
|
128
|
+
* cannot answer is a reason to send a less readable title, not a reason to
|
|
129
|
+
* leave the human waiting in silence.
|
|
130
|
+
*/
|
|
131
|
+
async function resolveWorktreeName(worktreeId) {
|
|
132
|
+
try {
|
|
133
|
+
const [{ getDbInstance }, { getWorktreeById }] = await Promise.all([
|
|
134
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
|
|
135
|
+
Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
|
|
136
|
+
]);
|
|
137
|
+
return getWorktreeById(getDbInstance(), worktreeId)?.name ?? worktreeId;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return worktreeId;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* `@/lib/push/push-sender`, reached by module path rather than through the
|
|
145
|
+
* `@/lib/push` barrel.
|
|
146
|
+
*
|
|
147
|
+
* The barrel's own comments give the reason: a suite that stubs `@/lib/push`
|
|
148
|
+
* wholesale would leave the very path it is guarding undefined. Both existing
|
|
149
|
+
* producers (`waiting-push-notifier`, `failure-push-notifier`) import the
|
|
150
|
+
* concrete module for that reason, and this one follows.
|
|
151
|
+
*/
|
|
152
|
+
async function loadPushSender() {
|
|
153
|
+
return Promise.resolve().then(() => __importStar(require('../../../../lib/push/push-sender')));
|
|
154
|
+
}
|
|
155
|
+
async function subjectOf(target, instanceId) {
|
|
156
|
+
return {
|
|
157
|
+
worktreeId: target.worktreeId,
|
|
158
|
+
worktreeName: await resolveWorktreeName(target.worktreeId),
|
|
159
|
+
instanceId,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Tell the human's phone that opencode is asking them a question.
|
|
164
|
+
*
|
|
165
|
+
* `kind: 'prompt'` — this is the acting bucket, and it is the truthful one: the
|
|
166
|
+
* turn does not continue until the question is answered.
|
|
167
|
+
*
|
|
168
|
+
* `waitingKind: 'prompt'` rather than `'menu'`, deliberately. The kind decides
|
|
169
|
+
* whether the body says "waiting for your reply" or "needs attention in the
|
|
170
|
+
* terminal", and an opencode question is answerable *from the app*: it arrives
|
|
171
|
+
* as structured choices (`recordAskUserQuestion` in `./ingest`), so the picker
|
|
172
|
+
* and `commandmate respond <n>` can both close it without a terminal.
|
|
173
|
+
*
|
|
174
|
+
* @param question - The question text, or null when the frame carried none
|
|
175
|
+
* @param askedAt - The frame's `receivedAt`; the wait's identity (see module doc)
|
|
176
|
+
*/
|
|
177
|
+
async function notifyOpencodeQuestionPush(target, instanceId, question, askedAt) {
|
|
178
|
+
try {
|
|
179
|
+
const { notifyPushSubscribers, buildExcerpt } = await loadPushSender();
|
|
180
|
+
const subject = await subjectOf(target, instanceId);
|
|
181
|
+
await notifyPushSubscribers({
|
|
182
|
+
...subject,
|
|
183
|
+
kind: 'prompt',
|
|
184
|
+
// Both halves of "worktree / instance" the Issue asks for: the title is
|
|
185
|
+
// `${worktreeName} (${agentName})`, so naming the instance here is what
|
|
186
|
+
// tells two panes of the same worktree apart.
|
|
187
|
+
agentName: instanceId,
|
|
188
|
+
waitingKind: 'prompt',
|
|
189
|
+
waitingSince: askedAt,
|
|
190
|
+
excerpt: buildExcerpt(question ?? undefined, exports.OPENCODE_PUSH_EXCERPT_LENGTH),
|
|
191
|
+
},
|
|
192
|
+
// The frame's clock, not a fresh reading: `askedAt` is when the human
|
|
193
|
+
// became blocked, and it is what the card's timestamp should say.
|
|
194
|
+
askedAt);
|
|
195
|
+
logger.info('opencode-question-push-sent', {
|
|
196
|
+
worktreeId: target.worktreeId,
|
|
197
|
+
instanceId,
|
|
198
|
+
hasQuestion: question !== null,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
logger.warn('opencode-question-push-failed', {
|
|
203
|
+
worktreeId: target.worktreeId,
|
|
204
|
+
instanceId,
|
|
205
|
+
error: error instanceof Error ? error.message : String(error),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Tell the human's phone that a turn ended in an error.
|
|
211
|
+
*
|
|
212
|
+
* `kind: 'failure'` (#2000), which shares the "you need to act" toggle with
|
|
213
|
+
* `prompt` but keeps its own Service Worker `tag`, so a failure never replaces
|
|
214
|
+
* the card for a question that is still open.
|
|
215
|
+
*
|
|
216
|
+
* The dedup content is the {@link FailureContext.signature}, not the excerpt:
|
|
217
|
+
* `error.data.message` for a retrying provider carries changing detail, while
|
|
218
|
+
* `(session, error name)` is the incident. Two *different* errors in one
|
|
219
|
+
* session therefore both notify, and a repeat of one does not.
|
|
220
|
+
*
|
|
221
|
+
* @param errorName - `properties.error.name`, or null
|
|
222
|
+
* @param message - The human-facing line `./ingest` already extracted
|
|
223
|
+
* (`error.data.message`, falling back to `error.name`)
|
|
224
|
+
* @param sessionId - The opencode session the error belongs to, for the signature
|
|
225
|
+
*/
|
|
226
|
+
async function notifyOpencodeSessionErrorPush(target, instanceId, errorName, message, sessionId, at) {
|
|
227
|
+
if (errorName === exports.OPENCODE_INTERRUPT_ERROR_NAME) {
|
|
228
|
+
logger.info('opencode-error-push-skipped-interrupt', {
|
|
229
|
+
worktreeId: target.worktreeId,
|
|
230
|
+
instanceId,
|
|
231
|
+
errorName,
|
|
232
|
+
});
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const { notifyPushSubscribers, buildExcerpt } = await loadPushSender();
|
|
237
|
+
const subject = await subjectOf(target, instanceId);
|
|
238
|
+
await notifyPushSubscribers({
|
|
239
|
+
...subject,
|
|
240
|
+
kind: 'failure',
|
|
241
|
+
agentName: instanceId,
|
|
242
|
+
excerpt: buildExcerpt(message ?? undefined, exports.OPENCODE_PUSH_EXCERPT_LENGTH),
|
|
243
|
+
failure: {
|
|
244
|
+
reason: 'agent-session-error',
|
|
245
|
+
signature: `opencode:session-error:${sessionId ?? 'unknown'}:${errorName ?? 'unknown'}`,
|
|
246
|
+
},
|
|
247
|
+
}, at);
|
|
248
|
+
logger.info('opencode-error-push-sent', {
|
|
249
|
+
worktreeId: target.worktreeId,
|
|
250
|
+
instanceId,
|
|
251
|
+
errorName,
|
|
252
|
+
sessionId,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
logger.warn('opencode-error-push-failed', {
|
|
257
|
+
worktreeId: target.worktreeId,
|
|
258
|
+
instanceId,
|
|
259
|
+
error: error instanceof Error ? error.message : String(error),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Tell the human that a newer opencode exists.
|
|
265
|
+
*
|
|
266
|
+
* `kind: 'completion'` — the informational bucket. Nothing is blocked and
|
|
267
|
+
* nobody has to act, so this must not ride the toggle a waiting prompt and a
|
|
268
|
+
* failed run share; a reader who opted out of "for information" opted out of
|
|
269
|
+
* this too.
|
|
270
|
+
*
|
|
271
|
+
* The excerpt is the version rather than prose. It is never rendered — the body
|
|
272
|
+
* comes from `updateAvailable` — but `passesDedup` hashes it, so carrying the
|
|
273
|
+
* version there makes the fan-out's own 30 s guard key off *which* update this
|
|
274
|
+
* is instead of off an empty string it would share with a bare completion.
|
|
275
|
+
*
|
|
276
|
+
* Suppressing repeats is the caller's job (`./subscription` remembers the
|
|
277
|
+
* versions it has announced), not this module's: the frame carries **no
|
|
278
|
+
* `sessionID`** — measured against 1.18.22's `GET /doc`, where
|
|
279
|
+
* `EventInstallationUpdate-available.properties` is `{ version }` and nothing
|
|
280
|
+
* else — so "once per session" can only be answered by whoever holds the
|
|
281
|
+
* connection.
|
|
282
|
+
*/
|
|
283
|
+
async function notifyOpencodeUpdateAvailablePush(target, instanceId, version, at) {
|
|
284
|
+
try {
|
|
285
|
+
const { notifyPushSubscribers } = await loadPushSender();
|
|
286
|
+
const subject = await subjectOf(target, instanceId);
|
|
287
|
+
await notifyPushSubscribers({
|
|
288
|
+
...subject,
|
|
289
|
+
kind: 'completion',
|
|
290
|
+
agentName: instanceId,
|
|
291
|
+
excerpt: version,
|
|
292
|
+
updateAvailable: { agent: instanceId, version },
|
|
293
|
+
}, at);
|
|
294
|
+
logger.info('opencode-update-push-sent', {
|
|
295
|
+
worktreeId: target.worktreeId,
|
|
296
|
+
instanceId,
|
|
297
|
+
version,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
logger.warn('opencode-update-push-failed', {
|
|
302
|
+
worktreeId: target.worktreeId,
|
|
303
|
+
instanceId,
|
|
304
|
+
error: error instanceof Error ? error.message : String(error),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|