pi-kot 0.1.21 → 0.1.22

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/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  3. package/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  4. package/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  5. package/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  6. package/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  7. package/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  8. package/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  9. package/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  10. package/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  11. package/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  12. package/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  13. package/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  14. package/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  15. package/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  16. package/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  17. package/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  18. package/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  19. package/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  20. package/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  21. package/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  22. package/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  23. package/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  24. package/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  25. package/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  26. package/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  27. package/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  28. package/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  29. package/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  30. package/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  31. package/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  32. package/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  33. package/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  34. package/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  35. package/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  36. package/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  37. package/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  38. package/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  39. package/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  40. package/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  41. package/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  42. package/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  43. package/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  44. package/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  45. package/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  46. package/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  47. package/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  48. package/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  49. package/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  50. package/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  51. package/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  52. package/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  53. package/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  54. package/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  55. package/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  56. package/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  57. package/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  58. package/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  59. package/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  60. package/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  61. package/client/assets/index-CE_Na97I.js +75 -0
  62. package/client/assets/index-CE_Na97I.js.map +1 -0
  63. package/client/assets/index-QP95zkpd.css +1 -0
  64. package/client/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  65. package/client/assets/vendor-codemirror-CD3uCqRj.js +48 -0
  66. package/client/assets/vendor-codemirror-CD3uCqRj.js.map +1 -0
  67. package/client/assets/vendor-icons-W8thHNMl.js +2 -0
  68. package/client/assets/vendor-icons-W8thHNMl.js.map +1 -0
  69. package/client/assets/vendor-katex-4z5K3dyr.js +260 -0
  70. package/client/assets/vendor-katex-4z5K3dyr.js.map +1 -0
  71. package/client/assets/vendor-katex-CYlHEDRF.css +1 -0
  72. package/client/assets/vendor-markdown-BSzxNR_7.js +35 -0
  73. package/client/assets/vendor-markdown-BSzxNR_7.js.map +1 -0
  74. package/client/assets/vendor-prism-CQGp13s2.js +4 -0
  75. package/client/assets/vendor-prism-CQGp13s2.js.map +1 -0
  76. package/client/assets/vendor-xterm-BrP-ENHg.css +1 -0
  77. package/client/assets/vendor-xterm-DXwh06H3.js +36 -0
  78. package/client/assets/vendor-xterm-DXwh06H3.js.map +1 -0
  79. package/client/index.html +23 -0
  80. package/package.json +5 -3
  81. package/server/ask-user-question/envelope.d.ts +11 -0
  82. package/server/ask-user-question/envelope.d.ts.map +1 -0
  83. package/server/ask-user-question/envelope.js +41 -0
  84. package/server/ask-user-question/envelope.js.map +1 -0
  85. package/server/ask-user-question/plan-mode-question-tool.d.ts +26 -0
  86. package/server/ask-user-question/plan-mode-question-tool.d.ts.map +1 -0
  87. package/server/ask-user-question/plan-mode-question-tool.js +273 -0
  88. package/server/ask-user-question/plan-mode-question-tool.js.map +1 -0
  89. package/server/ask-user-question/prompt-strings.d.ts +4 -0
  90. package/server/ask-user-question/prompt-strings.d.ts.map +1 -0
  91. package/server/ask-user-question/prompt-strings.js +18 -0
  92. package/server/ask-user-question/prompt-strings.js.map +1 -0
  93. package/server/ask-user-question/registry.d.ts +39 -0
  94. package/server/ask-user-question/registry.d.ts.map +1 -0
  95. package/server/ask-user-question/registry.js +124 -0
  96. package/server/ask-user-question/registry.js.map +1 -0
  97. package/server/ask-user-question/tool.d.ts +4 -0
  98. package/server/ask-user-question/tool.d.ts.map +1 -0
  99. package/server/ask-user-question/tool.js +68 -0
  100. package/server/ask-user-question/tool.js.map +1 -0
  101. package/server/ask-user-question/types.d.ts +50 -0
  102. package/server/ask-user-question/types.d.ts.map +1 -0
  103. package/server/ask-user-question/types.js +7 -0
  104. package/server/ask-user-question/types.js.map +1 -0
  105. package/server/ask-user-question/validate.d.ts +3 -0
  106. package/server/ask-user-question/validate.d.ts.map +1 -0
  107. package/server/ask-user-question/validate.js +67 -0
  108. package/server/ask-user-question/validate.js.map +1 -0
  109. package/server/clone-provider.d.ts +55 -0
  110. package/server/clone-provider.d.ts.map +1 -0
  111. package/server/clone-provider.js +172 -0
  112. package/server/clone-provider.js.map +1 -0
  113. package/server/compaction-cards.d.ts +62 -0
  114. package/server/compaction-cards.d.ts.map +1 -0
  115. package/server/compaction-cards.js +180 -0
  116. package/server/compaction-cards.js.map +1 -0
  117. package/server/compaction-continuation.d.ts +112 -0
  118. package/server/compaction-continuation.d.ts.map +1 -0
  119. package/server/compaction-continuation.js +65 -0
  120. package/server/compaction-continuation.js.map +1 -0
  121. package/server/config-store.d.ts +97 -0
  122. package/server/config-store.d.ts.map +1 -0
  123. package/server/config-store.js +351 -0
  124. package/server/config-store.js.map +1 -0
  125. package/server/config.d.ts +24 -0
  126. package/server/config.d.ts.map +1 -0
  127. package/server/config.js +67 -0
  128. package/server/config.js.map +1 -0
  129. package/server/event-stream.d.ts +28 -0
  130. package/server/event-stream.d.ts.map +1 -0
  131. package/server/event-stream.js +153 -0
  132. package/server/event-stream.js.map +1 -0
  133. package/server/extension-manager.d.ts +116 -0
  134. package/server/extension-manager.d.ts.map +1 -0
  135. package/server/extension-manager.js +586 -0
  136. package/server/extension-manager.js.map +1 -0
  137. package/server/extension-scanner.d.ts +26 -0
  138. package/server/extension-scanner.d.ts.map +1 -0
  139. package/server/extension-scanner.js +107 -0
  140. package/server/extension-scanner.js.map +1 -0
  141. package/server/extension-ui-bridge.d.ts +35 -0
  142. package/server/extension-ui-bridge.d.ts.map +1 -0
  143. package/server/extension-ui-bridge.js +228 -0
  144. package/server/extension-ui-bridge.js.map +1 -0
  145. package/server/file-manager.d.ts +79 -0
  146. package/server/file-manager.d.ts.map +1 -0
  147. package/server/file-manager.js +535 -0
  148. package/server/file-manager.js.map +1 -0
  149. package/server/file-searcher.d.ts +29 -0
  150. package/server/file-searcher.d.ts.map +1 -0
  151. package/server/file-searcher.js +318 -0
  152. package/server/file-searcher.js.map +1 -0
  153. package/server/git-operations.d.ts +346 -0
  154. package/server/git-operations.d.ts.map +1 -0
  155. package/server/git-operations.js +884 -0
  156. package/server/git-operations.js.map +1 -0
  157. package/server/hunk-stager.d.ts +56 -0
  158. package/server/hunk-stager.d.ts.map +1 -0
  159. package/server/hunk-stager.js +137 -0
  160. package/server/hunk-stager.js.map +1 -0
  161. package/server/index.d.ts +21 -0
  162. package/server/index.d.ts.map +1 -0
  163. package/server/index.js +262 -0
  164. package/server/index.js.map +1 -0
  165. package/server/mcp/config.d.ts +23 -0
  166. package/server/mcp/config.d.ts.map +1 -0
  167. package/server/mcp/config.js +139 -0
  168. package/server/mcp/config.js.map +1 -0
  169. package/server/mcp/manager.d.ts +40 -0
  170. package/server/mcp/manager.d.ts.map +1 -0
  171. package/server/mcp/manager.js +435 -0
  172. package/server/mcp/manager.js.map +1 -0
  173. package/server/mcp/stdio-trust.d.ts +5 -0
  174. package/server/mcp/stdio-trust.d.ts.map +1 -0
  175. package/server/mcp/stdio-trust.js +78 -0
  176. package/server/mcp/stdio-trust.js.map +1 -0
  177. package/server/mcp/tool-bridge.d.ts +33 -0
  178. package/server/mcp/tool-bridge.d.ts.map +1 -0
  179. package/server/mcp/tool-bridge.js +138 -0
  180. package/server/mcp/tool-bridge.js.map +1 -0
  181. package/server/orchestration/config.d.ts +5 -0
  182. package/server/orchestration/config.d.ts.map +1 -0
  183. package/server/orchestration/config.js +35 -0
  184. package/server/orchestration/config.js.map +1 -0
  185. package/server/orchestration/event-bridge.d.ts +32 -0
  186. package/server/orchestration/event-bridge.d.ts.map +1 -0
  187. package/server/orchestration/event-bridge.js +110 -0
  188. package/server/orchestration/event-bridge.js.map +1 -0
  189. package/server/orchestration/inbox.d.ts +9 -0
  190. package/server/orchestration/inbox.d.ts.map +1 -0
  191. package/server/orchestration/inbox.js +186 -0
  192. package/server/orchestration/inbox.js.map +1 -0
  193. package/server/orchestration/init.d.ts +2 -0
  194. package/server/orchestration/init.d.ts.map +1 -0
  195. package/server/orchestration/init.js +22 -0
  196. package/server/orchestration/init.js.map +1 -0
  197. package/server/orchestration/store.d.ts +33 -0
  198. package/server/orchestration/store.d.ts.map +1 -0
  199. package/server/orchestration/store.js +331 -0
  200. package/server/orchestration/store.js.map +1 -0
  201. package/server/orchestration/tools.d.ts +15 -0
  202. package/server/orchestration/tools.d.ts.map +1 -0
  203. package/server/orchestration/tools.js +621 -0
  204. package/server/orchestration/tools.js.map +1 -0
  205. package/server/orchestration/types.d.ts +68 -0
  206. package/server/orchestration/types.d.ts.map +1 -0
  207. package/server/orchestration/types.js +43 -0
  208. package/server/orchestration/types.js.map +1 -0
  209. package/server/orchestration/worker-lifecycle.d.ts +15 -0
  210. package/server/orchestration/worker-lifecycle.d.ts.map +1 -0
  211. package/server/orchestration/worker-lifecycle.js +45 -0
  212. package/server/orchestration/worker-lifecycle.js.map +1 -0
  213. package/server/path-refs.d.ts +5 -0
  214. package/server/path-refs.d.ts.map +1 -0
  215. package/server/path-refs.js +249 -0
  216. package/server/path-refs.js.map +1 -0
  217. package/server/routes/_schemas.d.ts +16 -0
  218. package/server/routes/_schemas.d.ts.map +1 -0
  219. package/server/routes/_schemas.js +12 -0
  220. package/server/routes/_schemas.js.map +1 -0
  221. package/server/routes/ask-user-question.d.ts +3 -0
  222. package/server/routes/ask-user-question.d.ts.map +1 -0
  223. package/server/routes/ask-user-question.js +105 -0
  224. package/server/routes/ask-user-question.js.map +1 -0
  225. package/server/routes/auth.d.ts +8 -0
  226. package/server/routes/auth.d.ts.map +1 -0
  227. package/server/routes/auth.js +225 -0
  228. package/server/routes/auth.js.map +1 -0
  229. package/server/routes/config.d.ts +3 -0
  230. package/server/routes/config.d.ts.map +1 -0
  231. package/server/routes/config.js +602 -0
  232. package/server/routes/config.js.map +1 -0
  233. package/server/routes/control.d.ts +3 -0
  234. package/server/routes/control.d.ts.map +1 -0
  235. package/server/routes/control.js +365 -0
  236. package/server/routes/control.js.map +1 -0
  237. package/server/routes/exec.d.ts +3 -0
  238. package/server/routes/exec.d.ts.map +1 -0
  239. package/server/routes/exec.js +426 -0
  240. package/server/routes/exec.js.map +1 -0
  241. package/server/routes/extension-commands.d.ts +22 -0
  242. package/server/routes/extension-commands.d.ts.map +1 -0
  243. package/server/routes/extension-commands.js +178 -0
  244. package/server/routes/extension-commands.js.map +1 -0
  245. package/server/routes/extensions.d.ts +8 -0
  246. package/server/routes/extensions.d.ts.map +1 -0
  247. package/server/routes/extensions.js +414 -0
  248. package/server/routes/extensions.js.map +1 -0
  249. package/server/routes/files.d.ts +3 -0
  250. package/server/routes/files.d.ts.map +1 -0
  251. package/server/routes/files.js +835 -0
  252. package/server/routes/files.js.map +1 -0
  253. package/server/routes/git.d.ts +3 -0
  254. package/server/routes/git.d.ts.map +1 -0
  255. package/server/routes/git.js +1058 -0
  256. package/server/routes/git.js.map +1 -0
  257. package/server/routes/mcp.d.ts +3 -0
  258. package/server/routes/mcp.d.ts.map +1 -0
  259. package/server/routes/mcp.js +403 -0
  260. package/server/routes/mcp.js.map +1 -0
  261. package/server/routes/orchestration.d.ts +3 -0
  262. package/server/routes/orchestration.d.ts.map +1 -0
  263. package/server/routes/orchestration.js +251 -0
  264. package/server/routes/orchestration.js.map +1 -0
  265. package/server/routes/projects.d.ts +3 -0
  266. package/server/routes/projects.d.ts.map +1 -0
  267. package/server/routes/projects.js +421 -0
  268. package/server/routes/projects.js.map +1 -0
  269. package/server/routes/prompt.d.ts +3 -0
  270. package/server/routes/prompt.d.ts.map +1 -0
  271. package/server/routes/prompt.js +311 -0
  272. package/server/routes/prompt.js.map +1 -0
  273. package/server/routes/session-extensions.d.ts +11 -0
  274. package/server/routes/session-extensions.d.ts.map +1 -0
  275. package/server/routes/session-extensions.js +171 -0
  276. package/server/routes/session-extensions.js.map +1 -0
  277. package/server/routes/sessions.d.ts +3 -0
  278. package/server/routes/sessions.d.ts.map +1 -0
  279. package/server/routes/sessions.js +706 -0
  280. package/server/routes/sessions.js.map +1 -0
  281. package/server/routes/skills.d.ts +14 -0
  282. package/server/routes/skills.d.ts.map +1 -0
  283. package/server/routes/skills.js +448 -0
  284. package/server/routes/skills.js.map +1 -0
  285. package/server/routes/stream.d.ts +3 -0
  286. package/server/routes/stream.d.ts.map +1 -0
  287. package/server/routes/stream.js +112 -0
  288. package/server/routes/stream.js.map +1 -0
  289. package/server/routes/terminal.d.ts +28 -0
  290. package/server/routes/terminal.d.ts.map +1 -0
  291. package/server/routes/terminal.js +211 -0
  292. package/server/routes/terminal.js.map +1 -0
  293. package/server/routes/tunnel.d.ts +13 -0
  294. package/server/routes/tunnel.d.ts.map +1 -0
  295. package/server/routes/tunnel.js +231 -0
  296. package/server/routes/tunnel.js.map +1 -0
  297. package/server/session-alerts.d.ts +28 -0
  298. package/server/session-alerts.d.ts.map +1 -0
  299. package/server/session-alerts.js +38 -0
  300. package/server/session-alerts.js.map +1 -0
  301. package/server/session-store.d.ts +164 -0
  302. package/server/session-store.d.ts.map +1 -0
  303. package/server/session-store.js +754 -0
  304. package/server/session-store.js.map +1 -0
  305. package/server/skill-policy.d.ts +47 -0
  306. package/server/skill-policy.d.ts.map +1 -0
  307. package/server/skill-policy.js +178 -0
  308. package/server/skill-policy.js.map +1 -0
  309. package/server/terminal-provider.d.ts +54 -0
  310. package/server/terminal-provider.d.ts.map +1 -0
  311. package/server/terminal-provider.js +220 -0
  312. package/server/terminal-provider.js.map +1 -0
  313. package/server/tool-policy.d.ts +39 -0
  314. package/server/tool-policy.d.ts.map +1 -0
  315. package/server/tool-policy.js +121 -0
  316. package/server/tool-policy.js.map +1 -0
  317. package/server/tunnel/executable-search.d.ts +43 -0
  318. package/server/tunnel/executable-search.d.ts.map +1 -0
  319. package/server/tunnel/executable-search.js +148 -0
  320. package/server/tunnel/executable-search.js.map +1 -0
  321. package/server/tunnel/install-help.d.ts +19 -0
  322. package/server/tunnel/install-help.d.ts.map +1 -0
  323. package/server/tunnel/install-help.js +47 -0
  324. package/server/tunnel/install-help.js.map +1 -0
  325. package/server/tunnel/providers/ngrok.d.ts +31 -0
  326. package/server/tunnel/providers/ngrok.d.ts.map +1 -0
  327. package/server/tunnel/providers/ngrok.js +461 -0
  328. package/server/tunnel/providers/ngrok.js.map +1 -0
  329. package/server/tunnel/registry.d.ts +13 -0
  330. package/server/tunnel/registry.d.ts.map +1 -0
  331. package/server/tunnel/registry.js +56 -0
  332. package/server/tunnel/registry.js.map +1 -0
  333. package/server/tunnel/service.d.ts +13 -0
  334. package/server/tunnel/service.d.ts.map +1 -0
  335. package/server/tunnel/service.js +156 -0
  336. package/server/tunnel/service.js.map +1 -0
  337. package/server/tunnel/types.d.ts +163 -0
  338. package/server/tunnel/types.d.ts.map +1 -0
  339. package/server/tunnel/types.js +214 -0
  340. package/server/tunnel/types.js.map +1 -0
  341. package/server/ui-settings-store.d.ts +25 -0
  342. package/server/ui-settings-store.d.ts.map +1 -0
  343. package/server/ui-settings-store.js +91 -0
  344. package/server/ui-settings-store.js.map +1 -0
  345. package/server/workspace-store.d.ts +25 -0
  346. package/server/workspace-store.d.ts.map +1 -0
  347. package/server/workspace-store.js +157 -0
  348. package/server/workspace-store.js.map +1 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Tunnel service — orchestrates tunnel provider lifecycle with a start mutex
3
+ * to prevent concurrent starts from orphaning child processes.
4
+ */
5
+ import { TUNNEL_MODE_QUICK, TunnelServiceError, normalizeTunnelStartRequest, validateTunnelStartRequest, } 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 function createTunnelService(deps) {
13
+ const { registry, getController, setController, getActivePort, onQuickTunnelWarning, } = deps;
14
+ if (!registry) {
15
+ throw new Error("Tunnel service requires a provider registry");
16
+ }
17
+ const resolveActiveMode = () => {
18
+ const controller = getController();
19
+ if (!controller || typeof controller.mode !== "string") {
20
+ return null;
21
+ }
22
+ return controller.mode;
23
+ };
24
+ const resolveActiveProvider = () => {
25
+ const controller = getController();
26
+ if (!controller || typeof controller.provider !== "string") {
27
+ return null;
28
+ }
29
+ return controller.provider;
30
+ };
31
+ const stop = () => {
32
+ const controller = getController();
33
+ if (!controller) {
34
+ return false;
35
+ }
36
+ const providerId = typeof controller.provider === "string" ? controller.provider : "";
37
+ const provider = providerId ? registry.get(providerId) : null;
38
+ if (provider?.stop) {
39
+ provider.stop(controller);
40
+ }
41
+ else {
42
+ controller.stop?.();
43
+ }
44
+ setController(null);
45
+ return true;
46
+ };
47
+ const checkAvailability = async (providerId) => {
48
+ const provider = registry.get(providerId);
49
+ if (!provider) {
50
+ throw new TunnelServiceError("provider_unsupported", `Unsupported tunnel provider: ${providerId}`);
51
+ }
52
+ const result = await provider.checkAvailability();
53
+ return result;
54
+ };
55
+ // Mutex to prevent concurrent tunnel starts from orphaning child processes.
56
+ let startLock = Promise.resolve();
57
+ const start = async (rawRequest, options = {}) => {
58
+ let releaseLock;
59
+ const lockPromise = new Promise((resolve) => { releaseLock = resolve; });
60
+ const previousLock = startLock;
61
+ startLock = lockPromise;
62
+ await previousLock;
63
+ try {
64
+ const request = normalizeTunnelStartRequest(rawRequest);
65
+ const provider = registry.get(request.provider);
66
+ if (!provider) {
67
+ throw new TunnelServiceError("provider_unsupported", `Unsupported tunnel provider: ${request.provider}`);
68
+ }
69
+ validateTunnelStartRequest(request, provider.capabilities);
70
+ let publicUrl = getController() ? provider.resolvePublicUrl(getController()) : null;
71
+ const activeMode = resolveActiveMode();
72
+ const activeProvider = resolveActiveProvider();
73
+ if (publicUrl && (activeMode !== request.mode || activeProvider !== request.provider)) {
74
+ stop();
75
+ publicUrl = null;
76
+ }
77
+ if (!publicUrl) {
78
+ const availability = await provider.checkAvailability();
79
+ if (!availability?.available) {
80
+ const missingDependencyMessage = typeof availability?.message === "string" && availability.message.trim().length > 0
81
+ ? availability.message
82
+ : `Required dependency for provider '${request.provider}' is missing`;
83
+ throw new TunnelServiceError("missing_dependency", missingDependencyMessage);
84
+ }
85
+ const activePort = Number.isFinite(getActivePort?.()) ? getActivePort() : null;
86
+ const originUrl = activePort !== null ? `http://127.0.0.1:${activePort}` : undefined;
87
+ let controller;
88
+ try {
89
+ controller = await provider.start(request, {
90
+ activePort,
91
+ originUrl,
92
+ ...options,
93
+ });
94
+ }
95
+ catch (error) {
96
+ if (error instanceof TunnelServiceError) {
97
+ throw error;
98
+ }
99
+ const message = error instanceof Error && error.message.trim().length > 0
100
+ ? error.message
101
+ : "Failed to start tunnel";
102
+ throw new TunnelServiceError("startup_failed", message);
103
+ }
104
+ controller.provider = request.provider;
105
+ setController(controller);
106
+ publicUrl = provider.resolvePublicUrl(controller);
107
+ if (!publicUrl) {
108
+ stop();
109
+ throw new TunnelServiceError("startup_failed", "Tunnel started but no public URL was assigned");
110
+ }
111
+ if (request.mode === TUNNEL_MODE_QUICK) {
112
+ onQuickTunnelWarning();
113
+ }
114
+ }
115
+ return {
116
+ publicUrl,
117
+ request,
118
+ activeMode: request.mode,
119
+ provider: request.provider,
120
+ providerMetadata: provider.getMetadata?.(getController()) ?? null,
121
+ };
122
+ }
123
+ finally {
124
+ releaseLock?.();
125
+ }
126
+ };
127
+ const getPublicUrl = () => {
128
+ const controller = getController();
129
+ if (!controller) {
130
+ return null;
131
+ }
132
+ const provider = registry.get(controller.provider);
133
+ if (!provider) {
134
+ return controller.getPublicUrl?.() ?? null;
135
+ }
136
+ return provider.resolvePublicUrl(controller);
137
+ };
138
+ const getProviderMetadata = () => {
139
+ const controller = getController();
140
+ if (!controller) {
141
+ return null;
142
+ }
143
+ const provider = registry.get(controller.provider);
144
+ return provider?.getMetadata?.(controller) ?? null;
145
+ };
146
+ return {
147
+ start,
148
+ stop,
149
+ checkAvailability,
150
+ getPublicUrl,
151
+ getProviderMetadata,
152
+ resolveActiveMode,
153
+ resolveActiveProvider,
154
+ };
155
+ }
156
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tunnel/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Tunnel module types — constants, error class, normalizers, validators,
3
+ * and the provider interface contract.
4
+ */
5
+ export declare const TUNNEL_PROVIDER_CLOUDFLARE: "cloudflare";
6
+ export declare const TUNNEL_PROVIDER_NGROK: "ngrok";
7
+ export type TunnelProviderId = typeof TUNNEL_PROVIDER_CLOUDFLARE | typeof TUNNEL_PROVIDER_NGROK | (string & {});
8
+ export declare const TUNNEL_MODE_QUICK: "quick";
9
+ export declare const TUNNEL_MODE_MANAGED_REMOTE: "managed-remote";
10
+ export declare const TUNNEL_MODE_MANAGED_LOCAL: "managed-local";
11
+ export type TunnelMode = typeof TUNNEL_MODE_QUICK | typeof TUNNEL_MODE_MANAGED_REMOTE | typeof TUNNEL_MODE_MANAGED_LOCAL;
12
+ export declare const TUNNEL_INTENT_EPHEMERAL_PUBLIC: "ephemeral-public";
13
+ export declare const TUNNEL_INTENT_PERSISTENT_PUBLIC: "persistent-public";
14
+ export declare const TUNNEL_INTENT_PRIVATE_NETWORK: "private-network";
15
+ export type TunnelIntent = typeof TUNNEL_INTENT_EPHEMERAL_PUBLIC | typeof TUNNEL_INTENT_PERSISTENT_PUBLIC | typeof TUNNEL_INTENT_PRIVATE_NETWORK;
16
+ export declare class TunnelServiceError extends Error {
17
+ readonly code: string;
18
+ readonly details: unknown;
19
+ constructor(code: string, message: string, details?: unknown);
20
+ }
21
+ export interface TunnelModeDescriptor {
22
+ key: string;
23
+ label: string;
24
+ intent: string;
25
+ requires: string[];
26
+ supports: string[];
27
+ stability: string;
28
+ }
29
+ export interface TunnelProviderCapabilities {
30
+ provider: string;
31
+ defaults: {
32
+ mode: string;
33
+ optionDefaults: Record<string, unknown>;
34
+ };
35
+ modes: TunnelModeDescriptor[];
36
+ }
37
+ export interface TunnelAvailability {
38
+ available: boolean;
39
+ path: string | null;
40
+ version: string | null;
41
+ dependency?: string;
42
+ installCommand?: string;
43
+ installUrl?: string;
44
+ platform?: string;
45
+ message?: string;
46
+ }
47
+ export interface TunnelStartRequest {
48
+ provider: string;
49
+ mode: string;
50
+ intent?: string;
51
+ configPath?: string | null;
52
+ token?: string;
53
+ hostname?: string;
54
+ }
55
+ export interface TunnelContext {
56
+ activePort?: number | null;
57
+ originUrl?: string;
58
+ }
59
+ export interface TunnelController {
60
+ /** Set by the provider on start(). */
61
+ mode: string;
62
+ /** Set by the service after start(). */
63
+ provider: string;
64
+ /** Kill the tunnel process. */
65
+ stop(): void;
66
+ /** Resolve the public URL from internal state. */
67
+ getPublicUrl(): string | null;
68
+ /** The underlying child process, if any. */
69
+ process?: import("node:child_process").ChildProcess;
70
+ /** Resolve the effective config path (cloudflare managed-local). */
71
+ getEffectiveConfigPath?(): string | null;
72
+ /** Resolve the resolved hostname (cloudflare managed-local). */
73
+ getResolvedHostname?(): string | null;
74
+ }
75
+ export interface TunnelCheck {
76
+ id: string;
77
+ label: string;
78
+ status: "pass" | "fail" | "warn";
79
+ detail: string;
80
+ }
81
+ export interface TunnelModeDiagnosis {
82
+ mode: string;
83
+ checks: TunnelCheck[];
84
+ summary: {
85
+ ready: boolean;
86
+ failures: number;
87
+ warnings: number;
88
+ };
89
+ ready: boolean;
90
+ blockers: string[];
91
+ }
92
+ export interface TunnelDiagnosis {
93
+ providerChecks: TunnelCheck[];
94
+ modes: TunnelModeDiagnosis[];
95
+ }
96
+ export interface DoctorRequest {
97
+ mode?: string | null;
98
+ hostname?: string;
99
+ token?: string;
100
+ tokenProvided?: boolean;
101
+ hostnameProvided?: boolean;
102
+ configPath?: string | null;
103
+ hasSavedManagedRemoteProfile?: boolean;
104
+ }
105
+ export interface TunnelProvider {
106
+ readonly id: string;
107
+ readonly capabilities: TunnelProviderCapabilities;
108
+ checkAvailability(): Promise<TunnelAvailability>;
109
+ diagnose?(request?: DoctorRequest, context?: {
110
+ capabilities: TunnelProviderCapabilities;
111
+ }): Promise<TunnelDiagnosis>;
112
+ start(request: TunnelStartRequest, context: TunnelContext): Promise<TunnelController>;
113
+ stop(controller: TunnelController): void;
114
+ resolvePublicUrl(controller: TunnelController): string | null;
115
+ getMetadata?(controller: TunnelController | null): Record<string, unknown> | null;
116
+ }
117
+ export interface TunnelStartResult {
118
+ publicUrl: string;
119
+ request: TunnelStartRequest;
120
+ activeMode: string;
121
+ provider: string;
122
+ providerMetadata: Record<string, unknown> | null;
123
+ }
124
+ export interface TunnelServiceDeps {
125
+ registry: TunnelProviderRegistry;
126
+ getController: () => TunnelController | null;
127
+ setController: (controller: TunnelController | null) => void;
128
+ getActivePort: () => number | null;
129
+ onQuickTunnelWarning: () => void;
130
+ }
131
+ export interface TunnelService {
132
+ start(rawRequest: Partial<TunnelStartRequest>, options?: Record<string, unknown>): Promise<TunnelStartResult>;
133
+ stop(): boolean;
134
+ checkAvailability(providerId: string): Promise<TunnelAvailability>;
135
+ getPublicUrl(): string | null;
136
+ getProviderMetadata(): Record<string, unknown> | null;
137
+ resolveActiveMode(): string | null;
138
+ resolveActiveProvider(): string | null;
139
+ }
140
+ export interface TunnelProviderRegistry {
141
+ register(provider: TunnelProvider): TunnelProvider;
142
+ get(providerId: string): TunnelProvider | null;
143
+ list(): TunnelProvider[];
144
+ listCapabilities(): TunnelProviderCapabilities[];
145
+ seal(): void;
146
+ }
147
+ export declare function isPathWithinDirectory(candidatePath: string, directoryPath: string, platform?: string): boolean;
148
+ export declare function resolveTunnelConfigPath(value: string, home?: string, platform?: string): string;
149
+ export declare function normalizeTunnelProvider(value: unknown): string;
150
+ export declare function normalizeTunnelMode(value: unknown): string;
151
+ export declare function normalizeOptionalPath(value: unknown): string | null | undefined;
152
+ export declare function isSupportedTunnelMode(mode: string): boolean;
153
+ export interface NormalizedTunnelStartRequest {
154
+ provider: string;
155
+ mode: string;
156
+ intent?: string;
157
+ configPath?: string | null;
158
+ token: string;
159
+ hostname: string;
160
+ }
161
+ export declare function normalizeTunnelStartRequest(input?: Record<string, unknown>, defaults?: Record<string, unknown>): NormalizedTunnelStartRequest;
162
+ export declare function validateTunnelStartRequest(request: NormalizedTunnelStartRequest, capabilities: TunnelProviderCapabilities): void;
163
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tunnel/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Tunnel module types — constants, error class, normalizers, validators,
3
+ * and the provider interface contract.
4
+ */
5
+ import path from "node:path";
6
+ import os from "node:os";
7
+ // ── Provider constants ────────────────────────────────────────────────────
8
+ export const TUNNEL_PROVIDER_CLOUDFLARE = "cloudflare";
9
+ export const TUNNEL_PROVIDER_NGROK = "ngrok";
10
+ // ── Mode constants ────────────────────────────────────────────────────────
11
+ export const TUNNEL_MODE_QUICK = "quick";
12
+ export const TUNNEL_MODE_MANAGED_REMOTE = "managed-remote";
13
+ export const TUNNEL_MODE_MANAGED_LOCAL = "managed-local";
14
+ // ── Intent constants ──────────────────────────────────────────────────────
15
+ export const TUNNEL_INTENT_EPHEMERAL_PUBLIC = "ephemeral-public";
16
+ export const TUNNEL_INTENT_PERSISTENT_PUBLIC = "persistent-public";
17
+ export const TUNNEL_INTENT_PRIVATE_NETWORK = "private-network";
18
+ // ── Sets for validation ───────────────────────────────────────────────────
19
+ const SUPPORTED_TUNNEL_PROVIDERS = new Set([
20
+ TUNNEL_PROVIDER_CLOUDFLARE,
21
+ TUNNEL_PROVIDER_NGROK,
22
+ ]);
23
+ const SUPPORTED_TUNNEL_MODES = new Set([
24
+ TUNNEL_MODE_QUICK,
25
+ TUNNEL_MODE_MANAGED_REMOTE,
26
+ TUNNEL_MODE_MANAGED_LOCAL,
27
+ ]);
28
+ const SUPPORTED_TUNNEL_INTENTS = new Set([
29
+ TUNNEL_INTENT_EPHEMERAL_PUBLIC,
30
+ TUNNEL_INTENT_PERSISTENT_PUBLIC,
31
+ TUNNEL_INTENT_PRIVATE_NETWORK,
32
+ ]);
33
+ // ── Error class ───────────────────────────────────────────────────────────
34
+ export class TunnelServiceError extends Error {
35
+ code;
36
+ details;
37
+ constructor(code, message, details = null) {
38
+ super(message);
39
+ this.name = "TunnelServiceError";
40
+ this.code = code;
41
+ this.details = details;
42
+ }
43
+ }
44
+ // ── Path helpers ──────────────────────────────────────────────────────────
45
+ function getPathApiForPlatform(platform) {
46
+ return platform === "win32" ? path.win32 : path;
47
+ }
48
+ export function isPathWithinDirectory(candidatePath, directoryPath, platform = process.platform) {
49
+ if (typeof candidatePath !== "string" || typeof directoryPath !== "string") {
50
+ return false;
51
+ }
52
+ const pathApi = getPathApiForPlatform(platform);
53
+ const resolvedCandidate = pathApi.resolve(candidatePath);
54
+ const resolvedDirectory = pathApi.resolve(directoryPath);
55
+ const comparableCandidate = platform === "win32" ? resolvedCandidate.toLowerCase() : resolvedCandidate;
56
+ const comparableDirectory = platform === "win32" ? resolvedDirectory.toLowerCase() : resolvedDirectory;
57
+ const directoryPrefix = comparableDirectory.endsWith(pathApi.sep)
58
+ ? comparableDirectory
59
+ : `${comparableDirectory}${pathApi.sep}`;
60
+ return comparableCandidate === comparableDirectory || comparableCandidate.startsWith(directoryPrefix);
61
+ }
62
+ export function resolveTunnelConfigPath(value, home = os.homedir(), platform = process.platform) {
63
+ const pathApi = getPathApiForPlatform(platform);
64
+ let resolved;
65
+ if (value === "~") {
66
+ resolved = home;
67
+ }
68
+ else if (value.startsWith("~/") || value.startsWith("~\\")) {
69
+ resolved = pathApi.join(home, value.slice(2));
70
+ }
71
+ else {
72
+ resolved = pathApi.resolve(value);
73
+ }
74
+ if (!isPathWithinDirectory(resolved, home, platform)) {
75
+ throw new TunnelServiceError("validation_error", `Config path must be within the home directory (${home}). Got: ${resolved}`);
76
+ }
77
+ return resolved;
78
+ }
79
+ // ── Normalizers ───────────────────────────────────────────────────────────
80
+ export function normalizeTunnelProvider(value) {
81
+ if (typeof value !== "string") {
82
+ return TUNNEL_PROVIDER_CLOUDFLARE;
83
+ }
84
+ const provider = value.trim().toLowerCase();
85
+ if (!provider || !SUPPORTED_TUNNEL_PROVIDERS.has(provider)) {
86
+ return TUNNEL_PROVIDER_CLOUDFLARE;
87
+ }
88
+ return provider;
89
+ }
90
+ export function normalizeTunnelMode(value) {
91
+ if (typeof value !== "string") {
92
+ return TUNNEL_MODE_QUICK;
93
+ }
94
+ const mode = value.trim().toLowerCase();
95
+ if (!mode) {
96
+ return TUNNEL_MODE_QUICK;
97
+ }
98
+ if (mode === TUNNEL_MODE_QUICK)
99
+ return TUNNEL_MODE_QUICK;
100
+ return TUNNEL_MODE_QUICK;
101
+ }
102
+ function normalizeTunnelIntent(value) {
103
+ if (typeof value !== "string") {
104
+ return undefined;
105
+ }
106
+ const intent = value.trim().toLowerCase();
107
+ if (!intent || !SUPPORTED_TUNNEL_INTENTS.has(intent)) {
108
+ return undefined;
109
+ }
110
+ return intent;
111
+ }
112
+ function modeIntentFallback(mode) {
113
+ if (mode === TUNNEL_MODE_QUICK)
114
+ return TUNNEL_INTENT_EPHEMERAL_PUBLIC;
115
+ return undefined;
116
+ }
117
+ function normalizeTunnelModeForRequest(value) {
118
+ if (typeof value === "string") {
119
+ const mode = value.trim().toLowerCase();
120
+ if (mode === TUNNEL_MODE_QUICK) {
121
+ return mode;
122
+ }
123
+ }
124
+ return TUNNEL_MODE_QUICK;
125
+ }
126
+ export function normalizeOptionalPath(value) {
127
+ if (value === null) {
128
+ return null;
129
+ }
130
+ if (typeof value !== "string") {
131
+ return undefined;
132
+ }
133
+ const trimmed = value.trim();
134
+ if (!trimmed) {
135
+ return null;
136
+ }
137
+ return resolveTunnelConfigPath(trimmed);
138
+ }
139
+ export function isSupportedTunnelMode(mode) {
140
+ return SUPPORTED_TUNNEL_MODES.has(mode);
141
+ }
142
+ export function normalizeTunnelStartRequest(input = {}, defaults = {}) {
143
+ const provider = normalizeTunnelProvider(input.provider ?? defaults.provider);
144
+ const mode = normalizeTunnelModeForRequest(input.mode ?? defaults.mode);
145
+ const explicitIntent = normalizeTunnelIntent(input.intent ?? defaults.intent);
146
+ const intent = explicitIntent ?? modeIntentFallback(mode);
147
+ const configPathValue = Object.prototype.hasOwnProperty.call(input, "configPath")
148
+ ? input.configPath
149
+ : defaults.configPath;
150
+ const configPath = normalizeOptionalPath(configPathValue);
151
+ const rawToken = input.token ?? defaults.token;
152
+ const token = typeof rawToken === "string"
153
+ ? rawToken.trim()
154
+ : "";
155
+ const rawHostname = input.hostname ?? defaults.hostname;
156
+ const hostname = typeof rawHostname === "string"
157
+ ? rawHostname.trim().toLowerCase()
158
+ : "";
159
+ return {
160
+ provider,
161
+ mode,
162
+ intent,
163
+ configPath,
164
+ token,
165
+ hostname,
166
+ };
167
+ }
168
+ // ── Validator ─────────────────────────────────────────────────────────────
169
+ export function validateTunnelStartRequest(request, capabilities) {
170
+ if (!request || typeof request !== "object") {
171
+ throw new TunnelServiceError("validation_error", "Tunnel start request must be an object");
172
+ }
173
+ if (!request.provider) {
174
+ throw new TunnelServiceError("validation_error", "Tunnel provider is required");
175
+ }
176
+ if (!isSupportedTunnelMode(request.mode)) {
177
+ throw new TunnelServiceError("mode_unsupported", `Unsupported tunnel mode: ${request.mode}`);
178
+ }
179
+ if (!capabilities || capabilities.provider !== request.provider) {
180
+ throw new TunnelServiceError("provider_unsupported", `Unsupported tunnel provider: ${request.provider}`);
181
+ }
182
+ if (!Array.isArray(capabilities.modes)) {
183
+ throw new TunnelServiceError("mode_unsupported", `Provider '${request.provider}' does not declare tunnel modes`);
184
+ }
185
+ const modeDescriptor = capabilities.modes.find((entry) => entry?.key === request.mode);
186
+ if (!modeDescriptor) {
187
+ throw new TunnelServiceError("mode_unsupported", `Provider '${request.provider}' does not support mode '${request.mode}'`);
188
+ }
189
+ if (typeof request.intent === "string" && request.intent.length > 0) {
190
+ if (!SUPPORTED_TUNNEL_INTENTS.has(request.intent)) {
191
+ throw new TunnelServiceError("validation_error", `Unsupported tunnel intent: ${request.intent}`);
192
+ }
193
+ if (modeDescriptor.intent !== request.intent) {
194
+ throw new TunnelServiceError("validation_error", `Tunnel intent '${request.intent}' does not match mode '${request.mode}' (expected '${modeDescriptor.intent}')`);
195
+ }
196
+ }
197
+ const requiredFields = Array.isArray(modeDescriptor.requires) ? modeDescriptor.requires : [];
198
+ if (requiredFields.includes("token")) {
199
+ if (!request.token) {
200
+ throw new TunnelServiceError("validation_error", "Managed remote tunnel token is required");
201
+ }
202
+ }
203
+ if (requiredFields.includes("hostname")) {
204
+ if (!request.hostname) {
205
+ throw new TunnelServiceError("validation_error", "Managed remote tunnel hostname is required");
206
+ }
207
+ }
208
+ if (requiredFields.includes("configPath")) {
209
+ if (request.configPath === undefined || request.configPath === null || request.configPath === "") {
210
+ throw new TunnelServiceError("validation_error", `Mode '${request.mode}' requires a configPath`);
211
+ }
212
+ }
213
+ }
214
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tunnel/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type UiSettings = {
2
+ version: 1;
3
+ theme?: string;
4
+ stickyUserHeader: boolean;
5
+ showTokenUsage: boolean;
6
+ compressImages: boolean;
7
+ };
8
+ export declare function createUiSettingsStore(): {
9
+ read: typeof read;
10
+ write: typeof write;
11
+ patch: typeof patch;
12
+ reset: typeof reset;
13
+ };
14
+ declare function read(): Promise<UiSettings>;
15
+ declare function write(settings: UiSettings): Promise<UiSettings>;
16
+ declare function patch(patch: Partial<UiSettings>): Promise<UiSettings>;
17
+ declare function reset(): Promise<UiSettings>;
18
+ export declare const uiSettings: {
19
+ read: typeof read;
20
+ write: typeof write;
21
+ patch: typeof patch;
22
+ reset: typeof reset;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=ui-settings-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-settings-store.d.ts","sourceRoot":"","sources":["../src/ui-settings-store.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAsCF,wBAAgB,qBAAqB;;;;;EAEpC;AAMD,iBAAe,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAYzC;AAED,iBAAe,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9D;AAED,iBAAe,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CASpE;AAED,iBAAe,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAQ1C;AAID,eAAO,MAAM,UAAU;;;;;CAAgC,CAAC"}