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,351 @@
1
+ /**
2
+ * Config Manager — wraps SDK config files (auth.json, settings.json, models.json).
3
+ *
4
+ * Lightweight: no prompt/skill/tool overrides, no export/import.
5
+ */
6
+ import { readFile, writeFile, rename, unlink, mkdir } from "node:fs/promises";
7
+ import { join, dirname } from "node:path";
8
+ import { randomUUID } from "node:crypto";
9
+ import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
10
+ import { AuthStorage, SettingsManager, ModelRegistry, } from "@earendil-works/pi-coding-agent";
11
+ import { config } from "./config.js";
12
+ /**
13
+ * Probe a provider endpoint to test connectivity, detect API type,
14
+ * and fetch available models.
15
+ */
16
+ export async function probeProvider(req) {
17
+ const baseUrl = req.baseUrl.replace(/\/+$/, "");
18
+ // Build headers
19
+ const headers = {
20
+ ...(req.headers ?? {}),
21
+ };
22
+ if (req.apiKey) {
23
+ headers["Authorization"] = `Bearer ${req.apiKey}`;
24
+ }
25
+ // Detect API type if not provided
26
+ const urlLower = baseUrl.toLowerCase();
27
+ const apiType = req.apiType ??
28
+ (urlLower.includes("anthropic")
29
+ ? "anthropic-messages"
30
+ : urlLower.includes("google")
31
+ ? "google-generative-ai"
32
+ : "openai-completions");
33
+ // Try to fetch models — different endpoints per API type
34
+ let modelsEndpoint;
35
+ if (apiType === "google-generative-ai") {
36
+ // Google uses /v1beta/models or /v1/models
37
+ modelsEndpoint = baseUrl.endsWith("/v1beta") || baseUrl.endsWith("/v1")
38
+ ? `${baseUrl}/models`
39
+ : `${baseUrl}/v1beta/models`;
40
+ }
41
+ else if (apiType === "anthropic-messages") {
42
+ // Anthropic doesn't have a public models endpoint — try common patterns
43
+ modelsEndpoint = `${baseUrl}/models`;
44
+ }
45
+ else {
46
+ // OpenAI-compatible: /v1/models or /models
47
+ modelsEndpoint = baseUrl.endsWith("/v1")
48
+ ? `${baseUrl}/models`
49
+ : `${baseUrl}/v1/models`;
50
+ }
51
+ // First test basic connectivity
52
+ try {
53
+ const controller = new AbortController();
54
+ const timeout = setTimeout(() => controller.abort(), 10000);
55
+ const res = await fetch(modelsEndpoint, {
56
+ method: "GET",
57
+ headers,
58
+ signal: controller.signal,
59
+ });
60
+ clearTimeout(timeout);
61
+ if (!res.ok) {
62
+ return {
63
+ reachable: false,
64
+ error: `HTTP ${res.status}: ${res.statusText}. Tried ${modelsEndpoint}`,
65
+ detectedApiType: apiType,
66
+ };
67
+ }
68
+ const body = (await res.json());
69
+ // Parse models from response
70
+ let models = [];
71
+ if (Array.isArray(body.data)) {
72
+ // OpenAI-compatible { data: [{ id, ... }] }
73
+ models = body.data.map((m) => ({
74
+ id: String(m.id ?? ""),
75
+ name: String(m.name ?? m.id ?? ""),
76
+ }));
77
+ }
78
+ else if (Array.isArray(body.models)) {
79
+ // Google-style { models: [{ name, ... }] }
80
+ models = body.models.map((m) => {
81
+ const name = String(m.name ?? "");
82
+ const shortId = name.includes("/") ? name.split("/").pop() ?? name : name;
83
+ return { id: shortId, name };
84
+ });
85
+ }
86
+ // Filter out empty ids
87
+ models = models.filter((m) => m.id.length > 0);
88
+ // Derive a suggested provider name from the hostname
89
+ let suggestedName;
90
+ try {
91
+ const hostname = new URL(baseUrl).hostname;
92
+ suggestedName = hostname
93
+ .replace(/^api[.-]/, "")
94
+ .replace(/[.-]api$/, "")
95
+ .replace(/\./g, "-")
96
+ .replace(/[^a-zA-Z0-9_-]/g, "")
97
+ .toLowerCase()
98
+ .slice(0, 24) || "custom";
99
+ }
100
+ catch {
101
+ suggestedName = "custom";
102
+ }
103
+ return {
104
+ reachable: true,
105
+ detectedApiType: apiType,
106
+ models,
107
+ suggestedName,
108
+ rawResponse: models.length > 0 ? undefined : body,
109
+ };
110
+ }
111
+ catch (err) {
112
+ const message = err instanceof Error ? err.message : String(err);
113
+ return {
114
+ reachable: false,
115
+ error: `Connection failed: ${message}`,
116
+ detectedApiType: apiType,
117
+ };
118
+ }
119
+ }
120
+ /**
121
+ * Add or update a custom provider in models.json.
122
+ */
123
+ export async function addCustomProvider(providerName, config) {
124
+ const current = await readModelsJsonRaw();
125
+ current.providers[providerName] = config;
126
+ await writeModelsJson(current);
127
+ return { providers: current.providers };
128
+ }
129
+ /**
130
+ * Remove a custom provider from models.json.
131
+ */
132
+ export async function removeCustomProvider(providerName) {
133
+ const current = await readModelsJsonRaw();
134
+ delete current.providers[providerName];
135
+ await writeModelsJson(current);
136
+ return { providers: current.providers };
137
+ }
138
+ /**
139
+ * Read models.json raw (without redaction).
140
+ */
141
+ async function readModelsJsonRaw() {
142
+ try {
143
+ const raw = await readFile(MODELS_PATH, "utf-8");
144
+ return JSON.parse(raw);
145
+ }
146
+ catch (err) {
147
+ if (err.code === "ENOENT") {
148
+ return { providers: {} };
149
+ }
150
+ throw err;
151
+ }
152
+ }
153
+ // ── Paths ─────────────────────────────────────────────────────────────────
154
+ const PI_CONFIG_DIR = config.piConfigDir;
155
+ const AUTH_PATH = join(PI_CONFIG_DIR, "auth.json");
156
+ const MODELS_PATH = join(PI_CONFIG_DIR, "models.json");
157
+ // ── Errors ─────────────────────────────────────────────────────────────────
158
+ export class AuthProviderNotFoundError extends Error {
159
+ constructor(provider) {
160
+ super(`Auth provider "${provider}" not found`);
161
+ this.name = "AuthProviderNotFoundError";
162
+ }
163
+ }
164
+ export function readAuthSummary() {
165
+ const store = AuthStorage.create(AUTH_PATH);
166
+ const providers = {};
167
+ for (const name of store.list()) {
168
+ providers[name] = {
169
+ configured: store.has(name),
170
+ source: "stored",
171
+ };
172
+ }
173
+ return { providers };
174
+ }
175
+ export function writeApiKey(provider, apiKey) {
176
+ const store = AuthStorage.create(AUTH_PATH);
177
+ store.set(provider, { type: "api_key", key: apiKey });
178
+ }
179
+ export function removeApiKey(provider) {
180
+ const store = AuthStorage.create(AUTH_PATH);
181
+ if (!store.has(provider)) {
182
+ throw new AuthProviderNotFoundError(provider);
183
+ }
184
+ store.remove(provider);
185
+ }
186
+ // ── Settings (settings.json) ──────────────────────────────────────────────
187
+ export function readSettings() {
188
+ const mgr = SettingsManager.create(PI_CONFIG_DIR);
189
+ return mgr.getGlobalSettings();
190
+ }
191
+ export function updateSettings(patch) {
192
+ const mgr = SettingsManager.create(PI_CONFIG_DIR);
193
+ // Apply overrides for the fields that have individual setters
194
+ if (patch.defaultProvider !== undefined && patch.defaultProvider !== null) {
195
+ mgr.setDefaultProvider(String(patch.defaultProvider));
196
+ }
197
+ if (patch.defaultModel !== undefined && patch.defaultModel !== null) {
198
+ mgr.setDefaultModel(String(patch.defaultModel));
199
+ }
200
+ if (patch.defaultThinkingLevel !== undefined && patch.defaultThinkingLevel !== null) {
201
+ mgr.setDefaultThinkingLevel(patch.defaultThinkingLevel);
202
+ }
203
+ if (patch.skills !== undefined) {
204
+ mgr.setSkillPaths(patch.skills === null ? [] : patch.skills);
205
+ }
206
+ if (patch.enableSkillCommands !== undefined) {
207
+ mgr.setEnableSkillCommands(patch.enableSkillCommands === null ? false : Boolean(patch.enableSkillCommands));
208
+ }
209
+ mgr.flush();
210
+ // Handle orchestrator model fields (not managed by SDK SettingsManager)
211
+ const raw = mgr.getGlobalSettings();
212
+ if (patch.orchProvider !== undefined) {
213
+ raw.orchProvider = patch.orchProvider === null ? undefined : String(patch.orchProvider);
214
+ }
215
+ if (patch.orchModel !== undefined) {
216
+ raw.orchModel = patch.orchModel === null ? undefined : String(patch.orchModel);
217
+ }
218
+ // Write back to persist the extra fields
219
+ writeSettings(raw).catch(() => undefined);
220
+ return raw;
221
+ }
222
+ /**
223
+ * Read models.json, redacting secret fields (apiKey, apiKeyCommand).
224
+ */
225
+ export async function readModelsJsonRedacted() {
226
+ try {
227
+ const raw = await readFile(MODELS_PATH, "utf-8");
228
+ const parsed = JSON.parse(raw);
229
+ // Redact secrets in every provider config
230
+ const redacted = { providers: {} };
231
+ for (const [key, val] of Object.entries(parsed.providers ?? {})) {
232
+ if (typeof val === "object" && val !== null) {
233
+ const v = val;
234
+ const redactedVal = {};
235
+ for (const [k, vv] of Object.entries(v)) {
236
+ if ((k === "apiKey" || k === "apiKeyCommand") && vv !== undefined) {
237
+ redactedVal[k] = "***REDACTED***";
238
+ }
239
+ else {
240
+ redactedVal[k] = vv;
241
+ }
242
+ }
243
+ redacted.providers[key] = redactedVal;
244
+ }
245
+ else {
246
+ redacted.providers[key] = val;
247
+ }
248
+ }
249
+ return redacted;
250
+ }
251
+ catch (err) {
252
+ if (err.code === "ENOENT") {
253
+ return { providers: {} };
254
+ }
255
+ throw err;
256
+ }
257
+ }
258
+ export async function writeModelsJson(data) {
259
+ await mkdir(dirname(MODELS_PATH), { recursive: true });
260
+ await writeFile(MODELS_PATH, JSON.stringify(data, null, 2), "utf-8");
261
+ }
262
+ /**
263
+ * Atomic JSON write (tmp + rename) for config files.
264
+ * Pattern: crash-safe writes, no partial writes.
265
+ */
266
+ async function atomicWriteJson(path, data) {
267
+ await mkdir(dirname(path), { recursive: true });
268
+ const tmp = `${path}.${randomUUID()}.tmp`;
269
+ await writeFile(tmp, JSON.stringify(data, null, 2), "utf8");
270
+ try {
271
+ await rename(tmp, path);
272
+ }
273
+ catch (err) {
274
+ await unlink(tmp).catch(() => undefined);
275
+ throw err;
276
+ }
277
+ }
278
+ /**
279
+ * Write settings.json atomically. Used by the per-session setModel route
280
+ * to restore the global default after the SDK mutates it as a side effect
281
+ * of session.setModel().
282
+ * Uses a temp-file + rename pattern for atomic writes.
283
+ */
284
+ export async function writeSettings(settings) {
285
+ const SETTINGS_FILE = join(PI_CONFIG_DIR, "settings.json");
286
+ await atomicWriteJson(SETTINGS_FILE, settings);
287
+ }
288
+ // ── Enabled Models (settings.json → enabledModels) ─────────────────────────
289
+ /**
290
+ * Read the enabledModels array from settings via the SDK SettingsManager.
291
+ * Returns undefined when no scoping is active (all models visible).
292
+ */
293
+ export function readEnabledModels() {
294
+ const mgr = SettingsManager.create(PI_CONFIG_DIR);
295
+ return mgr.getEnabledModels();
296
+ }
297
+ /**
298
+ * Persist the enabledModels array to settings. Pass undefined or null
299
+ * to disable scoping (all models visible).
300
+ */
301
+ export function writeEnabledModels(patterns) {
302
+ const mgr = SettingsManager.create(PI_CONFIG_DIR);
303
+ mgr.setEnabledModels(patterns === null || patterns === undefined ? undefined : patterns);
304
+ }
305
+ // ── Live providers listing (from SDK ModelRegistry) ──────────────────────
306
+ function buildModelDetail(m, registry) {
307
+ const supportedThinkingLevels = (() => {
308
+ try {
309
+ return getSupportedThinkingLevels(m);
310
+ }
311
+ catch {
312
+ return [];
313
+ }
314
+ })();
315
+ return {
316
+ id: m.id,
317
+ name: m.name,
318
+ contextWindow: m.contextWindow,
319
+ maxTokens: m.maxTokens,
320
+ reasoning: m.reasoning,
321
+ input: m.input,
322
+ hasAuth: registry.hasConfiguredAuth(m),
323
+ supportedThinkingLevels,
324
+ };
325
+ }
326
+ export function liveProvidersListing(opts) {
327
+ const store = AuthStorage.create(AUTH_PATH);
328
+ const registry = ModelRegistry.create(store, MODELS_PATH);
329
+ let all = registry.getAll();
330
+ console.log("[config] total models:", all.length);
331
+ // Filter to enabled models when scoped mode is on
332
+ if (opts?.scoped === true) {
333
+ const enabled = readEnabledModels();
334
+ if (enabled !== undefined && enabled.length > 0) {
335
+ // enabledModels are stored as "provider/modelId" patterns
336
+ all = all.filter((m) => enabled.includes(`${m.provider}/${m.id}`));
337
+ console.log("[config] scoped models:", all.length);
338
+ }
339
+ }
340
+ const grouped = new Map();
341
+ for (const m of all) {
342
+ let entry = grouped.get(m.provider);
343
+ if (entry === undefined) {
344
+ entry = { provider: m.provider, models: [] };
345
+ grouped.set(m.provider, entry);
346
+ }
347
+ entry.models.push(buildModelDetail(m, registry));
348
+ }
349
+ return { providers: Array.from(grouped.values()) };
350
+ }
351
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,WAAW,EACX,eAAe,EACf,aAAa,GACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAqBrC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiB;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhD,gBAAgB;IAChB,MAAM,OAAO,GAA2B;QACtC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACvB,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,OAAO,GACX,GAAG,CAAC,OAAO;QACX,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC3B,CAAC,CAAC,sBAAsB;gBACxB,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAE9B,yDAAyD;IACzD,IAAI,cAAsB,CAAC;IAC3B,IAAI,OAAO,KAAK,sBAAsB,EAAE,CAAC;QACvC,2CAA2C;QAC3C,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrE,CAAC,CAAC,GAAG,OAAO,SAAS;YACrB,CAAC,CAAC,GAAG,OAAO,gBAAgB,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QAC5C,wEAAwE;QACxE,cAAc,GAAG,GAAG,OAAO,SAAS,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,2CAA2C;QAC3C,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACtC,CAAC,CAAC,GAAG,OAAO,SAAS;YACrB,CAAC,CAAC,GAAG,OAAO,YAAY,CAAC;IAC7B,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,WAAW,cAAc,EAAE;gBACvE,eAAe,EAAE,OAAO;aACzB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;QAE3D,6BAA6B;QAC7B,IAAI,MAAM,GAAyC,EAAE,CAAC;QAEtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,4CAA4C;YAC5C,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;gBACtD,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACtB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;aACnC,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,2CAA2C;YAC3C,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE;gBACtD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1E,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,uBAAuB;QACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/C,qDAAqD;QACrD,IAAI,aAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YAC3C,aAAa,GAAG,QAAQ;iBACrB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;iBACnB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;iBAC9B,WAAW,EAAE;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,OAAO;YACxB,MAAM;YACN,aAAa;YACb,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;SAClD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,sBAAsB,OAAO,EAAE;YACtC,eAAe,EAAE,OAAO;SACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAAoB,EACpB,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;IACzC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,YAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,6EAA6E;AAE7E,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC;AACzC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AACnD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAEvD,8EAA8E;AAE9E,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,QAAgB;QAC1B,KAAK,CAAC,kBAAkB,QAAQ,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAcD,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAiC,EAAE,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAc;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,iBAAiB,EAAwC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAA8B;IAC3D,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,8DAA8D;IAC9D,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;QAC1E,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QACpE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,IAAI,KAAK,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;QACpF,GAAG,CAAC,uBAAuB,CACzB,KAAK,CAAC,oBAA+E,CACtF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,KAAK,CAAC,MAAmB,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC5C,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,wEAAwE;IACxE,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,EAA6B,CAAC;IAC/D,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC;IACD,yCAAyC;IACzC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE1C,OAAO,GAAG,CAAC;AACb,CAAC;AAQD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QAC7C,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,EAA6B,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YAChE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,GAA8B,CAAC;gBACzC,MAAM,WAAW,GAA4B,EAAE,CAAC;gBAChD,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,IAAI,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,eAAe,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;wBAClE,WAAW,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAgB;IACpD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,IAAa;IACxD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAC1C,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAiC;IACnE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,gBAAgB,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAqC;IACtE,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,GAAG,CAAC,gBAAgB,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC3F,CAAC;AAED,4EAA4E;AAE5E,SAAS,gBAAgB,CAAC,CAA6E,EAAE,QAAuB;IAC9H,MAAM,uBAAuB,GAAa,CAAC,GAAG,EAAE;QAC9C,IAAI,CAAC;YACH,OAAO,0BAA0B,CAAC,CAAqD,CAAC,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACtC,uBAAuB;KACxB,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,oBAAoB,CAAC,IAA8B;IAejE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAElD,kDAAkD;IAClD,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,0DAA0D;YAC1D,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAYnB,CAAC;IAEL,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,24 @@
1
+ export declare const config: Readonly<{
2
+ readonly port: number;
3
+ readonly host: string;
4
+ readonly logLevel: string;
5
+ readonly isTest: boolean;
6
+ readonly trustProxy: boolean;
7
+ readonly workspacePath: string;
8
+ readonly piConfigDir: string;
9
+ readonly forgeDataDir: string;
10
+ readonly sessionDir: string;
11
+ readonly mcpConfigFile: string;
12
+ readonly mcpStdioTrustFile: string;
13
+ readonly toolOverridesFile: string;
14
+ readonly skillOverridesFile: string;
15
+ readonly uiPassword: string | undefined;
16
+ readonly apiKey: string | undefined;
17
+ readonly clientDistPath: string;
18
+ readonly serveClient: boolean;
19
+ readonly corsOrigin: string | true;
20
+ readonly orchestrationEnabled: boolean;
21
+ readonly orchestrationMaxWorkersPerSupervisor: number;
22
+ readonly minimalUi: boolean;
23
+ }>;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsDA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;EA8BR,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { homedir } from "node:os";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ function readEnv(key) {
5
+ const v = process.env[key];
6
+ return v === undefined || v === "" ? undefined : v;
7
+ }
8
+ function readInt(key, fallback) {
9
+ const v = readEnv(key);
10
+ if (v === undefined)
11
+ return fallback;
12
+ const n = Number.parseInt(v, 10);
13
+ if (!Number.isFinite(n) || n < 0 || String(n) !== v.trim()) {
14
+ throw new Error(`config: ${key} must be a non-negative integer (got ${v})`);
15
+ }
16
+ return n;
17
+ }
18
+ function readBool(key, fallback) {
19
+ const v = readEnv(key)?.toLowerCase();
20
+ if (v === undefined)
21
+ return fallback;
22
+ return ["1", "true", "yes", "on"].includes(v);
23
+ }
24
+ function modeSuffix() {
25
+ const mode = readEnv("PIKOT_MODE") ?? "";
26
+ return mode === "dev" ? "-dev" : "";
27
+ }
28
+ const HOME = homedir();
29
+ if (HOME === "/" || HOME === "") {
30
+ throw new Error("config: os.homedir() returned empty path. " +
31
+ "Set HOME / USERPROFILE to a real user account.");
32
+ }
33
+ const SUFFIX = modeSuffix();
34
+ const WORKSPACE_PATH = resolve(readEnv("WORKSPACE_PATH") ?? resolve(HOME, `.pi-kot${SUFFIX}`, "workspace", "default"));
35
+ const SESSION_DIR = resolve(readEnv("SESSION_DIR") ?? resolve(HOME, `.pi-kot${SUFFIX}`, "sessions"));
36
+ const FORGE_DATA_DIR = resolve(readEnv("FORGE_DATA_DIR") ?? resolve(HOME, `.pi-kot${SUFFIX}`));
37
+ /** Path to built client dist (Vite output). Resolved relative to server dist/ */
38
+ const CLIENT_DIST_PATH = resolve(readEnv("CLIENT_DIST_PATH") ??
39
+ join(dirname(fileURLToPath(import.meta.url)), "..", "..", "client", "dist"));
40
+ export const config = Object.freeze({
41
+ port: readInt("PORT", 3333),
42
+ host: readEnv("HOST") ?? "0.0.0.0",
43
+ logLevel: readEnv("LOG_LEVEL") ?? "info",
44
+ isTest: (readEnv("NODE_ENV") ?? "") === "test",
45
+ trustProxy: readBool("TRUST_PROXY", false),
46
+ workspacePath: WORKSPACE_PATH,
47
+ piConfigDir: resolve(readEnv("PI_CONFIG_DIR") ?? resolve(HOME, ".pi", `agent${SUFFIX}`)),
48
+ forgeDataDir: FORGE_DATA_DIR,
49
+ sessionDir: SESSION_DIR,
50
+ mcpConfigFile: resolve(readEnv("MCP_CONFIG_FILE") ?? resolve(FORGE_DATA_DIR, "mcp.json")),
51
+ mcpStdioTrustFile: resolve(readEnv("MCP_STDIO_TRUST_FILE") ?? resolve(FORGE_DATA_DIR, "mcp-stdio-trust.json")),
52
+ toolOverridesFile: resolve(readEnv("TOOL_OVERRIDES_FILE") ?? resolve(FORGE_DATA_DIR, "tool-overrides.json")),
53
+ skillOverridesFile: resolve(readEnv("SKILL_OVERRIDES_FILE") ?? resolve(FORGE_DATA_DIR, "skill-overrides.json")),
54
+ // Auth
55
+ uiPassword: readEnv("UI_PASSWORD"),
56
+ apiKey: readEnv("API_KEY"),
57
+ // Static client (production)
58
+ clientDistPath: CLIENT_DIST_PATH,
59
+ serveClient: readBool("SERVE_CLIENT", true),
60
+ // CORS
61
+ corsOrigin: readEnv("CORS_ORIGIN") ?? true,
62
+ // Orchestration
63
+ orchestrationEnabled: readBool("ORCHESTRATION_ENABLED", true),
64
+ orchestrationMaxWorkersPerSupervisor: readInt("ORCHESTRATION_MAX_WORKERS", 8),
65
+ minimalUi: readBool("MINIMAL_UI", false),
66
+ });
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { FastifyReply } from "fastify";
2
+ import type { LiveSession, SSEClient } from "./session-store.js";
3
+ /**
4
+ * Serialize an event into SSE wire format.
5
+ */
6
+ export declare function serializeSSE(event: {
7
+ type: string;
8
+ [k: string]: unknown;
9
+ }): string;
10
+ /**
11
+ * Build a snapshot event from the current LiveSession state.
12
+ * Sent immediately on SSE connect so the browser can hydrate
13
+ * without a separate HTTP round-trip.
14
+ */
15
+ export declare function buildSnapshot(live: LiveSession): {
16
+ type: "snapshot";
17
+ sessionId: string;
18
+ projectId: string;
19
+ messages: unknown[];
20
+ isStreaming: boolean;
21
+ };
22
+ /**
23
+ * Hijack the Fastify reply and turn it into a long-lived SSE stream
24
+ * attached to `live.clients`. Sends a snapshot immediately, forwards
25
+ * filtered AgentSessionEvents, and unregisters on socket close.
26
+ */
27
+ export declare function createSSEClient(reply: FastifyReply, live: LiveSession): SSEClient;
28
+ //# sourceMappingURL=event-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAsBjE;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,CAElF;AA2CD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG;IAChD,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAQA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,GAAG,SAAS,CAuEjF"}
@@ -0,0 +1,153 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /**
3
+ * One-shot padding flush sent right after `compaction_start` so L7
4
+ * proxies (notably HAProxy on OpenShift) release the event immediately
5
+ * rather than buffering it through the multi-second compaction LLM call.
6
+ *
7
+ * The `compaction_start` event is ~150 bytes, well below any L7 proxy's
8
+ * minimum-buffer-to-flush threshold (1–8 KB is common). Without padding,
9
+ * the proxy holds the response for the entire duration of the compaction
10
+ * LLM call (several seconds) — by which point `compaction_end` has also
11
+ * fired and been buffered. The browser receives both events together,
12
+ * which defeats the purpose of sending `compaction_start` at all.
13
+ *
14
+ * This padding line is ~2000 bytes of comments. We use a dedicated
15
+ * writeRaw path that bypasses the event filter so it's invisible to
16
+ * clients. An `event: ping` SSE frame is less standard-compliant than
17
+ * a comment-only line (comments are defined in the SSE spec and all
18
+ * SSE parsers must ignore them).
19
+ */
20
+ const COMPACTION_START_PADDING_LINE = `: ${Array(80).fill("-").join("")}\n`.repeat(40);
21
+ /**
22
+ * Serialize an event into SSE wire format.
23
+ */
24
+ export function serializeSSE(event) {
25
+ return `data: ${JSON.stringify(event)}\n\n`;
26
+ }
27
+ /**
28
+ * Allowed event types forwarded to browser clients.
29
+ * Unknown types are silently dropped for forwards-compatibility.
30
+ */
31
+ const ALLOWED_EVENT_TYPES = new Set([
32
+ "agent_start",
33
+ "agent_end",
34
+ "turn_start",
35
+ "turn_end",
36
+ "message_start",
37
+ "message_update",
38
+ "message_end",
39
+ "tool_execution_start",
40
+ "tool_execution_update",
41
+ "tool_execution_end",
42
+ "tool_call",
43
+ "tool_result",
44
+ "queue_update",
45
+ "compaction_start",
46
+ "compaction_end",
47
+ "auto_retry_start",
48
+ "auto_retry_end",
49
+ "snapshot",
50
+ "ask_user_question",
51
+ "ask_user_question_cancelled",
52
+ // Streaming exec events (!cmd / !!cmd live terminal feed)
53
+ "exec_start",
54
+ "exec_update",
55
+ "exec_end",
56
+ // Extension UI bridge events
57
+ "extension_ui_select",
58
+ "extension_ui_confirm",
59
+ "extension_ui_input",
60
+ "extension_ui_notify",
61
+ "extension_ui_done",
62
+ ]);
63
+ function isAllowedEvent(event) {
64
+ return ALLOWED_EVENT_TYPES.has(event.type);
65
+ }
66
+ /**
67
+ * Build a snapshot event from the current LiveSession state.
68
+ * Sent immediately on SSE connect so the browser can hydrate
69
+ * without a separate HTTP round-trip.
70
+ */
71
+ export function buildSnapshot(live) {
72
+ return {
73
+ type: "snapshot",
74
+ sessionId: live.sessionId,
75
+ projectId: live.projectId,
76
+ messages: live.session.messages,
77
+ isStreaming: live.session.isStreaming,
78
+ };
79
+ }
80
+ /**
81
+ * Hijack the Fastify reply and turn it into a long-lived SSE stream
82
+ * attached to `live.clients`. Sends a snapshot immediately, forwards
83
+ * filtered AgentSessionEvents, and unregisters on socket close.
84
+ */
85
+ export function createSSEClient(reply, live) {
86
+ reply.hijack();
87
+ const raw = reply.raw;
88
+ let registeredClient;
89
+ let closed = false;
90
+ try {
91
+ raw.writeHead(200, {
92
+ "Content-Type": "text/event-stream",
93
+ "Cache-Control": "no-cache, no-transform",
94
+ Connection: "keep-alive",
95
+ "X-Accel-Buffering": "no",
96
+ });
97
+ const id = randomUUID();
98
+ const close = () => {
99
+ if (closed)
100
+ return;
101
+ closed = true;
102
+ if (registeredClient !== undefined)
103
+ live.clients.delete(registeredClient);
104
+ try {
105
+ raw.end();
106
+ }
107
+ catch {
108
+ // socket already torn down
109
+ }
110
+ };
111
+ const send = (event) => {
112
+ if (closed)
113
+ return;
114
+ if (!isAllowedEvent(event))
115
+ return;
116
+ try {
117
+ raw.write(serializeSSE(event));
118
+ // After compaction_start, follow with a padding flush so L7
119
+ // proxies (notably the OpenShift HAProxy router) release the
120
+ // event immediately rather than holding it through the
121
+ // multi-second compaction LLM call.
122
+ if (event.type === "compaction_start") {
123
+ raw.write(COMPACTION_START_PADDING_LINE);
124
+ }
125
+ }
126
+ catch {
127
+ close();
128
+ }
129
+ };
130
+ const client = { id, send, close };
131
+ registeredClient = client;
132
+ // Snapshot must be sent BEFORE adding to live.clients so events
133
+ // after the snapshot never arrive before it.
134
+ raw.write(serializeSSE(buildSnapshot(live)));
135
+ live.clients.add(client);
136
+ raw.on("close", close);
137
+ raw.on("error", close);
138
+ return client;
139
+ }
140
+ catch (err) {
141
+ closed = true;
142
+ if (registeredClient !== undefined)
143
+ live.clients.delete(registeredClient);
144
+ try {
145
+ raw.destroy();
146
+ }
147
+ catch {
148
+ // already destroyed
149
+ }
150
+ throw err;
151
+ }
152
+ }
153
+ //# sourceMappingURL=event-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"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"}