commandmate 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +28 -0
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +286 -256
- package/.next/app-path-routes-manifest.json +36 -32
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +12 -12
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +32 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route.js +1 -1
- package/.next/server/app/api/app/update/route.js.nft.json +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js +1 -1
- package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js +1 -1
- package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js +1 -1
- package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/session/route.js +1 -1
- package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/start/route.js +32 -1
- package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/terminal/route.js +34 -3
- package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js +1 -1
- package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route.js +1 -1
- package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js +1 -1
- package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route.js +1 -1
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route.js +1 -1
- package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js +7 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js +1 -1
- package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +1 -1
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js +2 -2
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js +2 -2
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/todos/route.js +1 -1
- package/.next/server/app/api/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route.js +1 -1
- package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js +4 -4
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +5 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route.js +6 -2
- package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +7 -3
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -3
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js +1 -1
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page.js +1 -1
- package/.next/server/app/review/page.js.nft.json +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +15 -10
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +2 -2
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +36 -32
- package/.next/server/chunks/1058.js +1 -0
- package/.next/server/chunks/1068.js +1 -3
- package/.next/server/chunks/1191.js +13 -0
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1714.js +7 -0
- package/.next/server/chunks/1886.js +5 -0
- package/.next/server/chunks/1944.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/221.js +19 -0
- package/.next/server/chunks/222.js +1 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2366.js +1 -0
- package/.next/server/chunks/2404.js +2 -2
- package/.next/server/chunks/243.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2759.js +1 -1
- package/.next/server/chunks/3346.js +1 -1
- package/.next/server/chunks/3480.js +17 -1
- package/.next/server/chunks/3558.js +1 -0
- package/.next/server/chunks/4299.js +1 -0
- package/.next/server/chunks/4393.js +1 -1
- package/.next/server/chunks/5017.js +1 -1
- package/.next/server/chunks/5089.js +1 -1
- package/.next/server/chunks/5354.js +1 -1
- package/.next/server/chunks/5571.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6274.js +11 -10
- package/.next/server/chunks/6285.js +1 -1
- package/.next/server/chunks/6337.js +1 -0
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/663.js +78 -0
- package/.next/server/chunks/7472.js +1 -1
- package/.next/server/chunks/7824.js +1 -0
- package/.next/server/chunks/7905.js +1 -0
- package/.next/server/chunks/880.js +1 -1
- package/.next/server/chunks/8807.js +84 -18
- package/.next/server/chunks/9130.js +5 -0
- package/.next/server/chunks/9328.js +1 -1
- package/.next/server/chunks/9358.js +1 -1
- package/.next/server/chunks/9508.js +1 -1
- package/.next/server/chunks/9584.js +1 -0
- package/.next/server/chunks/9627.js +274 -0
- package/.next/server/chunks/9798.js +2 -0
- package/.next/server/chunks/9938.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1188-8567ee5ecfef02ee.js +1 -0
- package/.next/static/chunks/3361-aa1b6e7c1d7eeeb4.js +1 -0
- package/.next/static/chunks/3968-8d8ca15657748bfb.js +1 -0
- package/.next/static/chunks/6381-d921ab728eda1191.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/skills/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/templates/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-9247d6b9d647f750.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-27b7cb2e77099eec.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +1 -0
- package/.next/static/css/98722bc4152cedcc.css +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/worktrees/[id]/instances/opencode/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/diff/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/session/route.ts +347 -0
- package/.next/types/app/api/worktrees/[id]/opencode/share/route.ts +347 -0
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/README.md +9 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +66 -0
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +46 -1
- package/dist/cli/commands/interrupt.d.ts +25 -0
- package/dist/cli/commands/interrupt.d.ts.map +1 -0
- package/dist/cli/commands/interrupt.js +146 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +11 -4
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +146 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +104 -0
- package/dist/cli/commands/wait.d.ts.map +1 -1
- package/dist/cli/commands/wait.js +39 -1
- package/dist/cli/config/agent-target-options.d.ts +12 -0
- package/dist/cli/config/agent-target-options.d.ts.map +1 -1
- package/dist/cli/config/agent-target-options.js +15 -1
- package/dist/cli/docs/agent-operations.d.ts +1 -1
- package/dist/cli/docs/agent-operations.d.ts.map +1 -1
- package/dist/cli/docs/agent-operations.js +34 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/types/api-responses.d.ts +375 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +63 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/types/index.js +31 -1
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +3 -0
- package/dist/cli/utils/env-setup.d.ts +24 -0
- package/dist/cli/utils/env-setup.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.js +70 -0
- package/dist/cli/utils/vapid-keygen.d.ts +74 -0
- package/dist/cli/utils/vapid-keygen.d.ts.map +1 -0
- package/dist/cli/utils/vapid-keygen.js +111 -0
- package/dist/lib/cli-tools/types.d.ts +11 -1
- package/dist/lib/cli-tools/types.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.d.ts +14 -3
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +14 -3
- package/dist/lib/push/vapid.d.ts +178 -0
- package/dist/lib/push/vapid.d.ts.map +1 -0
- package/dist/lib/push/vapid.js +293 -0
- package/dist/lib/server/localhost-self-check.d.ts +203 -0
- package/dist/lib/server/localhost-self-check.d.ts.map +1 -0
- package/dist/lib/server/localhost-self-check.js +333 -0
- package/dist/server/locales/en/notifications.json +23 -1
- package/dist/server/locales/ja/notifications.json +23 -1
- package/dist/server/server.js +103 -0
- package/dist/server/src/config/image-extensions.js +244 -0
- package/dist/server/src/config/opencode-constants.js +69 -0
- package/dist/server/src/config/tmux-pane-config.js +100 -1
- package/dist/server/src/lib/cli-tools/base.js +33 -48
- package/dist/server/src/lib/cli-tools/opencode-config.js +12 -0
- package/dist/server/src/lib/cli-tools/opencode.js +435 -7
- package/dist/server/src/lib/cli-tools/start-availability.js +160 -0
- package/dist/server/src/lib/cmate-cli-tool-parser.js +328 -7
- package/dist/server/src/lib/cmate-parser.js +12 -0
- package/dist/server/src/lib/db/agent-instances-db.js +129 -0
- package/dist/server/src/lib/db/agent-session-cost-db.js +204 -0
- package/dist/server/src/lib/db/agent-session-cost-sampler.js +194 -0
- package/dist/server/src/lib/db/chat-db.js +33 -0
- package/dist/server/src/lib/db/db-instance.js +11 -0
- package/dist/server/src/lib/db/db.js +8 -3
- package/dist/server/src/lib/db/migrations/index.js +6 -0
- package/dist/server/src/lib/db/migrations/runner.js +1 -1
- package/dist/server/src/lib/db/migrations/v57-push-subscription-defaults-notice.js +54 -0
- package/dist/server/src/lib/db/migrations/v58-agent-session-costs.js +100 -0
- package/dist/server/src/lib/db/migrations/v59-opencode-instance-settings.js +71 -0
- package/dist/server/src/lib/db/push-subscriptions-db.js +56 -5
- package/dist/server/src/lib/detection/cli-patterns.js +17 -6
- package/dist/server/src/lib/detection/excerpt.js +48 -0
- package/dist/server/src/lib/detection/model-info-extractor.js +26 -3
- package/dist/server/src/lib/detection/opencode-modal-overlay.js +400 -0
- package/dist/server/src/lib/detection/opencode-pane-obstruction.js +181 -0
- package/dist/server/src/lib/detection/status-detector.js +7 -0
- package/dist/server/src/lib/detection/status-reason.js +20 -0
- package/dist/server/src/lib/detection/terminal-columns.js +94 -0
- package/dist/server/src/lib/detection/tools/opencode/detect.js +43 -0
- package/dist/server/src/lib/detection/tools/opencode/prompt.js +20 -0
- package/dist/server/src/lib/detection/tools/verified-against.js +14 -3
- package/dist/server/src/lib/detection/upstream-faults.js +7 -22
- package/dist/server/src/lib/hooks/agent-session-telemetry.js +324 -0
- package/dist/server/src/lib/hooks/pending-decision-kind.js +72 -0
- package/dist/server/src/lib/hooks/sources/define-source.js +88 -0
- package/dist/server/src/lib/hooks/sources/opencode/client.js +907 -2
- package/dist/server/src/lib/hooks/sources/opencode/diff.js +336 -0
- package/dist/server/src/lib/hooks/sources/opencode/history.js +480 -0
- package/dist/server/src/lib/hooks/sources/opencode/ingest.js +76 -7
- package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +222 -0
- package/dist/server/src/lib/hooks/sources/opencode/mappers.js +31 -0
- package/dist/server/src/lib/hooks/sources/opencode/payloads.js +45 -0
- package/dist/server/src/lib/hooks/sources/opencode/ports.js +16 -0
- package/dist/server/src/lib/hooks/sources/opencode/push.js +307 -0
- package/dist/server/src/lib/hooks/sources/opencode/reattach.js +284 -0
- package/dist/server/src/lib/hooks/sources/opencode/runtime.js +165 -2
- package/dist/server/src/lib/hooks/sources/opencode/source.js +46 -2
- package/dist/server/src/lib/hooks/sources/opencode/subscription.js +407 -4
- package/dist/server/src/lib/hooks/sources/opencode/transcript.js +383 -0
- package/dist/server/src/lib/hooks/structured-decision-response.js +460 -0
- package/dist/server/src/lib/job-executor.js +43 -20
- package/dist/server/src/lib/polling/response-checker.js +43 -16
- package/dist/server/src/lib/polling/structured-history-gate.js +75 -0
- package/dist/server/src/lib/prompt-answer-sender.js +153 -2
- package/dist/server/src/lib/push/delivery-health.js +237 -0
- package/dist/server/src/lib/push/failure-push-notifier.js +109 -7
- package/dist/server/src/lib/push/index.js +25 -1
- package/dist/server/src/lib/push/prompt-card-state.js +254 -14
- package/dist/server/src/lib/push/push-sender.js +63 -12
- package/dist/server/src/lib/push/resolution-push-notifier.js +15 -3
- package/dist/server/src/lib/push/vapid.js +264 -5
- package/dist/server/src/lib/push/waiting-push-notifier.js +7 -0
- package/dist/server/src/lib/server/localhost-self-check.js +333 -0
- package/dist/server/src/lib/session/agent-event-state.js +169 -4
- package/dist/server/src/lib/session/claude-executor.js +152 -15
- package/dist/server/src/lib/session/current-output-builder.js +182 -15
- package/dist/server/src/lib/session/opencode-session-api.js +214 -0
- package/dist/server/src/lib/session/opencode-session-recall.js +168 -0
- package/dist/server/src/lib/session/opencode-session-store.js +274 -0
- package/dist/server/src/lib/session/provisional-turn.js +54 -1
- package/dist/server/src/lib/session/send-user-message.js +6 -5
- package/dist/server/src/lib/session/structured-prompt.js +53 -2
- package/dist/server/src/lib/skills/compatibility-matrix.js +50 -1
- package/dist/server/src/lib/tmux/tmux.js +74 -4
- package/dist/server/src/lib/verification/gate-runner.js +71 -8
- package/dist/server/src/types/agent-session.js +63 -0
- package/dist/server/src/types/agent-transcript.js +80 -0
- package/dist/server/src/types/opencode-export.js +228 -0
- package/dist/server/src/types/opencode-instance-settings.js +140 -0
- package/dist/server/src/types/opencode-share.js +111 -0
- package/dist/server/src/types/terminal-keys.js +69 -1
- package/dist/types/cli-tool-contracts.d.ts +48 -0
- package/dist/types/cli-tool-contracts.d.ts.map +1 -1
- package/dist/types/terminal-keys.d.ts +89 -0
- package/dist/types/terminal-keys.d.ts.map +1 -0
- package/dist/types/terminal-keys.js +105 -0
- package/package.json +1 -1
- package/.next/server/chunks/1029.js +0 -1
- package/.next/server/chunks/1239.js +0 -1
- package/.next/server/chunks/1538.js +0 -7
- package/.next/server/chunks/2546.js +0 -1
- package/.next/server/chunks/2689.js +0 -13
- package/.next/server/chunks/3292.js +0 -1
- package/.next/server/chunks/3417.js +0 -1
- package/.next/server/chunks/3736.js +0 -1
- package/.next/server/chunks/4423.js +0 -1
- package/.next/server/chunks/4444.js +0 -32
- package/.next/server/chunks/4565.js +0 -3
- package/.next/server/chunks/467.js +0 -1
- package/.next/server/chunks/4905.js +0 -5
- package/.next/server/chunks/552.js +0 -19
- package/.next/server/chunks/5998.js +0 -74
- package/.next/server/chunks/6919.js +0 -1
- package/.next/server/chunks/7970.js +0 -229
- package/.next/server/chunks/8536.js +0 -1
- package/.next/server/chunks/9284.js +0 -1
- package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +0 -1
- package/.next/static/chunks/6381-b7250e8ca7a44c6c.js +0 -1
- package/.next/static/chunks/8521-c43994fb58501d13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/more/page-3266dfa945972649.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/review/page-8f63aff862fee421.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-e4f28966b4fc0ce1.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
- package/.next/static/css/928e5a8830fbf997.css +0 -1
- /package/.next/static/{t0BoV4H46ZgKmTjSi7GIz → 0GHE2JGlFzqvSBZAcBFSt}/_buildManifest.js +0 -0
- /package/.next/static/{t0BoV4H46ZgKmTjSi7GIz → 0GHE2JGlFzqvSBZAcBFSt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* opencode's modal overlays, detected structurally from a captured frame
|
|
4
|
+
* (Issue #2112).
|
|
5
|
+
*
|
|
6
|
+
* ## What this is about
|
|
7
|
+
*
|
|
8
|
+
* opencode 1.18 opens its session list (`ctrl+x l`), agent list (`ctrl+x a`),
|
|
9
|
+
* timeline (`ctrl+x g`), command palette (`ctrl+p`) and model picker
|
|
10
|
+
* (`ctrl+x m`) as an overlay painted OVER the transcript. The overlay hides
|
|
11
|
+
* nothing the detector reads: the finished-turn marker `▣ Build · <model> ·
|
|
12
|
+
* 2.8s` from the previous turn is still on the pane above it, and the input box
|
|
13
|
+
* is still drawn below it. So branch D of `tools/opencode/detect.ts` matched the
|
|
14
|
+
* old marker and published a pane that is blocked on a human as
|
|
15
|
+
* `ready` / `opencode_response_complete` — measured on the committed #2046
|
|
16
|
+
* fixtures, `dialog-{session-list,agent-list,timeline}.txt`.
|
|
17
|
+
*
|
|
18
|
+
* That is worse than it sounds, and it is why this module exists rather than a
|
|
19
|
+
* widened allowlist. `ready` is POSITIVE evidence, so the frame never reaches
|
|
20
|
+
* the "nothing could read this" path #1017 / #1494 built for unknown overlays:
|
|
21
|
+
* `isUnclassifiedActive` stays false, the 60-second escape hatch never opens,
|
|
22
|
+
* and `commandmate wait` reports the blocked pane as **exit 0, completed**.
|
|
23
|
+
* `claude`'s `/help` overlay is the benign version of the same shape — it lands
|
|
24
|
+
* on `running` / `default`, i.e. on the no-evidence side, where the hatch does
|
|
25
|
+
* open.
|
|
26
|
+
*
|
|
27
|
+
* ## The signature, and why it is not a word list
|
|
28
|
+
*
|
|
29
|
+
* `Sessions`, `Commands`, `Timeline` and `Select agent` are the overlay
|
|
30
|
+
* headings. They are also ordinary English an agent writes in a reply, and
|
|
31
|
+
* Issue #1883 already deleted one "the word is somewhere on the pane" inference
|
|
32
|
+
* for exactly that reason (#1896 measured the harm: an answer that said
|
|
33
|
+
* `Select model to continue:` parked the session on `waiting` for the rest of
|
|
34
|
+
* the session). `OPENCODE_SELECTION_LIST_PATTERN` reacted by narrowing to three
|
|
35
|
+
* allowlisted headings, which is why `Select agent` does not match it today.
|
|
36
|
+
*
|
|
37
|
+
* This module reads the LAYOUT instead. opencode paints the overlay as a
|
|
38
|
+
* background-coloured rectangle, and `capture-pane -e` re-emits that background
|
|
39
|
+
* verbatim:
|
|
40
|
+
*
|
|
41
|
+
* ```
|
|
42
|
+
* ␛[48;2;20;20;20m Commands ␛[38;2;128;128;128mesc␛[0m ␛[48;2;4;4;4mlogical
|
|
43
|
+
* └ column 10 ─────────────────────────────────────────────────────────┘ column 70
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* Every row of the overlay switches the background on at the SAME column and
|
|
47
|
+
* off at the SAME column, whatever is written on it — and one of those rows
|
|
48
|
+
* carries the overlay's own dismiss affordance, `esc`, right-aligned INSIDE the
|
|
49
|
+
* rectangle. Both halves are needed:
|
|
50
|
+
*
|
|
51
|
+
* - the rectangle alone is also what opencode's input box and its echoed user
|
|
52
|
+
* prompts are (measured: the composer is a painted rectangle at columns
|
|
53
|
+
* 3–78 on every 80-column frame in `opencode-live-2046`);
|
|
54
|
+
* - the `esc` hatch alone is also what the composer footer says while the agent
|
|
55
|
+
* is generating (`⬝⬝⬝⬝⬝⬝ esc interrupt`, `esc again to interrupt`) — which
|
|
56
|
+
* is why the hatch is required to be the LAST thing inside the rectangle, as
|
|
57
|
+
* `OPENCODE_SELECTION_LIST_PATTERN` requires it to be the last thing on the
|
|
58
|
+
* line.
|
|
59
|
+
*
|
|
60
|
+
* Reading the rectangle rather than the row's total width is what makes this
|
|
61
|
+
* work over a busy transcript. At 120 and 200 columns the same palette is
|
|
62
|
+
* centred with response text visible on BOTH sides of it
|
|
63
|
+
* (`opencode-live-2047/w200/command-palette.txt`), so the rows are not equal in
|
|
64
|
+
* length and nothing outside the rectangle is constant — only its two edges are.
|
|
65
|
+
*
|
|
66
|
+
* ## What a match means, and what it does not
|
|
67
|
+
*
|
|
68
|
+
* A match means a background-painted rectangle offering an `esc` hatch was on
|
|
69
|
+
* the pane. A **non**-match means no such rectangle could be read, and NEVER
|
|
70
|
+
* "no overlay is open": the rule needs the SGR the capture was taken with, so a
|
|
71
|
+
* caller that hands over an already-stripped frame — Auto-Yes's
|
|
72
|
+
* `captureAndCleanOutput` is the one in this repository — always gets `null`.
|
|
73
|
+
* That is fail-open by construction and matches how `tools/opencode/prompt.ts`
|
|
74
|
+
* already describes its own gutter anchor on that path. Every production caller
|
|
75
|
+
* of `detectSessionStatus` passes the raw `capture-pane -e` output
|
|
76
|
+
* (`lib/tmux/tmux.ts` always passes `-e`).
|
|
77
|
+
*
|
|
78
|
+
* A leaf module by design: it imports the ANSI primitives, the column rule and
|
|
79
|
+
* the excerpt bound and nothing else.
|
|
80
|
+
*
|
|
81
|
+
* @module lib/detection/opencode-modal-overlay
|
|
82
|
+
*/
|
|
83
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
84
|
+
exports.OPENCODE_OVERLAY_TRUNCATION_MARKER = exports.OPENCODE_OVERLAY_EXCERPT_MAX_BYTES = exports.OPENCODE_OVERLAY_HEADER_ROW_LIMIT = exports.OPENCODE_OVERLAY_MIN_ROWS = exports.OPENCODE_OVERLAY_MIN_WIDTH = exports.OPENCODE_OVERLAY_MIN_LEFT = exports.OPENCODE_MODAL_OVERLAY_RECOVERY_KEY = exports.OPENCODE_MODAL_OVERLAY_ID = void 0;
|
|
85
|
+
exports.detectOpenCodeModalOverlay = detectOpenCodeModalOverlay;
|
|
86
|
+
const excerpt_1 = require("./excerpt");
|
|
87
|
+
const terminal_columns_1 = require("./terminal-columns");
|
|
88
|
+
/**
|
|
89
|
+
* Published `sessionStatusReason` for this signature.
|
|
90
|
+
*
|
|
91
|
+
* Snake case, like every other reason, and distinct from
|
|
92
|
+
* `opencode_selection_list` on purpose: an operator reading `capture --json`
|
|
93
|
+
* can then tell "the allowlisted picker heading matched" from "a painted
|
|
94
|
+
* rectangle with an esc hatch was on the pane", which are two different
|
|
95
|
+
* readings of the same screen and fail in different ways.
|
|
96
|
+
*/
|
|
97
|
+
exports.OPENCODE_MODAL_OVERLAY_ID = 'opencode_modal_overlay';
|
|
98
|
+
/**
|
|
99
|
+
* The key that closes it, in opencode's own notation.
|
|
100
|
+
*
|
|
101
|
+
* Taken from the overlay's own chrome — the hatch this module anchors on IS the
|
|
102
|
+
* affordance, printed by opencode at the right edge of the header row. Exported
|
|
103
|
+
* for the same reason {@link OPENCODE_SIDEBAR_RECOVERY_CHORD} is: no surface
|
|
104
|
+
* should hold a bare key literal of its own.
|
|
105
|
+
*/
|
|
106
|
+
exports.OPENCODE_MODAL_OVERLAY_RECOVERY_KEY = 'esc';
|
|
107
|
+
/**
|
|
108
|
+
* Leftmost column an overlay rectangle may start at.
|
|
109
|
+
*
|
|
110
|
+
* One, not zero. A rectangle that starts at column 0 is not an overlay drawn
|
|
111
|
+
* OVER the pane — it is the pane's own background, which some themes paint
|
|
112
|
+
* explicitly (measured: `opencode-live-2047/w200/*` paint every row
|
|
113
|
+
* `48;2;4;4;4` from column 0), and treating that as a rectangle makes every row
|
|
114
|
+
* of every frame "match" whatever else is asserted. The measured overlays start
|
|
115
|
+
* at column 10 (80 and 120 columns), 70 (200 columns) and 1 (the 80-column
|
|
116
|
+
* session list and timeline, which are nearly pane-wide), so the constraint has
|
|
117
|
+
* never been the thing that decided a verdict.
|
|
118
|
+
*/
|
|
119
|
+
exports.OPENCODE_OVERLAY_MIN_LEFT = 1;
|
|
120
|
+
/**
|
|
121
|
+
* Narrowest rectangle that can be an overlay, in columns.
|
|
122
|
+
*
|
|
123
|
+
* The measured overlays are 60 columns wide (palette and pickers at every
|
|
124
|
+
* width) and 78 (the session list and timeline at 80 columns), so this is a
|
|
125
|
+
* floor with four times the headroom rather than a tuned threshold. Its job is
|
|
126
|
+
* to reject a single highlighted CELL — opencode paints the selected row of a
|
|
127
|
+
* list in its own background, and a one-word highlight elsewhere on the pane
|
|
128
|
+
* should not be able to pose as a dialog.
|
|
129
|
+
*/
|
|
130
|
+
exports.OPENCODE_OVERLAY_MIN_WIDTH = 16;
|
|
131
|
+
/**
|
|
132
|
+
* How many rows must carry the rectangle before this reports a match.
|
|
133
|
+
*
|
|
134
|
+
* Three: the measured overlays carry 8 (the timeline, the shortest) to 72 (the
|
|
135
|
+
* command palette), so there is an order of magnitude of headroom, and three is
|
|
136
|
+
* what a real dialog cannot be under — opencode draws a padding row, the header
|
|
137
|
+
* row with the hatch, and a padding row before any content at all.
|
|
138
|
+
*/
|
|
139
|
+
exports.OPENCODE_OVERLAY_MIN_ROWS = 3;
|
|
140
|
+
/**
|
|
141
|
+
* How far down the rectangle the `esc` hatch may sit, in rows.
|
|
142
|
+
*
|
|
143
|
+
* A dialog puts its dismiss affordance in its TITLE BAR, and the measurement is
|
|
144
|
+
* unusually clean: on all eleven overlays in this repository — four #2046
|
|
145
|
+
* dialogs, the palette at 80/120/200 columns, the #2049 and #1896 palettes, the
|
|
146
|
+
* #1896 model picker and the canary picker — the hatch is on the SECOND row that
|
|
147
|
+
* carries the rectangle, the first being the overlay's top padding. Three is
|
|
148
|
+
* that measurement plus one row of headroom.
|
|
149
|
+
*
|
|
150
|
+
* What it buys is the case the other guards cannot reach: opencode paints code
|
|
151
|
+
* blocks in an agent's reply with their own background, so a fenced keybinding
|
|
152
|
+
* table (`quit esc`) is a painted rectangle with a hatch-shaped row in it.
|
|
153
|
+
* Requiring the hatch at the top makes that a table in the middle of a block
|
|
154
|
+
* rather than a dialog's title bar. The 120- and 200-column captures show the
|
|
155
|
+
* other half of the same problem — transcript painting produces up to fourteen
|
|
156
|
+
* incidental rectangles per frame — and not one of them carries a hatch at all.
|
|
157
|
+
*/
|
|
158
|
+
exports.OPENCODE_OVERLAY_HEADER_ROW_LIMIT = 3;
|
|
159
|
+
/** Bound on {@link OpenCodeModalOverlay.headerText}, in UTF-8 bytes. */
|
|
160
|
+
exports.OPENCODE_OVERLAY_EXCERPT_MAX_BYTES = 200;
|
|
161
|
+
/** Appended when {@link OPENCODE_OVERLAY_EXCERPT_MAX_BYTES} cut the excerpt. */
|
|
162
|
+
exports.OPENCODE_OVERLAY_TRUNCATION_MARKER = '…[truncated]';
|
|
163
|
+
/**
|
|
164
|
+
* The overlay's dismiss affordance, right-aligned inside the rectangle.
|
|
165
|
+
*
|
|
166
|
+
* Deliberately the same shape as `OPENCODE_SELECTION_LIST_PATTERN`'s tail
|
|
167
|
+
* (Issue #1896): text, then two or more spaces, then `esc`, then nothing but
|
|
168
|
+
* padding. The `$` is what separates a dialog's hatch from the composer footer's
|
|
169
|
+
* `esc interrupt` / `esc again to interrupt`, which carry a word AFTER the key —
|
|
170
|
+
* both of those are live frames in this repository
|
|
171
|
+
* (`opencode-live-1883/turn-running.txt`,
|
|
172
|
+
* `opencode-live-1894/esc-again-after-marker.txt`) and both are painted
|
|
173
|
+
* rectangles, so without the anchor a generating pane would be read as a dialog.
|
|
174
|
+
*
|
|
175
|
+
* Applied to the rectangle's own columns, never to the whole row: at 120 and 200
|
|
176
|
+
* columns the transcript resumes to the right of the overlay on the same line,
|
|
177
|
+
* so a row-anchored `$` would never match there.
|
|
178
|
+
*
|
|
179
|
+
* The leading `\S` keeps a rectangle whose only content is the hatch from
|
|
180
|
+
* counting: a dialog has a heading.
|
|
181
|
+
*
|
|
182
|
+
* Linear pattern, no nested quantifiers — ReDoS safe (S4-001).
|
|
183
|
+
*/
|
|
184
|
+
const OVERLAY_ESCAPE_HATCH = /\S[^\S\n]{2,}esc[^\S\n]*$/;
|
|
185
|
+
/** Cheap pre-filter for the rows worth measuring at all. */
|
|
186
|
+
const ESCAPE_HATCH_WORD = 'esc';
|
|
187
|
+
/**
|
|
188
|
+
* One of opencode's own box gutters: the composer, the permission dialog, or an
|
|
189
|
+
* echoed user prompt.
|
|
190
|
+
*
|
|
191
|
+
* Same character class as `OPENCODE_GUTTER_ROW_PATTERN` (Issue #1893) plus the
|
|
192
|
+
* bottom border's `╹`. Those boxes are painted rectangles too — the composer is
|
|
193
|
+
* one at columns 3–78 on every 80-column frame here — and a user whose prompt
|
|
194
|
+
* happened to end in `… esc` would otherwise be drawing an overlay in the
|
|
195
|
+
* transcript. That is not hypothetical: it is `words-in-response.txt`, this
|
|
196
|
+
* Issue's negative control, whose echoed prompt says all four dialog headings
|
|
197
|
+
* and ends in a hatch.
|
|
198
|
+
*
|
|
199
|
+
* Tested at the column immediately LEFT of the rectangle, because that is where
|
|
200
|
+
* opencode puts the glyph: the gutter is drawn first and the background is
|
|
201
|
+
* switched on after it, so the box's painted interior starts one column to its
|
|
202
|
+
* right (measured — `[(null, 0, 3), ('48;2;30;30;30', 3, 78)]` on every gutter
|
|
203
|
+
* row of `sidebar-off.txt`). The rectangle's own first column is tested too, so
|
|
204
|
+
* a theme that paints the gutter itself is covered by the same rule.
|
|
205
|
+
*/
|
|
206
|
+
const BOX_GUTTER = /^[│┃╹]/;
|
|
207
|
+
/**
|
|
208
|
+
* Every ANSI sequence, in the repository's own spelling.
|
|
209
|
+
*
|
|
210
|
+
* Restated from `ANSI_PATTERN` (`ansi.ts`) rather than imported because this
|
|
211
|
+
* module needs to walk the sequences IN ORDER while counting columns, and that
|
|
212
|
+
* one is a shared `g`-flagged instance whose `lastIndex` a caller must not
|
|
213
|
+
* disturb. `tests/unit/detection-opencode-modal-overlay-2112.test.ts` asserts
|
|
214
|
+
* the text this scan produces is byte-identical to `stripAnsi`'s, so the
|
|
215
|
+
* restatement cannot drift silently.
|
|
216
|
+
*/
|
|
217
|
+
const ANSI_SEQUENCE = /\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\[[0-9;]*m/g;
|
|
218
|
+
/** An SGR sequence, with its parameters. Only these can change the background. */
|
|
219
|
+
const SGR_PARAMETERS = /^(?:\x1b\[|\[)([0-9;]*)m$/;
|
|
220
|
+
/**
|
|
221
|
+
* Fold one SGR sequence's parameters into the current background.
|
|
222
|
+
*
|
|
223
|
+
* Handles the three forms tmux emits: the 16-colour codes (`40`–`47`,
|
|
224
|
+
* `100`–`107`), the 256-colour and 24-bit extended forms (`48;5;n`,
|
|
225
|
+
* `48;2;r;g;b`), and the two resets (`0`, `49`). Foreground and attribute codes
|
|
226
|
+
* leave the background alone, which is what keeps a syntax-highlighted
|
|
227
|
+
* transcript row from producing dozens of spurious edges.
|
|
228
|
+
*/
|
|
229
|
+
function applySgr(current, parameters) {
|
|
230
|
+
const parts = (parameters === '' ? '0' : parameters).split(';');
|
|
231
|
+
let bg = current;
|
|
232
|
+
for (let i = 0; i < parts.length; i++) {
|
|
233
|
+
const code = Number(parts[i] === '' ? '0' : parts[i]);
|
|
234
|
+
if (!Number.isFinite(code))
|
|
235
|
+
continue;
|
|
236
|
+
if (code === 0 || code === 49) {
|
|
237
|
+
bg = null;
|
|
238
|
+
}
|
|
239
|
+
else if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
|
|
240
|
+
bg = parts[i];
|
|
241
|
+
}
|
|
242
|
+
else if (code === 48) {
|
|
243
|
+
if (parts[i + 1] === '2') {
|
|
244
|
+
bg = parts.slice(i, i + 5).join(';');
|
|
245
|
+
i += 4;
|
|
246
|
+
}
|
|
247
|
+
else if (parts[i + 1] === '5') {
|
|
248
|
+
bg = parts.slice(i, i + 3).join(';');
|
|
249
|
+
i += 2;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return bg;
|
|
254
|
+
}
|
|
255
|
+
/** Measure one captured row: its text, its background runs and their edges. */
|
|
256
|
+
function scanRow(line) {
|
|
257
|
+
ANSI_SEQUENCE.lastIndex = 0;
|
|
258
|
+
const segments = [];
|
|
259
|
+
let text = '';
|
|
260
|
+
let bg = null;
|
|
261
|
+
let columns = 0;
|
|
262
|
+
let segmentStart = 0;
|
|
263
|
+
let cursor = 0;
|
|
264
|
+
let match;
|
|
265
|
+
while ((match = ANSI_SEQUENCE.exec(line)) !== null) {
|
|
266
|
+
const chunk = line.slice(cursor, match.index);
|
|
267
|
+
text += chunk;
|
|
268
|
+
columns += (0, terminal_columns_1.visibleWidth)(chunk);
|
|
269
|
+
cursor = match.index + match[0].length;
|
|
270
|
+
const sgr = SGR_PARAMETERS.exec(match[0]);
|
|
271
|
+
if (sgr === null)
|
|
272
|
+
continue;
|
|
273
|
+
const next = applySgr(bg, sgr[1]);
|
|
274
|
+
if (next === bg)
|
|
275
|
+
continue;
|
|
276
|
+
if (columns > segmentStart)
|
|
277
|
+
segments.push({ bg, start: segmentStart, end: columns });
|
|
278
|
+
bg = next;
|
|
279
|
+
segmentStart = columns;
|
|
280
|
+
}
|
|
281
|
+
const tail = line.slice(cursor);
|
|
282
|
+
text += tail;
|
|
283
|
+
columns += (0, terminal_columns_1.visibleWidth)(tail);
|
|
284
|
+
if (columns > segmentStart)
|
|
285
|
+
segments.push({ bg, start: segmentStart, end: columns });
|
|
286
|
+
const edges = new Set(segments.map(segment => segment.start));
|
|
287
|
+
if (segments.length > 0)
|
|
288
|
+
edges.add(segments[segments.length - 1].end);
|
|
289
|
+
return { text, segments, edges, width: columns };
|
|
290
|
+
}
|
|
291
|
+
/** The background painted at one column, or `null` for the terminal default. */
|
|
292
|
+
function backgroundAt(row, column) {
|
|
293
|
+
for (const segment of row.segments) {
|
|
294
|
+
if (segment.start <= column && column < segment.end)
|
|
295
|
+
return segment.bg;
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Does this row carry the rectangle `[left, right)`?
|
|
301
|
+
*
|
|
302
|
+
* Four conditions, and every one of them is about the LAYOUT:
|
|
303
|
+
*
|
|
304
|
+
* 1. the row has a background boundary at both edges;
|
|
305
|
+
* 2. every column between them is painted — an unpainted gap means the two
|
|
306
|
+
* boundaries belong to two different things that happen to line up;
|
|
307
|
+
* 3. the boundaries are real transitions, i.e. what is painted just outside
|
|
308
|
+
* differs from what is painted just inside. This is what stops a theme that
|
|
309
|
+
* paints the whole pane from turning every column pair into a rectangle;
|
|
310
|
+
* 4. neither the rectangle's first column nor the column just left of it holds
|
|
311
|
+
* one of opencode's own box gutters.
|
|
312
|
+
*/
|
|
313
|
+
function carriesRectangle(row, left, right) {
|
|
314
|
+
if (!row.edges.has(left) || !row.edges.has(right))
|
|
315
|
+
return false;
|
|
316
|
+
for (const segment of row.segments) {
|
|
317
|
+
if (segment.end <= left || segment.start >= right)
|
|
318
|
+
continue;
|
|
319
|
+
if (segment.bg === null)
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
if (backgroundAt(row, left - 1) === backgroundAt(row, left))
|
|
323
|
+
return false;
|
|
324
|
+
if (right < row.width && backgroundAt(row, right) === backgroundAt(row, right - 1))
|
|
325
|
+
return false;
|
|
326
|
+
if (BOX_GUTTER.test((0, terminal_columns_1.sliceColumns)(row.text, left - 1, left)))
|
|
327
|
+
return false;
|
|
328
|
+
return !BOX_GUTTER.test((0, terminal_columns_1.sliceColumns)(row.text, left, right));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The modal overlay painted over an opencode transcript, or null.
|
|
332
|
+
*
|
|
333
|
+
* Call it only for opencode: the rule is about opencode's own dialog chrome, and
|
|
334
|
+
* every other tool is left exactly as it was (Issue #2112 changes no other
|
|
335
|
+
* tool's detection).
|
|
336
|
+
*
|
|
337
|
+
* The search is seeded from the rows that contain the literal `esc` and never
|
|
338
|
+
* from the frame at large, so the cost is `rows × (background boundaries on a
|
|
339
|
+
* hatch row)²` rather than anything quadratic in the pane. Background boundaries
|
|
340
|
+
* are rare — a foreground-only SGR does not make one — so a 200-row opencode
|
|
341
|
+
* capture typically seeds from a single row with fewer than ten of them.
|
|
342
|
+
*
|
|
343
|
+
* When more than one rectangle qualifies the widest-supported one wins, measured
|
|
344
|
+
* by how many rows carry it: an overlay's own highlighted list item is a
|
|
345
|
+
* rectangle too, and it is drawn on exactly one row.
|
|
346
|
+
*
|
|
347
|
+
* A caveat the seeding makes easy to miss: two identical rows are two entries in
|
|
348
|
+
* `carrying`, so the title-bar check below compares object identity rather than
|
|
349
|
+
* value.
|
|
350
|
+
*
|
|
351
|
+
* @param frame - The capture with its ANSI intact (`capture-pane -e`)
|
|
352
|
+
*/
|
|
353
|
+
function detectOpenCodeModalOverlay(frame) {
|
|
354
|
+
const rows = frame.split('\n').map(scanRow);
|
|
355
|
+
const examined = new Set();
|
|
356
|
+
let best = null;
|
|
357
|
+
for (const row of rows) {
|
|
358
|
+
if (!row.text.includes(ESCAPE_HATCH_WORD))
|
|
359
|
+
continue;
|
|
360
|
+
const edges = [...row.edges].sort((a, b) => a - b);
|
|
361
|
+
for (const left of edges) {
|
|
362
|
+
if (left < exports.OPENCODE_OVERLAY_MIN_LEFT)
|
|
363
|
+
continue;
|
|
364
|
+
for (const right of edges) {
|
|
365
|
+
if (right - left < exports.OPENCODE_OVERLAY_MIN_WIDTH)
|
|
366
|
+
continue;
|
|
367
|
+
const key = `${left}:${right}`;
|
|
368
|
+
if (examined.has(key))
|
|
369
|
+
continue;
|
|
370
|
+
if (!carriesRectangle(row, left, right))
|
|
371
|
+
continue;
|
|
372
|
+
const header = (0, terminal_columns_1.sliceColumns)(row.text, left, right);
|
|
373
|
+
if (!OVERLAY_ESCAPE_HATCH.test(header))
|
|
374
|
+
continue;
|
|
375
|
+
examined.add(key);
|
|
376
|
+
const carrying = rows.filter(candidate => carriesRectangle(candidate, left, right));
|
|
377
|
+
if (carrying.length < exports.OPENCODE_OVERLAY_MIN_ROWS)
|
|
378
|
+
continue;
|
|
379
|
+
// Identity, not a re-test: `row` is the row whose slice just matched, and
|
|
380
|
+
// asking which position it holds in the rectangle is the whole of the
|
|
381
|
+
// title-bar rule. A second search by text would find the FIRST hatch-
|
|
382
|
+
// shaped row instead, which is a different question.
|
|
383
|
+
const headerRow = carrying.indexOf(row);
|
|
384
|
+
if (headerRow < 0 || headerRow >= exports.OPENCODE_OVERLAY_HEADER_ROW_LIMIT)
|
|
385
|
+
continue;
|
|
386
|
+
if (best === null || carrying.length > best.rows) {
|
|
387
|
+
best = {
|
|
388
|
+
id: exports.OPENCODE_MODAL_OVERLAY_ID,
|
|
389
|
+
headerText: (0, excerpt_1.truncateToByteBudget)(header.trim(), exports.OPENCODE_OVERLAY_EXCERPT_MAX_BYTES, exports.OPENCODE_OVERLAY_TRUNCATION_MARKER),
|
|
390
|
+
left,
|
|
391
|
+
right,
|
|
392
|
+
rows: carrying.length,
|
|
393
|
+
headerRow,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return best;
|
|
400
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* opencode's sidebar, detected structurally from a captured frame (Issue #2095).
|
|
4
|
+
*
|
|
5
|
+
* ## What this is about
|
|
6
|
+
*
|
|
7
|
+
* opencode 1.18.22 paints a right-hand sidebar (session title, `Context` /
|
|
8
|
+
* token counters, `LSP` status) that does **not** get its own region of a
|
|
9
|
+
* `capture-pane`. It shares ROWS with the transcript and with the input box, so
|
|
10
|
+
* every captured line becomes `<transcript text> … <sidebar text>` and every
|
|
11
|
+
* reader in this repo sees one row (Issue #2047 measured this at ≥121 columns).
|
|
12
|
+
*
|
|
13
|
+
* Issue #2046 then measured the consequence at the width production actually
|
|
14
|
+
* runs opencode at. `ctrl+x b` (`sidebar_toggle`) turns the sidebar on at **80
|
|
15
|
+
* columns**, below the width #2047 found it appearing at on its own, and the
|
|
16
|
+
* same finished turn flips from `ready` / `opencode_response_complete` to
|
|
17
|
+
* `running` / `unknown_frame` with the sidebar's own text saved as the
|
|
18
|
+
* assistant's reply. Escape does not close it; pressing `ctrl+x b` again does.
|
|
19
|
+
*
|
|
20
|
+
* #2046 removed `b` from {@link OPENCODE_LEADER_CHORD_VALUES} and the
|
|
21
|
+
* special-keys route refuses it, but that only closes CommandMate's own door:
|
|
22
|
+
* opencode's `ctrl+p` command palette lists `Show sidebar ctrl+x b` and a user
|
|
23
|
+
* can run it from there. **This module does not stop the sidebar. It makes the
|
|
24
|
+
* sidebar visible to the people and the tools that are waiting on the pane.**
|
|
25
|
+
*
|
|
26
|
+
* ## The signature, and why it is not a word list
|
|
27
|
+
*
|
|
28
|
+
* `Context`, `LSP` and `tokens` are on the sidebar, and they are also ordinary
|
|
29
|
+
* English an agent writes in a reply — a word list would flag any turn that
|
|
30
|
+
* happens to discuss LSPs. The signature this module uses is the geometry
|
|
31
|
+
* instead:
|
|
32
|
+
*
|
|
33
|
+
* ```
|
|
34
|
+
* ┃ Context ← gutter row, second column
|
|
35
|
+
* OK2046 1% used
|
|
36
|
+
* ┃ Build · Claude Sonnet 4.6 GitHub maenokota-share-work-…
|
|
37
|
+
* ╹▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ commandmate-issue-2046/…
|
|
38
|
+
* ↑ the box ends here
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* opencode draws the input box's bottom edge as `╹` + a run of `▀` spanning the
|
|
42
|
+
* box's full width, and pads every gutter (`┃`) row out to that same width. So
|
|
43
|
+
* the box's right edge is measurable from the frame itself, and **content to the
|
|
44
|
+
* right of it on a row that belongs to the box is a second column** — something
|
|
45
|
+
* a box that owns the full pane width can never produce, because its own text
|
|
46
|
+
* wraps at that edge.
|
|
47
|
+
*
|
|
48
|
+
* Deliberately NOT gated on the pane being wide. #2046's measurement is that the
|
|
49
|
+
* explicit toggle ignores the 121-column threshold, so a width branch would miss
|
|
50
|
+
* the case this Issue exists for.
|
|
51
|
+
*
|
|
52
|
+
* ## What a match means, and what it does not
|
|
53
|
+
*
|
|
54
|
+
* A match means the frame was laid out in two columns. A **non**-match means the
|
|
55
|
+
* layout could not be read — most often because no bottom border was on the
|
|
56
|
+
* frame at all, which is what a permission dialog produces (measured:
|
|
57
|
+
* `permission-bash.txt` / `permission-edit.txt` under every width of
|
|
58
|
+
* `tests/fixtures/opencode-live-2047` carry no border row) — and NEVER "the
|
|
59
|
+
* sidebar is off". Nothing reading this may report
|
|
60
|
+
* `null` as an all-clear, for the same reason `upstream-faults.ts` says so.
|
|
61
|
+
*
|
|
62
|
+
* A leaf module by design: it imports {@link stripAnsi}, the excerpt bound and
|
|
63
|
+
* the column rule and nothing else, so the payload builder, the CLI types and the
|
|
64
|
+
* client components that derive this from the frame they already hold can all
|
|
65
|
+
* share one rule.
|
|
66
|
+
*
|
|
67
|
+
* @module lib/detection/opencode-pane-obstruction
|
|
68
|
+
*/
|
|
69
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
|
+
exports.OPENCODE_SIDEBAR_TRUNCATION_MARKER = exports.OPENCODE_SIDEBAR_EXCERPT_MAX_BYTES = exports.OPENCODE_SIDEBAR_MIN_ROWS = exports.OPENCODE_SIDEBAR_RECOVERY_CHORD = exports.OPENCODE_SIDEBAR_OBSTRUCTION_ID = void 0;
|
|
71
|
+
exports.detectOpenCodePaneObstruction = detectOpenCodePaneObstruction;
|
|
72
|
+
const ansi_1 = require("./ansi");
|
|
73
|
+
const excerpt_1 = require("./excerpt");
|
|
74
|
+
const terminal_columns_1 = require("./terminal-columns");
|
|
75
|
+
/**
|
|
76
|
+
* Published `paneObstruction.id` for this signature.
|
|
77
|
+
*
|
|
78
|
+
* Snake case, like every `sessionStatusReason` value, because the same operators
|
|
79
|
+
* read the two next to each other in `capture --json`.
|
|
80
|
+
*/
|
|
81
|
+
exports.OPENCODE_SIDEBAR_OBSTRUCTION_ID = 'opencode_sidebar';
|
|
82
|
+
/**
|
|
83
|
+
* The keystroke that closes it, in opencode's own notation.
|
|
84
|
+
*
|
|
85
|
+
* Taken verbatim from opencode's keybind table, which its `ctrl+p` palette
|
|
86
|
+
* prints as `Show sidebar ctrl+x b` — see
|
|
87
|
+
* `tests/fixtures/opencode-live-2046/w80/dialog-command-palette.txt:70`.
|
|
88
|
+
* Exported rather than written into each surface so the UI banner, the history
|
|
89
|
+
* row and `wait`'s stderr cannot drift apart, and so no surface has to hold a
|
|
90
|
+
* bare key literal of its own.
|
|
91
|
+
*/
|
|
92
|
+
exports.OPENCODE_SIDEBAR_RECOVERY_CHORD = 'ctrl+x b';
|
|
93
|
+
/**
|
|
94
|
+
* How many box rows must carry a second column before this reports a match.
|
|
95
|
+
*
|
|
96
|
+
* Two, as cheap insurance against a single stray cell — a wide character
|
|
97
|
+
* straddling the edge, a repaint caught mid-write. Not a tuned threshold: the
|
|
98
|
+
* measured frames carry 3 (in the 100-row window this is judged on) to 11, so
|
|
99
|
+
* the guard has an order of magnitude of headroom and has never been the thing
|
|
100
|
+
* that decided a verdict.
|
|
101
|
+
*/
|
|
102
|
+
exports.OPENCODE_SIDEBAR_MIN_ROWS = 2;
|
|
103
|
+
/** Bound on {@link OpenCodePaneObstruction.matchedText}, in UTF-8 bytes. */
|
|
104
|
+
exports.OPENCODE_SIDEBAR_EXCERPT_MAX_BYTES = 200;
|
|
105
|
+
/** Appended when {@link OPENCODE_SIDEBAR_EXCERPT_MAX_BYTES} cut the excerpt. */
|
|
106
|
+
exports.OPENCODE_SIDEBAR_TRUNCATION_MARKER = '…[truncated]';
|
|
107
|
+
/**
|
|
108
|
+
* The input box's bottom edge: ` ╹▀▀▀▀▀…`.
|
|
109
|
+
*
|
|
110
|
+
* The same anchor `OPENCODE_COMPOSER_BOTTOM_BORDER` (`cli-patterns.ts`, Issue
|
|
111
|
+
* #1911) uses, restated here with capture groups because this module needs the
|
|
112
|
+
* edge's COLUMN and that one only needs to know the row exists.
|
|
113
|
+
* `tests/unit/detection-opencode-pane-obstruction-2095.test.ts` asserts the two
|
|
114
|
+
* still select the same rows, so the restatement cannot drift silently.
|
|
115
|
+
*/
|
|
116
|
+
const COMPOSER_BOTTOM_BORDER_ROW = /^([^\S\n]*)╹(▀{4,})/;
|
|
117
|
+
/**
|
|
118
|
+
* A row of the input box: leading space, then the gutter.
|
|
119
|
+
*
|
|
120
|
+
* Character class shared with `OPENCODE_GUTTER_ROW_PATTERN` (Issue #1893):
|
|
121
|
+
* opencode draws the same box with `┃` and, in some themes, `│`.
|
|
122
|
+
*/
|
|
123
|
+
const COMPOSER_GUTTER_ROW = /^([^\S\n]*)[│┃]/;
|
|
124
|
+
/**
|
|
125
|
+
* The second column sharing rows with an opencode transcript, or null.
|
|
126
|
+
*
|
|
127
|
+
* Call it only for opencode: the anchors are opencode's own box drawing, and
|
|
128
|
+
* every other tool is left exactly as it was (Issue #2095 changes no other
|
|
129
|
+
* tool's detection).
|
|
130
|
+
*
|
|
131
|
+
* ANSI is stripped first — the sidebar is painted with an SGR background, so on
|
|
132
|
+
* a raw `capture-pane -e` frame the column boundary is buried in escape
|
|
133
|
+
* sequences.
|
|
134
|
+
*/
|
|
135
|
+
function detectOpenCodePaneObstruction(frame) {
|
|
136
|
+
const lines = (0, ansi_1.stripAnsi)(frame).split('\n');
|
|
137
|
+
// The LAST border row, not the first: a long capture holds the borders of
|
|
138
|
+
// every repaint still in scrollback, and the only one that describes the box
|
|
139
|
+
// on screen now is the last one. Reading an older, wider edge would report
|
|
140
|
+
// "no second column" on a pane that has one.
|
|
141
|
+
let borderIndex = -1;
|
|
142
|
+
let boxLeft = -1;
|
|
143
|
+
let boxRight = -1;
|
|
144
|
+
for (let i = 0; i < lines.length; i++) {
|
|
145
|
+
const border = COMPOSER_BOTTOM_BORDER_ROW.exec(lines[i]);
|
|
146
|
+
if (!border)
|
|
147
|
+
continue;
|
|
148
|
+
borderIndex = i;
|
|
149
|
+
boxLeft = border[1].length;
|
|
150
|
+
boxRight = boxLeft + 1 + border[2].length;
|
|
151
|
+
}
|
|
152
|
+
if (borderIndex === -1)
|
|
153
|
+
return null;
|
|
154
|
+
let rows = 0;
|
|
155
|
+
let matchedText = '';
|
|
156
|
+
for (let i = 0; i < lines.length; i++) {
|
|
157
|
+
const line = lines[i];
|
|
158
|
+
if (i !== borderIndex) {
|
|
159
|
+
const gutter = COMPOSER_GUTTER_ROW.exec(line);
|
|
160
|
+
// Same indent as the border, or it is not this box's row. At 200 columns
|
|
161
|
+
// opencode centres the home screen's box (measured: `boxLeft` 63), so an
|
|
162
|
+
// indent-agnostic test would count transcript rows as box rows.
|
|
163
|
+
if (!gutter || gutter[1].length !== boxLeft)
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// Cut at the COLUMN, not at the UTF-16 unit — see {@link indexAtColumn} for
|
|
167
|
+
// which of the two ways those disagree can invent a column that is not
|
|
168
|
+
// there. A box that owns the full pane width slices to '' whatever is
|
|
169
|
+
// written in it.
|
|
170
|
+
const tail = line.slice((0, terminal_columns_1.indexAtColumn)(line, boxRight)).trim();
|
|
171
|
+
if (tail === '')
|
|
172
|
+
continue;
|
|
173
|
+
rows += 1;
|
|
174
|
+
if (matchedText === '') {
|
|
175
|
+
matchedText = (0, excerpt_1.truncateToByteBudget)(tail, exports.OPENCODE_SIDEBAR_EXCERPT_MAX_BYTES, exports.OPENCODE_SIDEBAR_TRUNCATION_MARKER);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (rows < exports.OPENCODE_SIDEBAR_MIN_ROWS)
|
|
179
|
+
return null;
|
|
180
|
+
return { id: exports.OPENCODE_SIDEBAR_OBSTRUCTION_ID, matchedText, boxRight, rows };
|
|
181
|
+
}
|
|
@@ -42,6 +42,13 @@ Object.defineProperty(exports, "STATUS_REASON", { enumerable: true, get: functio
|
|
|
42
42
|
*/
|
|
43
43
|
exports.SELECTION_LIST_REASONS = new Set([
|
|
44
44
|
status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
|
|
45
|
+
// Issue #2112: opencode's session list / agent list / timeline / command
|
|
46
|
+
// palette, recognised from the rectangle they are painted as rather than from
|
|
47
|
+
// their headings. Like every other opencode overlay they are driven by ↑/↓ +
|
|
48
|
+
// Enter and dismissed with `esc`, which is what NavigationButtons sends —
|
|
49
|
+
// and, critically, they must never be read as a finished turn: the marker
|
|
50
|
+
// from the PREVIOUS turn is still on the pane behind them.
|
|
51
|
+
status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
|
|
45
52
|
// Issue #1893: opencode's permission dialog is a horizontal button strip that
|
|
46
53
|
// only ←/→ + Enter drive — typing an option number does nothing (measured on
|
|
47
54
|
// 1.18.21), so it is a `menu`, not something `respond <id> N` can answer.
|
|
@@ -23,6 +23,26 @@ exports.STATUS_REASON = {
|
|
|
23
23
|
THINKING_INDICATOR: 'thinking_indicator',
|
|
24
24
|
OPENCODE_PROCESSING_INDICATOR: 'opencode_processing_indicator',
|
|
25
25
|
OPENCODE_SELECTION_LIST: 'opencode_selection_list',
|
|
26
|
+
/**
|
|
27
|
+
* Issue #2112: a background-painted rectangle with an `esc` hatch was drawn
|
|
28
|
+
* over the transcript — opencode's session list, agent list, timeline,
|
|
29
|
+
* command palette or picker.
|
|
30
|
+
*
|
|
31
|
+
* Distinct from {@link STATUS_REASON.OPENCODE_SELECTION_LIST} because the two
|
|
32
|
+
* are different READINGS of the same screen: that one is the allowlisted
|
|
33
|
+
* heading (`Select model` / `Select provider` / `Connect a provider`, #1896)
|
|
34
|
+
* found as text and survives ANSI stripping; this one is the layout and needs
|
|
35
|
+
* the SGR the capture was taken with. An operator reading `capture --json`
|
|
36
|
+
* can tell which one answered, which is the difference between "the heading is
|
|
37
|
+
* one we know" and "something modal is on the pane".
|
|
38
|
+
*
|
|
39
|
+
* The literal is restated from `OPENCODE_MODAL_OVERLAY_ID`
|
|
40
|
+
* (`lib/detection/opencode-modal-overlay.ts`) rather than imported, so this
|
|
41
|
+
* module keeps the no-imports property its docblock above depends on;
|
|
42
|
+
* `tests/unit/detection-opencode-modal-overlay-2112.test.ts` pins the two
|
|
43
|
+
* equal so the restatement cannot drift.
|
|
44
|
+
*/
|
|
45
|
+
OPENCODE_MODAL_OVERLAY: 'opencode_modal_overlay',
|
|
26
46
|
/** Issue #1893: opencode's permission dialog — an arrow-key button strip. */
|
|
27
47
|
OPENCODE_PERMISSION_PROMPT: 'opencode_permission_prompt',
|
|
28
48
|
CLAUDE_SELECTION_LIST: 'claude_selection_list',
|