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,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `opencode export --sanitize` — what it actually removes (Issue #2051)
|
|
4
|
+
*
|
|
5
|
+
* The Issue asks for the sanitized export to become an attachment candidate for
|
|
6
|
+
* the daily report and for `/create-pr`. The name `--sanitize` is not evidence
|
|
7
|
+
* that it is safe to attach, so 1.18.22 was measured against a session built to
|
|
8
|
+
* be maximally leaky — a prompt carrying an inline password, and a `read` tool
|
|
9
|
+
* call over a file of key-shaped strings. Both exports were taken and diffed;
|
|
10
|
+
* the full record is `docs/design/opencode-server-live-verification.md` §23.
|
|
11
|
+
*
|
|
12
|
+
* ## What it removes
|
|
13
|
+
*
|
|
14
|
+
* Every field that can carry free text or file content:
|
|
15
|
+
*
|
|
16
|
+
* | Field | Sanitized value |
|
|
17
|
+
* |---|---|
|
|
18
|
+
* | `info.directory` | `[redacted:session-directory:<sessionID>]` |
|
|
19
|
+
* | `info.title` | `[redacted:session-title:<sessionID>]` |
|
|
20
|
+
* | `messages[].info.path.cwd` / `.root` | `[redacted:cwd:<messageID>]` / `[redacted:root:…]` |
|
|
21
|
+
* | `messages[].parts[].text` | `[redacted:text:<partID>]` — **user and assistant alike** |
|
|
22
|
+
* | `messages[].parts[].snapshot` | `[redacted:snapshot:<partID>]` |
|
|
23
|
+
* | `messages[].parts[].state.output` | `[redacted:tool-output:<partID>]` |
|
|
24
|
+
* | `messages[].parts[].state.title` | `[redacted:tool-title:<partID>]` |
|
|
25
|
+
* | `messages[].parts[].state.input` | replaced by `{ redacted: "tool-input:<partID>" }` |
|
|
26
|
+
* | `messages[].parts[].state.metadata` | replaced by `{ redacted: "tool-state-metadata:<partID>" }` |
|
|
27
|
+
* | `messages[].parts[].metadata` | replaced by `{ redacted: "tool-metadata:<partID>" }` |
|
|
28
|
+
*
|
|
29
|
+
* Verified by counting needles: the inline password, the four key-shaped
|
|
30
|
+
* strings, the read file's name, the operator's username and every path segment
|
|
31
|
+
* appeared 3–8 times each in the plain export and **zero** times in the
|
|
32
|
+
* sanitized one.
|
|
33
|
+
*
|
|
34
|
+
* ## What it keeps — and why that is the interesting half
|
|
35
|
+
*
|
|
36
|
+
* Ids (session / message / part / `callID`), `slug`, `projectID`, `path`,
|
|
37
|
+
* `agent`, `model.id`, `model.providerID`, `model.variant`, `version`, every
|
|
38
|
+
* timestamp, every token count, every cost, `finish` reasons, `state.status`,
|
|
39
|
+
* each part's `type`, the diff `summary` counts — and **the tool names**
|
|
40
|
+
* (`"read"`), which are not redacted.
|
|
41
|
+
*
|
|
42
|
+
* The consequence worth stating plainly: **a sanitized export contains no
|
|
43
|
+
* conversation at all.** It is not a redacted transcript, it is a metrics and
|
|
44
|
+
* shape document — how many turns, which tools ran, what it cost, how long it
|
|
45
|
+
* took. That is a genuinely useful thing to hang off a daily report or a PR, but
|
|
46
|
+
* it is not the thing "attach the transcript" suggests, so
|
|
47
|
+
* {@link summarizeOpencodeExport} reduces it to exactly those facts rather than
|
|
48
|
+
* pretending the JSON is readable.
|
|
49
|
+
*
|
|
50
|
+
* Two kept fields needed a judgement call, since the Issue asks for one:
|
|
51
|
+
*
|
|
52
|
+
* - **`projectID`** is a hash derived from the session's absolute directory
|
|
53
|
+
* (`44b7340824bf…` for the measured path). It is not reversible, but it is a
|
|
54
|
+
* stable fingerprint of a path, so two exports from the same checkout can be
|
|
55
|
+
* linked. For a daily report and a PR body — both of which already name the
|
|
56
|
+
* repository — that is not a disclosure, and it is kept.
|
|
57
|
+
* - **Tool names** reveal the shape of the work (`read`, `bash`, `edit`). Same
|
|
58
|
+
* judgement, same reason, and they are most of the value in the summary.
|
|
59
|
+
*
|
|
60
|
+
* ## Why {@link auditOpencodeExportRedaction} exists
|
|
61
|
+
*
|
|
62
|
+
* "It is called sanitize" is not a guarantee that `--sanitize` was passed, that
|
|
63
|
+
* this opencode release still redacts the same fields, or that the bytes on
|
|
64
|
+
* hand came from that command at all. Every path measured above is checked
|
|
65
|
+
* before anything is attached, and an export that fails the audit is dropped
|
|
66
|
+
* rather than published. A later release that stops redacting a field turns
|
|
67
|
+
* into a missing section, which is the failure worth having.
|
|
68
|
+
*/
|
|
69
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
|
+
exports.OPENCODE_EXPORT_SENSITIVE_KEYS = exports.OPENCODE_REDACTION_PREFIX = void 0;
|
|
71
|
+
exports.auditOpencodeExportRedaction = auditOpencodeExportRedaction;
|
|
72
|
+
exports.summarizeOpencodeExport = summarizeOpencodeExport;
|
|
73
|
+
/** The prefix every scalar redaction token measured on 1.18.22 begins with. */
|
|
74
|
+
exports.OPENCODE_REDACTION_PREFIX = '[redacted:';
|
|
75
|
+
/**
|
|
76
|
+
* Keys whose value must be redacted in a `--sanitize` export.
|
|
77
|
+
*
|
|
78
|
+
* Every one was observed carrying either free text or a filesystem path in the
|
|
79
|
+
* plain export of the same session. `input` and `metadata` are here because
|
|
80
|
+
* `--sanitize` replaces the whole object rather than its leaves.
|
|
81
|
+
*/
|
|
82
|
+
exports.OPENCODE_EXPORT_SENSITIVE_KEYS = [
|
|
83
|
+
'directory',
|
|
84
|
+
'title',
|
|
85
|
+
'cwd',
|
|
86
|
+
'root',
|
|
87
|
+
'text',
|
|
88
|
+
'snapshot',
|
|
89
|
+
'output',
|
|
90
|
+
'input',
|
|
91
|
+
'metadata',
|
|
92
|
+
];
|
|
93
|
+
function isRedactedScalar(value) {
|
|
94
|
+
return typeof value === 'string' && value.startsWith(exports.OPENCODE_REDACTION_PREFIX);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Whether a value is the `{ redacted: "…" }` stand-in `--sanitize` substitutes
|
|
98
|
+
* for `state.input`, `state.metadata` and `parts[].metadata`.
|
|
99
|
+
*/
|
|
100
|
+
function isRedactedObject(value) {
|
|
101
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
102
|
+
return false;
|
|
103
|
+
const keys = Object.keys(value);
|
|
104
|
+
return keys.length === 1 && keys[0] === 'redacted';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check every measured-sensitive field of a parsed export.
|
|
108
|
+
*
|
|
109
|
+
* Absent, `null` and empty-string values pass: a part with no text simply has
|
|
110
|
+
* none, and `--sanitize` leaves those alone rather than inventing a token for
|
|
111
|
+
* them. Numbers and booleans pass for the same reason — `truncated: false` is
|
|
112
|
+
* not a disclosure. What fails is a non-empty string that is not a redaction
|
|
113
|
+
* token, and an object standing where `--sanitize` would have put its
|
|
114
|
+
* `{ redacted }` stand-in.
|
|
115
|
+
*
|
|
116
|
+
* @param document - A parsed `opencode export` body (either variety)
|
|
117
|
+
* @returns Every field still readable. Empty means the document is redacted to
|
|
118
|
+
* the extent 1.18.22 was measured to redact it
|
|
119
|
+
*/
|
|
120
|
+
function auditOpencodeExportRedaction(document) {
|
|
121
|
+
const leaks = [];
|
|
122
|
+
const sensitive = new Set(exports.OPENCODE_EXPORT_SENSITIVE_KEYS);
|
|
123
|
+
const walk = (node, path) => {
|
|
124
|
+
if (Array.isArray(node)) {
|
|
125
|
+
node.forEach((item, index) => walk(item, `${path}[${index}]`));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (typeof node !== 'object' || node === null)
|
|
129
|
+
return;
|
|
130
|
+
for (const [key, value] of Object.entries(node)) {
|
|
131
|
+
const childPath = path === '' ? key : `${path}.${key}`;
|
|
132
|
+
if (sensitive.has(key)) {
|
|
133
|
+
if (value === null || value === undefined || value === '')
|
|
134
|
+
continue;
|
|
135
|
+
if (isRedactedScalar(value) || isRedactedObject(value))
|
|
136
|
+
continue;
|
|
137
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
138
|
+
continue;
|
|
139
|
+
leaks.push({
|
|
140
|
+
path: childPath,
|
|
141
|
+
kind: typeof value === 'string' ? 'plaintext' : 'unredacted-object',
|
|
142
|
+
});
|
|
143
|
+
// Not descending: the whole subtree is suspect, and one entry per
|
|
144
|
+
// offending field reads better than one per leaf beneath it.
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
walk(value, childPath);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
walk(document, '');
|
|
151
|
+
return leaks;
|
|
152
|
+
}
|
|
153
|
+
function readNumber(source, key) {
|
|
154
|
+
const value = source[key];
|
|
155
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
156
|
+
}
|
|
157
|
+
function readString(source, key) {
|
|
158
|
+
const value = source[key];
|
|
159
|
+
return typeof value === 'string' && value !== '' ? value : null;
|
|
160
|
+
}
|
|
161
|
+
function asRecord(value) {
|
|
162
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
163
|
+
? value
|
|
164
|
+
: null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Reduce a sanitized export to the facts it still carries.
|
|
168
|
+
*
|
|
169
|
+
* Reads defensively throughout: this parses the output of another program's
|
|
170
|
+
* `--sanitize` path, and a release that renames a field should cost the report
|
|
171
|
+
* that field rather than throw inside a summary generator.
|
|
172
|
+
*
|
|
173
|
+
* @param document - A parsed `opencode export --sanitize` body
|
|
174
|
+
* @returns The summary, or null when the document has no `info` object at all
|
|
175
|
+
*/
|
|
176
|
+
function summarizeOpencodeExport(document) {
|
|
177
|
+
const root = asRecord(document);
|
|
178
|
+
if (root === null)
|
|
179
|
+
return null;
|
|
180
|
+
const info = asRecord(root.info);
|
|
181
|
+
if (info === null)
|
|
182
|
+
return null;
|
|
183
|
+
const model = asRecord(info.model);
|
|
184
|
+
const providerId = model === null ? null : readString(model, 'providerID');
|
|
185
|
+
const modelId = model === null ? null : readString(model, 'id');
|
|
186
|
+
const time = asRecord(info.time);
|
|
187
|
+
let userMessages = 0;
|
|
188
|
+
let assistantMessages = 0;
|
|
189
|
+
let toolCalls = 0;
|
|
190
|
+
const tools = new Set();
|
|
191
|
+
const messages = Array.isArray(root.messages) ? root.messages : [];
|
|
192
|
+
for (const entry of messages) {
|
|
193
|
+
const message = asRecord(entry);
|
|
194
|
+
if (message === null)
|
|
195
|
+
continue;
|
|
196
|
+
const messageInfo = asRecord(message.info);
|
|
197
|
+
const role = messageInfo === null ? null : readString(messageInfo, 'role');
|
|
198
|
+
if (role === 'user')
|
|
199
|
+
userMessages += 1;
|
|
200
|
+
else if (role === 'assistant')
|
|
201
|
+
assistantMessages += 1;
|
|
202
|
+
const parts = Array.isArray(message.parts) ? message.parts : [];
|
|
203
|
+
for (const rawPart of parts) {
|
|
204
|
+
const part = asRecord(rawPart);
|
|
205
|
+
if (part === null)
|
|
206
|
+
continue;
|
|
207
|
+
if (readString(part, 'type') !== 'tool')
|
|
208
|
+
continue;
|
|
209
|
+
toolCalls += 1;
|
|
210
|
+
const tool = readString(part, 'tool');
|
|
211
|
+
if (tool !== null)
|
|
212
|
+
tools.add(tool);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
sessionId: readString(info, 'id'),
|
|
217
|
+
agent: readString(info, 'agent'),
|
|
218
|
+
model: providerId !== null && modelId !== null ? `${providerId}/${modelId}` : modelId,
|
|
219
|
+
version: readString(info, 'version'),
|
|
220
|
+
cost: readNumber(info, 'cost'),
|
|
221
|
+
userMessages,
|
|
222
|
+
assistantMessages,
|
|
223
|
+
tools: [...tools].sort(),
|
|
224
|
+
toolCalls,
|
|
225
|
+
createdAt: time === null ? null : readNumber(time, 'created'),
|
|
226
|
+
updatedAt: time === null ? null : readNumber(time, 'updated'),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* What one opencode instance should be launched and prompted with (Issue #2048).
|
|
4
|
+
*
|
|
5
|
+
* Three values the operator chooses per agent instance — the persona, the model
|
|
6
|
+
* and the model's variant — and the vocabulary the settings UI, the API route,
|
|
7
|
+
* the database and the launcher all speak. It lives in `src/types` rather than
|
|
8
|
+
* beside the launcher because the settings pane is a `'use client'` component:
|
|
9
|
+
* anything it imports must not drag `fs` / `better-sqlite3` into the bundle.
|
|
10
|
+
*
|
|
11
|
+
* ## What each field can actually do, measured
|
|
12
|
+
*
|
|
13
|
+
* All three were measured against opencode **1.18.22** in an isolated `HOME`
|
|
14
|
+
* (`docs/design/opencode-server-live-verification.md` §20), and they are **not**
|
|
15
|
+
* interchangeable:
|
|
16
|
+
*
|
|
17
|
+
* | field | TUI launch flag | `prompt_async` body | reported back on |
|
|
18
|
+
* |-------------|------------------------|---------------------|------------------|
|
|
19
|
+
* | {@link agent} | `--agent <name>` ✅ | `agent` ✅ | `message.updated.info.agent`, `Session.agent` |
|
|
20
|
+
* | provider/model | `-m <p>/<m>` ✅ | `model` ✅ | `info.modelID` / `info.providerID` |
|
|
21
|
+
* | {@link variant} | **none** ❌ | `variant` ✅ | `info.variant`, `Session.model.variant` |
|
|
22
|
+
*
|
|
23
|
+
* The empty cell is the one that matters. `--variant` exists on `opencode run`
|
|
24
|
+
* and **not** on the TUI: passing it to the TUI makes opencode print its usage
|
|
25
|
+
* and exit, so a launch line that carried it would leave the pane with no agent
|
|
26
|
+
* in it at all. `"agent": { "plan": { "variant": "high" } }` in `opencode.jsonc`
|
|
27
|
+
* was measured too and did not reach the turn either (`info.variant` absent). So
|
|
28
|
+
* the variant is applied where opencode does accept it — on the prompt this
|
|
29
|
+
* server posts — and the launch line never carries it.
|
|
30
|
+
*
|
|
31
|
+
* ## Why every value is pattern-checked rather than escaped
|
|
32
|
+
*
|
|
33
|
+
* `agent` and `provider`/`model` are interpolated into a **shell command line**
|
|
34
|
+
* by `prepareOpencodeLaunch`. The same argument `OPENCODE_SESSION_ID_PATTERN`
|
|
35
|
+
* makes applies verbatim: a value that reached the pane with a space or a quote
|
|
36
|
+
* in it would be a command injection into the operator's own terminal, and these
|
|
37
|
+
* values arrive over HTTP. Anything that does not match is refused, because
|
|
38
|
+
* there is no legitimate opencode id these patterns reject — the four providers
|
|
39
|
+
* measured publish ids like `claude-sonnet-4.6`, `qwen/qwen3-coder-30b` and
|
|
40
|
+
* `deepseek-v4-flash:0731`, which is where `/` and `:` come from.
|
|
41
|
+
*
|
|
42
|
+
* @module types/opencode-instance-settings
|
|
43
|
+
*/
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.EMPTY_OPENCODE_LAUNCH_CATALOG = exports.EMPTY_OPENCODE_INSTANCE_SETTINGS = exports.OPENCODE_VARIANT_PATTERN = exports.OPENCODE_MODEL_ID_PATTERN = exports.OPENCODE_PROVIDER_ID_PATTERN = exports.OPENCODE_AGENT_NAME_PATTERN = void 0;
|
|
46
|
+
exports.hasOpencodeInstanceSettings = hasOpencodeInstanceSettings;
|
|
47
|
+
exports.normalizeOpencodeInstanceSettings = normalizeOpencodeInstanceSettings;
|
|
48
|
+
exports.opencodeModelReference = opencodeModelReference;
|
|
49
|
+
/**
|
|
50
|
+
* An opencode agent (persona) name, e.g. `build` / `plan`.
|
|
51
|
+
*
|
|
52
|
+
* `GET /agent` answered seven on a stock 1.18.22 install and every name was
|
|
53
|
+
* lower-case alphanumeric; the class is widened to `._-` for the user-defined
|
|
54
|
+
* agents an operator can add to their config, and no further.
|
|
55
|
+
*/
|
|
56
|
+
exports.OPENCODE_AGENT_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
57
|
+
/** A provider id, e.g. `github-copilot` / `ollama-cloud` / `opencode`. */
|
|
58
|
+
exports.OPENCODE_PROVIDER_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
59
|
+
/**
|
|
60
|
+
* A model id, e.g. `claude-sonnet-4.6` / `qwen/qwen3-coder-30b` /
|
|
61
|
+
* `deepseek-v4-flash:0731`.
|
|
62
|
+
*
|
|
63
|
+
* `/` and `:` are in the class because measured ids contain them — LMStudio
|
|
64
|
+
* publishes `org/model` and Ollama Cloud publishes `model:tag`. Neither is a
|
|
65
|
+
* shell metacharacter, so widening the class here does not widen what can reach
|
|
66
|
+
* the command line.
|
|
67
|
+
*/
|
|
68
|
+
exports.OPENCODE_MODEL_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/;
|
|
69
|
+
/**
|
|
70
|
+
* A model variant, e.g. `low` / `medium` / `high` / `max` / `minimal` / `none` /
|
|
71
|
+
* `xhigh`.
|
|
72
|
+
*
|
|
73
|
+
* Not an enum: the names come from each model's own `variants` map in
|
|
74
|
+
* `GET /config/providers`, and the seven above are simply the ones the measured
|
|
75
|
+
* catalogue happened to contain. opencode does not validate the value either —
|
|
76
|
+
* a variant of `totally-not-a-variant` was accepted with `204` and echoed back
|
|
77
|
+
* verbatim on `message.updated.info.variant` (§20.6) — so this pattern is a
|
|
78
|
+
* bound on what this server will store and send, not a claim about what is real.
|
|
79
|
+
*/
|
|
80
|
+
exports.OPENCODE_VARIANT_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/;
|
|
81
|
+
/** The all-unset settings object. Frozen so a caller cannot mutate the default. */
|
|
82
|
+
exports.EMPTY_OPENCODE_INSTANCE_SETTINGS = Object.freeze({ agent: null, providerId: null, modelId: null, variant: null });
|
|
83
|
+
/** Whether anything at all is configured. */
|
|
84
|
+
function hasOpencodeInstanceSettings(settings) {
|
|
85
|
+
if (!settings)
|
|
86
|
+
return false;
|
|
87
|
+
return Boolean(settings.agent || settings.providerId || settings.modelId || settings.variant);
|
|
88
|
+
}
|
|
89
|
+
/** One value, checked against its pattern; anything else becomes null. */
|
|
90
|
+
function acceptToken(value, pattern) {
|
|
91
|
+
if (typeof value !== 'string')
|
|
92
|
+
return null;
|
|
93
|
+
const trimmed = value.trim();
|
|
94
|
+
if (trimmed.length === 0)
|
|
95
|
+
return null;
|
|
96
|
+
return pattern.test(trimmed) ? trimmed : null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Coerce an untrusted value into settings, dropping anything unusable.
|
|
100
|
+
*
|
|
101
|
+
* Field-by-field rather than all-or-nothing: a stored row written by a newer
|
|
102
|
+
* build, or a request body with one bad field, still yields the settings that
|
|
103
|
+
* *are* valid instead of silently reverting the instance to opencode's defaults.
|
|
104
|
+
*
|
|
105
|
+
* `providerId` and `modelId` are the one pair that stands or falls together —
|
|
106
|
+
* `-m` takes `provider/model` and half of that is not a model reference — so a
|
|
107
|
+
* lone half of the pair is dropped.
|
|
108
|
+
*/
|
|
109
|
+
function normalizeOpencodeInstanceSettings(input) {
|
|
110
|
+
if (typeof input !== 'object' || input === null) {
|
|
111
|
+
return { ...exports.EMPTY_OPENCODE_INSTANCE_SETTINGS };
|
|
112
|
+
}
|
|
113
|
+
const raw = input;
|
|
114
|
+
const providerId = acceptToken(raw.providerId, exports.OPENCODE_PROVIDER_ID_PATTERN);
|
|
115
|
+
const modelId = acceptToken(raw.modelId, exports.OPENCODE_MODEL_ID_PATTERN);
|
|
116
|
+
const paired = providerId !== null && modelId !== null;
|
|
117
|
+
return {
|
|
118
|
+
agent: acceptToken(raw.agent, exports.OPENCODE_AGENT_NAME_PATTERN),
|
|
119
|
+
providerId: paired ? providerId : null,
|
|
120
|
+
modelId: paired ? modelId : null,
|
|
121
|
+
variant: acceptToken(raw.variant, exports.OPENCODE_VARIANT_PATTERN),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* `provider/model`, or null when the pair is not set.
|
|
126
|
+
*
|
|
127
|
+
* The spelling `-m` takes and the spelling `opencode models` prints, in one
|
|
128
|
+
* place so the launch line and the settings pane cannot disagree about it.
|
|
129
|
+
*/
|
|
130
|
+
function opencodeModelReference(settings) {
|
|
131
|
+
if (!settings?.providerId || !settings.modelId)
|
|
132
|
+
return null;
|
|
133
|
+
return `${settings.providerId}/${settings.modelId}`;
|
|
134
|
+
}
|
|
135
|
+
/** The empty catalogue — what a disconnected worktree answers. */
|
|
136
|
+
exports.EMPTY_OPENCODE_LAUNCH_CATALOG = {
|
|
137
|
+
connected: false,
|
|
138
|
+
providers: [],
|
|
139
|
+
agents: [],
|
|
140
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* opencode session sharing — the config gate and the URL shape (Issue #2051)
|
|
4
|
+
*
|
|
5
|
+
* `POST /session/:id/share` publishes a conversation to opencode's own hosting
|
|
6
|
+
* under the operator's credentials, and the page it produces is readable by
|
|
7
|
+
* anyone who has the link. This module holds the two facts the rest of the app
|
|
8
|
+
* needs in order to decide whether that button may be offered at all, and both
|
|
9
|
+
* were measured against opencode 1.18.22 rather than read off the Issue —
|
|
10
|
+
* `docs/design/opencode-server-live-verification.md` §23.
|
|
11
|
+
*
|
|
12
|
+
* ## The gate is `share === 'disabled'`, and nothing else
|
|
13
|
+
*
|
|
14
|
+
* `GET /config` echoes a `share` key **only when the operator set one**. The
|
|
15
|
+
* OpenAPI `Config.share` schema is `enum: ["manual", "auto", "disabled"]`, and a
|
|
16
|
+
* server whose config file has no `share` key answers with the key **absent** —
|
|
17
|
+
* measured, not inferred. So `undefined` is *unset*, which is not the same
|
|
18
|
+
* answer as `"disabled"`, and treating the two alike would hide the button on
|
|
19
|
+
* every default installation.
|
|
20
|
+
*
|
|
21
|
+
* The reason this gate has to exist client-side at all is that the server does
|
|
22
|
+
* not offer a usable one. With `share: "disabled"` configured, `POST /share`
|
|
23
|
+
* answers **HTTP 500** with `{"name":"UnknownError","data":{"message":
|
|
24
|
+
* "Unexpected server error. Check server logs for details.","ref":"err_…"}}`.
|
|
25
|
+
* The real reason (`Error: Sharing is disabled in configuration`) appears only
|
|
26
|
+
* in the server's own log, and the response carries no code that tells it apart
|
|
27
|
+
* from any other 500. A caller cannot ask forgiveness here, only permission.
|
|
28
|
+
*
|
|
29
|
+
* ## What the returned URL looks like
|
|
30
|
+
*
|
|
31
|
+
* Measured: `https://opncd.ai/share/<last 8 characters of the session id>` —
|
|
32
|
+
* for `ses_fc35f3dadffe2uirJpjJBtxFhy`, `https://opncd.ai/share/jJBtxFhy`. The
|
|
33
|
+
* Issue body says `opncd.ai/s/<id>`; that spelling does not exist on 1.18.22.
|
|
34
|
+
* Nothing here hard-codes the host, because the server is the authority on the
|
|
35
|
+
* URL it minted and a later release may move it; the only requirement enforced
|
|
36
|
+
* is that it be an absolute `https:` URL, so that a malformed body cannot turn
|
|
37
|
+
* into a link the UI would render.
|
|
38
|
+
*
|
|
39
|
+
* ## Why `session.share` is not "is it shared right now"
|
|
40
|
+
*
|
|
41
|
+
* `DELETE /session/:id/share` really does take the page down (the public URL
|
|
42
|
+
* then renders opencode's own "Not Found" view), but the session record
|
|
43
|
+
* **keeps** its `share: { url }` afterwards — measured, and it survives a server
|
|
44
|
+
* restart, so it is persisted rather than cached. `session.share` therefore
|
|
45
|
+
* means *this session was published at some point*, and a UI that reads it as
|
|
46
|
+
* current state will report a revoked session as still shared for ever.
|
|
47
|
+
*/
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.OPENCODE_SHARE_MODES = void 0;
|
|
50
|
+
exports.readOpencodeShareMode = readOpencodeShareMode;
|
|
51
|
+
exports.isOpencodeSharingDisabled = isOpencodeSharingDisabled;
|
|
52
|
+
exports.readOpencodeShareUrl = readOpencodeShareUrl;
|
|
53
|
+
/** The values opencode's `Config.share` accepts, from its own OpenAPI. */
|
|
54
|
+
exports.OPENCODE_SHARE_MODES = ['manual', 'auto', 'disabled'];
|
|
55
|
+
/**
|
|
56
|
+
* The `share` setting a `GET /config` body declares.
|
|
57
|
+
*
|
|
58
|
+
* @param config - A parsed `GET /config` body
|
|
59
|
+
* @returns The configured mode, or `null` when the key is absent or is a word
|
|
60
|
+
* this opencode release added and this build does not know. `null` is *not*
|
|
61
|
+
* `'disabled'`; see the module comment
|
|
62
|
+
*/
|
|
63
|
+
function readOpencodeShareMode(config) {
|
|
64
|
+
if (typeof config !== 'object' || config === null || Array.isArray(config))
|
|
65
|
+
return null;
|
|
66
|
+
const value = config.share;
|
|
67
|
+
if (typeof value !== 'string')
|
|
68
|
+
return null;
|
|
69
|
+
return exports.OPENCODE_SHARE_MODES.includes(value)
|
|
70
|
+
? value
|
|
71
|
+
: null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Whether this server would refuse to publish.
|
|
75
|
+
*
|
|
76
|
+
* Deliberately positive only for the one measured refusal. An unreadable
|
|
77
|
+
* config, an unreachable server and an unset key all answer `false` here, which
|
|
78
|
+
* lets the operator try; the failure they get back is a plain error, whereas a
|
|
79
|
+
* button that silently never appears is a feature that looks broken.
|
|
80
|
+
*
|
|
81
|
+
* @param mode - From {@link readOpencodeShareMode}
|
|
82
|
+
*/
|
|
83
|
+
function isOpencodeSharingDisabled(mode) {
|
|
84
|
+
return mode === 'disabled';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The share URL a `Session` body carries, if it carries a usable one.
|
|
88
|
+
*
|
|
89
|
+
* @param session - A parsed `Session` body, e.g. from `POST /session/:id/share`
|
|
90
|
+
* @returns An absolute `https:` URL, or null
|
|
91
|
+
*/
|
|
92
|
+
function readOpencodeShareUrl(session) {
|
|
93
|
+
if (typeof session !== 'object' || session === null || Array.isArray(session))
|
|
94
|
+
return null;
|
|
95
|
+
const share = session.share;
|
|
96
|
+
if (typeof share !== 'object' || share === null || Array.isArray(share))
|
|
97
|
+
return null;
|
|
98
|
+
const url = share.url;
|
|
99
|
+
if (typeof url !== 'string' || url === '')
|
|
100
|
+
return null;
|
|
101
|
+
// An absolute https URL or nothing: a relative or `javascript:` value reaching
|
|
102
|
+
// an anchor's href is the one way a malformed body becomes a UI defect.
|
|
103
|
+
let parsed;
|
|
104
|
+
try {
|
|
105
|
+
parsed = new URL(url);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return parsed.protocol === 'https:' ? url : null;
|
|
111
|
+
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* Values only — no tmux process access — so this module is safe from any layer.
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.NAVIGATION_KEY_VALUES = void 0;
|
|
22
|
+
exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.NAVIGATION_KEY_VALUES = void 0;
|
|
23
23
|
/**
|
|
24
24
|
* Navigation keys accepted by the special-keys API and the terminal UI.
|
|
25
25
|
*
|
|
@@ -35,3 +35,71 @@ exports.NAVIGATION_KEY_VALUES = [
|
|
|
35
35
|
// 'q' is the pager quit key (literal char). PageUp/PageDown/Home/End are tmux named keys.
|
|
36
36
|
'PageUp', 'PageDown', 'Home', 'End', 'q',
|
|
37
37
|
];
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Per-tool vocabularies (Issue #2046)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
/**
|
|
42
|
+
* opencode's leader prefix — the first half of a two-step chord.
|
|
43
|
+
*
|
|
44
|
+
* Measured, not assumed: opencode 1.18.22 ships `leader: "ctrl+x"` and
|
|
45
|
+
* `leader_timeout: 2000` as the defaults in its own binary, and a live TUI on a
|
|
46
|
+
* private tmux socket answered `C-x` + one letter at the 100 ms
|
|
47
|
+
* `SPECIAL_KEY_DELAY_MS` the transport already sends multi-key requests with
|
|
48
|
+
* (3/3 on `C-x` `a`). See `docs/design/opencode-server-live-verification.md` §22.
|
|
49
|
+
*/
|
|
50
|
+
exports.OPENCODE_LEADER_KEY = 'C-x';
|
|
51
|
+
/**
|
|
52
|
+
* The letters that complete an opencode leader chord, in the order the quick-key
|
|
53
|
+
* strip renders them.
|
|
54
|
+
*
|
|
55
|
+
* These are LITERAL characters, not tmux key names — `tmux send-keys -- a` puts
|
|
56
|
+
* an `a` through, exactly as `q` has done for the codex pager since #1017. The
|
|
57
|
+
* one thing that makes them safe to hand to `tmux send-keys` is that they are
|
|
58
|
+
* fixed single characters chosen here, delivered through `execFile` and never a
|
|
59
|
+
* shell; the one thing that makes them safe to hand to *opencode* is that the
|
|
60
|
+
* route only accepts them for a tool that declares them (see
|
|
61
|
+
* `ICLITool.navigationKeys()`), so an `a` can never reach claude's composer.
|
|
62
|
+
*
|
|
63
|
+
* **`b` (`sidebar_toggle`) is deliberately absent.** It is a real opencode
|
|
64
|
+
* binding and it is the one this Issue measured and refused: §22.3.
|
|
65
|
+
*/
|
|
66
|
+
exports.OPENCODE_LEADER_CHORD_VALUES = [
|
|
67
|
+
'a', 'l', 'n', 't', 'm', 'g', 'u', 'r', 'c',
|
|
68
|
+
];
|
|
69
|
+
/**
|
|
70
|
+
* opencode keys that need no leader.
|
|
71
|
+
*
|
|
72
|
+
* `C-p` opens the command palette (opencode prints `ctrl+p commands` in its own
|
|
73
|
+
* footer) and `C-t` cycles the model variant — both confirmed live on 1.18.22.
|
|
74
|
+
* `Tab` / `BTab` cycle the agent and are already in {@link NAVIGATION_KEY_VALUES}.
|
|
75
|
+
*/
|
|
76
|
+
exports.OPENCODE_DIRECT_KEY_VALUES = ['C-p', 'C-t'];
|
|
77
|
+
/**
|
|
78
|
+
* Everything an opencode pane may be sent — the base navigation pad plus this
|
|
79
|
+
* tool's own chords. Returned by `OpenCodeTool.navigationKeys()`.
|
|
80
|
+
*/
|
|
81
|
+
exports.OPENCODE_NAVIGATION_KEY_VALUES = [
|
|
82
|
+
...exports.NAVIGATION_KEY_VALUES,
|
|
83
|
+
exports.OPENCODE_LEADER_KEY,
|
|
84
|
+
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
85
|
+
...exports.OPENCODE_LEADER_CHORD_VALUES,
|
|
86
|
+
];
|
|
87
|
+
/**
|
|
88
|
+
* The union of every tool's vocabulary — what the tmux transport must be able to
|
|
89
|
+
* deliver.
|
|
90
|
+
*
|
|
91
|
+
* This is NOT what any single request is validated against. Since Issue #2046
|
|
92
|
+
* the special-keys route validates against the *declaring tool's* set
|
|
93
|
+
* (`ICLITool.navigationKeys()`), and this list exists so the transport's
|
|
94
|
+
* allow-list has one place to be checked against. The #2032 invariant is now
|
|
95
|
+
* stated per tool — every declared key must be deliverable — and
|
|
96
|
+
* `tests/unit/tmux/special-keys-allowlist-2032.test.ts` plus
|
|
97
|
+
* `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pin both
|
|
98
|
+
* halves.
|
|
99
|
+
*/
|
|
100
|
+
exports.TERMINAL_KEY_VALUES = [
|
|
101
|
+
...exports.NAVIGATION_KEY_VALUES,
|
|
102
|
+
exports.OPENCODE_LEADER_KEY,
|
|
103
|
+
...exports.OPENCODE_DIRECT_KEY_VALUES,
|
|
104
|
+
...exports.OPENCODE_LEADER_CHORD_VALUES,
|
|
105
|
+
];
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* `.eslintrc.json`'s `no-restricted-imports` rule exists to keep closed. Values
|
|
14
14
|
* and types only — nothing here touches a process.
|
|
15
15
|
*/
|
|
16
|
+
import type { TerminalKey } from './terminal-keys';
|
|
16
17
|
/**
|
|
17
18
|
* The key names a {@link KeySequence} step may name.
|
|
18
19
|
*
|
|
@@ -103,6 +104,53 @@ export declare function isKeyStep(step: KeySequence): step is Extract<KeySequenc
|
|
|
103
104
|
* refuses anything else rather than handing an unvalidated string to tmux.
|
|
104
105
|
*/
|
|
105
106
|
export declare function isKeySequenceKeyName(name: string): name is KeySequenceKeyName;
|
|
107
|
+
/**
|
|
108
|
+
* The keys one tool's UI may ask the special-keys API to deliver.
|
|
109
|
+
*
|
|
110
|
+
* Returned by `ICLITool.navigationKeys()`. Before Issue #2046 this was a single
|
|
111
|
+
* module-level list (`NAVIGATION_KEY_VALUES`) that `POST
|
|
112
|
+
* /api/worktrees/[id]/special-keys` validated EVERY request against, regardless
|
|
113
|
+
* of which tool the request named. That worked only while every tool wanted the
|
|
114
|
+
* same twelve keys. opencode does not: its TUI is driven by a `ctrl+x` leader
|
|
115
|
+
* plus a bare letter, and a bare letter is a character — `a` sent to claude's
|
|
116
|
+
* pane is an `a` typed into claude's composer, not a command.
|
|
117
|
+
*
|
|
118
|
+
* So the vocabulary moved into the tool, and the route now asks the tool it was
|
|
119
|
+
* given. 設計方針書 §6 ("tool-specific behaviour belongs in the tool class") is
|
|
120
|
+
* the same reason `describeComposer()` / `captureSpec()` / `gracefulExitSequence()`
|
|
121
|
+
* exist.
|
|
122
|
+
*
|
|
123
|
+
* ## The invariant this must not break (Issue #2032)
|
|
124
|
+
*
|
|
125
|
+
* Every key a tool declares must be one `sendSpecialKeys()` will actually hand
|
|
126
|
+
* to tmux. When the vocabulary was global that was stated as
|
|
127
|
+
* `NAVIGATION_KEY_VALUES` ⊆ `ALLOWED_SPECIAL_KEYS`; per tool it is the same
|
|
128
|
+
* statement quantified over the registry, and it is checked the same way —
|
|
129
|
+
* `isSendableSpecialKey()`. Breaking it restores exactly the #2032 failure: the
|
|
130
|
+
* route validates a request, answers nothing, and then throws inside the
|
|
131
|
+
* transport and reports 500.
|
|
132
|
+
*/
|
|
133
|
+
export interface NavigationKeySpec {
|
|
134
|
+
/**
|
|
135
|
+
* Every key name this tool's UI may send, including the leader prefix and any
|
|
136
|
+
* literal characters that complete a chord.
|
|
137
|
+
*/
|
|
138
|
+
readonly keys: readonly TerminalKey[];
|
|
139
|
+
/**
|
|
140
|
+
* The prefix key of this tool's two-step chord, or `null` when it has none.
|
|
141
|
+
*
|
|
142
|
+
* opencode alone today (`C-x`, measured default of 1.18.22). The UI reads this
|
|
143
|
+
* instead of writing `C-x` next to every chord, so a tool whose leader differs
|
|
144
|
+
* — or a future opencode that renames it — changes one declaration.
|
|
145
|
+
*
|
|
146
|
+
* A chord is delivered as TWO array entries in one special-keys request
|
|
147
|
+
* (`['C-x', 'b']`), which `sendSpecialKeys()` sends one at a time with
|
|
148
|
+
* `SPECIAL_KEY_DELAY_MS` between them. That is the same sequential-step
|
|
149
|
+
* discipline `runKeySequence` applies to `KeySequence`, minus the literal/key
|
|
150
|
+
* distinction the special-keys transport does not have.
|
|
151
|
+
*/
|
|
152
|
+
readonly leaderKey: TerminalKey | null;
|
|
153
|
+
}
|
|
106
154
|
/**
|
|
107
155
|
* How a tool's input box is located on a captured frame.
|
|
108
156
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,mDAAoD,CAAC;AAExF,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEN,wBAAwB;AACxB,wBAAgB,OAAO,CACrB,IAAI,EAAE,kBAAkB,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAEvC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAI3C;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,GAChB,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,kBAAkB,CAE7E;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,cAAc,GAAG,YAAY,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAMD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,qDAAsD,CAAC;AAEjG,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC"}
|