pi-kot 0.1.21 → 0.1.23

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 (348) hide show
  1. package/bin/pi-kot.mjs +148 -0
  2. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  3. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  4. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  5. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  6. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  7. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  8. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  9. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  10. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  11. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  12. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  13. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  14. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  15. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  16. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  17. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  18. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  19. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  20. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  21. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  22. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  23. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  24. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  25. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  26. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  27. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  28. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  29. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  30. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  31. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  32. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  33. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  34. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  35. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  36. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  37. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  38. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  39. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  40. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  44. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  45. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  46. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  47. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  48. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  49. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  50. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  51. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  52. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  53. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  54. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  55. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  56. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  57. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  58. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  59. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  60. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  61. package/dist/client/assets/index-CE_Na97I.js +75 -0
  62. package/dist/client/assets/index-CE_Na97I.js.map +1 -0
  63. package/dist/client/assets/index-QP95zkpd.css +1 -0
  64. package/dist/client/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  65. package/dist/client/assets/vendor-codemirror-CD3uCqRj.js +48 -0
  66. package/dist/client/assets/vendor-codemirror-CD3uCqRj.js.map +1 -0
  67. package/dist/client/assets/vendor-icons-W8thHNMl.js +2 -0
  68. package/dist/client/assets/vendor-icons-W8thHNMl.js.map +1 -0
  69. package/dist/client/assets/vendor-katex-4z5K3dyr.js +260 -0
  70. package/dist/client/assets/vendor-katex-4z5K3dyr.js.map +1 -0
  71. package/dist/client/assets/vendor-katex-CYlHEDRF.css +1 -0
  72. package/dist/client/assets/vendor-markdown-BSzxNR_7.js +35 -0
  73. package/dist/client/assets/vendor-markdown-BSzxNR_7.js.map +1 -0
  74. package/dist/client/assets/vendor-prism-CQGp13s2.js +4 -0
  75. package/dist/client/assets/vendor-prism-CQGp13s2.js.map +1 -0
  76. package/dist/client/assets/vendor-xterm-BrP-ENHg.css +1 -0
  77. package/dist/client/assets/vendor-xterm-DXwh06H3.js +36 -0
  78. package/dist/client/assets/vendor-xterm-DXwh06H3.js.map +1 -0
  79. package/dist/client/index.html +23 -0
  80. package/dist/server/ask-user-question/envelope.d.ts +11 -0
  81. package/dist/server/ask-user-question/envelope.d.ts.map +1 -0
  82. package/dist/server/ask-user-question/envelope.js +41 -0
  83. package/dist/server/ask-user-question/envelope.js.map +1 -0
  84. package/dist/server/ask-user-question/plan-mode-question-tool.d.ts +26 -0
  85. package/dist/server/ask-user-question/plan-mode-question-tool.d.ts.map +1 -0
  86. package/dist/server/ask-user-question/plan-mode-question-tool.js +273 -0
  87. package/dist/server/ask-user-question/plan-mode-question-tool.js.map +1 -0
  88. package/dist/server/ask-user-question/prompt-strings.d.ts +4 -0
  89. package/dist/server/ask-user-question/prompt-strings.d.ts.map +1 -0
  90. package/dist/server/ask-user-question/prompt-strings.js +18 -0
  91. package/dist/server/ask-user-question/prompt-strings.js.map +1 -0
  92. package/dist/server/ask-user-question/registry.d.ts +39 -0
  93. package/dist/server/ask-user-question/registry.d.ts.map +1 -0
  94. package/dist/server/ask-user-question/registry.js +124 -0
  95. package/dist/server/ask-user-question/registry.js.map +1 -0
  96. package/dist/server/ask-user-question/tool.d.ts +4 -0
  97. package/dist/server/ask-user-question/tool.d.ts.map +1 -0
  98. package/dist/server/ask-user-question/tool.js +68 -0
  99. package/dist/server/ask-user-question/tool.js.map +1 -0
  100. package/dist/server/ask-user-question/types.d.ts +50 -0
  101. package/dist/server/ask-user-question/types.d.ts.map +1 -0
  102. package/dist/server/ask-user-question/types.js +7 -0
  103. package/dist/server/ask-user-question/types.js.map +1 -0
  104. package/dist/server/ask-user-question/validate.d.ts +3 -0
  105. package/dist/server/ask-user-question/validate.d.ts.map +1 -0
  106. package/dist/server/ask-user-question/validate.js +67 -0
  107. package/dist/server/ask-user-question/validate.js.map +1 -0
  108. package/dist/server/clone-provider.d.ts +55 -0
  109. package/dist/server/clone-provider.d.ts.map +1 -0
  110. package/dist/server/clone-provider.js +172 -0
  111. package/dist/server/clone-provider.js.map +1 -0
  112. package/dist/server/compaction-cards.d.ts +62 -0
  113. package/dist/server/compaction-cards.d.ts.map +1 -0
  114. package/dist/server/compaction-cards.js +180 -0
  115. package/dist/server/compaction-cards.js.map +1 -0
  116. package/dist/server/compaction-continuation.d.ts +112 -0
  117. package/dist/server/compaction-continuation.d.ts.map +1 -0
  118. package/dist/server/compaction-continuation.js +65 -0
  119. package/dist/server/compaction-continuation.js.map +1 -0
  120. package/dist/server/config-store.d.ts +97 -0
  121. package/dist/server/config-store.d.ts.map +1 -0
  122. package/dist/server/config-store.js +351 -0
  123. package/dist/server/config-store.js.map +1 -0
  124. package/dist/server/config.d.ts +24 -0
  125. package/dist/server/config.d.ts.map +1 -0
  126. package/dist/server/config.js +67 -0
  127. package/dist/server/config.js.map +1 -0
  128. package/dist/server/event-stream.d.ts +28 -0
  129. package/dist/server/event-stream.d.ts.map +1 -0
  130. package/dist/server/event-stream.js +153 -0
  131. package/dist/server/event-stream.js.map +1 -0
  132. package/dist/server/extension-manager.d.ts +116 -0
  133. package/dist/server/extension-manager.d.ts.map +1 -0
  134. package/dist/server/extension-manager.js +586 -0
  135. package/dist/server/extension-manager.js.map +1 -0
  136. package/dist/server/extension-scanner.d.ts +26 -0
  137. package/dist/server/extension-scanner.d.ts.map +1 -0
  138. package/dist/server/extension-scanner.js +107 -0
  139. package/dist/server/extension-scanner.js.map +1 -0
  140. package/dist/server/extension-ui-bridge.d.ts +35 -0
  141. package/dist/server/extension-ui-bridge.d.ts.map +1 -0
  142. package/dist/server/extension-ui-bridge.js +228 -0
  143. package/dist/server/extension-ui-bridge.js.map +1 -0
  144. package/dist/server/file-manager.d.ts +79 -0
  145. package/dist/server/file-manager.d.ts.map +1 -0
  146. package/dist/server/file-manager.js +535 -0
  147. package/dist/server/file-manager.js.map +1 -0
  148. package/dist/server/file-searcher.d.ts +29 -0
  149. package/dist/server/file-searcher.d.ts.map +1 -0
  150. package/dist/server/file-searcher.js +318 -0
  151. package/dist/server/file-searcher.js.map +1 -0
  152. package/dist/server/git-operations.d.ts +346 -0
  153. package/dist/server/git-operations.d.ts.map +1 -0
  154. package/dist/server/git-operations.js +884 -0
  155. package/dist/server/git-operations.js.map +1 -0
  156. package/dist/server/hunk-stager.d.ts +56 -0
  157. package/dist/server/hunk-stager.d.ts.map +1 -0
  158. package/dist/server/hunk-stager.js +137 -0
  159. package/dist/server/hunk-stager.js.map +1 -0
  160. package/dist/server/index.d.ts +21 -0
  161. package/dist/server/index.d.ts.map +1 -0
  162. package/dist/server/index.js +262 -0
  163. package/dist/server/index.js.map +1 -0
  164. package/dist/server/mcp/config.d.ts +23 -0
  165. package/dist/server/mcp/config.d.ts.map +1 -0
  166. package/dist/server/mcp/config.js +139 -0
  167. package/dist/server/mcp/config.js.map +1 -0
  168. package/dist/server/mcp/manager.d.ts +40 -0
  169. package/dist/server/mcp/manager.d.ts.map +1 -0
  170. package/dist/server/mcp/manager.js +435 -0
  171. package/dist/server/mcp/manager.js.map +1 -0
  172. package/dist/server/mcp/stdio-trust.d.ts +5 -0
  173. package/dist/server/mcp/stdio-trust.d.ts.map +1 -0
  174. package/dist/server/mcp/stdio-trust.js +78 -0
  175. package/dist/server/mcp/stdio-trust.js.map +1 -0
  176. package/dist/server/mcp/tool-bridge.d.ts +33 -0
  177. package/dist/server/mcp/tool-bridge.d.ts.map +1 -0
  178. package/dist/server/mcp/tool-bridge.js +138 -0
  179. package/dist/server/mcp/tool-bridge.js.map +1 -0
  180. package/dist/server/orchestration/config.d.ts +5 -0
  181. package/dist/server/orchestration/config.d.ts.map +1 -0
  182. package/dist/server/orchestration/config.js +35 -0
  183. package/dist/server/orchestration/config.js.map +1 -0
  184. package/dist/server/orchestration/event-bridge.d.ts +32 -0
  185. package/dist/server/orchestration/event-bridge.d.ts.map +1 -0
  186. package/dist/server/orchestration/event-bridge.js +110 -0
  187. package/dist/server/orchestration/event-bridge.js.map +1 -0
  188. package/dist/server/orchestration/inbox.d.ts +9 -0
  189. package/dist/server/orchestration/inbox.d.ts.map +1 -0
  190. package/dist/server/orchestration/inbox.js +186 -0
  191. package/dist/server/orchestration/inbox.js.map +1 -0
  192. package/dist/server/orchestration/init.d.ts +2 -0
  193. package/dist/server/orchestration/init.d.ts.map +1 -0
  194. package/dist/server/orchestration/init.js +22 -0
  195. package/dist/server/orchestration/init.js.map +1 -0
  196. package/dist/server/orchestration/store.d.ts +33 -0
  197. package/dist/server/orchestration/store.d.ts.map +1 -0
  198. package/dist/server/orchestration/store.js +331 -0
  199. package/dist/server/orchestration/store.js.map +1 -0
  200. package/dist/server/orchestration/tools.d.ts +15 -0
  201. package/dist/server/orchestration/tools.d.ts.map +1 -0
  202. package/dist/server/orchestration/tools.js +621 -0
  203. package/dist/server/orchestration/tools.js.map +1 -0
  204. package/dist/server/orchestration/types.d.ts +68 -0
  205. package/dist/server/orchestration/types.d.ts.map +1 -0
  206. package/dist/server/orchestration/types.js +43 -0
  207. package/dist/server/orchestration/types.js.map +1 -0
  208. package/dist/server/orchestration/worker-lifecycle.d.ts +15 -0
  209. package/dist/server/orchestration/worker-lifecycle.d.ts.map +1 -0
  210. package/dist/server/orchestration/worker-lifecycle.js +45 -0
  211. package/dist/server/orchestration/worker-lifecycle.js.map +1 -0
  212. package/dist/server/path-refs.d.ts +5 -0
  213. package/dist/server/path-refs.d.ts.map +1 -0
  214. package/dist/server/path-refs.js +249 -0
  215. package/dist/server/path-refs.js.map +1 -0
  216. package/dist/server/routes/_schemas.d.ts +16 -0
  217. package/dist/server/routes/_schemas.d.ts.map +1 -0
  218. package/dist/server/routes/_schemas.js +12 -0
  219. package/dist/server/routes/_schemas.js.map +1 -0
  220. package/dist/server/routes/ask-user-question.d.ts +3 -0
  221. package/dist/server/routes/ask-user-question.d.ts.map +1 -0
  222. package/dist/server/routes/ask-user-question.js +105 -0
  223. package/dist/server/routes/ask-user-question.js.map +1 -0
  224. package/dist/server/routes/auth.d.ts +8 -0
  225. package/dist/server/routes/auth.d.ts.map +1 -0
  226. package/dist/server/routes/auth.js +225 -0
  227. package/dist/server/routes/auth.js.map +1 -0
  228. package/dist/server/routes/config.d.ts +3 -0
  229. package/dist/server/routes/config.d.ts.map +1 -0
  230. package/dist/server/routes/config.js +602 -0
  231. package/dist/server/routes/config.js.map +1 -0
  232. package/dist/server/routes/control.d.ts +3 -0
  233. package/dist/server/routes/control.d.ts.map +1 -0
  234. package/dist/server/routes/control.js +365 -0
  235. package/dist/server/routes/control.js.map +1 -0
  236. package/dist/server/routes/exec.d.ts +3 -0
  237. package/dist/server/routes/exec.d.ts.map +1 -0
  238. package/dist/server/routes/exec.js +426 -0
  239. package/dist/server/routes/exec.js.map +1 -0
  240. package/dist/server/routes/extension-commands.d.ts +22 -0
  241. package/dist/server/routes/extension-commands.d.ts.map +1 -0
  242. package/dist/server/routes/extension-commands.js +178 -0
  243. package/dist/server/routes/extension-commands.js.map +1 -0
  244. package/dist/server/routes/extensions.d.ts +8 -0
  245. package/dist/server/routes/extensions.d.ts.map +1 -0
  246. package/dist/server/routes/extensions.js +414 -0
  247. package/dist/server/routes/extensions.js.map +1 -0
  248. package/dist/server/routes/files.d.ts +3 -0
  249. package/dist/server/routes/files.d.ts.map +1 -0
  250. package/dist/server/routes/files.js +835 -0
  251. package/dist/server/routes/files.js.map +1 -0
  252. package/dist/server/routes/git.d.ts +3 -0
  253. package/dist/server/routes/git.d.ts.map +1 -0
  254. package/dist/server/routes/git.js +1058 -0
  255. package/dist/server/routes/git.js.map +1 -0
  256. package/dist/server/routes/mcp.d.ts +3 -0
  257. package/dist/server/routes/mcp.d.ts.map +1 -0
  258. package/dist/server/routes/mcp.js +403 -0
  259. package/dist/server/routes/mcp.js.map +1 -0
  260. package/dist/server/routes/orchestration.d.ts +3 -0
  261. package/dist/server/routes/orchestration.d.ts.map +1 -0
  262. package/dist/server/routes/orchestration.js +251 -0
  263. package/dist/server/routes/orchestration.js.map +1 -0
  264. package/dist/server/routes/projects.d.ts +3 -0
  265. package/dist/server/routes/projects.d.ts.map +1 -0
  266. package/dist/server/routes/projects.js +421 -0
  267. package/dist/server/routes/projects.js.map +1 -0
  268. package/dist/server/routes/prompt.d.ts +3 -0
  269. package/dist/server/routes/prompt.d.ts.map +1 -0
  270. package/dist/server/routes/prompt.js +311 -0
  271. package/dist/server/routes/prompt.js.map +1 -0
  272. package/dist/server/routes/session-extensions.d.ts +11 -0
  273. package/dist/server/routes/session-extensions.d.ts.map +1 -0
  274. package/dist/server/routes/session-extensions.js +171 -0
  275. package/dist/server/routes/session-extensions.js.map +1 -0
  276. package/dist/server/routes/sessions.d.ts +3 -0
  277. package/dist/server/routes/sessions.d.ts.map +1 -0
  278. package/dist/server/routes/sessions.js +706 -0
  279. package/dist/server/routes/sessions.js.map +1 -0
  280. package/dist/server/routes/skills.d.ts +14 -0
  281. package/dist/server/routes/skills.d.ts.map +1 -0
  282. package/dist/server/routes/skills.js +448 -0
  283. package/dist/server/routes/skills.js.map +1 -0
  284. package/dist/server/routes/stream.d.ts +3 -0
  285. package/dist/server/routes/stream.d.ts.map +1 -0
  286. package/dist/server/routes/stream.js +112 -0
  287. package/dist/server/routes/stream.js.map +1 -0
  288. package/dist/server/routes/terminal.d.ts +28 -0
  289. package/dist/server/routes/terminal.d.ts.map +1 -0
  290. package/dist/server/routes/terminal.js +211 -0
  291. package/dist/server/routes/terminal.js.map +1 -0
  292. package/dist/server/routes/tunnel.d.ts +13 -0
  293. package/dist/server/routes/tunnel.d.ts.map +1 -0
  294. package/dist/server/routes/tunnel.js +231 -0
  295. package/dist/server/routes/tunnel.js.map +1 -0
  296. package/dist/server/session-alerts.d.ts +28 -0
  297. package/dist/server/session-alerts.d.ts.map +1 -0
  298. package/dist/server/session-alerts.js +38 -0
  299. package/dist/server/session-alerts.js.map +1 -0
  300. package/dist/server/session-store.d.ts +164 -0
  301. package/dist/server/session-store.d.ts.map +1 -0
  302. package/dist/server/session-store.js +754 -0
  303. package/dist/server/session-store.js.map +1 -0
  304. package/dist/server/skill-policy.d.ts +47 -0
  305. package/dist/server/skill-policy.d.ts.map +1 -0
  306. package/dist/server/skill-policy.js +178 -0
  307. package/dist/server/skill-policy.js.map +1 -0
  308. package/dist/server/terminal-provider.d.ts +54 -0
  309. package/dist/server/terminal-provider.d.ts.map +1 -0
  310. package/dist/server/terminal-provider.js +220 -0
  311. package/dist/server/terminal-provider.js.map +1 -0
  312. package/dist/server/tool-policy.d.ts +39 -0
  313. package/dist/server/tool-policy.d.ts.map +1 -0
  314. package/dist/server/tool-policy.js +121 -0
  315. package/dist/server/tool-policy.js.map +1 -0
  316. package/dist/server/tunnel/executable-search.d.ts +43 -0
  317. package/dist/server/tunnel/executable-search.d.ts.map +1 -0
  318. package/dist/server/tunnel/executable-search.js +148 -0
  319. package/dist/server/tunnel/executable-search.js.map +1 -0
  320. package/dist/server/tunnel/install-help.d.ts +19 -0
  321. package/dist/server/tunnel/install-help.d.ts.map +1 -0
  322. package/dist/server/tunnel/install-help.js +47 -0
  323. package/dist/server/tunnel/install-help.js.map +1 -0
  324. package/dist/server/tunnel/providers/ngrok.d.ts +31 -0
  325. package/dist/server/tunnel/providers/ngrok.d.ts.map +1 -0
  326. package/dist/server/tunnel/providers/ngrok.js +461 -0
  327. package/dist/server/tunnel/providers/ngrok.js.map +1 -0
  328. package/dist/server/tunnel/registry.d.ts +13 -0
  329. package/dist/server/tunnel/registry.d.ts.map +1 -0
  330. package/dist/server/tunnel/registry.js +56 -0
  331. package/dist/server/tunnel/registry.js.map +1 -0
  332. package/dist/server/tunnel/service.d.ts +13 -0
  333. package/dist/server/tunnel/service.d.ts.map +1 -0
  334. package/dist/server/tunnel/service.js +156 -0
  335. package/dist/server/tunnel/service.js.map +1 -0
  336. package/dist/server/tunnel/types.d.ts +163 -0
  337. package/dist/server/tunnel/types.d.ts.map +1 -0
  338. package/dist/server/tunnel/types.js +214 -0
  339. package/dist/server/tunnel/types.js.map +1 -0
  340. package/dist/server/ui-settings-store.d.ts +25 -0
  341. package/dist/server/ui-settings-store.d.ts.map +1 -0
  342. package/dist/server/ui-settings-store.js +91 -0
  343. package/dist/server/ui-settings-store.js.map +1 -0
  344. package/dist/server/workspace-store.d.ts +25 -0
  345. package/dist/server/workspace-store.d.ts.map +1 -0
  346. package/dist/server/workspace-store.js +157 -0
  347. package/dist/server/workspace-store.js.map +1 -0
  348. package/package.json +5 -3
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Ngrok tunnel provider — spawns ngrok as a child process, parses JSON-log
3
+ * output for the public URL, and manages the tunnel lifecycle.
4
+ */
5
+ import { spawn, spawnSync } from "node:child_process";
6
+ import { createExecutableSearchEnv, resolveExecutableLaunchTarget, } from "../executable-search.js";
7
+ import { getTunnelDependencyInstallInfo } from "../install-help.js";
8
+ import { TUNNEL_INTENT_EPHEMERAL_PUBLIC, TUNNEL_MODE_QUICK, TUNNEL_PROVIDER_NGROK, TunnelServiceError, } from "../types.js";
9
+ // ── Constants ─────────────────────────────────────────────────────────────
10
+ const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
11
+ const NGROK_API_URL = "http://127.0.0.1:4040/api/tunnels";
12
+ const NGROK_PUBLIC_URL_REGEX = /https:\/\/[^\s"']+/i;
13
+ const NGROK_AUTHTOKEN_HELP = "Run: ngrok config add-authtoken <your-ngrok-token>";
14
+ function getNgrokInstallInfo() {
15
+ return getTunnelDependencyInstallInfo(TUNNEL_PROVIDER_NGROK);
16
+ }
17
+ // ── Capabilities ──────────────────────────────────────────────────────────
18
+ export const ngrokTunnelProviderCapabilities = {
19
+ provider: TUNNEL_PROVIDER_NGROK,
20
+ defaults: {
21
+ mode: TUNNEL_MODE_QUICK,
22
+ optionDefaults: {},
23
+ },
24
+ modes: [
25
+ {
26
+ key: TUNNEL_MODE_QUICK,
27
+ label: "Quick Tunnel",
28
+ intent: TUNNEL_INTENT_EPHEMERAL_PUBLIC,
29
+ requires: [],
30
+ supports: ["sessionTTL"],
31
+ stability: "beta",
32
+ },
33
+ ],
34
+ };
35
+ // ── Dependency checks ─────────────────────────────────────────────────────
36
+ export async function checkNgrokAvailable() {
37
+ const target = resolveExecutableLaunchTarget("ngrok");
38
+ if (target) {
39
+ try {
40
+ const result = spawnSync(target.command, ["version"], {
41
+ encoding: "utf8",
42
+ stdio: ["pipe", "pipe", "pipe"],
43
+ windowsHide: true,
44
+ env: target.env,
45
+ });
46
+ if (result.status === 0) {
47
+ const version = (result.stdout || result.stderr || "").trim();
48
+ return {
49
+ available: true,
50
+ path: target.command,
51
+ version: (version || undefined) ?? null,
52
+ };
53
+ }
54
+ }
55
+ catch {
56
+ // Ignore and report unavailable below.
57
+ }
58
+ }
59
+ return { available: false, path: null, version: null };
60
+ }
61
+ export async function checkNgrokAuthtokenConfigured(ngrokPath = null) {
62
+ const authTokenEnv = process.env.NGROK_AUTHTOKEN;
63
+ if (typeof authTokenEnv === "string" && authTokenEnv.trim().length > 0) {
64
+ return { configured: true, detail: "NGROK_AUTHTOKEN is set." };
65
+ }
66
+ const target = ngrokPath
67
+ ? { command: ngrokPath, env: createExecutableSearchEnv() }
68
+ : resolveExecutableLaunchTarget("ngrok");
69
+ if (!target) {
70
+ return { configured: false, detail: getNgrokInstallInfo().message };
71
+ }
72
+ try {
73
+ const result = spawnSync(target.command, ["config", "check"], {
74
+ encoding: "utf8",
75
+ stdio: ["pipe", "pipe", "pipe"],
76
+ windowsHide: true,
77
+ env: target.env,
78
+ });
79
+ const output = `${result.stdout || ""}${result.stderr || ""}`.trim();
80
+ if (result.status === 0) {
81
+ return { configured: true, detail: output || "ngrok config is valid." };
82
+ }
83
+ return { configured: false, detail: output || NGROK_AUTHTOKEN_HELP };
84
+ }
85
+ catch (error) {
86
+ return {
87
+ configured: false,
88
+ detail: error instanceof Error ? error.message : String(error),
89
+ };
90
+ }
91
+ }
92
+ export async function checkNgrokApiReachability(options = {}) {
93
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
94
+ const timeoutMs = options.timeoutMs ?? 5000;
95
+ if (typeof fetchImpl !== "function") {
96
+ return { reachable: false, status: null, error: "Fetch API is unavailable in this runtime." };
97
+ }
98
+ const controller = new AbortController();
99
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
100
+ try {
101
+ const response = await fetchImpl("https://api.ngrok.com/", {
102
+ method: "GET",
103
+ signal: controller.signal,
104
+ });
105
+ return { reachable: true, status: response.status, error: null };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ reachable: false,
110
+ status: null,
111
+ error: error instanceof Error ? error.message : String(error),
112
+ };
113
+ }
114
+ finally {
115
+ clearTimeout(timeout);
116
+ }
117
+ }
118
+ // ── URL extraction ────────────────────────────────────────────────────────
119
+ function normalizeNgrokPublicUrl(value) {
120
+ if (typeof value !== "string" || value.trim().length === 0) {
121
+ return null;
122
+ }
123
+ const trimmed = value.trim();
124
+ try {
125
+ const parsed = new URL(trimmed);
126
+ if (parsed.protocol === "https:" && parsed.hostname.includes("ngrok")) {
127
+ return parsed.toString().replace(/\/$/, "");
128
+ }
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ return null;
134
+ }
135
+ export function extractNgrokPublicUrlFromText(text) {
136
+ if (typeof text !== "string" || text.trim().length === 0) {
137
+ return null;
138
+ }
139
+ const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
140
+ for (const line of lines) {
141
+ // Try JSON parse (ngrok --log-format=json)
142
+ try {
143
+ const parsed = JSON.parse(line);
144
+ const parsedUrl = normalizeNgrokPublicUrl(parsed?.url) ??
145
+ normalizeNgrokPublicUrl(parsed?.public_url);
146
+ if (parsedUrl) {
147
+ return parsedUrl;
148
+ }
149
+ }
150
+ catch {
151
+ // ngrok may emit non-JSON diagnostics even when log-format=json.
152
+ }
153
+ // Fallback: regex scan
154
+ const match = line.match(NGROK_PUBLIC_URL_REGEX);
155
+ const matchedUrl = normalizeNgrokPublicUrl(match?.[0] ?? "");
156
+ if (matchedUrl) {
157
+ return matchedUrl;
158
+ }
159
+ }
160
+ return null;
161
+ }
162
+ // ── Output summarization ──────────────────────────────────────────────────
163
+ function normalizeNgrokDiagnosticText(value) {
164
+ if (typeof value !== "string") {
165
+ return "";
166
+ }
167
+ return value
168
+ .replace(/\r/g, "")
169
+ .split("\n")
170
+ .map((line) => line.trim())
171
+ .filter(Boolean)
172
+ .join(" ")
173
+ .replace(/\s+/g, " ")
174
+ .trim();
175
+ }
176
+ export function summarizeNgrokOutput(lines) {
177
+ const nonEmptyLines = Array.isArray(lines)
178
+ ? lines.map((line) => String(line || "").trim()).filter(Boolean)
179
+ : [];
180
+ if (nonEmptyLines.length === 0) {
181
+ return "";
182
+ }
183
+ // Scan for error-level JSON lines first
184
+ for (const line of [...nonEmptyLines].reverse()) {
185
+ try {
186
+ const parsed = JSON.parse(line);
187
+ const level = typeof parsed?.lvl === "string" ? parsed.lvl.toLowerCase() : "";
188
+ if (level !== "eror" && level !== "error" && level !== "crit") {
189
+ continue;
190
+ }
191
+ const err = normalizeNgrokDiagnosticText(parsed?.err);
192
+ if (err && err !== "<nil>") {
193
+ return err;
194
+ }
195
+ }
196
+ catch {
197
+ // Not a JSON ngrok log line.
198
+ }
199
+ }
200
+ // Scan for any JSON line with a meaningful error
201
+ for (const line of [...nonEmptyLines].reverse()) {
202
+ try {
203
+ const parsed = JSON.parse(line);
204
+ const err = normalizeNgrokDiagnosticText(parsed?.err);
205
+ if (err && err !== "<nil>" && !/context canceled/i.test(err)) {
206
+ return err;
207
+ }
208
+ const msg = normalizeNgrokDiagnosticText(parsed?.msg);
209
+ if (msg && /failed|error|invalid|auth/i.test(msg)) {
210
+ return msg;
211
+ }
212
+ }
213
+ catch {
214
+ // Not a JSON ngrok log line.
215
+ }
216
+ }
217
+ // Fallback: scan for ERROR: prefix lines
218
+ const errorLines = nonEmptyLines
219
+ .filter((line) => /^ERROR:/i.test(line))
220
+ .map((line) => normalizeNgrokDiagnosticText(line.replace(/^ERROR:\s*/i, "")))
221
+ .filter(Boolean);
222
+ if (errorLines.length > 0) {
223
+ return errorLines.slice(0, 4).join(" ");
224
+ }
225
+ // Last resort: return the last non-empty line
226
+ const lastLine = [...nonEmptyLines].reverse().find((line) => line.trim().length > 0);
227
+ if (!lastLine) {
228
+ return "";
229
+ }
230
+ try {
231
+ const parsed = JSON.parse(lastLine);
232
+ if (typeof parsed?.err === "string" && parsed.err.trim().length > 0) {
233
+ return normalizeNgrokDiagnosticText(parsed.err);
234
+ }
235
+ if (typeof parsed?.msg === "string" && parsed.msg.trim().length > 0) {
236
+ return normalizeNgrokDiagnosticText(parsed.msg);
237
+ }
238
+ }
239
+ catch {
240
+ // Fall through to plain text.
241
+ }
242
+ return normalizeNgrokDiagnosticText(lastLine);
243
+ }
244
+ function appendNgrokOutputSummary(message, lines) {
245
+ const summary = summarizeNgrokOutput(lines);
246
+ return summary ? `${message}: ${summary}` : message;
247
+ }
248
+ // ── API-based URL fetch ───────────────────────────────────────────────────
249
+ async function fetchNgrokPublicUrl(fetchImpl = globalThis.fetch) {
250
+ if (typeof fetchImpl !== "function") {
251
+ return null;
252
+ }
253
+ try {
254
+ const response = await fetchImpl(NGROK_API_URL, { method: "GET" });
255
+ if (!response.ok) {
256
+ return null;
257
+ }
258
+ const payload = (await response.json());
259
+ const tunnels = Array.isArray(payload?.tunnels) ? payload.tunnels : [];
260
+ const httpsTunnel = tunnels.find((entry) => entry?.proto === "https" && normalizeNgrokPublicUrl(entry?.public_url ?? ""));
261
+ const fallbackTunnel = tunnels.find((entry) => normalizeNgrokPublicUrl(entry?.public_url ?? ""));
262
+ return (normalizeNgrokPublicUrl(httpsTunnel?.public_url ?? "") ??
263
+ normalizeNgrokPublicUrl(fallbackTunnel?.public_url ?? ""));
264
+ }
265
+ catch {
266
+ return null;
267
+ }
268
+ }
269
+ // ── Tunnel starter ────────────────────────────────────────────────────────
270
+ function spawnNgrok(args, resolvedBinaryPath = "ngrok") {
271
+ return spawn(resolvedBinaryPath, args, {
272
+ stdio: ["ignore", "pipe", "pipe"],
273
+ windowsHide: true,
274
+ env: createExecutableSearchEnv(),
275
+ killSignal: "SIGINT",
276
+ });
277
+ }
278
+ export async function startNgrokQuickTunnel(params) {
279
+ const ngrokCheck = await checkNgrokAvailable();
280
+ if (!ngrokCheck.available) {
281
+ throw new Error(getNgrokInstallInfo().message);
282
+ }
283
+ const authtokenCheck = await checkNgrokAuthtokenConfigured(ngrokCheck.path);
284
+ if (!authtokenCheck.configured) {
285
+ throw new Error(`ngrok authtoken is not configured. ${authtokenCheck.detail || NGROK_AUTHTOKEN_HELP}`);
286
+ }
287
+ if (!Number.isFinite(params.port)) {
288
+ throw new Error("A local port is required to start an ngrok tunnel");
289
+ }
290
+ const child = spawnNgrok(["http", "--log=stdout", "--log-format=json", `127.0.0.1:${params.port}`], ngrokCheck.path ?? undefined);
291
+ let publicUrl = null;
292
+ const recentOutput = [];
293
+ const captureOutput = (chunk) => {
294
+ const text = chunk.toString("utf8");
295
+ const parsedUrl = extractNgrokPublicUrlFromText(text);
296
+ if (parsedUrl) {
297
+ publicUrl = parsedUrl;
298
+ }
299
+ for (const line of text.split(/\r?\n/)) {
300
+ const trimmed = line.trim();
301
+ if (!trimmed) {
302
+ continue;
303
+ }
304
+ recentOutput.push(trimmed);
305
+ if (recentOutput.length > 200) {
306
+ recentOutput.shift();
307
+ }
308
+ }
309
+ return text;
310
+ };
311
+ child.stdout?.on("data", (chunk) => {
312
+ captureOutput(chunk);
313
+ });
314
+ child.stderr?.on("data", (chunk) => {
315
+ const text = captureOutput(chunk);
316
+ process.stderr.write(text);
317
+ });
318
+ await new Promise((resolve, reject) => {
319
+ let settled = false;
320
+ const finish = (handler, value) => {
321
+ if (settled)
322
+ return;
323
+ settled = true;
324
+ clearTimeout(timeout);
325
+ clearInterval(checkReady);
326
+ child.off("error", onError);
327
+ child.off("exit", onExit);
328
+ handler(value);
329
+ };
330
+ const timeout = setTimeout(() => {
331
+ try {
332
+ child.kill("SIGINT");
333
+ }
334
+ catch { /* ignore */ }
335
+ finish(reject, new Error(appendNgrokOutputSummary("Ngrok tunnel URL not received within 30 seconds", recentOutput)));
336
+ }, DEFAULT_STARTUP_TIMEOUT_MS);
337
+ const checkReady = setInterval(async () => {
338
+ publicUrl = publicUrl || (await fetchNgrokPublicUrl());
339
+ if (publicUrl) {
340
+ finish(resolve, undefined);
341
+ }
342
+ }, 250);
343
+ const onError = (error) => {
344
+ finish(reject, new Error(`Ngrok failed to start: ${error.message}`));
345
+ };
346
+ const onExit = (code) => {
347
+ finish(reject, new Error(appendNgrokOutputSummary(`Ngrok exited while starting (code ${code ?? "unknown"})`, recentOutput)));
348
+ };
349
+ child.once("error", onError);
350
+ child.once("exit", onExit);
351
+ });
352
+ return {
353
+ mode: TUNNEL_MODE_QUICK,
354
+ provider: TUNNEL_PROVIDER_NGROK,
355
+ process: child,
356
+ stop: () => {
357
+ try {
358
+ child.kill("SIGINT");
359
+ }
360
+ catch {
361
+ // Ignore.
362
+ }
363
+ },
364
+ getPublicUrl: () => publicUrl,
365
+ };
366
+ }
367
+ // ── Standalone diagnose (used by routes without creating a provider instance) ──
368
+ export async function diagnoseNgrok() {
369
+ const dependency = await checkNgrokAvailable();
370
+ const authtoken = await checkNgrokAuthtokenConfigured(dependency.path);
371
+ const network = await checkNgrokApiReachability();
372
+ const installInfo = getTunnelDependencyInstallInfo(TUNNEL_PROVIDER_NGROK);
373
+ const startupReady = dependency.available && authtoken.configured && network.reachable;
374
+ const providerChecks = [
375
+ {
376
+ id: "dependency",
377
+ label: "ngrok installed",
378
+ status: dependency.available ? "pass" : "fail",
379
+ detail: dependency.available
380
+ ? (dependency.version || dependency.path || "ngrok available")
381
+ : installInfo.message,
382
+ },
383
+ {
384
+ id: "authtoken",
385
+ label: "ngrok authtoken configured",
386
+ status: authtoken.configured ? "pass" : "fail",
387
+ detail: authtoken.configured
388
+ ? authtoken.detail
389
+ : (authtoken.detail || "Run: ngrok config add-authtoken <your-ngrok-token>"),
390
+ },
391
+ {
392
+ id: "network",
393
+ label: "ngrok API reachable",
394
+ status: network.reachable ? "pass" : "fail",
395
+ detail: network.reachable
396
+ ? (network.status ? `HTTP ${network.status}` : "Reachable")
397
+ : (network.error || "Could not reach api.ngrok.com"),
398
+ },
399
+ ];
400
+ return {
401
+ providerChecks,
402
+ modes: [
403
+ {
404
+ mode: TUNNEL_MODE_QUICK,
405
+ checks: [
406
+ {
407
+ id: "startup_readiness",
408
+ label: "Provider startup readiness",
409
+ status: startupReady ? "pass" : "fail",
410
+ detail: startupReady
411
+ ? "Provider dependency, auth, and network checks passed."
412
+ : "Resolve provider checks before starting tunnels.",
413
+ },
414
+ ],
415
+ summary: {
416
+ ready: startupReady,
417
+ failures: startupReady ? 0 : 1,
418
+ warnings: 0,
419
+ },
420
+ ready: startupReady,
421
+ blockers: startupReady ? [] : ["Resolve provider checks before starting tunnels."],
422
+ },
423
+ ],
424
+ };
425
+ }
426
+ // ── Provider factory ──────────────────────────────────────────────────────
427
+ export function createNgrokTunnelProvider() {
428
+ return {
429
+ id: TUNNEL_PROVIDER_NGROK,
430
+ capabilities: ngrokTunnelProviderCapabilities,
431
+ checkAvailability: async () => {
432
+ const result = await checkNgrokAvailable();
433
+ if (result.available) {
434
+ return {
435
+ ...result,
436
+ ...getTunnelDependencyInstallInfo(TUNNEL_PROVIDER_NGROK),
437
+ };
438
+ }
439
+ const installInfo = getTunnelDependencyInstallInfo(TUNNEL_PROVIDER_NGROK);
440
+ return {
441
+ ...result,
442
+ ...installInfo,
443
+ };
444
+ },
445
+ diagnose: async (_request) => {
446
+ return diagnoseNgrok();
447
+ },
448
+ start: async (request, context) => {
449
+ if (request.mode !== TUNNEL_MODE_QUICK) {
450
+ throw new TunnelServiceError("mode_unsupported", `Ngrok only supports '${TUNNEL_MODE_QUICK}' mode right now`);
451
+ }
452
+ return startNgrokQuickTunnel({ port: context.activePort ?? 0 });
453
+ },
454
+ stop: (controller) => {
455
+ controller?.stop?.();
456
+ },
457
+ resolvePublicUrl: (controller) => controller?.getPublicUrl?.() ?? null,
458
+ getMetadata: () => null,
459
+ };
460
+ }
461
+ //# sourceMappingURL=ngrok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrok.js","sourceRoot":"","sources":["../../../src/tunnel/providers/ngrok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tunnel provider registry — a sealable Map-based registry that validates
3
+ * required methods on registration.
4
+ */
5
+ import type { TunnelProvider, TunnelProviderRegistry } from "./types.js";
6
+ /**
7
+ * Create a sealable tunnel provider registry.
8
+ *
9
+ * @param initialProviders - Optional array of providers to register immediately.
10
+ * @returns A registry with register, get, list, listCapabilities, and seal.
11
+ */
12
+ export declare function createTunnelProviderRegistry(initialProviders?: TunnelProvider[]): TunnelProviderRegistry;
13
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tunnel/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA8B,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIrG;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,gBAAgB,GAAE,cAAc,EAAO,GACtC,sBAAsB,CAmDxB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Tunnel provider registry — a sealable Map-based registry that validates
3
+ * required methods on registration.
4
+ */
5
+ const REQUIRED_PROVIDER_METHODS = ["start", "stop", "checkAvailability", "resolvePublicUrl"];
6
+ /**
7
+ * Create a sealable tunnel provider registry.
8
+ *
9
+ * @param initialProviders - Optional array of providers to register immediately.
10
+ * @returns A registry with register, get, list, listCapabilities, and seal.
11
+ */
12
+ export function createTunnelProviderRegistry(initialProviders = []) {
13
+ const providers = new Map();
14
+ let sealed = false;
15
+ const register = (provider) => {
16
+ if (sealed) {
17
+ throw new Error("Tunnel provider registry is sealed; no further registrations allowed");
18
+ }
19
+ if (!provider || typeof provider.id !== "string" || provider.id.trim().length === 0) {
20
+ throw new Error("Tunnel provider must define a non-empty id");
21
+ }
22
+ for (const method of REQUIRED_PROVIDER_METHODS) {
23
+ if (typeof provider[method] !== "function") {
24
+ throw new Error(`Tunnel provider '${provider.id}' must implement ${method}()`);
25
+ }
26
+ }
27
+ const key = provider.id.trim().toLowerCase();
28
+ if (providers.has(key)) {
29
+ throw new Error(`Tunnel provider '${key}' is already registered`);
30
+ }
31
+ providers.set(key, provider);
32
+ return provider;
33
+ };
34
+ const get = (providerId) => {
35
+ if (typeof providerId !== "string" || providerId.trim().length === 0) {
36
+ return null;
37
+ }
38
+ return providers.get(providerId.trim().toLowerCase()) ?? null;
39
+ };
40
+ const list = () => Array.from(providers.values());
41
+ const listCapabilities = () => list().map((provider) => ({ ...provider.capabilities }));
42
+ for (const provider of initialProviders) {
43
+ register(provider);
44
+ }
45
+ const seal = () => {
46
+ sealed = true;
47
+ };
48
+ return {
49
+ register,
50
+ get,
51
+ list,
52
+ listCapabilities,
53
+ seal,
54
+ };
55
+ }
56
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tunnel/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,yBAAyB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,CAAU,CAAC;AAEtG;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,gBAAgB,GAAqB,EAAE;IAEvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,QAAQ,GAAG,CAAC,QAAwB,EAAkB,EAAE;QAC5D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,yBAAyB,EAAE,CAAC;YAC/C,IAAI,OAAQ,QAA+C,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;gBACnF,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,EAAE,oBAAoB,MAAM,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,yBAAyB,CAAC,CAAC;QACpE,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,UAAkB,EAAyB,EAAE;QACxD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;IAChE,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAqB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,GAAiC,EAAE,CAC1D,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAE3D,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,GAAG;QACH,IAAI;QACJ,gBAAgB;QAChB,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tunnel service — orchestrates tunnel provider lifecycle with a start mutex
3
+ * to prevent concurrent starts from orphaning child processes.
4
+ */
5
+ import { type TunnelService, type TunnelServiceDeps } from "./types.js";
6
+ /**
7
+ * Create the tunnel service.
8
+ *
9
+ * @param deps - Service dependencies (registry, controller accessors, port, warning callback).
10
+ * @returns A TunnelService with start, stop, checkAvailability, getPublicUrl, etc.
11
+ */
12
+ export declare function createTunnelService(deps: TunnelServiceDeps): TunnelService;
13
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tunnel/service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAIvB,MAAM,YAAY,CAAC;AAGpB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAyL1E"}