commandmate 0.27.1 → 0.29.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 +441 -404
- package/.next/app-path-routes-manifest.json +34 -29
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +9 -9
- package/.next/react-loadable-manifest.json +0 -6
- 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.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.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.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/remote/pair/route.js +2 -0
- package/.next/server/app/api/remote/pair/route.js.nft.json +1 -0
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -0
- 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.js +2 -2
- 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 +34 -29
- package/.next/server/chunks/1058.js +1 -0
- package/.next/server/chunks/1068.js +1 -3
- package/.next/server/chunks/1162.js +1 -1
- package/.next/server/chunks/1191.js +13 -0
- package/.next/server/chunks/1296.js +1 -1
- package/.next/server/chunks/1601.js +2 -2
- package/.next/server/chunks/1714.js +7 -0
- package/.next/server/chunks/1886.js +5 -0
- package/.next/server/chunks/1944.js +1 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/221.js +19 -0
- package/.next/server/chunks/222.js +1 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2366.js +1 -0
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/243.js +1 -0
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/2759.js +1 -1
- package/.next/server/chunks/3346.js +1 -1
- package/.next/server/chunks/3440.js +1 -1
- package/.next/server/chunks/3480.js +17 -1
- package/.next/server/chunks/3543.js +1 -1
- package/.next/server/chunks/3558.js +1 -0
- package/.next/server/chunks/3945.js +1 -1
- 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 +6 -6
- package/.next/server/chunks/8807.js +84 -18
- package/.next/server/chunks/9123.js +2 -2
- 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/functions-config-manifest.json +3 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +1 -1
- package/.next/server/src/middleware.js.map +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/5229-580b581fce5aeb52.js +1 -0
- package/.next/static/chunks/6381-c8d93ec301dbc380.js +1 -0
- package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/login/page-03659dded846ef1d.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/more/page-03867ab635d197c7.js +1 -0
- package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/review/page-9a6d18ddcccbb63c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-c07b23b6ca58091c.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-00ad5d9a62a71cab.js +1 -0
- package/.next/static/chunks/webpack-7e79064bfce988d7.js +1 -0
- package/.next/static/css/b6990f889f4f9515.css +1 -0
- package/.next/static/uulKcSOgyxChTo4SipUSF/_buildManifest.js +1 -0
- package/.next/trace +13 -13
- package/.next/types/app/api/remote/pair/route.ts +347 -0
- 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 +6 -1
- package/.next/types/validator.ts +45 -0
- package/README.md +24 -4
- 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/remote.d.ts +248 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/remote.js +849 -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/config/security-messages.d.ts +25 -0
- package/dist/cli/config/security-messages.d.ts.map +1 -1
- package/dist/cli/config/security-messages.js +43 -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 +12 -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 +83 -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/qr-terminal.d.ts +54 -0
- package/dist/cli/utils/qr-terminal.d.ts.map +1 -0
- package/dist/cli/utils/qr-terminal.js +181 -0
- package/dist/cli/utils/remote-state.d.ts +123 -0
- package/dist/cli/utils/remote-state.d.ts.map +1 -0
- package/dist/cli/utils/remote-state.js +193 -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/config/auth-config.d.ts +1 -1
- package/dist/config/auth-config.d.ts.map +1 -1
- package/dist/config/auth-config.js +5 -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/remote/cloudflare.d.ts +285 -0
- package/dist/lib/remote/cloudflare.d.ts.map +1 -0
- package/dist/lib/remote/cloudflare.js +619 -0
- package/dist/lib/remote/index.d.ts +17 -0
- package/dist/lib/remote/index.d.ts.map +1 -0
- package/dist/lib/remote/index.js +64 -0
- package/dist/lib/remote/provider-registry.d.ts +29 -0
- package/dist/lib/remote/provider-registry.d.ts.map +1 -0
- package/dist/lib/remote/provider-registry.js +73 -0
- package/dist/lib/remote/tailscale.d.ts +268 -0
- package/dist/lib/remote/tailscale.d.ts.map +1 -0
- package/dist/lib/remote/tailscale.js +546 -0
- package/dist/lib/remote/types.d.ts +127 -0
- package/dist/lib/remote/types.d.ts.map +1 -0
- package/dist/lib/remote/types.js +53 -0
- package/dist/lib/security/pairing-code.d.ts +182 -0
- package/dist/lib/security/pairing-code.d.ts.map +1 -0
- package/dist/lib/security/pairing-code.js +265 -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/auth-config.js +5 -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 +2 -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/9IXgWfBUtnEnRqnbmErTp/_buildManifest.js +0 -1
- package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +0 -1
- package/.next/static/chunks/5229-1f5f19740a8d6c11.js +0 -1
- package/.next/static/chunks/6271.295ced91b6335f18.js +0 -1
- package/.next/static/chunks/6381-8cfe50a5ca5425b1.js +0 -1
- package/.next/static/chunks/8521-c43994fb58501d13.js +0 -1
- package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/login/page-adc51f0f7cbb7ac6.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/more/page-3266dfa945972649.js +0 -1
- package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/review/page-8f63aff862fee421.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-f7b3dfbe757dc6b8.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +0 -1
- package/.next/static/chunks/webpack-6a9668cf54a26eba.js +0 -1
- package/.next/static/css/928e5a8830fbf997.css +0 -1
- /package/.next/static/{9IXgWfBUtnEnRqnbmErTp → uulKcSOgyxChTo4SipUSF}/_ssgManifest.js +0 -0
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* - startSession: launches `opencode` TUI in tmux
|
|
8
8
|
* - sendMessage: sends text via tmux send-keys + Enter
|
|
9
9
|
* - killSession: types `/exit` + a separate Enter, then falls back to tmux kill-session
|
|
10
|
-
* - interrupt():
|
|
10
|
+
* - interrupt(): `POST /session/:id/abort` when the port is live (Issue #2034),
|
|
11
|
+
* else Escape TWICE, 300 ms apart -- one press does not abort (Issue #1894)
|
|
11
12
|
*
|
|
12
13
|
* ## Structured events (Issue #1763, Epic #1720 Phase 4-5)
|
|
13
14
|
*
|
|
@@ -25,6 +26,16 @@
|
|
|
25
26
|
* starts without structured events is the pre-#1763 status quo, and the screen
|
|
26
27
|
* scraper keeps deciding for it exactly as before.
|
|
27
28
|
*
|
|
29
|
+
* ## Session continuity (Issue #2038)
|
|
30
|
+
*
|
|
31
|
+
* opencode is the one supported agent whose conversation is addressable from
|
|
32
|
+
* the command line (`-s` / `-c` / `--fork`, measured on 1.18.22). `killSession`
|
|
33
|
+
* writes the instance's session down while its server can still be asked
|
|
34
|
+
* (`@/lib/session/opencode-session-recall`), and the creation path appends
|
|
35
|
+
* `-s <id>` to the launch line when — and only when — the recorded
|
|
36
|
+
* `Session.directory` is this worktree. The flag is composed HERE rather than in
|
|
37
|
+
* `prepareOpencodeLaunch` so no other tool's launch plan can be reached by it.
|
|
38
|
+
*
|
|
28
39
|
* ## Launch side effects (Issue #1908)
|
|
29
40
|
*
|
|
30
41
|
* Two things this file used to do on the way up are gone. The 15-second sleep
|
|
@@ -34,8 +45,10 @@
|
|
|
34
45
|
* opted in — see `./opencode-config`.
|
|
35
46
|
*/
|
|
36
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.OpenCodeTool = exports.OPENCODE_READY_MAX_ATTEMPTS = exports.OPENCODE_READY_POLL_INTERVAL_MS = exports.OPENCODE_PANE_HEIGHT = exports.OPENCODE_EXIT_COMMAND = void 0;
|
|
48
|
+
exports.OpenCodeTool = exports.OPENCODE_SEND_READBACK_DELAYS_MS = exports.OPENCODE_READY_MAX_ATTEMPTS = exports.OPENCODE_READY_POLL_INTERVAL_MS = exports.OPENCODE_PANE_WIDTH = exports.OPENCODE_PANE_HEIGHT = exports.OPENCODE_EXIT_COMMAND = void 0;
|
|
49
|
+
exports.formatImagePathFallbackMessage = formatImagePathFallbackMessage;
|
|
38
50
|
const base_1 = require("./base");
|
|
51
|
+
const terminal_keys_1 = require("../../types/terminal-keys");
|
|
39
52
|
const tmux_1 = require("../tmux/tmux");
|
|
40
53
|
const cli_patterns_1 = require("../detection/cli-patterns");
|
|
41
54
|
const submit_verified_sender_1 = require("./submit-verified-sender");
|
|
@@ -43,13 +56,20 @@ const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
|
|
|
43
56
|
const opencode_config_1 = require("./opencode-config");
|
|
44
57
|
const tmux_pane_config_1 = require("../../config/tmux-pane-config");
|
|
45
58
|
Object.defineProperty(exports, "OPENCODE_PANE_HEIGHT", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_HEIGHT; } });
|
|
59
|
+
Object.defineProperty(exports, "OPENCODE_PANE_WIDTH", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_WIDTH; } });
|
|
46
60
|
const child_process_1 = require("child_process");
|
|
61
|
+
const path_1 = require("path");
|
|
47
62
|
const util_1 = require("util");
|
|
48
63
|
const logger_1 = require("../../lib/logger");
|
|
64
|
+
const image_extensions_1 = require("../../config/image-extensions");
|
|
49
65
|
const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
|
|
50
66
|
const runtime_1 = require("../../lib/hooks/sources/opencode/runtime");
|
|
51
67
|
const ports_1 = require("../../lib/hooks/sources/opencode/ports");
|
|
68
|
+
const launch_settings_1 = require("../../lib/hooks/sources/opencode/launch-settings");
|
|
52
69
|
const client_1 = require("../../lib/hooks/sources/opencode/client");
|
|
70
|
+
const subscription_1 = require("../../lib/hooks/sources/opencode/subscription");
|
|
71
|
+
const opencode_session_recall_1 = require("../../lib/session/opencode-session-recall");
|
|
72
|
+
const opencode_session_store_1 = require("../../lib/session/opencode-session-store");
|
|
53
73
|
const graceful_exit_1 = require("./graceful-exit");
|
|
54
74
|
const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
|
|
55
75
|
const session_start_error_1 = require("../session/session-start-error");
|
|
@@ -67,6 +87,47 @@ function getErrorMessage(error) {
|
|
|
67
87
|
}
|
|
68
88
|
/** OpenCode TUI graceful exit command [D1-006] */
|
|
69
89
|
exports.OPENCODE_EXIT_COMMAND = '/exit';
|
|
90
|
+
/**
|
|
91
|
+
* {@link resolveOpencodePaneWidth}, plus the one-line operator feedback the
|
|
92
|
+
* pure config module deliberately cannot emit (Issue #2047).
|
|
93
|
+
*
|
|
94
|
+
* `tmux-pane-config.ts` has no imports at all — that is a documented property
|
|
95
|
+
* (#1906), and pulling the logger in there would make every consumer of a
|
|
96
|
+
* constant depend on the logging stack. So the resolver stays silent and the
|
|
97
|
+
* warning lives here, at the two call sites that actually resize a pane.
|
|
98
|
+
*
|
|
99
|
+
* Two things are worth telling the operator, and neither is an error:
|
|
100
|
+
*
|
|
101
|
+
* - the value was DROPPED (not an integer, or outside the accepted bounds), so
|
|
102
|
+
* the pane they are about to look at is the 80-column default rather than
|
|
103
|
+
* what they asked for;
|
|
104
|
+
* - the value was ACCEPTED but lands at or above
|
|
105
|
+
* {@link OPENCODE_SIDEBAR_MIN_WIDTH}, where opencode 1.18.22 paints its
|
|
106
|
+
* right-hand sidebar into the same rows as the transcript. #2047 measured
|
|
107
|
+
* what that does to this repo's own readers — a saved "reply" made entirely
|
|
108
|
+
* of sidebar chrome, a status flip on an aborted turn, and a false idle
|
|
109
|
+
* composer off the session title. It is still allowed, because an operator
|
|
110
|
+
* who only ever reads the pane in the browser may want it; it is not silent.
|
|
111
|
+
*
|
|
112
|
+
* @returns Pane width in columns, ready to hand to `resize-window`.
|
|
113
|
+
*/
|
|
114
|
+
function resolveOpencodePaneWidthChecked() {
|
|
115
|
+
const requested = process.env[tmux_pane_config_1.OPENCODE_PANE_WIDTH_ENV];
|
|
116
|
+
const width = (0, tmux_pane_config_1.resolveOpencodePaneWidth)();
|
|
117
|
+
if (requested !== undefined && String(width) !== requested.trim()) {
|
|
118
|
+
logger.warn('opencode-pane-width-rejected', {
|
|
119
|
+
requested,
|
|
120
|
+
applied: width,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else if (width >= tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH) {
|
|
124
|
+
logger.warn('opencode-pane-width-sidebar-visible', {
|
|
125
|
+
width,
|
|
126
|
+
sidebarMinWidth: tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return width;
|
|
130
|
+
}
|
|
70
131
|
/**
|
|
71
132
|
* Interval between readiness polls while opencode paints its TUI (Issue #1908).
|
|
72
133
|
*
|
|
@@ -94,6 +155,42 @@ exports.OPENCODE_READY_MAX_ATTEMPTS = 60;
|
|
|
94
155
|
* in the frame regardless of this number. Matches copilot's 50.
|
|
95
156
|
*/
|
|
96
157
|
const OPENCODE_READY_CAPTURE_LINES = 50;
|
|
158
|
+
/**
|
|
159
|
+
* Waits before each read-back of a message just posted to the server (#2035).
|
|
160
|
+
*
|
|
161
|
+
* Delays *before* each attempt, so the first costs nothing — which is the whole
|
|
162
|
+
* ladder in the ordinary case. Measured on 1.18.22 across five posts: the
|
|
163
|
+
* message was readable on the **first** `GET`, 8-23 ms after the POST began, so
|
|
164
|
+
* `prompt_async` answers `204` after the message exists rather than before.
|
|
165
|
+
*
|
|
166
|
+
* The three retries are for the race that measurement did not produce, and they
|
|
167
|
+
* are cheap because the alternative is expensive in one direction only: a
|
|
168
|
+
* `missing` verdict sends the body again over the keyboard, so calling a message
|
|
169
|
+
* missing while it is still being written would deliver it twice. Total worst
|
|
170
|
+
* case 350 ms, inside the HTTP request the operator's send is waiting on.
|
|
171
|
+
*/
|
|
172
|
+
exports.OPENCODE_SEND_READBACK_DELAYS_MS = [0, 50, 100, 200];
|
|
173
|
+
/**
|
|
174
|
+
* The body a tool that cannot attach an image sends instead (Issue #474).
|
|
175
|
+
*
|
|
176
|
+
* Defined here, and imported by `@/lib/session/send-user-message`, because
|
|
177
|
+
* opencode is the one tool where the choice is made **at run time**: every other
|
|
178
|
+
* tool either attaches natively for every session or never does, and their
|
|
179
|
+
* branch is picked once by `isImageCapableCLITool`. opencode's native path needs
|
|
180
|
+
* a server that a given pane may not have (no `--port`, `CM_AGENT_HOOKS_INJECT=0`,
|
|
181
|
+
* a version too old), so {@link OpenCodeTool.sendMessageWithImage} has to be able
|
|
182
|
+
* to produce this degraded form itself. One definition rather than two: the
|
|
183
|
+
* string is what an operator reads in Message History, and a second copy of it
|
|
184
|
+
* here would drift from the one in the send service without anything noticing.
|
|
185
|
+
*
|
|
186
|
+
* @param content - The operator's message; may be empty
|
|
187
|
+
* @param absoluteImagePath - Absolute path to the attachment
|
|
188
|
+
*/
|
|
189
|
+
function formatImagePathFallbackMessage(content, absoluteImagePath) {
|
|
190
|
+
return content
|
|
191
|
+
? `${content}\n\n[添付画像: ${absoluteImagePath}]`
|
|
192
|
+
: `[添付画像: ${absoluteImagePath}]`;
|
|
193
|
+
}
|
|
97
194
|
/**
|
|
98
195
|
* OpenCode CLI tool implementation
|
|
99
196
|
* Manages OpenCode interactive sessions using tmux
|
|
@@ -102,6 +199,34 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
102
199
|
id = 'opencode';
|
|
103
200
|
name = 'OpenCode';
|
|
104
201
|
command = 'opencode';
|
|
202
|
+
/**
|
|
203
|
+
* Declare opencode's key vocabulary (Issue #2046).
|
|
204
|
+
*
|
|
205
|
+
* The base pad plus opencode's own chords: the `C-x` leader, the letters that
|
|
206
|
+
* complete it, and the two control keys that need no leader (`C-p` palette,
|
|
207
|
+
* `C-t` variant cycle). Measured against a live opencode 1.18.22 on an
|
|
208
|
+
* isolated `HOME` and a private tmux socket; the defaults are also readable in
|
|
209
|
+
* the shipped binary (`leader: "ctrl+x"`, `leader_timeout: 2000`). Full run in
|
|
210
|
+
* `docs/design/opencode-server-live-verification.md` §22.
|
|
211
|
+
*
|
|
212
|
+
* **`b` (`sidebar_toggle`) is not here**, and that absence is the Issue's main
|
|
213
|
+
* finding rather than an oversight: at the 80 columns
|
|
214
|
+
* `resolveOpencodePaneWidth()` defaults to, an explicit `C-x` `b` turns the
|
|
215
|
+
* sidebar on *anyway* — it overrides the 121-column auto-gate #2047 measured —
|
|
216
|
+
* and in that state the same three readers #2047 documented at 200 columns
|
|
217
|
+
* break at 80 (§22.3). Before the first turn the binding is inert and the `b`
|
|
218
|
+
* lands in the composer as text instead. Neither branch has a width where it
|
|
219
|
+
* is safe, so the key is not published and the route will answer 400 for it.
|
|
220
|
+
*
|
|
221
|
+
* This method is the ONLY thing #2046 added to this file. Pane width and
|
|
222
|
+
* geometry stay where #2047 put them (`src/config/tmux-pane-config.ts`).
|
|
223
|
+
*/
|
|
224
|
+
navigationKeys() {
|
|
225
|
+
return {
|
|
226
|
+
keys: terminal_keys_1.OPENCODE_NAVIGATION_KEY_VALUES,
|
|
227
|
+
leaderKey: terminal_keys_1.OPENCODE_LEADER_KEY,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
105
230
|
/**
|
|
106
231
|
* Check if OpenCode session is running for a worktree
|
|
107
232
|
*/
|
|
@@ -125,8 +250,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
125
250
|
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
126
251
|
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
127
252
|
if (exists) {
|
|
253
|
+
// Issue #2047: the SAME width as the creation path below. These two used
|
|
254
|
+
// to spell `80` independently, which is the shape where "new sessions are
|
|
255
|
+
// 200 wide, reconnected ones are 80" ships without anyone noticing —
|
|
256
|
+
// a reconnect would silently hand the detectors a geometry the creation
|
|
257
|
+
// path had been moved away from.
|
|
128
258
|
await this.reconcileExistingSession(sessionName, {
|
|
129
|
-
windowWidth:
|
|
259
|
+
windowWidth: resolveOpencodePaneWidthChecked(),
|
|
130
260
|
windowHeight: tmux_pane_config_1.OPENCODE_PANE_HEIGHT,
|
|
131
261
|
});
|
|
132
262
|
// Issue #1763: the pane outlived this process (a CommandMate restart), so
|
|
@@ -156,13 +286,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
156
286
|
});
|
|
157
287
|
// Wait a moment for the session to be created
|
|
158
288
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
|
|
159
|
-
// Resize tmux window
|
|
289
|
+
// Resize tmux window so opencode's right-hand sidebar stays hidden and
|
|
290
|
+
// `capture-pane` returns transcript rows only. Issue #2047 measured the
|
|
291
|
+
// boundary this depends on (sidebar at >=121 columns, hidden at <=120) and
|
|
292
|
+
// moved the number to `OPENCODE_PANE_WIDTH` / `CM_OPENCODE_PANE_WIDTH`.
|
|
160
293
|
// [SEC-001] Uses execFile (not exec) to prevent shell meta-character injection via sessionName
|
|
161
294
|
try {
|
|
162
295
|
await execFileAsync('tmux', [
|
|
163
296
|
// Issue #1156: exact-match target so resize never leaks to a prefix-colliding instance
|
|
164
297
|
'resize-window', '-t', (0, tmux_1.exactTarget)(sessionName),
|
|
165
|
-
'-x',
|
|
298
|
+
'-x', String(resolveOpencodePaneWidthChecked()), '-y', String(tmux_pane_config_1.OPENCODE_PANE_HEIGHT),
|
|
166
299
|
]);
|
|
167
300
|
}
|
|
168
301
|
catch {
|
|
@@ -179,11 +312,32 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
179
312
|
// `AgentEventSource` for the plan (S3/S4/S5) and never throws. opencode's
|
|
180
313
|
// environment is empty — it is the one source with no correlation
|
|
181
314
|
// variable, because CommandMate holds the connection (#1846).
|
|
182
|
-
const
|
|
315
|
+
const plannedCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({
|
|
183
316
|
target,
|
|
184
317
|
executablePath: this.command,
|
|
185
318
|
worktreePath,
|
|
186
319
|
});
|
|
320
|
+
// Issue #2038: continue the conversation this instance was in before it
|
|
321
|
+
// was stopped. `-s <id>` is appended HERE rather than inside
|
|
322
|
+
// `prepareOpencodeLaunch` because the plan is a statement about the tool
|
|
323
|
+
// and this is a fact about one pane's history; keeping them apart is also
|
|
324
|
+
// what makes "claude / codex の起動引数は不変" a property of the code
|
|
325
|
+
// rather than of a test — no other tool's launcher can reach this line.
|
|
326
|
+
//
|
|
327
|
+
// Null whenever there is nothing to resume, and — the acceptance
|
|
328
|
+
// condition — whenever the remembered session belongs to a different
|
|
329
|
+
// worktree than the one being launched. See `./opencode-session-store`.
|
|
330
|
+
const resumeSessionId = (0, opencode_session_store_1.recoverOpencodeSessionId)(target, worktreePath);
|
|
331
|
+
const launchCommand = resumeSessionId === null
|
|
332
|
+
? plannedCommand
|
|
333
|
+
: (0, opencode_session_store_1.withOpencodeResumedSession)(plannedCommand, resumeSessionId);
|
|
334
|
+
if (resumeSessionId !== null) {
|
|
335
|
+
logger.info('opencode-session-resumed', {
|
|
336
|
+
worktreeId,
|
|
337
|
+
instanceId: instanceId ?? this.id,
|
|
338
|
+
sessionId: resumeSessionId,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
187
341
|
await (0, tmux_1.sendKeys)(sessionName, launchCommand, true);
|
|
188
342
|
// Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
|
|
189
343
|
await this.waitForReady(sessionName);
|
|
@@ -271,10 +425,186 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
271
425
|
logger.info('opencode-ready-detection-timeout');
|
|
272
426
|
return false;
|
|
273
427
|
}
|
|
428
|
+
/**
|
|
429
|
+
* Post one prompt to this instance's server, and verify it landed (#2035).
|
|
430
|
+
*
|
|
431
|
+
* The primary half of `sendMessage` / `sendMessageWithImage`. Answers false
|
|
432
|
+
* for every way the server route can fail to apply, and the caller then types
|
|
433
|
+
* the body exactly as it did before this Issue.
|
|
434
|
+
*
|
|
435
|
+
* ## Why `prompt_async` and not `/tui/append-prompt` + `/tui/submit-prompt`
|
|
436
|
+
*
|
|
437
|
+
* Both were measured live on 1.18.22 (design doc §11). The `/tui/*` pair does
|
|
438
|
+
* work — the composer reflects the text, `/tui/clear-prompt` removes residue
|
|
439
|
+
* a keystroke left, and a three-line and a 266-character body both arrived
|
|
440
|
+
* byte-identical. But it drives the **composer**, so it inherits the
|
|
441
|
+
* composer's state, and the Issue's own example is where that shows: a body
|
|
442
|
+
* of `/exit` opens the command palette on append, and the palette then eats
|
|
443
|
+
* the submit. All three calls answered `200 true`; no message was created;
|
|
444
|
+
* the TUI did not exit either. `prompt_async` does not touch the composer, and
|
|
445
|
+
* the same `/exit` arrived as literal text — as did `--force …`,
|
|
446
|
+
* `$(whoami)`, three lines, and 266 characters.
|
|
447
|
+
*
|
|
448
|
+
* It also leaves an operator's half-typed draft alone, which `/tui/*` cannot:
|
|
449
|
+
* `append-prompt` concatenates (`AAA` + `BBB` = `AAABBB`), so sending through
|
|
450
|
+
* the composer means either splicing CommandMate's body onto the draft or
|
|
451
|
+
* clearing the draft away.
|
|
452
|
+
*
|
|
453
|
+
* ## Why the read-back
|
|
454
|
+
*
|
|
455
|
+
* `204` is "accepted", not "delivered", and the gap is not theoretical:
|
|
456
|
+
* a file part whose `url` is a bare path is accepted and then dropped
|
|
457
|
+
* *together with its text part* (see `opencodeFileUrl`), and a server sharing
|
|
458
|
+
* `HOME` and project with this one accepts a prompt for a session it can
|
|
459
|
+
* reach through `opencode.db` while the message appears on neither this
|
|
460
|
+
* server's stream nor this pane's screen. So the message id is chosen up
|
|
461
|
+
* front and read back afterwards — the same shape as #2034's idle watch, one
|
|
462
|
+
* request instead of a subscription.
|
|
463
|
+
*
|
|
464
|
+
* ## What a `missing` verdict costs, and why `unknown` is treated like it
|
|
465
|
+
*
|
|
466
|
+
* `missing` is a `404` on the id: nothing exists, so typing the body is free
|
|
467
|
+
* of duplication. `unknown` — the server stopped answering between the POST
|
|
468
|
+
* and the read-back — cannot say that, and is still treated as a failure,
|
|
469
|
+
* following #2034: the operator's message must not be silently dropped, and
|
|
470
|
+
* a pane whose server just died is one where the keystroke route is the only
|
|
471
|
+
* one left. The residual risk is one duplicate message inside that window,
|
|
472
|
+
* and it is logged as `opencode-send-unverified` so it is visible rather than
|
|
473
|
+
* inferred.
|
|
474
|
+
*
|
|
475
|
+
* @param target - The instance
|
|
476
|
+
* @param message - The body, sent verbatim
|
|
477
|
+
* @param imagePath - Absolute path to an attachment, if there is one
|
|
478
|
+
* @returns Whether the message was posted **and** read back
|
|
479
|
+
*/
|
|
480
|
+
async trySendViaServer(target, message, imagePath) {
|
|
481
|
+
const instanceId = target.instanceId ?? target.cliToolId;
|
|
482
|
+
try {
|
|
483
|
+
const port = (0, ports_1.getAssignedOpencodePort)(target);
|
|
484
|
+
if (port === null)
|
|
485
|
+
return false;
|
|
486
|
+
// The same three preconditions the abort path checks (#2034): a port with
|
|
487
|
+
// a live subscription behind it, and a session this instance owns. The
|
|
488
|
+
// liveness check is what keeps a squatter on a remembered port from being
|
|
489
|
+
// handed the operator's message.
|
|
490
|
+
const liveness = (0, subscription_1.getOpencodeLiveness)(target);
|
|
491
|
+
if (liveness.state !== 'live') {
|
|
492
|
+
logger.info('opencode-send-skipped-not-live', {
|
|
493
|
+
worktreeId: target.worktreeId,
|
|
494
|
+
instanceId,
|
|
495
|
+
port,
|
|
496
|
+
liveness: liveness.state,
|
|
497
|
+
});
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
// Null on a pane that has not run a turn yet — the gate learns the session
|
|
501
|
+
// from the first frame that names it. That first send goes over the
|
|
502
|
+
// keyboard, and every send after it takes this route.
|
|
503
|
+
const sessionId = (0, subscription_1.getOpencodePrimarySession)(target);
|
|
504
|
+
if (sessionId === null) {
|
|
505
|
+
logger.info('opencode-send-skipped-no-session', {
|
|
506
|
+
worktreeId: target.worktreeId,
|
|
507
|
+
instanceId,
|
|
508
|
+
port,
|
|
509
|
+
});
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
const parts = [{ type: 'text', text: message }];
|
|
513
|
+
if (imagePath !== undefined) {
|
|
514
|
+
parts.push({
|
|
515
|
+
type: 'file',
|
|
516
|
+
mime: (0, image_extensions_1.getMimeTypeByExtension)((0, path_1.extname)(imagePath)),
|
|
517
|
+
filename: (0, path_1.basename)(imagePath),
|
|
518
|
+
url: (0, client_1.opencodeFileUrl)(imagePath),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
const messageId = (0, client_1.newOpencodeMessageId)();
|
|
522
|
+
// Issue #2048: the instance's own persona / model / variant, when the
|
|
523
|
+
// operator configured any. Read on every send rather than once at launch,
|
|
524
|
+
// because a send can be the first thing this process does for a pane it
|
|
525
|
+
// did not start (a CommandMate restart reattaches an existing session) —
|
|
526
|
+
// and because an omitted `agent` is not a no-op: a `prompt_async` body
|
|
527
|
+
// with no `agent` runs the turn as `build` even on a pane launched
|
|
528
|
+
// `--agent plan` (`docs/design/opencode-server-live-verification.md`
|
|
529
|
+
// §20.5). Null when nothing is configured, and the request body is then
|
|
530
|
+
// byte-identical to the pre-#2048 one.
|
|
531
|
+
const selection = (0, launch_settings_1.opencodePromptSelection)((0, launch_settings_1.getOpencodeLaunchSettings)(target));
|
|
532
|
+
if (!(await (0, client_1.sendOpencodePrompt)(port, sessionId, messageId, parts, selection)))
|
|
533
|
+
return false;
|
|
534
|
+
const verified = await this.verifyPostedMessage(port, sessionId, messageId, message);
|
|
535
|
+
if (!verified) {
|
|
536
|
+
logger.warn('opencode-send-unverified', {
|
|
537
|
+
worktreeId: target.worktreeId,
|
|
538
|
+
instanceId,
|
|
539
|
+
port,
|
|
540
|
+
sessionId,
|
|
541
|
+
messageId,
|
|
542
|
+
hasImage: imagePath !== undefined,
|
|
543
|
+
});
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
logger.info('opencode-send-delivered-via-api', {
|
|
547
|
+
worktreeId: target.worktreeId,
|
|
548
|
+
instanceId,
|
|
549
|
+
port,
|
|
550
|
+
sessionId,
|
|
551
|
+
messageId,
|
|
552
|
+
hasImage: imagePath !== undefined,
|
|
553
|
+
});
|
|
554
|
+
return true;
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
// Nothing above is allowed to take the send down: the keystroke route is
|
|
558
|
+
// still there and is what runs when this answers false.
|
|
559
|
+
logger.warn('opencode-send-api-failed', {
|
|
560
|
+
worktreeId: target.worktreeId,
|
|
561
|
+
instanceId,
|
|
562
|
+
error: getErrorMessage(error),
|
|
563
|
+
});
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Read the posted message back until it is there, or until it is not (#2035).
|
|
569
|
+
*
|
|
570
|
+
* The text is compared rather than merely counted, because the acceptance
|
|
571
|
+
* condition for this Issue is that the body is unchanged: a `/`-leading body,
|
|
572
|
+
* a three-line body and a 200-column body all have to come back identical to
|
|
573
|
+
* what was sent. An image send adds parts CommandMate did not write — 1.18.22
|
|
574
|
+
* synthesises a `Called the Read tool with …` text part beside the operator's
|
|
575
|
+
* — so the check is that the sent body is *among* the text parts, not that it
|
|
576
|
+
* is the only one.
|
|
577
|
+
*
|
|
578
|
+
* @returns True once the body was found; false on a `404` or after the ladder
|
|
579
|
+
*/
|
|
580
|
+
async verifyPostedMessage(port, sessionId, messageId, message) {
|
|
581
|
+
for (const waitMs of exports.OPENCODE_SEND_READBACK_DELAYS_MS) {
|
|
582
|
+
if (waitMs > 0)
|
|
583
|
+
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
584
|
+
const readback = await (0, client_1.readOpencodeUserMessage)(port, sessionId, messageId);
|
|
585
|
+
if (readback.kind === 'found')
|
|
586
|
+
return readback.texts.includes(message);
|
|
587
|
+
// A `404` is the server saying the message does not exist, which does not
|
|
588
|
+
// become truer by asking again — the measured cause is a part the server
|
|
589
|
+
// could not resolve, and it discards the whole message when that happens.
|
|
590
|
+
if (readback.kind === 'missing')
|
|
591
|
+
return false;
|
|
592
|
+
}
|
|
593
|
+
return false;
|
|
594
|
+
}
|
|
274
595
|
/**
|
|
275
596
|
* Send a message to OpenCode interactive session
|
|
276
597
|
* [D1-004] Same pattern as Codex/Gemini/VibeLocal (future Template Method candidate)
|
|
277
598
|
*
|
|
599
|
+
* Issue #2035: the server first, the keyboard second. {@link trySendViaServer}
|
|
600
|
+
* documents the measurements behind the choice; what matters here is that
|
|
601
|
+
* every no it can answer — no port, a subscription that is not live, no
|
|
602
|
+
* session yet, a refused POST, a message that did not read back — lands on the
|
|
603
|
+
* `sendMessageWithSubmitVerification` call below, which is the send path
|
|
604
|
+
* exactly as it was before this Issue. A pane launched with
|
|
605
|
+
* `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, must not
|
|
606
|
+
* become a pane that cannot be sent to.
|
|
607
|
+
*
|
|
278
608
|
* @param worktreeId - Worktree ID
|
|
279
609
|
* @param message - Message to send
|
|
280
610
|
*/
|
|
@@ -284,6 +614,12 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
284
614
|
if (!exists) {
|
|
285
615
|
throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
|
|
286
616
|
}
|
|
617
|
+
if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message)) {
|
|
618
|
+
// Issue #405: the transcript grew, so the cached capture is stale — the
|
|
619
|
+
// same reason the keystroke path invalidates below.
|
|
620
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
287
623
|
try {
|
|
288
624
|
// Issue #1471: Body/Enter separation + read-back submit verification via the
|
|
289
625
|
// shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
|
|
@@ -302,6 +638,58 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
302
638
|
throw new Error(`Failed to send message to OpenCode: ${errorMessage}`);
|
|
303
639
|
}
|
|
304
640
|
}
|
|
641
|
+
/**
|
|
642
|
+
* opencode can attach an image — sometimes (Issue #2035).
|
|
643
|
+
*
|
|
644
|
+
* `IImageCapableCLITool` is a *static* declaration: `supportsImage()` takes no
|
|
645
|
+
* arguments, so it cannot answer per pane, and `send-user-message` picks the
|
|
646
|
+
* branch from it once. Saying `true` here therefore means
|
|
647
|
+
* {@link sendMessageWithImage} owns the degraded form as well — which it does.
|
|
648
|
+
*
|
|
649
|
+
* Measured on 1.18.22: `POST /session/:id/prompt_async` with a `file` part
|
|
650
|
+
* delivers a real image. The part came back on the stream re-encoded as
|
|
651
|
+
* `data:image/png;base64,…`, the TUI rendered it as `File blue.png`, and the
|
|
652
|
+
* vision model answered the question that was asked about it. That is the
|
|
653
|
+
* whole of the claim being made here.
|
|
654
|
+
*/
|
|
655
|
+
supportsImage() {
|
|
656
|
+
return true;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Send a message with an image attached (Issue #2035).
|
|
660
|
+
*
|
|
661
|
+
* Before this Issue opencode had no image path at all, so `send-user-message`
|
|
662
|
+
* took its `else` branch and appended `[添付画像: <path>]` to the text — the
|
|
663
|
+
* agent received a *path*, and whether it ever looked at the file was up to
|
|
664
|
+
* it. The server route sends the file itself.
|
|
665
|
+
*
|
|
666
|
+
* The fallback is that same degraded body, reached whenever the server route
|
|
667
|
+
* does not apply, and it is deliberately routed back through
|
|
668
|
+
* {@link sendMessage} rather than `sendMessageWithSubmitVerification`: the
|
|
669
|
+
* reason the image could not be attached is usually "no session yet", and by
|
|
670
|
+
* the time the text is sent that can already have changed. Going through
|
|
671
|
+
* `sendMessage` gives the text one honest attempt at the API before the
|
|
672
|
+
* keyboard, at the cost of one cheap re-check.
|
|
673
|
+
*
|
|
674
|
+
* @param worktreeId - Worktree ID
|
|
675
|
+
* @param message - Message text; may be empty
|
|
676
|
+
* @param imagePath - Absolute path to the image file
|
|
677
|
+
* @param instanceId - Agent instance ID (defaults to the primary instance)
|
|
678
|
+
*/
|
|
679
|
+
async sendMessageWithImage(worktreeId, message, imagePath, instanceId) {
|
|
680
|
+
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
681
|
+
const exists = await (0, tmux_1.hasSession)(sessionName);
|
|
682
|
+
if (!exists) {
|
|
683
|
+
throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
|
|
684
|
+
}
|
|
685
|
+
const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
|
|
686
|
+
if (await this.trySendViaServer(target, message, imagePath)) {
|
|
687
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
logger.info('opencode-image-degraded-to-path', { worktreeId, instanceId: instanceId ?? this.id });
|
|
691
|
+
await this.sendMessage(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId);
|
|
692
|
+
}
|
|
305
693
|
/**
|
|
306
694
|
* Kill OpenCode session with graceful shutdown.
|
|
307
695
|
*
|
|
@@ -337,6 +725,19 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
337
725
|
// Null whenever structured events are off or no port was ever allocated, and
|
|
338
726
|
// then the health probe is skipped entirely — there is nothing to orphan.
|
|
339
727
|
const assignedPort = (0, ports_1.getAssignedOpencodePort)(target);
|
|
728
|
+
// Issue #2038: the last moment the server that knows which session this
|
|
729
|
+
// instance is in is still answering. Verified against opencode's own
|
|
730
|
+
// `Session.directory` and followed up its `parentID` chain so a sub-agent's
|
|
731
|
+
// turn cannot be mistaken for the operator's conversation — see
|
|
732
|
+
// `@/lib/session/opencode-session-recall`. Never throws, and a skip costs
|
|
733
|
+
// the next launch its `-s <id>`, never the kill.
|
|
734
|
+
const captured = await (0, opencode_session_recall_1.captureOpencodeSessionMemory)(target).catch(() => null);
|
|
735
|
+
if (captured && !captured.captured) {
|
|
736
|
+
logger.info('opencode-session-capture-skipped', {
|
|
737
|
+
sessionName,
|
|
738
|
+
reason: captured.skipped,
|
|
739
|
+
});
|
|
740
|
+
}
|
|
340
741
|
// Issue #1763: stop watching before the pane goes, so the stream is not
|
|
341
742
|
// reconnecting to a server that is being shut down. Also gives the port
|
|
342
743
|
// back — the pane is what held it. Never throws.
|
|
@@ -398,7 +799,26 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
398
799
|
}
|
|
399
800
|
}
|
|
400
801
|
/**
|
|
401
|
-
* Abort the running turn:
|
|
802
|
+
* Abort the running turn: the server if there is one, Escape twice if not.
|
|
803
|
+
*
|
|
804
|
+
* ## The server route (Issue #2034)
|
|
805
|
+
*
|
|
806
|
+
* `POST /session/:id/abort` on the port this instance's TUI already serves,
|
|
807
|
+
* against the session `./turn-gate` calls this instance's own. It ends the
|
|
808
|
+
* turn outright — measured live on 1.18.22 with an isolated `opencode serve`:
|
|
809
|
+
* `200 true`, and `session.error MessageAbortedError` + `session.idle` on the
|
|
810
|
+
* stream in the same millisecond. The keystroke route below cannot claim that
|
|
811
|
+
* unconditionally: it depends on what the TUI has drawn, and a picker or a
|
|
812
|
+
* dialog on screen eats the presses.
|
|
813
|
+
*
|
|
814
|
+
* {@link abortOpencodeTurn} answers false for every way that can fail to
|
|
815
|
+
* apply — no port, a subscription that is not live, no session known, a
|
|
816
|
+
* refused request, a completion that never arrived — and then the Escapes go
|
|
817
|
+
* out exactly as they did before. An instance launched with
|
|
818
|
+
* `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, keeps
|
|
819
|
+
* the interrupt it has always had.
|
|
820
|
+
*
|
|
821
|
+
* ## The keyboard route (Issue #1894)
|
|
402
822
|
*
|
|
403
823
|
* `BaseCLITool.interrupt()` sends ONE Escape, and on opencode 1.18 that
|
|
404
824
|
* aborts nothing. The first press is a confirmation prompt drawn in the
|
|
@@ -441,6 +861,14 @@ class OpenCodeTool extends base_1.BaseCLITool {
|
|
|
441
861
|
*/
|
|
442
862
|
async interrupt(worktreeId, instanceId) {
|
|
443
863
|
const sessionName = this.getSessionName(worktreeId, instanceId);
|
|
864
|
+
// Issue #2034: the server first, and the keyboard only if it did not apply.
|
|
865
|
+
if (await (0, runtime_1.abortOpencodeTurn)((0, runtime_1.opencodeTarget)(worktreeId, instanceId))) {
|
|
866
|
+
// Issue #405: the turn is over, so the cached capture is stale — the same
|
|
867
|
+
// reason the keystroke path invalidates below.
|
|
868
|
+
(0, tmux_capture_cache_1.invalidateCache)(sessionName);
|
|
869
|
+
logger.info('opencode-interrupt-aborted-via-api');
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
444
872
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'Escape');
|
|
445
873
|
await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.OPENCODE_INTERRUPT_SECOND_ESCAPE_DELAY_MS));
|
|
446
874
|
await (0, tmux_1.sendSpecialKey)(sessionName, 'Escape');
|