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,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Learning which opencode session an instance is in, and writing it down before
|
|
4
|
+
* the pane that knows dies (Issue #2038).
|
|
5
|
+
*
|
|
6
|
+
* `./opencode-session-store` persists the answer and `./opencode-session-api`
|
|
7
|
+
* asks the server; this is the part that decides *what the answer is*, which is
|
|
8
|
+
* the only genuinely difficult half.
|
|
9
|
+
*
|
|
10
|
+
* ## Why the id is not simply "the last sessionID CommandMate saw"
|
|
11
|
+
*
|
|
12
|
+
* One opencode server carries several sessions at once and every frame on the
|
|
13
|
+
* stream is tagged with its own `sessionID` — a sub-agent spawned by the `task`
|
|
14
|
+
* tool runs in a session of its own, and its frames arrive on the same
|
|
15
|
+
* connection (#1758 §5.6.1, #1900). `getLastAgentEvent` therefore answers "the
|
|
16
|
+
* last session anything happened in", which after a sub-agent's turn is the
|
|
17
|
+
* sub-agent's. Resuming *that* on the next launch would drop the operator into
|
|
18
|
+
* the middle of a delegated task rather than back into their conversation.
|
|
19
|
+
*
|
|
20
|
+
* `../hooks/sources/opencode/turn-gate` already computes the right answer — its
|
|
21
|
+
* `primarySession()` — but it lives inside one SSE connection's state and is
|
|
22
|
+
* gone the moment the stream closes, which is precisely when this value is
|
|
23
|
+
* needed. So the parentage is re-established from the source that survives:
|
|
24
|
+
* opencode's own `Session.parentID`, read back over HTTP while the server is
|
|
25
|
+
* still up, and followed upwards to the session that has no parent.
|
|
26
|
+
*
|
|
27
|
+
* ## Why this runs at `killSession` rather than on every event
|
|
28
|
+
*
|
|
29
|
+
* Because it can only be *verified* while the server is alive, and `killSession`
|
|
30
|
+
* is the last moment that is true before the launch that wants the answer. The
|
|
31
|
+
* verification is what makes the entry trustworthy: `Session.directory` is
|
|
32
|
+
* opencode's own statement of which worktree the conversation belongs to, and
|
|
33
|
+
* comparing it against the port assignment's worktree is the guard the Issue
|
|
34
|
+
* asks for ("`ports.ts` の worktreePath 照合と同じ守り"). An event-time write
|
|
35
|
+
* could not do any of that — `recordAgentEvent` is synchronous, tool-agnostic,
|
|
36
|
+
* and has no port.
|
|
37
|
+
*
|
|
38
|
+
* The cost is bounded and known: an instance that has completed no turn since
|
|
39
|
+
* this CommandMate process started, and is then killed, records nothing new and
|
|
40
|
+
* keeps whatever the previous kill recorded. That is a resume that is one
|
|
41
|
+
* session stale, not a resume of the wrong worktree — the directory guard still
|
|
42
|
+
* holds — and it is repaired by the next turn.
|
|
43
|
+
*
|
|
44
|
+
* @module lib/session/opencode-session-recall
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.MAX_OPENCODE_PARENT_HOPS = void 0;
|
|
48
|
+
exports.resolveOpencodeRootSession = resolveOpencodeRootSession;
|
|
49
|
+
exports.captureOpencodeSessionMemory = captureOpencodeSessionMemory;
|
|
50
|
+
exports.resolveOpencodeCurrentSessionId = resolveOpencodeCurrentSessionId;
|
|
51
|
+
const logger_1 = require("../../lib/logger");
|
|
52
|
+
const ports_1 = require("../../lib/hooks/sources/opencode/ports");
|
|
53
|
+
const agent_event_state_1 = require("./agent-event-state");
|
|
54
|
+
const opencode_session_api_1 = require("./opencode-session-api");
|
|
55
|
+
const opencode_session_store_1 = require("./opencode-session-store");
|
|
56
|
+
const logger = (0, logger_1.createLogger)('lib/session/opencode-session-recall');
|
|
57
|
+
/**
|
|
58
|
+
* How far up a `parentID` chain to walk before giving up.
|
|
59
|
+
*
|
|
60
|
+
* opencode nests sub-agents, and a cycle would be a server bug rather than an
|
|
61
|
+
* expected shape — but this loop runs inside `killSession`, which is inside the
|
|
62
|
+
* HTTP request that is stopping a session, so it is bounded by a small number
|
|
63
|
+
* rather than by trust. Three is two more hops than anything measured.
|
|
64
|
+
*/
|
|
65
|
+
exports.MAX_OPENCODE_PARENT_HOPS = 3;
|
|
66
|
+
/**
|
|
67
|
+
* Follow `parentID` until the session that has none.
|
|
68
|
+
*
|
|
69
|
+
* @param port - The instance's server port
|
|
70
|
+
* @param sessionId - Where to start
|
|
71
|
+
* @returns The root session, or null when a hop could not be read
|
|
72
|
+
*/
|
|
73
|
+
async function resolveOpencodeRootSession(port, sessionId) {
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
let current = await (0, opencode_session_api_1.fetchOpencodeSession)(port, sessionId);
|
|
76
|
+
for (let hop = 0; hop < exports.MAX_OPENCODE_PARENT_HOPS; hop += 1) {
|
|
77
|
+
if (current === null)
|
|
78
|
+
return null;
|
|
79
|
+
if (current.parentId === null)
|
|
80
|
+
return current;
|
|
81
|
+
if (seen.has(current.parentId))
|
|
82
|
+
return current;
|
|
83
|
+
seen.add(current.parentId);
|
|
84
|
+
logger.debug('opencode-session-parent-hop', { from: current.id, to: current.parentId });
|
|
85
|
+
current = await (0, opencode_session_api_1.fetchOpencodeSession)(port, current.parentId);
|
|
86
|
+
}
|
|
87
|
+
return current;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Write down the session this instance is in, verified against its own server.
|
|
91
|
+
*
|
|
92
|
+
* Call while the pane is still alive — from `OpenCodeTool.killSession`, before
|
|
93
|
+
* the event stream is released and before `/exit` is typed.
|
|
94
|
+
*
|
|
95
|
+
* @param target - The instance whose pane is about to go
|
|
96
|
+
* @returns What was recorded, or why nothing was
|
|
97
|
+
*/
|
|
98
|
+
async function captureOpencodeSessionMemory(target) {
|
|
99
|
+
const instanceId = target.instanceId ?? target.cliToolId;
|
|
100
|
+
const port = (0, ports_1.getAssignedOpencodePort)(target);
|
|
101
|
+
if (port === null)
|
|
102
|
+
return { captured: false, skipped: 'no-port' };
|
|
103
|
+
const observed = (0, agent_event_state_1.getLastAgentEvent)(target.worktreeId, 'opencode', target.instanceId)?.sessionId;
|
|
104
|
+
if (!(0, opencode_session_store_1.isOpencodeSessionId)(observed)) {
|
|
105
|
+
return { captured: false, skipped: 'no-session-observed' };
|
|
106
|
+
}
|
|
107
|
+
const root = await resolveOpencodeRootSession(port, observed);
|
|
108
|
+
if (root === null)
|
|
109
|
+
return { captured: false, skipped: 'session-unreadable' };
|
|
110
|
+
if (root.directory === null)
|
|
111
|
+
return { captured: false, skipped: 'no-directory' };
|
|
112
|
+
// The port assignment is the record of "this instance's pane runs there"
|
|
113
|
+
// (`ports.ts`), so this compares opencode's answer with CommandMate's rather
|
|
114
|
+
// than CommandMate's with its own. Null only when the assignment has already
|
|
115
|
+
// been released, in which case there is nothing to contradict.
|
|
116
|
+
const expected = (0, ports_1.getAssignedOpencodeWorktreePath)(target);
|
|
117
|
+
if (expected !== null && expected !== root.directory) {
|
|
118
|
+
logger.warn('opencode-session-capture-directory-mismatch', {
|
|
119
|
+
worktreeId: target.worktreeId,
|
|
120
|
+
instanceId,
|
|
121
|
+
expected,
|
|
122
|
+
reported: root.directory,
|
|
123
|
+
});
|
|
124
|
+
return { captured: false, skipped: 'directory-mismatch' };
|
|
125
|
+
}
|
|
126
|
+
const written = (0, opencode_session_store_1.rememberOpencodeSession)(target, {
|
|
127
|
+
sessionId: root.id,
|
|
128
|
+
title: root.title,
|
|
129
|
+
worktreePath: root.directory,
|
|
130
|
+
});
|
|
131
|
+
if (!written)
|
|
132
|
+
return { captured: false, skipped: 'not-persisted' };
|
|
133
|
+
logger.info('opencode-session-captured', {
|
|
134
|
+
worktreeId: target.worktreeId,
|
|
135
|
+
instanceId,
|
|
136
|
+
sessionId: root.id,
|
|
137
|
+
viaParentOf: root.id === observed ? null : observed,
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
140
|
+
captured: true,
|
|
141
|
+
memory: {
|
|
142
|
+
sessionId: root.id,
|
|
143
|
+
title: root.title,
|
|
144
|
+
worktreePath: root.directory,
|
|
145
|
+
updatedAt: Date.now(),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The session an operator's action (fork, or a title to display) should act on.
|
|
151
|
+
*
|
|
152
|
+
* Prefers what the live stream has seen — resolved up to its root, so a fork
|
|
153
|
+
* branches the conversation rather than a sub-agent — and falls back to what
|
|
154
|
+
* was persisted when nothing has arrived yet in this process.
|
|
155
|
+
*
|
|
156
|
+
* @param target - The instance
|
|
157
|
+
* @returns The session id, or null when nothing knows
|
|
158
|
+
*/
|
|
159
|
+
async function resolveOpencodeCurrentSessionId(target) {
|
|
160
|
+
const port = (0, ports_1.getAssignedOpencodePort)(target);
|
|
161
|
+
const observed = (0, agent_event_state_1.getLastAgentEvent)(target.worktreeId, 'opencode', target.instanceId)?.sessionId;
|
|
162
|
+
if (port !== null && (0, opencode_session_store_1.isOpencodeSessionId)(observed)) {
|
|
163
|
+
const root = await resolveOpencodeRootSession(port, observed);
|
|
164
|
+
if (root !== null)
|
|
165
|
+
return root.id;
|
|
166
|
+
}
|
|
167
|
+
return (0, opencode_session_store_1.getRememberedOpencodeSession)(target)?.sessionId ?? null;
|
|
168
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The last opencode session an instance was in, so a relaunch can resume it
|
|
4
|
+
* (Issue #2038).
|
|
5
|
+
*
|
|
6
|
+
* opencode is the one supported agent whose conversation is addressable from
|
|
7
|
+
* the command line: `opencode -s <id>` continues a session, `-c` continues the
|
|
8
|
+
* last one and `--fork` branches it (measured on 1.18.22 — the three flags are
|
|
9
|
+
* in `--help`). CommandMate has always known the id — the turn gate reads
|
|
10
|
+
* `properties.sessionID` off every frame — and has always thrown it away, so a
|
|
11
|
+
* `kill-session` followed by a `send` came back on opencode's home screen with
|
|
12
|
+
* the previous conversation unreachable from CommandMate.
|
|
13
|
+
*
|
|
14
|
+
* ## Why a JSON file rather than the database
|
|
15
|
+
*
|
|
16
|
+
* The Issue left the choice open ("`~/.commandmate/opencode-ports.json` と同様の
|
|
17
|
+
* store か DB"). Three properties of the read decide it, and all three are the
|
|
18
|
+
* same ones `../hooks/sources/opencode/ports.ts` records for the *port*:
|
|
19
|
+
*
|
|
20
|
+
* 1. **The reader is the launcher.** `src/lib/cli-tools/opencode.ts` composes
|
|
21
|
+
* the launch command line, and that module is deliberately outside the
|
|
22
|
+
* database's import graph — `./ingest` goes as far as `await import`-ing
|
|
23
|
+
* `@/lib/db` at event time precisely so `better-sqlite3` does not become a
|
|
24
|
+
* dependency of every import of `@/lib/hooks/sources`. Putting the id in
|
|
25
|
+
* the DB would either pull that graph into the launcher or force the launch
|
|
26
|
+
* path to become asynchronous around a dynamic import, for one string.
|
|
27
|
+
* 2. **It is machine-local runtime state about a process, not project data.**
|
|
28
|
+
* A session id means nothing on another machine or under another `HOME`,
|
|
29
|
+
* which is exactly the argument `ports.ts` makes for its own file. The
|
|
30
|
+
* database holds what a worktree *is*; this holds what a pane *was doing*.
|
|
31
|
+
* 3. **It has to outlive the port assignment.** `releaseOpencodeEventStream`
|
|
32
|
+
* calls `forgetOpencodePort` when the pane is killed, so the entry in
|
|
33
|
+
* `opencode-ports.json` is deleted at the exact moment this value becomes
|
|
34
|
+
* interesting. Storing the id as a field on that entry would delete it
|
|
35
|
+
* together with the port; a separate file is what lets the memory survive
|
|
36
|
+
* the kill it exists to survive.
|
|
37
|
+
*
|
|
38
|
+
* So: same shape as `ports.ts`, same `~/.commandmate` directory, same
|
|
39
|
+
* "never throws, a bad file means none" contract, separate lifetime.
|
|
40
|
+
*
|
|
41
|
+
* ## The worktree guard
|
|
42
|
+
*
|
|
43
|
+
* An entry is only usable when the worktree it was recorded for is the worktree
|
|
44
|
+
* being launched, which is `recoverOpencodePort`'s rule applied to a different
|
|
45
|
+
* value. It is not paranoia: sessions belong to opencode's own database rather
|
|
46
|
+
* than to a server, so one `HOME` holds every worktree's sessions at once —
|
|
47
|
+
* measured on 1.18.22, `GET /session` on a server started in directory A
|
|
48
|
+
* returned directory B's sessions too, both under `projectID: "global"`. A
|
|
49
|
+
* mismatched entry (a worktree id reused at a new path, a home directory copied
|
|
50
|
+
* between machines) would therefore resume a *different repository's*
|
|
51
|
+
* conversation into this pane, and opencode would accept it.
|
|
52
|
+
*
|
|
53
|
+
* The recorded path is opencode's own `Session.directory`, read back from the
|
|
54
|
+
* server before the entry is written (see `./opencode-session-recall`), so the
|
|
55
|
+
* two sides of the comparison are the agent's answer and CommandMate's, not two
|
|
56
|
+
* copies of CommandMate's.
|
|
57
|
+
*
|
|
58
|
+
* @module lib/session/opencode-session-store
|
|
59
|
+
*/
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
exports.MAX_OPENCODE_SESSION_TITLE_LENGTH = exports.OPENCODE_SESSION_ID_PATTERN = void 0;
|
|
62
|
+
exports.isOpencodeSessionId = isOpencodeSessionId;
|
|
63
|
+
exports.getOpencodeSessionFilePath = getOpencodeSessionFilePath;
|
|
64
|
+
exports.readPersistedOpencodeSessions = readPersistedOpencodeSessions;
|
|
65
|
+
exports.rememberOpencodeSession = rememberOpencodeSession;
|
|
66
|
+
exports.getRememberedOpencodeSession = getRememberedOpencodeSession;
|
|
67
|
+
exports.forgetOpencodeSession = forgetOpencodeSession;
|
|
68
|
+
exports.recoverOpencodeSessionId = recoverOpencodeSessionId;
|
|
69
|
+
exports.withOpencodeResumedSession = withOpencodeResumedSession;
|
|
70
|
+
exports.resetOpencodeSessionMemories = resetOpencodeSessionMemories;
|
|
71
|
+
const fs_1 = require("fs");
|
|
72
|
+
const os_1 = require("os");
|
|
73
|
+
const path_1 = require("path");
|
|
74
|
+
const safe_directory_1 = require("../../config/safe-directory");
|
|
75
|
+
const auto_yes_state_1 = require("../../lib/auto-yes-state");
|
|
76
|
+
const logger_1 = require("../../lib/logger");
|
|
77
|
+
const logger = (0, logger_1.createLogger)('lib/session/opencode-session-store');
|
|
78
|
+
/**
|
|
79
|
+
* What an opencode session id looks like.
|
|
80
|
+
*
|
|
81
|
+
* `^ses` is the server's own declared pattern (`GET /doc`, 1.18.22, every
|
|
82
|
+
* `sessionID` path parameter). The rest of the class is tightened to
|
|
83
|
+
* alphanumerics because this string is interpolated into a **shell command
|
|
84
|
+
* line** by {@link withOpencodeResumedSession}: a value that reached the pane
|
|
85
|
+
* with a space or a quote in it would be a command injection into the operator's
|
|
86
|
+
* own terminal, and the persisted file is writable by anything running as the
|
|
87
|
+
* user. Anything that does not match is refused rather than escaped, because
|
|
88
|
+
* there is no legitimate id this rejects.
|
|
89
|
+
*/
|
|
90
|
+
exports.OPENCODE_SESSION_ID_PATTERN = /^ses[A-Za-z0-9_-]{1,128}$/;
|
|
91
|
+
/** Whether a string is usable as an opencode session id. */
|
|
92
|
+
function isOpencodeSessionId(value) {
|
|
93
|
+
return typeof value === 'string' && exports.OPENCODE_SESSION_ID_PATTERN.test(value);
|
|
94
|
+
}
|
|
95
|
+
/** Longest title kept. Display only; opencode's own titles are one line. */
|
|
96
|
+
exports.MAX_OPENCODE_SESSION_TITLE_LENGTH = 200;
|
|
97
|
+
const memories = (globalThis.__opencodeSessionMemories ??= new Map());
|
|
98
|
+
function keyOf(target) {
|
|
99
|
+
return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Where the memories are persisted. `CM_OPENCODE_SESSION_FILE` overrides.
|
|
103
|
+
*
|
|
104
|
+
* Guarded exactly as `getOpencodePortFilePath` is (Issue #1774): the write below
|
|
105
|
+
* creates this file's directory with a recursive mkdir, and for a path inside
|
|
106
|
+
* `/proc`, `/sys` or `/dev` that call does not throw — it spins the event loop
|
|
107
|
+
* forever, so the `try/catch` around it never runs. `resolveSafeDirectory`
|
|
108
|
+
* refuses such an override and hands back the default.
|
|
109
|
+
*/
|
|
110
|
+
function getOpencodeSessionFilePath() {
|
|
111
|
+
const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'opencode-sessions.json');
|
|
112
|
+
return (0, safe_directory_1.resolveSafeDirectory)(process.env.CM_OPENCODE_SESSION_FILE, fallback, 'CM_OPENCODE_SESSION_FILE');
|
|
113
|
+
}
|
|
114
|
+
function isMemory(value) {
|
|
115
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
116
|
+
return false;
|
|
117
|
+
const record = value;
|
|
118
|
+
return (isOpencodeSessionId(record.sessionId) &&
|
|
119
|
+
typeof record.worktreePath === 'string' &&
|
|
120
|
+
record.worktreePath.length > 0);
|
|
121
|
+
}
|
|
122
|
+
/** Read the persisted memories. Never throws — a bad file means "none". */
|
|
123
|
+
function readPersistedOpencodeSessions() {
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(getOpencodeSessionFilePath(), 'utf8'));
|
|
126
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
127
|
+
return {};
|
|
128
|
+
const result = {};
|
|
129
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
130
|
+
if (!isMemory(value))
|
|
131
|
+
continue;
|
|
132
|
+
result[key] = {
|
|
133
|
+
sessionId: value.sessionId,
|
|
134
|
+
title: typeof value.title === 'string' ? value.title : null,
|
|
135
|
+
worktreePath: value.worktreePath,
|
|
136
|
+
updatedAt: typeof value.updatedAt === 'number' ? value.updatedAt : 0,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Absent on a first run, unreadable if somebody edited it. Both mean the
|
|
143
|
+
// same thing to a caller: nothing to resume.
|
|
144
|
+
return {};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Write the memories back. Never throws — losing the file costs one resume. */
|
|
148
|
+
function writePersistedOpencodeSessions(all) {
|
|
149
|
+
const path = getOpencodeSessionFilePath();
|
|
150
|
+
try {
|
|
151
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
|
152
|
+
(0, fs_1.writeFileSync)(path, `${JSON.stringify(all, null, 2)}\n`, { mode: 0o600 });
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
logger.warn('opencode-session-file-write-failed', {
|
|
156
|
+
path,
|
|
157
|
+
error: error instanceof Error ? error.message : String(error),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Record what this instance was last talking to.
|
|
163
|
+
*
|
|
164
|
+
* @param target - The instance
|
|
165
|
+
* @param memory - Session id, title and the directory opencode reported for it
|
|
166
|
+
* @returns Whether anything was written — false for an id this module refuses
|
|
167
|
+
*/
|
|
168
|
+
function rememberOpencodeSession(target, memory, at = Date.now()) {
|
|
169
|
+
if (!isOpencodeSessionId(memory.sessionId)) {
|
|
170
|
+
logger.warn('opencode-session-id-rejected', {
|
|
171
|
+
worktreeId: target.worktreeId,
|
|
172
|
+
instanceId: target.instanceId ?? target.cliToolId,
|
|
173
|
+
});
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (memory.worktreePath.length === 0)
|
|
177
|
+
return false;
|
|
178
|
+
const entry = {
|
|
179
|
+
sessionId: memory.sessionId,
|
|
180
|
+
title: typeof memory.title === 'string'
|
|
181
|
+
? memory.title.slice(0, exports.MAX_OPENCODE_SESSION_TITLE_LENGTH)
|
|
182
|
+
: null,
|
|
183
|
+
worktreePath: memory.worktreePath,
|
|
184
|
+
updatedAt: at,
|
|
185
|
+
};
|
|
186
|
+
const key = keyOf(target);
|
|
187
|
+
memories.set(key, entry);
|
|
188
|
+
const all = readPersistedOpencodeSessions();
|
|
189
|
+
all[key] = entry;
|
|
190
|
+
writePersistedOpencodeSessions(all);
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
/** What is remembered for this instance, from memory or from disk. */
|
|
194
|
+
function getRememberedOpencodeSession(target) {
|
|
195
|
+
const key = keyOf(target);
|
|
196
|
+
const live = memories.get(key);
|
|
197
|
+
if (live)
|
|
198
|
+
return live;
|
|
199
|
+
const persisted = readPersistedOpencodeSessions()[key];
|
|
200
|
+
if (!persisted)
|
|
201
|
+
return null;
|
|
202
|
+
memories.set(key, persisted);
|
|
203
|
+
return persisted;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Forget this instance's session.
|
|
207
|
+
*
|
|
208
|
+
* Called when the operator deliberately starts a new one: resuming the session
|
|
209
|
+
* they just walked away from on the next launch would undo the thing they asked
|
|
210
|
+
* for.
|
|
211
|
+
*/
|
|
212
|
+
function forgetOpencodeSession(target) {
|
|
213
|
+
const key = keyOf(target);
|
|
214
|
+
memories.delete(key);
|
|
215
|
+
const all = readPersistedOpencodeSessions();
|
|
216
|
+
if (key in all) {
|
|
217
|
+
delete all[key];
|
|
218
|
+
writePersistedOpencodeSessions(all);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The session id this instance may resume in this worktree, or null.
|
|
223
|
+
*
|
|
224
|
+
* The whole of the acceptance condition "別 worktree に紐づく sessionID は復元に
|
|
225
|
+
* 使われない". A mismatch is logged rather than repaired: the recorded path is
|
|
226
|
+
* what opencode itself said the session lived in, so a difference is a fact
|
|
227
|
+
* about the session, not a normalisation problem.
|
|
228
|
+
*
|
|
229
|
+
* @param target - The instance about to be launched
|
|
230
|
+
* @param worktreePath - The directory the pane will be created in
|
|
231
|
+
*/
|
|
232
|
+
function recoverOpencodeSessionId(target, worktreePath) {
|
|
233
|
+
const memory = getRememberedOpencodeSession(target);
|
|
234
|
+
if (!memory)
|
|
235
|
+
return null;
|
|
236
|
+
if (memory.worktreePath !== worktreePath) {
|
|
237
|
+
logger.info('opencode-session-recovery-path-mismatch', {
|
|
238
|
+
worktreeId: target.worktreeId,
|
|
239
|
+
instanceId: target.instanceId ?? target.cliToolId,
|
|
240
|
+
recorded: memory.worktreePath,
|
|
241
|
+
});
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
if (!isOpencodeSessionId(memory.sessionId))
|
|
245
|
+
return null;
|
|
246
|
+
return memory.sessionId;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Add opencode's resume flag to a launch command line.
|
|
250
|
+
*
|
|
251
|
+
* `-s <id>` rather than `-c`: `--continue` means "the last session in this
|
|
252
|
+
* directory", which on a worktree running two opencode instances is whichever
|
|
253
|
+
* of them spoke most recently — the two panes would fight over one conversation.
|
|
254
|
+
* The id is the only spelling that names the instance's own session.
|
|
255
|
+
*
|
|
256
|
+
* Deliberately a string append rather than a change to `prepareOpencodeLaunch`:
|
|
257
|
+
* the resume flag depends on state (what this instance was doing last time)
|
|
258
|
+
* that the launch *plan* has no business knowing, and every other tool's plan
|
|
259
|
+
* must come out byte-for-byte unchanged (#2038's third acceptance condition).
|
|
260
|
+
*
|
|
261
|
+
* @param commandLine - The rendered launch line, environment prefix included
|
|
262
|
+
* @param sessionId - The session to continue
|
|
263
|
+
* @returns The line with `-s <id>` appended, or the line untouched when the id
|
|
264
|
+
* is not one this module will put in front of a shell
|
|
265
|
+
*/
|
|
266
|
+
function withOpencodeResumedSession(commandLine, sessionId) {
|
|
267
|
+
if (!isOpencodeSessionId(sessionId))
|
|
268
|
+
return commandLine;
|
|
269
|
+
return `${commandLine} -s ${sessionId}`;
|
|
270
|
+
}
|
|
271
|
+
/** Drop every in-memory entry. Test seam; production only ever forgets one. */
|
|
272
|
+
function resetOpencodeSessionMemories() {
|
|
273
|
+
memories.clear();
|
|
274
|
+
}
|
|
@@ -41,12 +41,13 @@
|
|
|
41
41
|
* @module lib/session/provisional-turn
|
|
42
42
|
*/
|
|
43
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.NO_TURN = exports.MAX_EXTERNAL_ID_LENGTH = exports.MAX_PENDING_DECISIONS_PER_TURN = exports.SCRAPER_COMPLETION_POLLS = exports.DIALOG_PENDING_MAX_MS = exports.TURN_STALE_AFTER_MS = exports.TURN_CLOSE_REASONS = exports.TURN_ACTIVITY_EVENTS = void 0;
|
|
44
|
+
exports.NO_TURN = exports.MAX_DECISION_PATTERN_LENGTH = exports.MAX_DECISION_PATTERNS = exports.MAX_EXTERNAL_ID_LENGTH = exports.MAX_PENDING_DECISIONS_PER_TURN = exports.SCRAPER_COMPLETION_POLLS = exports.DIALOG_PENDING_MAX_MS = exports.TURN_STALE_AFTER_MS = exports.TURN_CLOSE_REASONS = exports.TURN_ACTIVITY_EVENTS = void 0;
|
|
45
45
|
exports.derivePublishedTurn = derivePublishedTurn;
|
|
46
46
|
exports.acceptExternalId = acceptExternalId;
|
|
47
47
|
exports.boundDisplayText = boundDisplayText;
|
|
48
48
|
exports.boundDecisionMessage = boundDecisionMessage;
|
|
49
49
|
exports.boundDecisionToolName = boundDecisionToolName;
|
|
50
|
+
exports.boundDecisionPatterns = boundDecisionPatterns;
|
|
50
51
|
exports.isDecisionLive = isDecisionLive;
|
|
51
52
|
exports.isDeliveryExpired = isDeliveryExpired;
|
|
52
53
|
exports.closesTurn = closesTurn;
|
|
@@ -190,6 +191,32 @@ exports.MAX_PENDING_DECISIONS_PER_TURN = 16;
|
|
|
190
191
|
* (`idsDiscarded`) so an operator can see it happened.
|
|
191
192
|
*/
|
|
192
193
|
exports.MAX_EXTERNAL_ID_LENGTH = 128;
|
|
194
|
+
/**
|
|
195
|
+
* How many `patterns` are retained with an approval (Issue #2031).
|
|
196
|
+
*
|
|
197
|
+
* opencode's `permission.asked` carries the rules answering `Allow always`
|
|
198
|
+
* would save. They are worth keeping where `message` and `toolName` are — they
|
|
199
|
+
* are the only statement of what the *durable* verdict grants, and a button
|
|
200
|
+
* that saves a rule without showing it is asking for a decision whose size the
|
|
201
|
+
* user cannot see. They are kept under the same discipline as those two: a
|
|
202
|
+
* count bound and a per-entry length bound, so the record's footprint stays
|
|
203
|
+
* fixed no matter what the agent sent.
|
|
204
|
+
*
|
|
205
|
+
* Eight because the captured approvals carry one (`["/tmp/*"]`) and the shape
|
|
206
|
+
* that produced them is a directory list; a number this far above the observed
|
|
207
|
+
* one is a cap on a runaway, not a display limit somebody has to tune.
|
|
208
|
+
*/
|
|
209
|
+
exports.MAX_DECISION_PATTERNS = 8;
|
|
210
|
+
/**
|
|
211
|
+
* Per-entry bound on a retained pattern (Issue #2031).
|
|
212
|
+
*
|
|
213
|
+
* A glob, not prose, so it is bounded well below {@link
|
|
214
|
+
* MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH}. Truncation is safe here in a way it is
|
|
215
|
+
* NOT for an id (see {@link acceptExternalId}): nothing matches on these — they
|
|
216
|
+
* are displayed — so a shortened pattern misinforms visibly rather than
|
|
217
|
+
* colliding silently with another rule.
|
|
218
|
+
*/
|
|
219
|
+
exports.MAX_DECISION_PATTERN_LENGTH = 200;
|
|
193
220
|
/** Nothing has been reported, so nothing can be said about a turn. */
|
|
194
221
|
exports.NO_TURN = {
|
|
195
222
|
turnId: null,
|
|
@@ -254,6 +281,32 @@ function boundDecisionMessage(raw) {
|
|
|
254
281
|
function boundDecisionToolName(raw) {
|
|
255
282
|
return boundDisplayText(raw, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH);
|
|
256
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Bound the `patterns` of an approval before they are retained (Issue #2031).
|
|
286
|
+
*
|
|
287
|
+
* Both axes, because either one alone leaves the footprint unbounded: a
|
|
288
|
+
* thousand short globs and one enormous glob are the same failure. Non-strings
|
|
289
|
+
* and empty strings are dropped rather than coerced — this list is displayed
|
|
290
|
+
* verbatim next to an `Allow always` button, and `"undefined"` rendered there
|
|
291
|
+
* would be a rule the user believes they are granting.
|
|
292
|
+
*
|
|
293
|
+
* @returns The bounded list, or null when nothing survived — so "the approval
|
|
294
|
+
* named no rules" and "there were none to begin with" are the same value, and
|
|
295
|
+
* a surface can render on presence alone
|
|
296
|
+
*/
|
|
297
|
+
function boundDecisionPatterns(raw) {
|
|
298
|
+
if (!Array.isArray(raw))
|
|
299
|
+
return null;
|
|
300
|
+
const kept = [];
|
|
301
|
+
for (const entry of raw) {
|
|
302
|
+
if (typeof entry !== 'string' || entry === '')
|
|
303
|
+
continue;
|
|
304
|
+
kept.push(entry.slice(0, exports.MAX_DECISION_PATTERN_LENGTH));
|
|
305
|
+
if (kept.length >= exports.MAX_DECISION_PATTERNS)
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
return kept.length > 0 ? kept : null;
|
|
309
|
+
}
|
|
257
310
|
/**
|
|
258
311
|
* Whether this decision is still describing something, at `now`.
|
|
259
312
|
*
|
|
@@ -32,6 +32,7 @@ const response_poller_1 = require("../../lib/polling/response-poller");
|
|
|
32
32
|
const assistant_response_saver_1 = require("../../lib/assistant-response-saver");
|
|
33
33
|
const logger_1 = require("../../lib/logger");
|
|
34
34
|
const prompt_waiting_guard_1 = require("../../lib/session/prompt-waiting-guard");
|
|
35
|
+
const opencode_1 = require("../../lib/cli-tools/opencode");
|
|
35
36
|
const logger = (0, logger_1.createLogger)('session/send-user-message');
|
|
36
37
|
function getErrorMessage(error) {
|
|
37
38
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -130,11 +131,11 @@ async function sendUserMessage(db, params) {
|
|
|
130
131
|
await cliTool.sendMessageWithImage(worktreeId, content, absoluteImagePath, instanceId);
|
|
131
132
|
}
|
|
132
133
|
else {
|
|
133
|
-
// Fallback: embed path in message
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
await cliTool.sendMessage(worktreeId,
|
|
134
|
+
// Fallback: embed path in message. Issue #2035 moved the wording to
|
|
135
|
+
// `@/lib/cli-tools/opencode` so this branch and opencode's own fallback
|
|
136
|
+
// — reached when a pane has no server to attach through — cannot drift
|
|
137
|
+
// apart; the behaviour of this line is unchanged.
|
|
138
|
+
await cliTool.sendMessage(worktreeId, (0, opencode_1.formatImagePathFallbackMessage)(content, absoluteImagePath), instanceId);
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
141
|
else {
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
37
|
exports.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH = exports.STRUCTURED_DECISION_OPTIONS = void 0;
|
|
38
|
+
exports.isAddressableDecision = isAddressableDecision;
|
|
38
39
|
exports.buildStructuredPromptQuestion = buildStructuredPromptQuestion;
|
|
39
40
|
exports.buildStructuredPromptData = buildStructuredPromptData;
|
|
40
41
|
exports.buildStructuredPromptHistoryRecord = buildStructuredPromptHistoryRecord;
|
|
@@ -68,6 +69,26 @@ exports.STRUCTURED_DECISION_OPTIONS = [
|
|
|
68
69
|
];
|
|
69
70
|
/** Bound on the agent's `message`, which is prose and only ever displayed. */
|
|
70
71
|
exports.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH = 500;
|
|
72
|
+
/**
|
|
73
|
+
* Whether an approval id is one a verdict can actually be addressed to
|
|
74
|
+
* (Issue #2031).
|
|
75
|
+
*
|
|
76
|
+
* The reason this is a function and not an `if` at the one call site: the
|
|
77
|
+
* publication condition for {@link STRUCTURED_DECISION_OPTIONS} and the
|
|
78
|
+
* publication condition for `decisionId` have to be the SAME condition, and
|
|
79
|
+
* #1932 is the record of what happens when they are merely intended to be. The
|
|
80
|
+
* receiving end (`components/worktree/prompt-decision-id`) applies exactly this
|
|
81
|
+
* predicate, so a payload the panel would reject as unaddressable can never
|
|
82
|
+
* have been published with buttons in the first place.
|
|
83
|
+
*
|
|
84
|
+
* Deliberately identical to `readPromptDecisionId`'s test — a non-empty string
|
|
85
|
+
* — and no stricter: the id has already been through `acceptExternalId` by the
|
|
86
|
+
* time it reaches a payload, and a second, different notion of validity here
|
|
87
|
+
* would be a way for the two ends to disagree again.
|
|
88
|
+
*/
|
|
89
|
+
function isAddressableDecision(value) {
|
|
90
|
+
return typeof value === 'string' && value !== '';
|
|
91
|
+
}
|
|
71
92
|
/** How each source reads in the one-line question. */
|
|
72
93
|
const SOURCE_LABEL = {
|
|
73
94
|
notification: 'Notification(permission_prompt)',
|
|
@@ -109,10 +130,30 @@ function buildStructuredPromptQuestion(worktreeId, facts) {
|
|
|
109
130
|
}
|
|
110
131
|
if (facts.askUserQuestion) {
|
|
111
132
|
const { question, labels, questionCount } = facts.askUserQuestion;
|
|
133
|
+
// Issue #2100: whether these numbers may be QUOTED is the same test the
|
|
134
|
+
// browser applies before drawing them as buttons — see
|
|
135
|
+
// `components/worktree/prompt-decision-id`'s `readPromptQuestionChoices`:
|
|
136
|
+
// an id to deliver an answer to, exactly one question, and no approval
|
|
137
|
+
// verdicts on the same payload. Claude satisfies none of it (its picker is
|
|
138
|
+
// read off the screen, renumbered, with entries the payload never
|
|
139
|
+
// mentioned), so its sentence is the unchanged warning.
|
|
140
|
+
//
|
|
141
|
+
// This is not a nicety. `promptData.question` is what PromptPanel renders
|
|
142
|
+
// ABOVE the choice buttons, so before this Issue an opencode question
|
|
143
|
+
// showed working numbered buttons under a line telling the reader not to
|
|
144
|
+
// count the list they were numbered from.
|
|
145
|
+
const answerable = isAddressableDecision(facts.decisionId) &&
|
|
146
|
+
questionCount === 1 &&
|
|
147
|
+
!(facts.decisionOptions && facts.decisionOptions.length > 0);
|
|
112
148
|
parts.push(`The agent asked${questionCount > 1 ? ` ${questionCount} questions, the first being` : ''}: ` +
|
|
113
149
|
`"${question}" — offering: ${labels.join(' / ')}. ` +
|
|
114
|
-
|
|
115
|
-
|
|
150
|
+
(answerable
|
|
151
|
+
? `Answer it with \`commandmate respond ${worktreeId} <number>\`: ` +
|
|
152
|
+
labels.map((label, index) => `${index + 1} = ${label}`).join(', ') +
|
|
153
|
+
`. The number is this list's own position and the reply goes to the agent's own ` +
|
|
154
|
+
`API, so no keys are sent to the terminal (the label works too).`
|
|
155
|
+
: `The picker renumbers and adds its own entries, so read the option NUMBER off the ` +
|
|
156
|
+
`terminal rather than counting this list.`));
|
|
116
157
|
}
|
|
117
158
|
return parts.join(' ');
|
|
118
159
|
}
|
|
@@ -130,6 +171,16 @@ function buildStructuredPromptData(worktreeId, facts) {
|
|
|
130
171
|
...(facts.decisionOptions && facts.decisionOptions.length > 0
|
|
131
172
|
? { decisionOptions: facts.decisionOptions }
|
|
132
173
|
: {}),
|
|
174
|
+
// Issue #2031. Unconditional, unlike every field above it: those are prose
|
|
175
|
+
// whose absence and emptiness mean the same thing, while this one answers
|
|
176
|
+
// "is there an approval to address?" and `null` is a real answer. Dropping
|
|
177
|
+
// this line is the mutation `structured-prompt-decision-id-2031` fires at —
|
|
178
|
+
// it puts the payload back to #1932's half-built state, where the panel
|
|
179
|
+
// publishes three verdicts nothing can deliver.
|
|
180
|
+
decisionId: isAddressableDecision(facts.decisionId) ? facts.decisionId : null,
|
|
181
|
+
...(facts.patterns && facts.patterns.length > 0
|
|
182
|
+
? { patterns: [...facts.patterns] }
|
|
183
|
+
: {}),
|
|
133
184
|
};
|
|
134
185
|
}
|
|
135
186
|
/** The prompt-history row for a structured prompt the scraper never saw. */
|