pi-kot 0.1.19 → 0.1.21

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