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
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloudflareProvider = exports.defaultCloudflareDeps = exports.STDERR_CAPTURE_LIMIT = exports.METRICS_REQUEST_TIMEOUT_MS = exports.DEFAULT_QUICK_TUNNEL_TIMING = exports.DETECT_TIMEOUT_MS = exports.CLOUDFLARED_LOG_NAME = exports.CLOUDFLARED_PIDFILE_NAME = exports.QUICK_TUNNEL_SUFFIX = exports.LOOPBACK_HOST = exports.CLOUDFLARED_VERSION_ARG = exports.CLOUDFLARED_BIN = void 0;
|
|
4
|
+
exports.buildQuickTunnelArgs = buildQuickTunnelArgs;
|
|
5
|
+
exports.buildQuickTunnelSpawnOptions = buildQuickTunnelSpawnOptions;
|
|
6
|
+
exports.openStderrLog = openStderrLog;
|
|
7
|
+
exports.isQuickTunnelHostname = isQuickTunnelHostname;
|
|
8
|
+
exports.parseQuickTunnelHostname = parseQuickTunnelHostname;
|
|
9
|
+
exports.parseBannerUrl = parseBannerUrl;
|
|
10
|
+
exports.findFreeLoopbackPort = findFreeLoopbackPort;
|
|
11
|
+
exports.fetchQuickTunnelHostname = fetchQuickTunnelHostname;
|
|
12
|
+
exports.resolveCloudflareStateDir = resolveCloudflareStateDir;
|
|
13
|
+
exports.createCloudflareProvider = createCloudflareProvider;
|
|
14
|
+
/**
|
|
15
|
+
* Cloudflare Quick Tunnel Provider (Issue #1937, R2).
|
|
16
|
+
*
|
|
17
|
+
* Implements §6.4 of `docs/design/remote-qr-pairing-1937.md`. Everything below
|
|
18
|
+
* that says "measured" was measured on 2026-08-29 against cloudflared 2025.4.0;
|
|
19
|
+
* the raw capture is in `dev-reports/issue/1937/u3-quicktunnel-url.md`.
|
|
20
|
+
*
|
|
21
|
+
* ## Three properties this file is responsible for
|
|
22
|
+
*
|
|
23
|
+
* 1. **Nothing but loopback is ever exposed.** `LOOPBACK_HOST` is a constant and
|
|
24
|
+
* is never derived from an argument, so neither the upstream nor the metrics
|
|
25
|
+
* listener can be pointed anywhere else. That matters twice over for
|
|
26
|
+
* `--metrics`: `cloudflared tunnel --help` says its default address "binds to
|
|
27
|
+
* all interfaces" under a virtual environment. CommandMate defaults `CM_BIND`
|
|
28
|
+
* to 127.0.0.1, and opening a hole in the Provider's own diagnostics port
|
|
29
|
+
* would give that back.
|
|
30
|
+
*
|
|
31
|
+
* 2. **`stop()` only signals the process this module started.** A Quick Tunnel
|
|
32
|
+
* writes no persistent Provider configuration, so `preexisting` is `null` and
|
|
33
|
+
* `owned.revert` is `null`; the whole teardown is one SIGTERM to `owned.pid`.
|
|
34
|
+
* Measured: the process is gone in about a second and the public URL then
|
|
35
|
+
* answers HTTP 530. There is no reason to reach for any command that acts on
|
|
36
|
+
* "every tunnel this machine knows about", and
|
|
37
|
+
* `tests/unit/config/remote-destructive-command-guard.test.ts` forbids it.
|
|
38
|
+
* This is not hypothetical — the machine this was measured on had a named
|
|
39
|
+
* tunnel of the user's own running for nine days at the time.
|
|
40
|
+
*
|
|
41
|
+
* 3. **The URL comes from the metrics API first.** Measured order: the stderr
|
|
42
|
+
* banner appears at t+3s, the metrics server only at t+4s. So a loop that
|
|
43
|
+
* tried both every round would find the banner first every single time and
|
|
44
|
+
* `/quicktunnel` would be dead code. `METRICS_PREFERENCE_WINDOW_MS` is what
|
|
45
|
+
* keeps the first candidate actually first: for that long, only the metrics
|
|
46
|
+
* route is consulted.
|
|
47
|
+
*
|
|
48
|
+
* 4. **The tunnel outlives the CLI that started it.** `commandmate remote up`
|
|
49
|
+
* exits as soon as it has a URL — measured at about 6.5 seconds, taken from
|
|
50
|
+
* the metrics API. cloudflared has to still be there afterwards, because the
|
|
51
|
+
* whole point is a QR code someone reads with a phone a minute later. Two
|
|
52
|
+
* things make that true, and Issue #2146 is what happens without them:
|
|
53
|
+
* cloudflared's stderr goes to a **file descriptor, never a pipe**, and the
|
|
54
|
+
* child is spawned `detached` and `unref`ed.
|
|
55
|
+
*
|
|
56
|
+
* Measured (Issue #2146, `docs/qa/1937-remote-uat-record.md` D-1): with
|
|
57
|
+
* `stdio: ['ignore', 'ignore', 'pipe']` the child was dead within two
|
|
58
|
+
* seconds of the parent exiting, and the public URL answered HTTP 530 before
|
|
59
|
+
* the QR code could be read. The parent's exit closes the read end of that
|
|
60
|
+
* pipe; cloudflared is Go, does not ignore SIGPIPE, and dies on its next
|
|
61
|
+
* write to fd 2 — which, at t+6.5s, is still mid log-burst. The same argv
|
|
62
|
+
* with a parent kept alive for 70 seconds gave a child that lived 70
|
|
63
|
+
* seconds, so this is the plumbing and not cloudflared giving up.
|
|
64
|
+
*
|
|
65
|
+
* `'ignore'` would also have fixed it and is the wrong fix: it takes fd 2
|
|
66
|
+
* away entirely, and fd 2 is where both the **second URL candidate**
|
|
67
|
+
* (`parseBannerUrl`) and every failure diagnostic (`stderrTail`) come from.
|
|
68
|
+
* A file keeps both — nothing closes when the CLI exits, and the parser and
|
|
69
|
+
* the diagnostic read it back by path. `--logfile` was the other candidate:
|
|
70
|
+
* it covers cloudflared's own log lines but not anything the Go runtime or
|
|
71
|
+
* the loader writes straight to fd 2, so fd 2 would still have been a pipe.
|
|
72
|
+
* `'ignore'` for fd 2 is what this falls back to only when the log file
|
|
73
|
+
* cannot be opened at all: a diagnostic is worth less than a working tunnel.
|
|
74
|
+
*
|
|
75
|
+
* Deliberately absent: the approval prompt. Creating a public URL is an
|
|
76
|
+
* irreversible, user-facing decision, and §6.2 puts it in the orchestrator that
|
|
77
|
+
* owns `src/cli/commands/remote.ts` — the same code that knows whether the
|
|
78
|
+
* session is interactive and whether `--yes` was passed.
|
|
79
|
+
*
|
|
80
|
+
* This module imports Node builtins and `./types` only. No `@/` alias, so the
|
|
81
|
+
* orchestrator can pull it into the `tsconfig.cli.json` build (which sets
|
|
82
|
+
* `paths: {}`) without the import failing to resolve.
|
|
83
|
+
*/
|
|
84
|
+
const child_process_1 = require("child_process");
|
|
85
|
+
const fs_1 = require("fs");
|
|
86
|
+
const net_1 = require("net");
|
|
87
|
+
const http_1 = require("http");
|
|
88
|
+
const os_1 = require("os");
|
|
89
|
+
const path_1 = require("path");
|
|
90
|
+
const types_1 = require("./types");
|
|
91
|
+
/** The executable. Looked up on PATH by `spawn`, never through a shell. */
|
|
92
|
+
exports.CLOUDFLARED_BIN = 'cloudflared';
|
|
93
|
+
/** Mirrors `PreflightChecker.checkDependency()`: one flag, passed as an array. */
|
|
94
|
+
exports.CLOUDFLARED_VERSION_ARG = '--version';
|
|
95
|
+
/**
|
|
96
|
+
* The only host this Provider ever names.
|
|
97
|
+
*
|
|
98
|
+
* A constant rather than a parameter on purpose: "the upstream is always
|
|
99
|
+
* loopback" is then a property of the code, not of every call site. §9.2 pins it
|
|
100
|
+
* from the outside as well, by asserting the argv `start()` builds.
|
|
101
|
+
*/
|
|
102
|
+
exports.LOOPBACK_HOST = '127.0.0.1';
|
|
103
|
+
/** Quick Tunnel hostnames live under this suffix, and nothing else does. */
|
|
104
|
+
exports.QUICK_TUNNEL_SUFFIX = 'trycloudflare.com';
|
|
105
|
+
/** Written next to the rest of CommandMate's state, for humans and for `ps`. */
|
|
106
|
+
exports.CLOUDFLARED_PIDFILE_NAME = 'cloudflared.pid';
|
|
107
|
+
/**
|
|
108
|
+
* Where cloudflared's stderr goes. Beside the pidfile, and for the same reason:
|
|
109
|
+
* a human who wants to know what the tunnel is doing should be able to find it.
|
|
110
|
+
*
|
|
111
|
+
* A fixed name, like the pidfile, so one `remote` session at a time is the
|
|
112
|
+
* assumption in both places rather than in one of them.
|
|
113
|
+
*/
|
|
114
|
+
exports.CLOUDFLARED_LOG_NAME = 'cloudflared.log';
|
|
115
|
+
/** Same 5s budget `PreflightChecker` gives every other dependency probe. */
|
|
116
|
+
exports.DETECT_TIMEOUT_MS = 5_000;
|
|
117
|
+
exports.DEFAULT_QUICK_TUNNEL_TIMING = {
|
|
118
|
+
urlWaitMs: 30_000,
|
|
119
|
+
metricsPreferenceMs: 5_000,
|
|
120
|
+
pollIntervalMs: 250,
|
|
121
|
+
};
|
|
122
|
+
/** Per-request budget for the loopback metrics call. */
|
|
123
|
+
exports.METRICS_REQUEST_TIMEOUT_MS = 1_000;
|
|
124
|
+
/**
|
|
125
|
+
* How much of the stderr log is read back, so a chatty reconnect loop cannot
|
|
126
|
+
* make either consumer grow unbounded.
|
|
127
|
+
*
|
|
128
|
+
* The **tail**, not the head: `parseBannerUrl` takes the last match on purpose
|
|
129
|
+
* (a reconnect banner should win), and `stderrTail` wants the last few lines.
|
|
130
|
+
*/
|
|
131
|
+
exports.STDERR_CAPTURE_LIMIT = 64 * 1024;
|
|
132
|
+
/**
|
|
133
|
+
* The argv for one Quick Tunnel.
|
|
134
|
+
*
|
|
135
|
+
* `LOOPBACK_HOST` appears twice and is a constant both times. `port` is the only
|
|
136
|
+
* caller-supplied value that reaches the command line, and it is validated as a
|
|
137
|
+
* port number before it gets here.
|
|
138
|
+
*/
|
|
139
|
+
function buildQuickTunnelArgs(opts) {
|
|
140
|
+
return [
|
|
141
|
+
'tunnel',
|
|
142
|
+
'--url',
|
|
143
|
+
`http://${exports.LOOPBACK_HOST}:${opts.port}`,
|
|
144
|
+
'--no-autoupdate',
|
|
145
|
+
'--metrics',
|
|
146
|
+
`${exports.LOOPBACK_HOST}:${opts.metricsPort}`,
|
|
147
|
+
'--pidfile',
|
|
148
|
+
opts.pidfile,
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The spawn options for one Quick Tunnel. Issue #2146 is entirely about these.
|
|
153
|
+
*
|
|
154
|
+
* `stderr` is a **file descriptor**, or `'ignore'` when the log file could not
|
|
155
|
+
* be opened. It is never `'pipe'`: a pipe's read end belongs to `commandmate
|
|
156
|
+
* remote`, which exits as soon as it has the URL, and cloudflared then dies of
|
|
157
|
+
* SIGPIPE on its next write to fd 2. See the file header for the measurement.
|
|
158
|
+
*
|
|
159
|
+
* `detached: true` puts the child in its own session. Without it, a Ctrl-C in
|
|
160
|
+
* the terminal that launched the CLI reaches cloudflared too — the tunnel is
|
|
161
|
+
* supposed to outlive the command, so it must not share its process group.
|
|
162
|
+
* `stop()` is unaffected: it signals a **positive** pid, which is one process,
|
|
163
|
+
* not a group, so detaching changes nothing about teardown.
|
|
164
|
+
*/
|
|
165
|
+
function buildQuickTunnelSpawnOptions(stderr) {
|
|
166
|
+
const stdio = ['ignore', 'ignore', stderr];
|
|
167
|
+
return { detached: true, stdio };
|
|
168
|
+
}
|
|
169
|
+
/** What `openStderrLog()` falls back to: no log, and still a working tunnel. */
|
|
170
|
+
const SILENT_STDERR_LOG = {
|
|
171
|
+
stdio: 'ignore',
|
|
172
|
+
path: null,
|
|
173
|
+
read: () => '',
|
|
174
|
+
close: () => {
|
|
175
|
+
// Nothing was opened, so there is nothing to close.
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Reads the last `limit` bytes of a log file.
|
|
180
|
+
*
|
|
181
|
+
* The tail rather than the head, because both consumers want the end: the
|
|
182
|
+
* banner parser takes the last match so a reconnect wins, and the diagnostic
|
|
183
|
+
* wants the last few lines. Never throws — a log that cannot be read is a
|
|
184
|
+
* missing diagnostic, not a failed tunnel.
|
|
185
|
+
*/
|
|
186
|
+
function readLogTail(logPath, limit) {
|
|
187
|
+
let fd = null;
|
|
188
|
+
try {
|
|
189
|
+
fd = (0, fs_1.openSync)(logPath, 'r');
|
|
190
|
+
const { size } = (0, fs_1.fstatSync)(fd);
|
|
191
|
+
const start = size > limit ? size - limit : 0;
|
|
192
|
+
const length = size - start;
|
|
193
|
+
if (length <= 0)
|
|
194
|
+
return '';
|
|
195
|
+
const buffer = Buffer.alloc(length);
|
|
196
|
+
const bytes = (0, fs_1.readSync)(fd, buffer, 0, length, start);
|
|
197
|
+
// A tail can start mid-codepoint. cloudflared logs ASCII, and at worst one
|
|
198
|
+
// leading character is mangled; neither consumer anchors on the first byte.
|
|
199
|
+
return buffer.subarray(0, bytes).toString('utf-8');
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return '';
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
if (fd !== null) {
|
|
206
|
+
try {
|
|
207
|
+
(0, fs_1.closeSync)(fd);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Already closed.
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Opens the file cloudflared's stderr is redirected into.
|
|
217
|
+
*
|
|
218
|
+
* Truncating (`'w'`) rather than appending, because `parseBannerUrl()` takes the
|
|
219
|
+
* last URL in the buffer and a previous session's banner names a tunnel that no
|
|
220
|
+
* longer exists. Starting from empty means the only banner that can be read is
|
|
221
|
+
* this session's.
|
|
222
|
+
*
|
|
223
|
+
* Returns `SILENT_STDERR_LOG` rather than throwing when the file cannot be
|
|
224
|
+
* opened: `start()` still has `/quicktunnel` — the *first* URL candidate — and
|
|
225
|
+
* a tunnel with no diagnostics beats no tunnel.
|
|
226
|
+
*/
|
|
227
|
+
function openStderrLog(logPath) {
|
|
228
|
+
let fd;
|
|
229
|
+
try {
|
|
230
|
+
fd = (0, fs_1.openSync)(logPath, 'w', 0o600);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return SILENT_STDERR_LOG;
|
|
234
|
+
}
|
|
235
|
+
let open = true;
|
|
236
|
+
return {
|
|
237
|
+
stdio: fd,
|
|
238
|
+
path: logPath,
|
|
239
|
+
read: () => readLogTail(logPath, exports.STDERR_CAPTURE_LIMIT),
|
|
240
|
+
close: () => {
|
|
241
|
+
if (!open)
|
|
242
|
+
return;
|
|
243
|
+
open = false;
|
|
244
|
+
try {
|
|
245
|
+
(0, fs_1.closeSync)(fd);
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// The child holds its own duplicate either way.
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** `QUICK_TUNNEL_SUFFIX` as a regex fragment, so the suffix has one definition. */
|
|
254
|
+
const SUFFIX_PATTERN = exports.QUICK_TUNNEL_SUFFIX.replace(/\./g, '\\.');
|
|
255
|
+
/** One DNS label, the shape cloudflared hands out (`four-random-words`). */
|
|
256
|
+
const LABEL_PATTERN = '[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?';
|
|
257
|
+
/** A single-label Quick Tunnel hostname, e.g. `four-random-words.<suffix>`. */
|
|
258
|
+
const QUICK_TUNNEL_HOSTNAME = new RegExp(`^${LABEL_PATTERN}\\.${SUFFIX_PATTERN}$`);
|
|
259
|
+
/** True for a hostname cloudflared could actually have handed out. */
|
|
260
|
+
function isQuickTunnelHostname(value) {
|
|
261
|
+
return QUICK_TUNNEL_HOSTNAME.test(value);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Reads the hostname out of a `/quicktunnel` response body.
|
|
265
|
+
*
|
|
266
|
+
* Measured body: `{"hostname":"villas-activists-hey-barbie.trycloudflare.com"}`
|
|
267
|
+
* — served as `text/plain`, and **without a scheme**, so the `https://` is ours
|
|
268
|
+
* to add. The shape is checked before it is used because this string becomes the
|
|
269
|
+
* QR code a phone is asked to open; a value that is not a Quick Tunnel hostname
|
|
270
|
+
* is treated as no answer rather than as a destination.
|
|
271
|
+
*/
|
|
272
|
+
function parseQuickTunnelHostname(body) {
|
|
273
|
+
let parsed;
|
|
274
|
+
try {
|
|
275
|
+
parsed = JSON.parse(body);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
281
|
+
return null;
|
|
282
|
+
const hostname = parsed.hostname;
|
|
283
|
+
if (typeof hostname !== 'string')
|
|
284
|
+
return null;
|
|
285
|
+
const trimmed = hostname.trim();
|
|
286
|
+
return isQuickTunnelHostname(trimmed) ? trimmed : null;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Second candidate: the URL cloudflared prints on stderr.
|
|
290
|
+
*
|
|
291
|
+
* Anchored on the **shape of the URL**, not on the surrounding words. Two
|
|
292
|
+
* measured facts drive that. The banner text and the URL are on *different*
|
|
293
|
+
* lines — the URL sits alone inside a box-drawn frame — so "read what follows
|
|
294
|
+
* `Visit it at`" does not work against the real output. And the wording is
|
|
295
|
+
* exactly the part Cloudflare is free to reword, while the hostname suffix is
|
|
296
|
+
* the service's identity.
|
|
297
|
+
*
|
|
298
|
+
* The same stderr also carries `https://www.cloudflare.com/website-terms/` and
|
|
299
|
+
* `https://developers.cloudflare.com/...`; neither ends in the Quick Tunnel
|
|
300
|
+
* suffix, and the `Requesting new quick Tunnel on trycloudflare.com...` line has
|
|
301
|
+
* no scheme. All three are negative controls in the unit test.
|
|
302
|
+
*
|
|
303
|
+
* The last match wins, so a reconnect that prints a fresher banner is preferred.
|
|
304
|
+
*/
|
|
305
|
+
function parseBannerUrl(stderr) {
|
|
306
|
+
const pattern = new RegExp(`https://${LABEL_PATTERN}\\.${SUFFIX_PATTERN}`, 'g');
|
|
307
|
+
const matches = stderr.match(pattern);
|
|
308
|
+
if (matches === null || matches.length === 0)
|
|
309
|
+
return null;
|
|
310
|
+
return matches[matches.length - 1];
|
|
311
|
+
}
|
|
312
|
+
/** Rejects anything that could not be a TCP port before it reaches argv. */
|
|
313
|
+
function assertUpstreamPort(port) {
|
|
314
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
315
|
+
throw new Error(`cloudflare-quick: upstream port must be 1-65535, got ${String(port)}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Asks the OS for a free port on loopback and hands it back unheld.
|
|
320
|
+
*
|
|
321
|
+
* Binding the probe to `LOOPBACK_HOST` rather than to every interface is part of
|
|
322
|
+
* the same guarantee as the `--metrics` argument: the port this returns is one
|
|
323
|
+
* that is free *on loopback*, which is the only place it will be used.
|
|
324
|
+
*/
|
|
325
|
+
function findFreeLoopbackPort() {
|
|
326
|
+
return new Promise((resolve, reject) => {
|
|
327
|
+
const server = (0, net_1.createServer)();
|
|
328
|
+
server.unref();
|
|
329
|
+
server.once('error', reject);
|
|
330
|
+
server.listen(0, exports.LOOPBACK_HOST, () => {
|
|
331
|
+
const address = server.address();
|
|
332
|
+
if (address === null || typeof address === 'string') {
|
|
333
|
+
server.close(() => reject(new Error('cloudflare-quick: could not read a free port')));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const { port } = address;
|
|
337
|
+
server.close(() => resolve(port));
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* `GET http://127.0.0.1:<metricsPort>/quicktunnel`.
|
|
343
|
+
*
|
|
344
|
+
* Never rejects: "no answer yet" and "no such route" are both normal during the
|
|
345
|
+
* poll, and neither should look different from a slow start.
|
|
346
|
+
*/
|
|
347
|
+
function fetchQuickTunnelHostname(metricsPort, timeoutMs = exports.METRICS_REQUEST_TIMEOUT_MS) {
|
|
348
|
+
return new Promise((resolve) => {
|
|
349
|
+
let settled = false;
|
|
350
|
+
const settle = (value) => {
|
|
351
|
+
if (settled)
|
|
352
|
+
return;
|
|
353
|
+
settled = true;
|
|
354
|
+
resolve(value);
|
|
355
|
+
};
|
|
356
|
+
const request = (0, http_1.get)({ host: exports.LOOPBACK_HOST, port: metricsPort, path: '/quicktunnel', timeout: timeoutMs }, (response) => {
|
|
357
|
+
if (response.statusCode !== 200) {
|
|
358
|
+
response.resume();
|
|
359
|
+
settle(null);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
response.setEncoding('utf-8');
|
|
363
|
+
let body = '';
|
|
364
|
+
response.on('data', (chunk) => {
|
|
365
|
+
if (body.length < 4096)
|
|
366
|
+
body += chunk;
|
|
367
|
+
});
|
|
368
|
+
response.on('end', () => settle(parseQuickTunnelHostname(body)));
|
|
369
|
+
response.on('error', () => settle(null));
|
|
370
|
+
});
|
|
371
|
+
request.on('timeout', () => request.destroy(new Error('metrics request timed out')));
|
|
372
|
+
request.on('error', () => settle(null));
|
|
373
|
+
request.on('close', () => settle(null));
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Where the pidfile goes: the same `~/.commandmate` the rest of CommandMate
|
|
378
|
+
* uses.
|
|
379
|
+
*
|
|
380
|
+
* Not read from the environment. §6.2 keeps state-file locations out of
|
|
381
|
+
* Providers, and an env-supplied directory would also have to defend against the
|
|
382
|
+
* `/proc` recursive-mkdir hang that `resolveSafeDirectory()` exists for. Tests
|
|
383
|
+
* override it through `CloudflareProviderDeps` instead.
|
|
384
|
+
*/
|
|
385
|
+
function resolveCloudflareStateDir() {
|
|
386
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.commandmate');
|
|
387
|
+
}
|
|
388
|
+
function sleep(ms) {
|
|
389
|
+
return new Promise((resolve) => {
|
|
390
|
+
setTimeout(resolve, ms);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
function describeExit(exit) {
|
|
394
|
+
if (exit.signal !== null)
|
|
395
|
+
return `killed by ${exit.signal}`;
|
|
396
|
+
return `exit code ${exit.code === null ? 'unknown' : String(exit.code)}`;
|
|
397
|
+
}
|
|
398
|
+
/** Last few stderr lines, capped, so a failure says something useful. */
|
|
399
|
+
function stderrTail(stderr) {
|
|
400
|
+
const lines = stderr
|
|
401
|
+
.split('\n')
|
|
402
|
+
.map((line) => line.trim())
|
|
403
|
+
.filter((line) => line.length > 0)
|
|
404
|
+
.slice(-5);
|
|
405
|
+
if (lines.length === 0)
|
|
406
|
+
return '';
|
|
407
|
+
return `; last output: ${lines.join(' | ').slice(0, 400)}`;
|
|
408
|
+
}
|
|
409
|
+
exports.defaultCloudflareDeps = {
|
|
410
|
+
spawn: child_process_1.spawn,
|
|
411
|
+
spawnSync: child_process_1.spawnSync,
|
|
412
|
+
kill: (pid, signal) => {
|
|
413
|
+
process.kill(pid, signal);
|
|
414
|
+
},
|
|
415
|
+
findFreePort: findFreeLoopbackPort,
|
|
416
|
+
fetchHostname: (metricsPort) => fetchQuickTunnelHostname(metricsPort),
|
|
417
|
+
resolveStateDir: resolveCloudflareStateDir,
|
|
418
|
+
timing: exports.DEFAULT_QUICK_TUNNEL_TIMING,
|
|
419
|
+
};
|
|
420
|
+
/**
|
|
421
|
+
* Builds the Provider.
|
|
422
|
+
*
|
|
423
|
+
* The returned object has exactly the four members `RemoteProvider` declares —
|
|
424
|
+
* the seams stay closed over in here rather than becoming a fifth key, because
|
|
425
|
+
* the contract test pins that list and §6.3-1 is the reason it does.
|
|
426
|
+
*/
|
|
427
|
+
function createCloudflareProvider(overrides = {}) {
|
|
428
|
+
const deps = { ...exports.defaultCloudflareDeps, ...overrides };
|
|
429
|
+
return {
|
|
430
|
+
id: 'cloudflare-quick',
|
|
431
|
+
async detect() {
|
|
432
|
+
let result;
|
|
433
|
+
try {
|
|
434
|
+
// Array args, no `shell`. MF-SEC-1, and the same call shape as
|
|
435
|
+
// `PreflightChecker.checkDependency()`.
|
|
436
|
+
result = deps.spawnSync(exports.CLOUDFLARED_BIN, [exports.CLOUDFLARED_VERSION_ARG], {
|
|
437
|
+
encoding: 'utf-8',
|
|
438
|
+
timeout: exports.DETECT_TIMEOUT_MS,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
return {
|
|
443
|
+
available: false,
|
|
444
|
+
ready: false,
|
|
445
|
+
reason: `cloudflared probe failed: ${messageOf(error)}`,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
if (result.error) {
|
|
449
|
+
const code = result.error.code;
|
|
450
|
+
if (code === 'ENOENT') {
|
|
451
|
+
return { available: false, ready: false, reason: 'cloudflared is not installed' };
|
|
452
|
+
}
|
|
453
|
+
return {
|
|
454
|
+
available: false,
|
|
455
|
+
ready: false,
|
|
456
|
+
reason: `cloudflared probe failed: ${messageOf(result.error)}`,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
if (result.status !== 0) {
|
|
460
|
+
return {
|
|
461
|
+
available: false,
|
|
462
|
+
ready: false,
|
|
463
|
+
reason: `cloudflared ${exports.CLOUDFLARED_VERSION_ARG} exited with ${String(result.status)}`,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
const output = (result.stdout || result.stderr || '').trim();
|
|
467
|
+
const version = /(\d+\.\d+\.\d+)/.exec(output)?.[1];
|
|
468
|
+
// A Quick Tunnel needs no account, no login and no prior configuration, so
|
|
469
|
+
// "installed" and "usable right now" are the same question here. Tailscale
|
|
470
|
+
// is the Provider that has to answer them separately.
|
|
471
|
+
return version === undefined
|
|
472
|
+
? { available: true, ready: true }
|
|
473
|
+
: { available: true, version, ready: true };
|
|
474
|
+
},
|
|
475
|
+
async start({ port, signal }) {
|
|
476
|
+
assertUpstreamPort(port);
|
|
477
|
+
if (signal.aborted) {
|
|
478
|
+
throw new Error('cloudflare-quick: aborted before cloudflared was started');
|
|
479
|
+
}
|
|
480
|
+
const metricsPort = await deps.findFreePort();
|
|
481
|
+
const stateDir = deps.resolveStateDir();
|
|
482
|
+
const pidfile = (0, path_1.join)(stateDir, exports.CLOUDFLARED_PIDFILE_NAME);
|
|
483
|
+
try {
|
|
484
|
+
(0, fs_1.mkdirSync)(stateDir, { recursive: true, mode: 0o700 });
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// The pidfile is a convenience for humans and `ps`; `owned.pid` is what
|
|
488
|
+
// `stop()` actually uses. Not being able to create the directory is not
|
|
489
|
+
// a reason to refuse to go remote.
|
|
490
|
+
}
|
|
491
|
+
const args = buildQuickTunnelArgs({ port, metricsPort, pidfile });
|
|
492
|
+
const stderrLog = openStderrLog((0, path_1.join)(stateDir, exports.CLOUDFLARED_LOG_NAME));
|
|
493
|
+
let child;
|
|
494
|
+
try {
|
|
495
|
+
child = deps.spawn(exports.CLOUDFLARED_BIN, args, buildQuickTunnelSpawnOptions(stderrLog.stdio));
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
// `spawn` duplicates the descriptor into the child before it returns, so
|
|
499
|
+
// this copy has no remaining job. Keeping it would tie fd 2's lifetime
|
|
500
|
+
// to the CLI's, which is the mistake Issue #2146 is about.
|
|
501
|
+
stderrLog.close();
|
|
502
|
+
}
|
|
503
|
+
// The tunnel has to outlive `commandmate remote`, which exits as soon as
|
|
504
|
+
// it has a URL. `unref()` means the CLI's event loop is not held open by a
|
|
505
|
+
// child it never intends to wait for.
|
|
506
|
+
child.unref();
|
|
507
|
+
const state = { exit: null };
|
|
508
|
+
child.once('exit', (code, exitSignal) => {
|
|
509
|
+
state.exit = { code, signal: exitSignal };
|
|
510
|
+
});
|
|
511
|
+
const pid = child.pid;
|
|
512
|
+
if (pid === undefined) {
|
|
513
|
+
child.kill('SIGTERM');
|
|
514
|
+
throw new Error('cloudflare-quick: cloudflared could not be started (no pid)');
|
|
515
|
+
}
|
|
516
|
+
let url;
|
|
517
|
+
try {
|
|
518
|
+
url = await waitForQuickTunnelUrl({
|
|
519
|
+
metricsPort,
|
|
520
|
+
signal,
|
|
521
|
+
timing: deps.timing,
|
|
522
|
+
fetchHostname: deps.fetchHostname,
|
|
523
|
+
readStderr: () => stderrLog.read(),
|
|
524
|
+
readExit: () => state.exit,
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
catch (error) {
|
|
528
|
+
// Nothing usable came back, so the child is ours to clean up and no
|
|
529
|
+
// handle ever reaches the caller that could have done it for us.
|
|
530
|
+
child.kill('SIGTERM');
|
|
531
|
+
throw error;
|
|
532
|
+
}
|
|
533
|
+
return {
|
|
534
|
+
provider: 'cloudflare-quick',
|
|
535
|
+
url,
|
|
536
|
+
// `revert: null` is the honest answer, not a placeholder: a Quick Tunnel
|
|
537
|
+
// leaves nothing behind to undo. The process is the whole of it.
|
|
538
|
+
owned: { pid, revert: null },
|
|
539
|
+
// No persistent Provider configuration exists, so there is nothing for
|
|
540
|
+
// §6.3-2 to protect. `planStop()` reads this as "protects nothing",
|
|
541
|
+
// which is right here and wrong for Tailscale — which is why the two
|
|
542
|
+
// Providers answer it differently instead of sharing a default.
|
|
543
|
+
preexisting: null,
|
|
544
|
+
};
|
|
545
|
+
},
|
|
546
|
+
async stop(handle) {
|
|
547
|
+
// Routed through the shared rule even though this Provider never has
|
|
548
|
+
// revert entries, so the two Providers cannot drift apart on §6.3-2.
|
|
549
|
+
const plan = (0, types_1.planStop)(handle);
|
|
550
|
+
const warnings = [];
|
|
551
|
+
for (const key of Object.keys(plan.revert)) {
|
|
552
|
+
// Unreachable for a handle this Provider produced. If it ever fires,
|
|
553
|
+
// something built a handle by hand — say it out loud rather than
|
|
554
|
+
// inventing an undo step for a key with no defined meaning.
|
|
555
|
+
warnings.push(`cloudflare-quick: no revert step for "${key}"; left in place`);
|
|
556
|
+
}
|
|
557
|
+
const pid = handle.owned.pid;
|
|
558
|
+
if (pid !== null) {
|
|
559
|
+
try {
|
|
560
|
+
// The entire teardown. Measured: cloudflared exits in about a second
|
|
561
|
+
// and the public URL immediately starts answering HTTP 530.
|
|
562
|
+
deps.kill(pid, 'SIGTERM');
|
|
563
|
+
}
|
|
564
|
+
catch (error) {
|
|
565
|
+
if (error.code === 'ESRCH') {
|
|
566
|
+
// Already gone. That is the goal state, so it is a success, not a
|
|
567
|
+
// warning — the same posture `stop.ts` takes toward a stale PID.
|
|
568
|
+
}
|
|
569
|
+
else {
|
|
570
|
+
warnings.push(`cloudflare-quick: could not signal pid ${String(pid)}: ${messageOf(error)}`);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return { reverted: warnings.length === 0, skipped: plan.skipped, warnings };
|
|
575
|
+
},
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
async function waitForQuickTunnelUrl(params) {
|
|
579
|
+
const { metricsPort, signal, timing, fetchHostname, readStderr, readExit } = params;
|
|
580
|
+
const startedAt = Date.now();
|
|
581
|
+
const deadline = startedAt + timing.urlWaitMs;
|
|
582
|
+
const bannerAllowedAt = startedAt + timing.metricsPreferenceMs;
|
|
583
|
+
for (;;) {
|
|
584
|
+
if (signal.aborted) {
|
|
585
|
+
throw new Error('cloudflare-quick: aborted while waiting for the public URL');
|
|
586
|
+
}
|
|
587
|
+
const hostname = await fetchHostname(metricsPort);
|
|
588
|
+
let candidate = hostname === null ? null : `https://${hostname}`;
|
|
589
|
+
// The banner is only consulted once the metrics route has had its window.
|
|
590
|
+
// Measured: cloudflared prints the banner about a second *before* it starts
|
|
591
|
+
// the metrics server, so without the window the second candidate would win
|
|
592
|
+
// every race and the first would never run.
|
|
593
|
+
if (candidate === null && Date.now() >= bannerAllowedAt) {
|
|
594
|
+
candidate = parseBannerUrl(readStderr());
|
|
595
|
+
}
|
|
596
|
+
// Re-read the exit state before handing a URL back. The `await` above spans
|
|
597
|
+
// real time, and a URL scraped from a process that has since exited names a
|
|
598
|
+
// tunnel nobody is serving — a QR code for a dead endpoint is worse than an
|
|
599
|
+
// error. Checked after the candidate rather than before it so a child that
|
|
600
|
+
// dies mid-poll cannot slip a stale URL through.
|
|
601
|
+
const exit = readExit();
|
|
602
|
+
if (exit !== null) {
|
|
603
|
+
throw new Error(`cloudflare-quick: cloudflared ${describeExit(exit)} before a public URL appeared` +
|
|
604
|
+
stderrTail(readStderr()));
|
|
605
|
+
}
|
|
606
|
+
if (candidate !== null)
|
|
607
|
+
return candidate;
|
|
608
|
+
if (Date.now() >= deadline) {
|
|
609
|
+
throw new Error(`cloudflare-quick: no public URL after ${String(timing.urlWaitMs)}ms` +
|
|
610
|
+
stderrTail(readStderr()));
|
|
611
|
+
}
|
|
612
|
+
await sleep(timing.pollIntervalMs);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
function messageOf(error) {
|
|
616
|
+
return error instanceof Error ? error.message : String(error);
|
|
617
|
+
}
|
|
618
|
+
/** The shipped Provider, wired to the real `cloudflared`. */
|
|
619
|
+
exports.cloudflareProvider = createCloudflareProvider();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the remote Provider layer (Issue #1937, R1/R2/R3).
|
|
3
|
+
*
|
|
4
|
+
* Note what is not re-exported: there is no selection helper. The orchestrator
|
|
5
|
+
* that owns `src/cli/commands/remote.ts` (R9) applies the selection rule
|
|
6
|
+
* itself — see the header of `./provider-registry`.
|
|
7
|
+
*
|
|
8
|
+
* Both `CLOUDFLARE_NOT_IMPLEMENTED_REASON` (removed in R2) and
|
|
9
|
+
* `TAILSCALE_NOT_IMPLEMENTED_REASON` (removed here in R3) are gone for the same
|
|
10
|
+
* reason: both Providers are implemented, so a constant saying otherwise would
|
|
11
|
+
* be a lie a caller could still read and act on.
|
|
12
|
+
*/
|
|
13
|
+
export { isPreexistingSnapshot, planStop, type PreexistingSnapshot, type ProviderDetection, type RemoteHandle, type RemoteProvider, type RemoteProviderId, type StopOutcome, type StopPlan, } from './types';
|
|
14
|
+
export { createRemoteProviders, detectRemoteProviders, REMOTE_PROVIDER_ORDER, type ProviderCandidate, } from './provider-registry';
|
|
15
|
+
export { buildQuickTunnelArgs, buildQuickTunnelSpawnOptions, CLOUDFLARED_BIN, CLOUDFLARED_LOG_NAME, CLOUDFLARED_PIDFILE_NAME, CLOUDFLARED_VERSION_ARG, cloudflareProvider, createCloudflareProvider, DEFAULT_QUICK_TUNNEL_TIMING, DETECT_TIMEOUT_MS, fetchQuickTunnelHostname, findFreeLoopbackPort, isQuickTunnelHostname, LOOPBACK_HOST, openStderrLog, parseBannerUrl, parseQuickTunnelHostname, QUICK_TUNNEL_SUFFIX, resolveCloudflareStateDir, STDERR_CAPTURE_LIMIT, type CloudflareProviderDeps, type QuickTunnelProcess, type QuickTunnelTiming, type StderrLog, } from './cloudflare';
|
|
16
|
+
export { BACKEND_STATE_RUNNING, buildServeArgs, buildServeOffArgs, buildServeUrl, createTailscaleProvider, DETECT_TIMEOUT_MS as TAILSCALE_DETECT_TIMEOUT_MS, LOOPBACK_HOST as TAILSCALE_LOOPBACK_HOST, normalizeDnsName, parseServeConfig, parseServeHandlerKey, readServeReadiness, SERVE_HTTPS_PORT, SERVE_PATH, SERVE_TIMEOUT_MS, serveHandlerKey, serveHandlerKeys, snapshotServeConfig, TAILSCALE_BIN, TAILSCALE_VERSION_ARG, tailscaleProvider, type ParsedServeHandlerKey, type ServeConfig, type ServeReadiness, type ServeTcpEntry, type ServeWebEntry, type TailscaleProviderDeps, type TailscaleStatus, } from './tailscale';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/remote/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,EACpB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,iBAAiB,IAAI,2BAA2B,EAChD,aAAa,IAAI,uBAAuB,EACxC,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC"}
|