commandmate 0.28.0 → 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.
Files changed (516) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +411 -404
  3. package/.next/app-path-routes-manifest.json +24 -23
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +0 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update-check/route.js +1 -1
  11. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/login/route.js +1 -1
  20. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/logout/route.js +1 -1
  22. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/auth/status/route.js +1 -1
  24. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/capabilities/route.js +1 -1
  26. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/remote/pair/route.js +2 -0
  43. package/.next/server/app/api/remote/pair/route.js.nft.json +1 -0
  44. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -0
  45. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/route.js +1 -1
  149. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  151. package/.next/server/app/login/page.js +2 -2
  152. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  153. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  155. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  159. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  161. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  162. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  163. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  164. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  165. package/.next/server/app/worktrees/[id]/page.js +1 -1
  166. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  167. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app-paths-manifest.json +24 -23
  169. package/.next/server/chunks/1162.js +1 -1
  170. package/.next/server/chunks/2759.js +1 -1
  171. package/.next/server/chunks/3440.js +1 -1
  172. package/.next/server/chunks/3543.js +1 -1
  173. package/.next/server/chunks/3945.js +1 -1
  174. package/.next/server/chunks/4393.js +1 -1
  175. package/.next/server/chunks/6130.js +1 -1
  176. package/.next/server/chunks/880.js +6 -6
  177. package/.next/server/chunks/9123.js +2 -2
  178. package/.next/server/chunks/9938.js +1 -1
  179. package/.next/server/functions-config-manifest.json +3 -1
  180. package/.next/server/middleware-build-manifest.js +1 -1
  181. package/.next/server/middleware-manifest.json +5 -5
  182. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  183. package/.next/server/pages/500.html +1 -1
  184. package/.next/server/server-reference-manifest.json +1 -1
  185. package/.next/server/src/middleware.js +1 -1
  186. package/.next/server/src/middleware.js.map +1 -1
  187. package/.next/static/chunks/5229-580b581fce5aeb52.js +1 -0
  188. package/.next/static/chunks/6381-c8d93ec301dbc380.js +1 -0
  189. package/.next/static/chunks/app/api/app/update/route-e3626364434d521b.js +1 -0
  190. package/.next/static/chunks/app/api/app/update-check/route-e3626364434d521b.js +1 -0
  191. package/.next/static/chunks/app/api/assistant/conversation/route-e3626364434d521b.js +1 -0
  192. package/.next/static/chunks/app/api/assistant/current-output/route-e3626364434d521b.js +1 -0
  193. package/.next/static/chunks/app/api/assistant/messages/route-e3626364434d521b.js +1 -0
  194. package/.next/static/chunks/app/api/assistant/session/route-e3626364434d521b.js +1 -0
  195. package/.next/static/chunks/app/api/assistant/start/route-e3626364434d521b.js +1 -0
  196. package/.next/static/chunks/app/api/assistant/terminal/route-e3626364434d521b.js +1 -0
  197. package/.next/static/chunks/app/api/assistant/tools/route-e3626364434d521b.js +1 -0
  198. package/.next/static/chunks/app/api/auth/login/route-e3626364434d521b.js +1 -0
  199. package/.next/static/chunks/app/api/auth/logout/route-e3626364434d521b.js +1 -0
  200. package/.next/static/chunks/app/api/auth/status/route-e3626364434d521b.js +1 -0
  201. package/.next/static/chunks/app/api/capabilities/route-e3626364434d521b.js +1 -0
  202. package/.next/static/chunks/app/api/daily-summary/route-e3626364434d521b.js +1 -0
  203. package/.next/static/chunks/app/api/daily-summary/status/route-e3626364434d521b.js +1 -0
  204. package/.next/static/chunks/app/api/external-apps/[id]/health/route-e3626364434d521b.js +1 -0
  205. package/.next/static/chunks/app/api/external-apps/[id]/route-e3626364434d521b.js +1 -0
  206. package/.next/static/chunks/app/api/external-apps/route-e3626364434d521b.js +1 -0
  207. package/.next/static/chunks/app/api/fs/browse/route-e3626364434d521b.js +1 -0
  208. package/.next/static/chunks/app/api/fs/recent-paths/route-e3626364434d521b.js +1 -0
  209. package/.next/static/chunks/app/api/hooks/agent-event/route-e3626364434d521b.js +1 -0
  210. package/.next/static/chunks/app/api/hooks/claude-done/route-e3626364434d521b.js +1 -0
  211. package/.next/static/chunks/app/api/hooks/permission-request/route-e3626364434d521b.js +1 -0
  212. package/.next/static/chunks/app/api/metrics/vibe/route-e3626364434d521b.js +1 -0
  213. package/.next/static/chunks/app/api/ollama/models/route-e3626364434d521b.js +1 -0
  214. package/.next/static/chunks/app/api/push/escalation/route-e3626364434d521b.js +1 -0
  215. package/.next/static/chunks/app/api/push/subscriptions/route-e3626364434d521b.js +1 -0
  216. package/.next/static/chunks/app/api/push/vapid/route-e3626364434d521b.js +1 -0
  217. package/.next/static/chunks/app/api/remote/pair/route-e3626364434d521b.js +1 -0
  218. package/.next/static/chunks/app/api/repositories/[id]/route-e3626364434d521b.js +1 -0
  219. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
  220. package/.next/static/chunks/app/api/repositories/[id]/todos/route-e3626364434d521b.js +1 -0
  221. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-e3626364434d521b.js +1 -0
  222. package/.next/static/chunks/app/api/repositories/clone/route-e3626364434d521b.js +1 -0
  223. package/.next/static/chunks/app/api/repositories/excluded/route-e3626364434d521b.js +1 -0
  224. package/.next/static/chunks/app/api/repositories/restore/route-e3626364434d521b.js +1 -0
  225. package/.next/static/chunks/app/api/repositories/route-e3626364434d521b.js +1 -0
  226. package/.next/static/chunks/app/api/repositories/scan/route-e3626364434d521b.js +1 -0
  227. package/.next/static/chunks/app/api/repositories/sync/route-e3626364434d521b.js +1 -0
  228. package/.next/static/chunks/app/api/repositories/validate-path/route-e3626364434d521b.js +1 -0
  229. package/.next/static/chunks/app/api/sidebar/group-order/route-e3626364434d521b.js +1 -0
  230. package/.next/static/chunks/app/api/skills/[id]/route-e3626364434d521b.js +1 -0
  231. package/.next/static/chunks/app/api/skills/installations/route-e3626364434d521b.js +1 -0
  232. package/.next/static/chunks/app/api/skills/operations/route-e3626364434d521b.js +1 -0
  233. package/.next/static/chunks/app/api/skills/reindex/route-e3626364434d521b.js +1 -0
  234. package/.next/static/chunks/app/api/skills/route-e3626364434d521b.js +1 -0
  235. package/.next/static/chunks/app/api/slash-commands/route-e3626364434d521b.js +1 -0
  236. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-e3626364434d521b.js +1 -0
  237. package/.next/static/chunks/app/api/tasks/[taskId]/route-e3626364434d521b.js +1 -0
  238. package/.next/static/chunks/app/api/templates/[id]/route-e3626364434d521b.js +1 -0
  239. package/.next/static/chunks/app/api/templates/route-e3626364434d521b.js +1 -0
  240. package/.next/static/chunks/app/api/todos/route-e3626364434d521b.js +1 -0
  241. package/.next/static/chunks/app/api/verification/runs/[runId]/route-e3626364434d521b.js +1 -0
  242. package/.next/static/chunks/app/api/verification/runs/route-e3626364434d521b.js +1 -0
  243. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-e3626364434d521b.js +1 -0
  244. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-e3626364434d521b.js +1 -0
  245. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-e3626364434d521b.js +1 -0
  246. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-e3626364434d521b.js +1 -0
  247. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-e3626364434d521b.js +1 -0
  248. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-e3626364434d521b.js +1 -0
  249. package/.next/static/chunks/app/api/worktrees/[id]/env/route-e3626364434d521b.js +1 -0
  250. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-e3626364434d521b.js +1 -0
  251. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-e3626364434d521b.js +1 -0
  252. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-e3626364434d521b.js +1 -0
  253. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-e3626364434d521b.js +1 -0
  254. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-e3626364434d521b.js +1 -0
  255. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-e3626364434d521b.js +1 -0
  256. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-e3626364434d521b.js +1 -0
  257. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-e3626364434d521b.js +1 -0
  258. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-e3626364434d521b.js +1 -0
  259. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-e3626364434d521b.js +1 -0
  260. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-e3626364434d521b.js +1 -0
  261. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-e3626364434d521b.js +1 -0
  262. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-e3626364434d521b.js +1 -0
  263. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-e3626364434d521b.js +1 -0
  264. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-e3626364434d521b.js +1 -0
  265. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-e3626364434d521b.js +1 -0
  266. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-e3626364434d521b.js +1 -0
  267. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-e3626364434d521b.js +1 -0
  268. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-e3626364434d521b.js +1 -0
  269. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-e3626364434d521b.js +1 -0
  270. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-e3626364434d521b.js +1 -0
  271. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-e3626364434d521b.js +1 -0
  272. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-e3626364434d521b.js +1 -0
  273. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-e3626364434d521b.js +1 -0
  274. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-e3626364434d521b.js +1 -0
  275. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-e3626364434d521b.js +1 -0
  276. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-e3626364434d521b.js +1 -0
  277. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-e3626364434d521b.js +1 -0
  278. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-e3626364434d521b.js +1 -0
  279. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-e3626364434d521b.js +1 -0
  280. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-e3626364434d521b.js +1 -0
  281. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-e3626364434d521b.js +1 -0
  282. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-e3626364434d521b.js +1 -0
  283. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-e3626364434d521b.js +1 -0
  284. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-e3626364434d521b.js +1 -0
  285. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-e3626364434d521b.js +1 -0
  286. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-e3626364434d521b.js +1 -0
  287. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-e3626364434d521b.js +1 -0
  288. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-e3626364434d521b.js +1 -0
  289. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-e3626364434d521b.js +1 -0
  290. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-e3626364434d521b.js +1 -0
  291. package/.next/static/chunks/app/api/worktrees/[id]/route-e3626364434d521b.js +1 -0
  292. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-e3626364434d521b.js +1 -0
  293. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-e3626364434d521b.js +1 -0
  294. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-e3626364434d521b.js +1 -0
  295. package/.next/static/chunks/app/api/worktrees/[id]/search/route-e3626364434d521b.js +1 -0
  296. package/.next/static/chunks/app/api/worktrees/[id]/send/route-e3626364434d521b.js +1 -0
  297. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-e3626364434d521b.js +1 -0
  298. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-e3626364434d521b.js +1 -0
  299. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-e3626364434d521b.js +1 -0
  300. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-e3626364434d521b.js +1 -0
  301. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-e3626364434d521b.js +1 -0
  302. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-e3626364434d521b.js +1 -0
  303. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-e3626364434d521b.js +1 -0
  304. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-e3626364434d521b.js +1 -0
  305. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-e3626364434d521b.js +1 -0
  306. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-e3626364434d521b.js +1 -0
  307. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-e3626364434d521b.js +1 -0
  308. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-e3626364434d521b.js +1 -0
  309. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-e3626364434d521b.js +1 -0
  310. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-e3626364434d521b.js +1 -0
  311. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-e3626364434d521b.js +1 -0
  312. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-e3626364434d521b.js +1 -0
  313. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-e3626364434d521b.js +1 -0
  314. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-e3626364434d521b.js +1 -0
  315. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-e3626364434d521b.js +1 -0
  316. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-e3626364434d521b.js +1 -0
  317. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-e3626364434d521b.js +1 -0
  318. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-e3626364434d521b.js +1 -0
  319. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-e3626364434d521b.js +1 -0
  320. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-e3626364434d521b.js +1 -0
  321. package/.next/static/chunks/app/api/worktrees/route-e3626364434d521b.js +1 -0
  322. package/.next/static/chunks/app/login/page-03659dded846ef1d.js +1 -0
  323. package/.next/static/chunks/app/manifest.webmanifest/route-e3626364434d521b.js +1 -0
  324. package/.next/static/chunks/app/proxy/[...path]/route-e3626364434d521b.js +1 -0
  325. package/.next/static/chunks/app/worktrees/[id]/layout-e3626364434d521b.js +1 -0
  326. package/.next/static/chunks/app/worktrees/[id]/{page-27b7cb2e77099eec.js → page-c07b23b6ca58091c.js} +1 -1
  327. package/.next/static/chunks/webpack-7e79064bfce988d7.js +1 -0
  328. package/.next/static/css/b6990f889f4f9515.css +1 -0
  329. package/.next/static/uulKcSOgyxChTo4SipUSF/_buildManifest.js +1 -0
  330. package/.next/trace +13 -13
  331. package/.next/types/app/api/remote/pair/route.ts +347 -0
  332. package/.next/types/routes.d.ts +2 -1
  333. package/.next/types/validator.ts +9 -0
  334. package/README.md +15 -3
  335. package/dist/cli/commands/remote.d.ts +248 -0
  336. package/dist/cli/commands/remote.d.ts.map +1 -0
  337. package/dist/cli/commands/remote.js +849 -0
  338. package/dist/cli/config/security-messages.d.ts +25 -0
  339. package/dist/cli/config/security-messages.d.ts.map +1 -1
  340. package/dist/cli/config/security-messages.js +43 -1
  341. package/dist/cli/program.d.ts.map +1 -1
  342. package/dist/cli/program.js +6 -0
  343. package/dist/cli/types/index.d.ts +20 -0
  344. package/dist/cli/types/index.d.ts.map +1 -1
  345. package/dist/cli/utils/qr-terminal.d.ts +54 -0
  346. package/dist/cli/utils/qr-terminal.d.ts.map +1 -0
  347. package/dist/cli/utils/qr-terminal.js +181 -0
  348. package/dist/cli/utils/remote-state.d.ts +123 -0
  349. package/dist/cli/utils/remote-state.d.ts.map +1 -0
  350. package/dist/cli/utils/remote-state.js +193 -0
  351. package/dist/config/auth-config.d.ts +1 -1
  352. package/dist/config/auth-config.d.ts.map +1 -1
  353. package/dist/config/auth-config.js +5 -0
  354. package/dist/lib/remote/cloudflare.d.ts +285 -0
  355. package/dist/lib/remote/cloudflare.d.ts.map +1 -0
  356. package/dist/lib/remote/cloudflare.js +619 -0
  357. package/dist/lib/remote/index.d.ts +17 -0
  358. package/dist/lib/remote/index.d.ts.map +1 -0
  359. package/dist/lib/remote/index.js +64 -0
  360. package/dist/lib/remote/provider-registry.d.ts +29 -0
  361. package/dist/lib/remote/provider-registry.d.ts.map +1 -0
  362. package/dist/lib/remote/provider-registry.js +73 -0
  363. package/dist/lib/remote/tailscale.d.ts +268 -0
  364. package/dist/lib/remote/tailscale.d.ts.map +1 -0
  365. package/dist/lib/remote/tailscale.js +546 -0
  366. package/dist/lib/remote/types.d.ts +127 -0
  367. package/dist/lib/remote/types.d.ts.map +1 -0
  368. package/dist/lib/remote/types.js +53 -0
  369. package/dist/lib/security/pairing-code.d.ts +182 -0
  370. package/dist/lib/security/pairing-code.d.ts.map +1 -0
  371. package/dist/lib/security/pairing-code.js +265 -0
  372. package/dist/server/src/config/auth-config.js +5 -0
  373. package/package.json +2 -1
  374. package/.next/static/0GHE2JGlFzqvSBZAcBFSt/_buildManifest.js +0 -1
  375. package/.next/static/chunks/5229-1f5f19740a8d6c11.js +0 -1
  376. package/.next/static/chunks/6271.295ced91b6335f18.js +0 -1
  377. package/.next/static/chunks/6381-d921ab728eda1191.js +0 -1
  378. package/.next/static/chunks/app/api/app/update/route-9247d6b9d647f750.js +0 -1
  379. package/.next/static/chunks/app/api/app/update-check/route-9247d6b9d647f750.js +0 -1
  380. package/.next/static/chunks/app/api/assistant/conversation/route-9247d6b9d647f750.js +0 -1
  381. package/.next/static/chunks/app/api/assistant/current-output/route-9247d6b9d647f750.js +0 -1
  382. package/.next/static/chunks/app/api/assistant/messages/route-9247d6b9d647f750.js +0 -1
  383. package/.next/static/chunks/app/api/assistant/session/route-9247d6b9d647f750.js +0 -1
  384. package/.next/static/chunks/app/api/assistant/start/route-9247d6b9d647f750.js +0 -1
  385. package/.next/static/chunks/app/api/assistant/terminal/route-9247d6b9d647f750.js +0 -1
  386. package/.next/static/chunks/app/api/assistant/tools/route-9247d6b9d647f750.js +0 -1
  387. package/.next/static/chunks/app/api/auth/login/route-9247d6b9d647f750.js +0 -1
  388. package/.next/static/chunks/app/api/auth/logout/route-9247d6b9d647f750.js +0 -1
  389. package/.next/static/chunks/app/api/auth/status/route-9247d6b9d647f750.js +0 -1
  390. package/.next/static/chunks/app/api/capabilities/route-9247d6b9d647f750.js +0 -1
  391. package/.next/static/chunks/app/api/daily-summary/route-9247d6b9d647f750.js +0 -1
  392. package/.next/static/chunks/app/api/daily-summary/status/route-9247d6b9d647f750.js +0 -1
  393. package/.next/static/chunks/app/api/external-apps/[id]/health/route-9247d6b9d647f750.js +0 -1
  394. package/.next/static/chunks/app/api/external-apps/[id]/route-9247d6b9d647f750.js +0 -1
  395. package/.next/static/chunks/app/api/external-apps/route-9247d6b9d647f750.js +0 -1
  396. package/.next/static/chunks/app/api/fs/browse/route-9247d6b9d647f750.js +0 -1
  397. package/.next/static/chunks/app/api/fs/recent-paths/route-9247d6b9d647f750.js +0 -1
  398. package/.next/static/chunks/app/api/hooks/agent-event/route-9247d6b9d647f750.js +0 -1
  399. package/.next/static/chunks/app/api/hooks/claude-done/route-9247d6b9d647f750.js +0 -1
  400. package/.next/static/chunks/app/api/hooks/permission-request/route-9247d6b9d647f750.js +0 -1
  401. package/.next/static/chunks/app/api/metrics/vibe/route-9247d6b9d647f750.js +0 -1
  402. package/.next/static/chunks/app/api/ollama/models/route-9247d6b9d647f750.js +0 -1
  403. package/.next/static/chunks/app/api/push/escalation/route-9247d6b9d647f750.js +0 -1
  404. package/.next/static/chunks/app/api/push/subscriptions/route-9247d6b9d647f750.js +0 -1
  405. package/.next/static/chunks/app/api/push/vapid/route-9247d6b9d647f750.js +0 -1
  406. package/.next/static/chunks/app/api/repositories/[id]/route-9247d6b9d647f750.js +0 -1
  407. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-9247d6b9d647f750.js +0 -1
  408. package/.next/static/chunks/app/api/repositories/[id]/todos/route-9247d6b9d647f750.js +0 -1
  409. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-9247d6b9d647f750.js +0 -1
  410. package/.next/static/chunks/app/api/repositories/clone/route-9247d6b9d647f750.js +0 -1
  411. package/.next/static/chunks/app/api/repositories/excluded/route-9247d6b9d647f750.js +0 -1
  412. package/.next/static/chunks/app/api/repositories/restore/route-9247d6b9d647f750.js +0 -1
  413. package/.next/static/chunks/app/api/repositories/route-9247d6b9d647f750.js +0 -1
  414. package/.next/static/chunks/app/api/repositories/scan/route-9247d6b9d647f750.js +0 -1
  415. package/.next/static/chunks/app/api/repositories/sync/route-9247d6b9d647f750.js +0 -1
  416. package/.next/static/chunks/app/api/repositories/validate-path/route-9247d6b9d647f750.js +0 -1
  417. package/.next/static/chunks/app/api/sidebar/group-order/route-9247d6b9d647f750.js +0 -1
  418. package/.next/static/chunks/app/api/skills/[id]/route-9247d6b9d647f750.js +0 -1
  419. package/.next/static/chunks/app/api/skills/installations/route-9247d6b9d647f750.js +0 -1
  420. package/.next/static/chunks/app/api/skills/operations/route-9247d6b9d647f750.js +0 -1
  421. package/.next/static/chunks/app/api/skills/reindex/route-9247d6b9d647f750.js +0 -1
  422. package/.next/static/chunks/app/api/skills/route-9247d6b9d647f750.js +0 -1
  423. package/.next/static/chunks/app/api/slash-commands/route-9247d6b9d647f750.js +0 -1
  424. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-9247d6b9d647f750.js +0 -1
  425. package/.next/static/chunks/app/api/tasks/[taskId]/route-9247d6b9d647f750.js +0 -1
  426. package/.next/static/chunks/app/api/templates/[id]/route-9247d6b9d647f750.js +0 -1
  427. package/.next/static/chunks/app/api/templates/route-9247d6b9d647f750.js +0 -1
  428. package/.next/static/chunks/app/api/todos/route-9247d6b9d647f750.js +0 -1
  429. package/.next/static/chunks/app/api/verification/runs/[runId]/route-9247d6b9d647f750.js +0 -1
  430. package/.next/static/chunks/app/api/verification/runs/route-9247d6b9d647f750.js +0 -1
  431. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-9247d6b9d647f750.js +0 -1
  432. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-9247d6b9d647f750.js +0 -1
  433. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-9247d6b9d647f750.js +0 -1
  434. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-9247d6b9d647f750.js +0 -1
  435. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-9247d6b9d647f750.js +0 -1
  436. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-9247d6b9d647f750.js +0 -1
  437. package/.next/static/chunks/app/api/worktrees/[id]/env/route-9247d6b9d647f750.js +0 -1
  438. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-9247d6b9d647f750.js +0 -1
  439. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-9247d6b9d647f750.js +0 -1
  440. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-9247d6b9d647f750.js +0 -1
  441. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-9247d6b9d647f750.js +0 -1
  442. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-9247d6b9d647f750.js +0 -1
  443. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-9247d6b9d647f750.js +0 -1
  444. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-9247d6b9d647f750.js +0 -1
  445. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-9247d6b9d647f750.js +0 -1
  446. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-9247d6b9d647f750.js +0 -1
  447. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-9247d6b9d647f750.js +0 -1
  448. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-9247d6b9d647f750.js +0 -1
  449. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-9247d6b9d647f750.js +0 -1
  450. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-9247d6b9d647f750.js +0 -1
  451. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-9247d6b9d647f750.js +0 -1
  452. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-9247d6b9d647f750.js +0 -1
  453. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-9247d6b9d647f750.js +0 -1
  454. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-9247d6b9d647f750.js +0 -1
  455. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-9247d6b9d647f750.js +0 -1
  456. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-9247d6b9d647f750.js +0 -1
  457. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-9247d6b9d647f750.js +0 -1
  458. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-9247d6b9d647f750.js +0 -1
  459. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-9247d6b9d647f750.js +0 -1
  460. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-9247d6b9d647f750.js +0 -1
  461. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-9247d6b9d647f750.js +0 -1
  462. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-9247d6b9d647f750.js +0 -1
  463. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-9247d6b9d647f750.js +0 -1
  464. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-9247d6b9d647f750.js +0 -1
  465. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-9247d6b9d647f750.js +0 -1
  466. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-9247d6b9d647f750.js +0 -1
  467. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-9247d6b9d647f750.js +0 -1
  468. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-9247d6b9d647f750.js +0 -1
  469. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-9247d6b9d647f750.js +0 -1
  470. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-9247d6b9d647f750.js +0 -1
  471. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-9247d6b9d647f750.js +0 -1
  472. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-9247d6b9d647f750.js +0 -1
  473. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-9247d6b9d647f750.js +0 -1
  474. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-9247d6b9d647f750.js +0 -1
  475. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-9247d6b9d647f750.js +0 -1
  476. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-9247d6b9d647f750.js +0 -1
  477. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-9247d6b9d647f750.js +0 -1
  478. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-9247d6b9d647f750.js +0 -1
  479. package/.next/static/chunks/app/api/worktrees/[id]/route-9247d6b9d647f750.js +0 -1
  480. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-9247d6b9d647f750.js +0 -1
  481. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-9247d6b9d647f750.js +0 -1
  482. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-9247d6b9d647f750.js +0 -1
  483. package/.next/static/chunks/app/api/worktrees/[id]/search/route-9247d6b9d647f750.js +0 -1
  484. package/.next/static/chunks/app/api/worktrees/[id]/send/route-9247d6b9d647f750.js +0 -1
  485. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-9247d6b9d647f750.js +0 -1
  486. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-9247d6b9d647f750.js +0 -1
  487. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-9247d6b9d647f750.js +0 -1
  488. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-9247d6b9d647f750.js +0 -1
  489. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-9247d6b9d647f750.js +0 -1
  490. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-9247d6b9d647f750.js +0 -1
  491. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-9247d6b9d647f750.js +0 -1
  492. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-9247d6b9d647f750.js +0 -1
  493. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-9247d6b9d647f750.js +0 -1
  494. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-9247d6b9d647f750.js +0 -1
  495. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-9247d6b9d647f750.js +0 -1
  496. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-9247d6b9d647f750.js +0 -1
  497. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-9247d6b9d647f750.js +0 -1
  498. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-9247d6b9d647f750.js +0 -1
  499. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-9247d6b9d647f750.js +0 -1
  500. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-9247d6b9d647f750.js +0 -1
  501. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-9247d6b9d647f750.js +0 -1
  502. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-9247d6b9d647f750.js +0 -1
  503. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-9247d6b9d647f750.js +0 -1
  504. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-9247d6b9d647f750.js +0 -1
  505. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-9247d6b9d647f750.js +0 -1
  506. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-9247d6b9d647f750.js +0 -1
  507. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-9247d6b9d647f750.js +0 -1
  508. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-9247d6b9d647f750.js +0 -1
  509. package/.next/static/chunks/app/api/worktrees/route-9247d6b9d647f750.js +0 -1
  510. package/.next/static/chunks/app/login/page-adc51f0f7cbb7ac6.js +0 -1
  511. package/.next/static/chunks/app/manifest.webmanifest/route-9247d6b9d647f750.js +0 -1
  512. package/.next/static/chunks/app/proxy/[...path]/route-9247d6b9d647f750.js +0 -1
  513. package/.next/static/chunks/app/worktrees/[id]/layout-9247d6b9d647f750.js +0 -1
  514. package/.next/static/chunks/webpack-6a9668cf54a26eba.js +0 -1
  515. package/.next/static/css/98722bc4152cedcc.css +0 -1
  516. /package/.next/static/{0GHE2JGlFzqvSBZAcBFSt → uulKcSOgyxChTo4SipUSF}/_ssgManifest.js +0 -0
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /**
3
+ * Persisted state of one `commandmate remote` session (Issue #1937, R9).
4
+ *
5
+ * Design: `docs/design/remote-qr-pairing-1937.md` §6.3.
6
+ *
7
+ * ## Why this file exists at all
8
+ *
9
+ * `remote stop` must undo exactly what `remote up` created and nothing else.
10
+ * The Provider interface enforces that structurally — `stop()` takes a
11
+ * `RemoteHandle` and there is no `reset()` / `cleanupAll()` to reach for — but
12
+ * the two commands are separate processes, so the handle has to survive on
13
+ * disk between them. This module is that hop, and nothing more: it stores, it
14
+ * does not interpret.
15
+ *
16
+ * ## Why "unreadable" is not "guess"
17
+ *
18
+ * `readRemoteState()` answers `null` for absent, unparseable and structurally
19
+ * wrong alike, and `remote stop` turns all three into "I do not know what to
20
+ * clean up" and exits SUCCESS (§6.3-4). That is deliberate and is the whole
21
+ * reason the reader validates rather than casts: a half-read state file must
22
+ * never become a Provider teardown aimed at configuration the user created.
23
+ * `stop.ts` treats a stale PID file the same way.
24
+ *
25
+ * ## Format
26
+ *
27
+ * Plain JSON with a `schemaVersion`, not `PidManager`'s hybrid
28
+ * "bare PID line + JSON line" shape. That format exists so a CLI predating
29
+ * #1354 can still `parseInt()` the first line; nothing has ever read this file,
30
+ * so there is no such reader to stay compatible with, and a PID is not what
31
+ * this record is about.
32
+ *
33
+ * The file is written 0600 like the pairing handoff. It holds no secret — the
34
+ * pairing code and the session token are never in it — but it names a public
35
+ * URL that reaches this machine, and that is not something to leave
36
+ * world-readable.
37
+ */
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.REMOTE_STATE_SCHEMA_VERSION = exports.REMOTE_STATE_FILE_MODE = exports.REMOTE_STATE_FILE_NAME = void 0;
40
+ exports.getRemoteStatePath = getRemoteStatePath;
41
+ exports.writeRemoteState = writeRemoteState;
42
+ exports.readRemoteState = readRemoteState;
43
+ exports.removeRemoteState = removeRemoteState;
44
+ exports.isRemoteState = isRemoteState;
45
+ const fs_1 = require("fs");
46
+ const path_1 = require("path");
47
+ const install_context_1 = require("./install-context");
48
+ /** File name inside the config directory (`~/.commandmate` for global installs). */
49
+ exports.REMOTE_STATE_FILE_NAME = 'remote.json';
50
+ /** Owner read/write only. Asserted by tests, not merely intended. */
51
+ exports.REMOTE_STATE_FILE_MODE = 0o600;
52
+ /**
53
+ * Bumped when a field changes meaning. A reader that does not recognise the
54
+ * version returns null, which routes to "nothing to clean up" rather than to a
55
+ * teardown driven by a record it does not understand.
56
+ */
57
+ exports.REMOTE_STATE_SCHEMA_VERSION = 1;
58
+ /**
59
+ * Absolute path of the state file.
60
+ *
61
+ * @returns `<configDir>/remote.json`
62
+ */
63
+ function getRemoteStatePath() {
64
+ return (0, path_1.join)((0, install_context_1.getConfigDir)(), exports.REMOTE_STATE_FILE_NAME);
65
+ }
66
+ /**
67
+ * Write the state file with mode 0600.
68
+ *
69
+ * An existing file is unlinked first: `writeFileSync`'s `mode` is only honoured
70
+ * on creation, so writing over a file left world-readable by something else
71
+ * would silently keep those permissions. Mirrors `writePairingHandoff()`.
72
+ *
73
+ * @param state - The session record to persist
74
+ * @param filePath - Override for the destination, for tests
75
+ */
76
+ function writeRemoteState(state, filePath) {
77
+ const target = filePath ?? (0, path_1.join)((0, install_context_1.ensureConfigDir)(), exports.REMOTE_STATE_FILE_NAME);
78
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
79
+ try {
80
+ (0, fs_1.unlinkSync)(target);
81
+ }
82
+ catch {
83
+ // Not there yet - the normal case.
84
+ }
85
+ (0, fs_1.writeFileSync)(target, JSON.stringify(state, null, 2), {
86
+ encoding: 'utf8',
87
+ mode: exports.REMOTE_STATE_FILE_MODE,
88
+ });
89
+ (0, fs_1.chmodSync)(target, exports.REMOTE_STATE_FILE_MODE);
90
+ }
91
+ /**
92
+ * Read and validate the state file.
93
+ *
94
+ * @param filePath - Override for the source, for tests
95
+ * @returns The state, or null when it is absent, unreadable or not this schema
96
+ */
97
+ function readRemoteState(filePath) {
98
+ const target = filePath ?? getRemoteStatePath();
99
+ let raw;
100
+ try {
101
+ raw = (0, fs_1.readFileSync)(target, 'utf8');
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ let parsed;
107
+ try {
108
+ parsed = JSON.parse(raw);
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ return isRemoteState(parsed) ? parsed : null;
114
+ }
115
+ /**
116
+ * Delete the state file. Idempotent — a missing file is success.
117
+ *
118
+ * @param filePath - Override for the target, for tests
119
+ */
120
+ function removeRemoteState(filePath) {
121
+ try {
122
+ (0, fs_1.unlinkSync)(filePath ?? getRemoteStatePath());
123
+ }
124
+ catch {
125
+ // Already gone: the state we wanted.
126
+ }
127
+ }
128
+ /**
129
+ * Structural check for a parsed state file.
130
+ *
131
+ * Every field `remote stop` and `remote status` read is checked, because the
132
+ * cost of being wrong is asymmetric: a rejected record costs the user one
133
+ * "nothing to clean up" message, an accepted-but-wrong one aims a Provider
134
+ * teardown at a handle nobody wrote.
135
+ *
136
+ * @param value - Parsed JSON
137
+ * @returns true when the value is a state record of the current schema
138
+ */
139
+ function isRemoteState(value) {
140
+ if (typeof value !== 'object' || value === null)
141
+ return false;
142
+ const record = value;
143
+ if (record.schemaVersion !== exports.REMOTE_STATE_SCHEMA_VERSION)
144
+ return false;
145
+ if (record.provider !== 'tailscale-serve' && record.provider !== 'cloudflare-quick')
146
+ return false;
147
+ if (typeof record.url !== 'string' || record.url.length === 0)
148
+ return false;
149
+ if (typeof record.startedAt !== 'string')
150
+ return false;
151
+ if (typeof record.expiresAt !== 'number' || !Number.isFinite(record.expiresAt))
152
+ return false;
153
+ const pairing = record.pairing;
154
+ if (typeof pairing !== 'object' || pairing === null)
155
+ return false;
156
+ if (typeof pairing.filePath !== 'string' || pairing.filePath.length === 0)
157
+ return false;
158
+ if (typeof pairing.expiresAt !== 'number' || !Number.isFinite(pairing.expiresAt))
159
+ return false;
160
+ const server = record.server;
161
+ if (typeof server !== 'object' || server === null)
162
+ return false;
163
+ if (server.pid !== null && typeof server.pid !== 'number')
164
+ return false;
165
+ if (typeof server.port !== 'number')
166
+ return false;
167
+ return isRemoteHandle(record.handle);
168
+ }
169
+ /**
170
+ * @param value - Candidate handle from a parsed state file
171
+ * @returns true when the value carries everything `stop()` needs
172
+ */
173
+ function isRemoteHandle(value) {
174
+ if (typeof value !== 'object' || value === null)
175
+ return false;
176
+ const handle = value;
177
+ if (handle.provider !== 'tailscale-serve' && handle.provider !== 'cloudflare-quick')
178
+ return false;
179
+ if (typeof handle.url !== 'string')
180
+ return false;
181
+ const owned = handle.owned;
182
+ if (typeof owned !== 'object' || owned === null)
183
+ return false;
184
+ if (owned.pid !== null && typeof owned.pid !== 'number')
185
+ return false;
186
+ if (owned.revert !== null && (typeof owned.revert !== 'object' || owned.revert === undefined)) {
187
+ return false;
188
+ }
189
+ // `preexisting` is deliberately `unknown` in the interface: its shape is the
190
+ // Provider's business, and `planStop()` narrows it itself. Requiring the key
191
+ // to be present is as far as this reader can honestly go.
192
+ return 'preexisting' in handle;
193
+ }
@@ -20,7 +20,7 @@ export declare function isValidTokenHash(hash: string | undefined): hash is stri
20
20
  * Paths excluded from authentication check.
21
21
  * S002: Must use === for matching (no startsWith - bypass attack prevention)
22
22
  */
23
- export declare const AUTH_EXCLUDED_PATHS: readonly ["/login", "/api/auth/login", "/api/auth/logout", "/api/auth/status", "/manifest.webmanifest", "/sw.js", "/offline"];
23
+ export declare const AUTH_EXCLUDED_PATHS: readonly ["/login", "/api/auth/login", "/api/auth/logout", "/api/auth/status", "/api/remote/pair", "/manifest.webmanifest", "/sw.js", "/offline"];
24
24
  /** Default token expiration duration (24 hours) */
25
25
  export declare const DEFAULT_EXPIRE_DURATION_MS: number;
26
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"auth-config.d.ts","sourceRoot":"","sources":["../../src/config/auth-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAG,eAAwB,CAAC;AAKzD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAEzE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,+HAWtB,CAAC;AAeX,mDAAmD;AACnD,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAQ3D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAgC/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAgB/C"}
1
+ {"version":3,"file":"auth-config.d.ts","sourceRoot":"","sources":["../../src/config/auth-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAG,eAAwB,CAAC;AAKzD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAEzE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,mJAgBtB,CAAC;AAeX,mDAAmD;AACnD,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAQ3D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAgC/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAgB/C"}
@@ -35,6 +35,11 @@ exports.AUTH_EXCLUDED_PATHS = [
35
35
  '/api/auth/login',
36
36
  '/api/auth/logout',
37
37
  '/api/auth/status',
38
+ // Issue #1937 (R5): one-shot pairing-code exchange for `commandmate remote`.
39
+ // The pairing SCREEN is '/login' above, driven by a '#code=' fragment, so
40
+ // this is the only entry the remote feature adds. Handler:
41
+ // src/app/api/remote/pair/route.ts (it authenticates the code itself).
42
+ '/api/remote/pair',
38
43
  // Issue #1124 (PWA): non-sensitive resources that must stay reachable before
39
44
  // auth so the app is installable and the offline fallback can be precached.
40
45
  // All carry no user data (app metadata / public SW code / static fallback).
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Cloudflare Quick Tunnel Provider (Issue #1937, R2).
3
+ *
4
+ * Implements §6.4 of `docs/design/remote-qr-pairing-1937.md`. Everything below
5
+ * that says "measured" was measured on 2026-08-29 against cloudflared 2025.4.0;
6
+ * the raw capture is in `dev-reports/issue/1937/u3-quicktunnel-url.md`.
7
+ *
8
+ * ## Three properties this file is responsible for
9
+ *
10
+ * 1. **Nothing but loopback is ever exposed.** `LOOPBACK_HOST` is a constant and
11
+ * is never derived from an argument, so neither the upstream nor the metrics
12
+ * listener can be pointed anywhere else. That matters twice over for
13
+ * `--metrics`: `cloudflared tunnel --help` says its default address "binds to
14
+ * all interfaces" under a virtual environment. CommandMate defaults `CM_BIND`
15
+ * to 127.0.0.1, and opening a hole in the Provider's own diagnostics port
16
+ * would give that back.
17
+ *
18
+ * 2. **`stop()` only signals the process this module started.** A Quick Tunnel
19
+ * writes no persistent Provider configuration, so `preexisting` is `null` and
20
+ * `owned.revert` is `null`; the whole teardown is one SIGTERM to `owned.pid`.
21
+ * Measured: the process is gone in about a second and the public URL then
22
+ * answers HTTP 530. There is no reason to reach for any command that acts on
23
+ * "every tunnel this machine knows about", and
24
+ * `tests/unit/config/remote-destructive-command-guard.test.ts` forbids it.
25
+ * This is not hypothetical — the machine this was measured on had a named
26
+ * tunnel of the user's own running for nine days at the time.
27
+ *
28
+ * 3. **The URL comes from the metrics API first.** Measured order: the stderr
29
+ * banner appears at t+3s, the metrics server only at t+4s. So a loop that
30
+ * tried both every round would find the banner first every single time and
31
+ * `/quicktunnel` would be dead code. `METRICS_PREFERENCE_WINDOW_MS` is what
32
+ * keeps the first candidate actually first: for that long, only the metrics
33
+ * route is consulted.
34
+ *
35
+ * 4. **The tunnel outlives the CLI that started it.** `commandmate remote up`
36
+ * exits as soon as it has a URL — measured at about 6.5 seconds, taken from
37
+ * the metrics API. cloudflared has to still be there afterwards, because the
38
+ * whole point is a QR code someone reads with a phone a minute later. Two
39
+ * things make that true, and Issue #2146 is what happens without them:
40
+ * cloudflared's stderr goes to a **file descriptor, never a pipe**, and the
41
+ * child is spawned `detached` and `unref`ed.
42
+ *
43
+ * Measured (Issue #2146, `docs/qa/1937-remote-uat-record.md` D-1): with
44
+ * `stdio: ['ignore', 'ignore', 'pipe']` the child was dead within two
45
+ * seconds of the parent exiting, and the public URL answered HTTP 530 before
46
+ * the QR code could be read. The parent's exit closes the read end of that
47
+ * pipe; cloudflared is Go, does not ignore SIGPIPE, and dies on its next
48
+ * write to fd 2 — which, at t+6.5s, is still mid log-burst. The same argv
49
+ * with a parent kept alive for 70 seconds gave a child that lived 70
50
+ * seconds, so this is the plumbing and not cloudflared giving up.
51
+ *
52
+ * `'ignore'` would also have fixed it and is the wrong fix: it takes fd 2
53
+ * away entirely, and fd 2 is where both the **second URL candidate**
54
+ * (`parseBannerUrl`) and every failure diagnostic (`stderrTail`) come from.
55
+ * A file keeps both — nothing closes when the CLI exits, and the parser and
56
+ * the diagnostic read it back by path. `--logfile` was the other candidate:
57
+ * it covers cloudflared's own log lines but not anything the Go runtime or
58
+ * the loader writes straight to fd 2, so fd 2 would still have been a pipe.
59
+ * `'ignore'` for fd 2 is what this falls back to only when the log file
60
+ * cannot be opened at all: a diagnostic is worth less than a working tunnel.
61
+ *
62
+ * Deliberately absent: the approval prompt. Creating a public URL is an
63
+ * irreversible, user-facing decision, and §6.2 puts it in the orchestrator that
64
+ * owns `src/cli/commands/remote.ts` — the same code that knows whether the
65
+ * session is interactive and whether `--yes` was passed.
66
+ *
67
+ * This module imports Node builtins and `./types` only. No `@/` alias, so the
68
+ * orchestrator can pull it into the `tsconfig.cli.json` build (which sets
69
+ * `paths: {}`) without the import failing to resolve.
70
+ */
71
+ import { type SpawnOptions, type SpawnSyncOptionsWithStringEncoding, type SpawnSyncReturns } from 'child_process';
72
+ import { type RemoteProvider } from './types';
73
+ /** The executable. Looked up on PATH by `spawn`, never through a shell. */
74
+ export declare const CLOUDFLARED_BIN = "cloudflared";
75
+ /** Mirrors `PreflightChecker.checkDependency()`: one flag, passed as an array. */
76
+ export declare const CLOUDFLARED_VERSION_ARG = "--version";
77
+ /**
78
+ * The only host this Provider ever names.
79
+ *
80
+ * A constant rather than a parameter on purpose: "the upstream is always
81
+ * loopback" is then a property of the code, not of every call site. §9.2 pins it
82
+ * from the outside as well, by asserting the argv `start()` builds.
83
+ */
84
+ export declare const LOOPBACK_HOST = "127.0.0.1";
85
+ /** Quick Tunnel hostnames live under this suffix, and nothing else does. */
86
+ export declare const QUICK_TUNNEL_SUFFIX = "trycloudflare.com";
87
+ /** Written next to the rest of CommandMate's state, for humans and for `ps`. */
88
+ export declare const CLOUDFLARED_PIDFILE_NAME = "cloudflared.pid";
89
+ /**
90
+ * Where cloudflared's stderr goes. Beside the pidfile, and for the same reason:
91
+ * a human who wants to know what the tunnel is doing should be able to find it.
92
+ *
93
+ * A fixed name, like the pidfile, so one `remote` session at a time is the
94
+ * assumption in both places rather than in one of them.
95
+ */
96
+ export declare const CLOUDFLARED_LOG_NAME = "cloudflared.log";
97
+ /** Same 5s budget `PreflightChecker` gives every other dependency probe. */
98
+ export declare const DETECT_TIMEOUT_MS = 5000;
99
+ /** How the wait for a public URL is paced. See `QuickTunnelTiming`. */
100
+ export interface QuickTunnelTiming {
101
+ /** Total budget for the URL to appear before `start()` gives up. */
102
+ urlWaitMs: number;
103
+ /**
104
+ * How long only `/quicktunnel` is consulted.
105
+ *
106
+ * Measured: the banner lands ~1s *before* the metrics server is listening. A
107
+ * window shorter than that gap turns the documented first candidate into
108
+ * something that never runs.
109
+ */
110
+ metricsPreferenceMs: number;
111
+ /** Gap between polls. */
112
+ pollIntervalMs: number;
113
+ }
114
+ export declare const DEFAULT_QUICK_TUNNEL_TIMING: QuickTunnelTiming;
115
+ /** Per-request budget for the loopback metrics call. */
116
+ export declare const METRICS_REQUEST_TIMEOUT_MS = 1000;
117
+ /**
118
+ * How much of the stderr log is read back, so a chatty reconnect loop cannot
119
+ * make either consumer grow unbounded.
120
+ *
121
+ * The **tail**, not the head: `parseBannerUrl` takes the last match on purpose
122
+ * (a reconnect banner should win), and `stderrTail` wants the last few lines.
123
+ */
124
+ export declare const STDERR_CAPTURE_LIMIT: number;
125
+ /**
126
+ * The part of a spawned cloudflared this module uses, and nothing more.
127
+ *
128
+ * No `stderr`: as of Issue #2146 fd 2 is a file, so there is no stream to read
129
+ * and nothing here that could be tempted to hold one open. `unref` is required
130
+ * rather than optional because forgetting it is exactly the class of mistake
131
+ * this interface exists to make impossible.
132
+ */
133
+ export interface QuickTunnelProcess {
134
+ readonly pid?: number | undefined;
135
+ once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
136
+ kill(signal?: NodeJS.Signals): boolean;
137
+ /** Releases the parent's event-loop reference to this child. */
138
+ unref(): unknown;
139
+ }
140
+ export type SpawnQuickTunnel = (command: string, args: readonly string[], options: SpawnOptions) => QuickTunnelProcess;
141
+ export type SpawnSyncProbe = (command: string, args: readonly string[], options: SpawnSyncOptionsWithStringEncoding) => SpawnSyncReturns<string>;
142
+ /**
143
+ * The seams that let this Provider be tested without a public tunnel.
144
+ *
145
+ * They are constructor arguments rather than members of the Provider because
146
+ * `RemoteProvider` is pinned to exactly `id` / `detect` / `start` / `stop`
147
+ * (§6.3-1): the returned object must not grow a fifth key.
148
+ */
149
+ export interface CloudflareProviderDeps {
150
+ spawn: SpawnQuickTunnel;
151
+ spawnSync: SpawnSyncProbe;
152
+ /** Signals a process. Defaults to `process.kill`. */
153
+ kill: (pid: number, signal: NodeJS.Signals) => void;
154
+ /** Picks the `--metrics` port. Bound on loopback, then released. */
155
+ findFreePort: () => Promise<number>;
156
+ /** The first URL candidate: `GET /quicktunnel` on the metrics listener. */
157
+ fetchHostname: (metricsPort: number) => Promise<string | null>;
158
+ /** Directory the pidfile goes in. */
159
+ resolveStateDir: () => string;
160
+ timing: QuickTunnelTiming;
161
+ }
162
+ /**
163
+ * The argv for one Quick Tunnel.
164
+ *
165
+ * `LOOPBACK_HOST` appears twice and is a constant both times. `port` is the only
166
+ * caller-supplied value that reaches the command line, and it is validated as a
167
+ * port number before it gets here.
168
+ */
169
+ export declare function buildQuickTunnelArgs(opts: {
170
+ port: number;
171
+ metricsPort: number;
172
+ pidfile: string;
173
+ }): string[];
174
+ /**
175
+ * The spawn options for one Quick Tunnel. Issue #2146 is entirely about these.
176
+ *
177
+ * `stderr` is a **file descriptor**, or `'ignore'` when the log file could not
178
+ * be opened. It is never `'pipe'`: a pipe's read end belongs to `commandmate
179
+ * remote`, which exits as soon as it has the URL, and cloudflared then dies of
180
+ * SIGPIPE on its next write to fd 2. See the file header for the measurement.
181
+ *
182
+ * `detached: true` puts the child in its own session. Without it, a Ctrl-C in
183
+ * the terminal that launched the CLI reaches cloudflared too — the tunnel is
184
+ * supposed to outlive the command, so it must not share its process group.
185
+ * `stop()` is unaffected: it signals a **positive** pid, which is one process,
186
+ * not a group, so detaching changes nothing about teardown.
187
+ */
188
+ export declare function buildQuickTunnelSpawnOptions(stderr: number | 'ignore'): SpawnOptions;
189
+ /**
190
+ * cloudflared's stderr, as this module hands it out and reads it back.
191
+ *
192
+ * Two consumers depend on it and both survive the change from a pipe to a file,
193
+ * because a file can be re-read by path at any time: `parseBannerUrl()` (the
194
+ * second URL candidate) and `stderrTail()` (the failure diagnostic).
195
+ */
196
+ export interface StderrLog {
197
+ /** Goes in slot 2 of `stdio`. A descriptor, or `'ignore'`. Never `'pipe'`. */
198
+ readonly stdio: number | 'ignore';
199
+ /** The file being written to, or `null` when there is none. */
200
+ readonly path: string | null;
201
+ /** The tail of what cloudflared has written so far. Never throws. */
202
+ read(): string;
203
+ /** Closes this process's copy of the descriptor. The child keeps its own. */
204
+ close(): void;
205
+ }
206
+ /**
207
+ * Opens the file cloudflared's stderr is redirected into.
208
+ *
209
+ * Truncating (`'w'`) rather than appending, because `parseBannerUrl()` takes the
210
+ * last URL in the buffer and a previous session's banner names a tunnel that no
211
+ * longer exists. Starting from empty means the only banner that can be read is
212
+ * this session's.
213
+ *
214
+ * Returns `SILENT_STDERR_LOG` rather than throwing when the file cannot be
215
+ * opened: `start()` still has `/quicktunnel` — the *first* URL candidate — and
216
+ * a tunnel with no diagnostics beats no tunnel.
217
+ */
218
+ export declare function openStderrLog(logPath: string): StderrLog;
219
+ /** True for a hostname cloudflared could actually have handed out. */
220
+ export declare function isQuickTunnelHostname(value: string): boolean;
221
+ /**
222
+ * Reads the hostname out of a `/quicktunnel` response body.
223
+ *
224
+ * Measured body: `{"hostname":"villas-activists-hey-barbie.trycloudflare.com"}`
225
+ * — served as `text/plain`, and **without a scheme**, so the `https://` is ours
226
+ * to add. The shape is checked before it is used because this string becomes the
227
+ * QR code a phone is asked to open; a value that is not a Quick Tunnel hostname
228
+ * is treated as no answer rather than as a destination.
229
+ */
230
+ export declare function parseQuickTunnelHostname(body: string): string | null;
231
+ /**
232
+ * Second candidate: the URL cloudflared prints on stderr.
233
+ *
234
+ * Anchored on the **shape of the URL**, not on the surrounding words. Two
235
+ * measured facts drive that. The banner text and the URL are on *different*
236
+ * lines — the URL sits alone inside a box-drawn frame — so "read what follows
237
+ * `Visit it at`" does not work against the real output. And the wording is
238
+ * exactly the part Cloudflare is free to reword, while the hostname suffix is
239
+ * the service's identity.
240
+ *
241
+ * The same stderr also carries `https://www.cloudflare.com/website-terms/` and
242
+ * `https://developers.cloudflare.com/...`; neither ends in the Quick Tunnel
243
+ * suffix, and the `Requesting new quick Tunnel on trycloudflare.com...` line has
244
+ * no scheme. All three are negative controls in the unit test.
245
+ *
246
+ * The last match wins, so a reconnect that prints a fresher banner is preferred.
247
+ */
248
+ export declare function parseBannerUrl(stderr: string): string | null;
249
+ /**
250
+ * Asks the OS for a free port on loopback and hands it back unheld.
251
+ *
252
+ * Binding the probe to `LOOPBACK_HOST` rather than to every interface is part of
253
+ * the same guarantee as the `--metrics` argument: the port this returns is one
254
+ * that is free *on loopback*, which is the only place it will be used.
255
+ */
256
+ export declare function findFreeLoopbackPort(): Promise<number>;
257
+ /**
258
+ * `GET http://127.0.0.1:<metricsPort>/quicktunnel`.
259
+ *
260
+ * Never rejects: "no answer yet" and "no such route" are both normal during the
261
+ * poll, and neither should look different from a slow start.
262
+ */
263
+ export declare function fetchQuickTunnelHostname(metricsPort: number, timeoutMs?: number): Promise<string | null>;
264
+ /**
265
+ * Where the pidfile goes: the same `~/.commandmate` the rest of CommandMate
266
+ * uses.
267
+ *
268
+ * Not read from the environment. §6.2 keeps state-file locations out of
269
+ * Providers, and an env-supplied directory would also have to defend against the
270
+ * `/proc` recursive-mkdir hang that `resolveSafeDirectory()` exists for. Tests
271
+ * override it through `CloudflareProviderDeps` instead.
272
+ */
273
+ export declare function resolveCloudflareStateDir(): string;
274
+ export declare const defaultCloudflareDeps: CloudflareProviderDeps;
275
+ /**
276
+ * Builds the Provider.
277
+ *
278
+ * The returned object has exactly the four members `RemoteProvider` declares —
279
+ * the seams stay closed over in here rather than becoming a fifth key, because
280
+ * the contract test pins that list and §6.3-1 is the reason it does.
281
+ */
282
+ export declare function createCloudflareProvider(overrides?: Partial<CloudflareProviderDeps>): RemoteProvider;
283
+ /** The shipped Provider, wired to the real `cloudflared`. */
284
+ export declare const cloudflareProvider: RemoteProvider;
285
+ //# sourceMappingURL=cloudflare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/lib/remote/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kCAAkC,EACvC,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAOvB,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,SAAS,CAAC;AAEjB,2EAA2E;AAC3E,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAEvC,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAIzC,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,IAAI,CACF,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GACrE,OAAO,CAAC;IACX,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACvC,gEAAgE;IAChE,KAAK,IAAI,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,YAAY,KAClB,kBAAkB,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,kCAAkC,KACxC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,gBAAgB,CAAC;IACxB,SAAS,EAAE,cAAc,CAAC;IAC1B,qDAAqD;IACrD,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IACpD,oEAAoE;IACpE,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,2EAA2E;IAC3E,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/D,qCAAqC;IACrC,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,EAAE,CAWX;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAGpF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qEAAqE;IACrE,IAAI,IAAI,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,IAAI,IAAI,CAAC;CACf;AA8CD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAuBxD;AAWD,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK5D;AASD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAetD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAmC,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AA6BD,eAAO,MAAM,qBAAqB,EAAE,sBAUnC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC9C,cAAc,CAqKhB;AA6DD,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,EAAE,cAA2C,CAAC"}