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,68 @@
1
+ /**
2
+ * Session orchestration — types + constants.
3
+ *
4
+ * A "supervisor" session has the `orchestrate_*` tool group enabled
5
+ * and can spawn / observe / message / interrupt / kill / detach a set
6
+ * of "worker" sessions. Workers are real first-class sessions (same
7
+ * .jsonl on disk, same browser visibility) — the link is purely
8
+ * forge-side metadata in `${FORGE_DATA_DIR}/session-orchestration.json`.
9
+ *
10
+ * Topology is strict hub-and-spoke: workers don't get the orchestrate
11
+ * tools and have no way to enumerate or message other workers.
12
+ * Enforcement is by tool-surface (the tools simply aren't there),
13
+ * not by permission check at the registry layer.
14
+ *
15
+ * Depth is limited to 1: a worker cannot become a supervisor. Keeps
16
+ * the worst case bounded against fork-bomb runaway prompts.
17
+ */
18
+ export declare const ORCHESTRATION_VERSION: 1;
19
+ /**
20
+ * Worker event types stored in orchestration history and pushed to
21
+ * supervisors as `orchestration-notify` custom messages.
22
+ */
23
+ export declare const INBOX_EVENT_TYPES: readonly ["worker.ended", "worker.ask_user", "worker.execution_stopped_without_agent_end", "worker.auto_retry_failed", "worker.process_alert", "worker.deleted"];
24
+ export type InboxEventType = (typeof INBOX_EVENT_TYPES)[number];
25
+ export declare function isInboxEventType(v: unknown): v is InboxEventType;
26
+ export interface InboxItem {
27
+ id: string;
28
+ type: InboxEventType;
29
+ workerId: string;
30
+ occurredAt: string;
31
+ data: Record<string, unknown>;
32
+ delivered: boolean;
33
+ }
34
+ export interface SupervisorRecord {
35
+ enabledAt: string;
36
+ workerIds: string[];
37
+ }
38
+ export type WorkerLifecycleState = "idle" | "running" | "ended" | "errored" | "stopped" | "deleted" | "awaiting_question";
39
+ export interface WorkerRecord {
40
+ supervisorId: string;
41
+ spawnedAt: string;
42
+ spawnedFrom?: {
43
+ sessionId: string;
44
+ mode: "fresh" | "summary";
45
+ };
46
+ state?: WorkerLifecycleState;
47
+ turnOpen?: boolean;
48
+ lastStateAt?: string;
49
+ lastAgentStartAt?: string;
50
+ lastAgentEndAt?: string;
51
+ stopReason?: string | null;
52
+ errorMessage?: string | null;
53
+ }
54
+ export interface OrchestrationStore {
55
+ version: typeof ORCHESTRATION_VERSION;
56
+ supervisors: Record<string, SupervisorRecord>;
57
+ workers: Record<string, WorkerRecord>;
58
+ }
59
+ export declare function emptyStore(): OrchestrationStore;
60
+ export interface InboxStore {
61
+ version: typeof ORCHESTRATION_VERSION;
62
+ inboxes: Record<string, InboxItem[]>;
63
+ }
64
+ export declare function emptyInboxStore(): InboxStore;
65
+ export declare const MAX_INBOX_ITEMS = 200;
66
+ export declare const DEFAULT_MAX_WORKERS_PER_SUPERVISOR = 8;
67
+ export declare const MAX_DEPTH = 1;
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/orchestration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,qBAAqB,EAAG,CAAU,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAC5B,cAAc,EACd,iBAAiB,EACjB,4CAA4C,EAC5C,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,CACR,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,cAAc,CAEhE;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAC5B,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,GACT,mBAAmB,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,qBAAqB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACvC;AAED,wBAAgB,UAAU,IAAI,kBAAkB,CAE/C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,qBAAqB,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CACtC;AAED,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,SAAS,IAAI,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Session orchestration — types + constants.
3
+ *
4
+ * A "supervisor" session has the `orchestrate_*` tool group enabled
5
+ * and can spawn / observe / message / interrupt / kill / detach a set
6
+ * of "worker" sessions. Workers are real first-class sessions (same
7
+ * .jsonl on disk, same browser visibility) — the link is purely
8
+ * forge-side metadata in `${FORGE_DATA_DIR}/session-orchestration.json`.
9
+ *
10
+ * Topology is strict hub-and-spoke: workers don't get the orchestrate
11
+ * tools and have no way to enumerate or message other workers.
12
+ * Enforcement is by tool-surface (the tools simply aren't there),
13
+ * not by permission check at the registry layer.
14
+ *
15
+ * Depth is limited to 1: a worker cannot become a supervisor. Keeps
16
+ * the worst case bounded against fork-bomb runaway prompts.
17
+ */
18
+ export const ORCHESTRATION_VERSION = 1;
19
+ /**
20
+ * Worker event types stored in orchestration history and pushed to
21
+ * supervisors as `orchestration-notify` custom messages.
22
+ */
23
+ export const INBOX_EVENT_TYPES = [
24
+ "worker.ended",
25
+ "worker.ask_user",
26
+ "worker.execution_stopped_without_agent_end",
27
+ "worker.auto_retry_failed",
28
+ "worker.process_alert",
29
+ "worker.deleted",
30
+ ];
31
+ export function isInboxEventType(v) {
32
+ return typeof v === "string" && INBOX_EVENT_TYPES.includes(v);
33
+ }
34
+ export function emptyStore() {
35
+ return { version: ORCHESTRATION_VERSION, supervisors: {}, workers: {} };
36
+ }
37
+ export function emptyInboxStore() {
38
+ return { version: ORCHESTRATION_VERSION, inboxes: {} };
39
+ }
40
+ export const MAX_INBOX_ITEMS = 200;
41
+ export const DEFAULT_MAX_WORKERS_PER_SUPERVISOR = 8;
42
+ export const MAX_DEPTH = 1;
43
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestration/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAU,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,cAAc;IACd,iBAAiB;IACjB,4CAA4C;IAC5C,0BAA0B;IAC1B,sBAAsB;IACtB,gBAAgB;CACR,CAAC;AAIX,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,iBAAuC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AA+CD,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC1E,CAAC;AAOD,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type WorkerArchiveStatus = "archived" | "not_found";
2
+ export interface KillWorkerResult {
3
+ wasLive: boolean;
4
+ archiveStatus: WorkerArchiveStatus;
5
+ }
6
+ export interface CleanupSupervisorWorkersResult {
7
+ workerIds: string[];
8
+ results: Record<string, KillWorkerResult>;
9
+ }
10
+ export declare function killWorkerAndArchive(args: {
11
+ supervisorId: string;
12
+ workerId: string;
13
+ }): Promise<KillWorkerResult>;
14
+ export declare function cleanupWorkersForDeletedSupervisor(supervisorId: string): Promise<CleanupSupervisorWorkersResult>;
15
+ //# sourceMappingURL=worker-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-lifecycle.d.ts","sourceRoot":"","sources":["../../src/orchestration/worker-lifecycle.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C;AAuBD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe5B;AAED,wBAAsB,kCAAkC,CACtD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,8BAA8B,CAAC,CAQzC"}
@@ -0,0 +1,45 @@
1
+ import { disposeSession, getSession } from "../session-store.js";
2
+ import { bridgeWorkerDeleted } from "./event-bridge.js";
3
+ import { disableSupervisor, getWorkerIds, unregisterWorker } from "./store.js";
4
+ function notifySupervisorSessionListChanged(args) {
5
+ const supervisor = getSession(args.supervisorId);
6
+ if (supervisor === undefined)
7
+ return;
8
+ for (const client of supervisor.clients) {
9
+ try {
10
+ client.send({
11
+ type: "session_list_changed",
12
+ reason: args.reason,
13
+ projectId: supervisor.projectId,
14
+ sessionId: args.workerId,
15
+ });
16
+ }
17
+ catch {
18
+ // SSE client already dropped
19
+ }
20
+ }
21
+ }
22
+ export async function killWorkerAndArchive(args) {
23
+ const wasLive = await disposeSession(args.workerId);
24
+ await bridgeWorkerDeleted(args.workerId, { wasLive, reason: "killed" }).catch(() => undefined);
25
+ await unregisterWorker(args.workerId);
26
+ notifySupervisorSessionListChanged({
27
+ supervisorId: args.supervisorId,
28
+ workerId: args.workerId,
29
+ reason: "kill_worker",
30
+ });
31
+ return {
32
+ wasLive,
33
+ archiveStatus: "archived",
34
+ };
35
+ }
36
+ export async function cleanupWorkersForDeletedSupervisor(supervisorId) {
37
+ const workerIds = await getWorkerIds(supervisorId);
38
+ const results = {};
39
+ for (const workerId of workerIds) {
40
+ results[workerId] = await killWorkerAndArchive({ supervisorId, workerId });
41
+ }
42
+ await disableSupervisor(supervisorId);
43
+ return { workerIds, results };
44
+ }
45
+ //# sourceMappingURL=worker-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-lifecycle.js","sourceRoot":"","sources":["../../src/orchestration/worker-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAc/E,SAAS,kCAAkC,CAAC,IAI3C;IACC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO;IACrC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAG1C;IACC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAC3E,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,kCAAkC,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,aAAa,EAAE,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,YAAoB;IAEpB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,oBAAoB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Parse `@<path>` references out of a text without touching it. */
2
+ export declare function parseFileReferences(text: string): string[];
3
+ export declare function expandFileReferences(text: string, workspacePath: string): Promise<string>;
4
+ export declare function languageHintForPath(path: string): string;
5
+ //# sourceMappingURL=path-refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-refs.d.ts","sourceRoot":"","sources":["../src/path-refs.ts"],"names":[],"mappings":"AAgFA,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgH/F;AAkED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD"}
@@ -0,0 +1,249 @@
1
+ import { extname, join } from "node:path";
2
+ import { readFile } from "./file-manager.js";
3
+ import { stat, open as fsOpen } from "node:fs/promises";
4
+ /**
5
+ * Process `@<path>` references in user input. The chat input's
6
+ * `@`-autocomplete inserts these markers; this helper transforms them
7
+ * server-side before the prompt reaches pi's `session.prompt()`.
8
+ *
9
+ * Threshold-based design: small files get inlined as fenced code blocks
10
+ * (the model has the content immediately, no tool round-trip); large
11
+ * files stay as the literal `@<path>` reference (the model loads what
12
+ * it needs via its read/grep/find tools, no context-burn on a 50 MB
13
+ * log we'd otherwise inhale wholesale).
14
+ *
15
+ * The chat UI renders BOTH forms as collapsed file badges in the user
16
+ * message bubble, so visually the user sees a chip either way; the
17
+ * difference is purely whether the LLM has the content in-prompt or
18
+ * has to fetch it.
19
+ *
20
+ * Behaviour:
21
+ * - Markers must be at start-of-string OR preceded by whitespace
22
+ * (avoid expanding `email@example.com`).
23
+ * - Two path forms accepted:
24
+ * `@<path>` — greedy non-whitespace; common case.
25
+ * `@"<path with spaces>"` — anything that isn't a `"` or newline.
26
+ * - Resolved against the project's workspace root via file-manager's
27
+ * path-traversal-safe `checkFileReference`. Four outcomes:
28
+ * inline → file ≤ INLINE_THRESHOLD; replace marker with a
29
+ * fenced code block. Language hint derived from
30
+ * extension.
31
+ * defer → file > INLINE_THRESHOLD; leave the literal `@<path>`
32
+ * reference for the model to load on demand.
33
+ * directory → path is a directory; preserve the marker normalized
34
+ * with a trailing `/` (e.g. `@src/components/`) so
35
+ * the model can ls/find/grep it via its tools.
36
+ * error → missing / outside root / binary. Replace marker
37
+ * with `[@<path> not included: <reason>]`.
38
+ *
39
+ * Multiple markers in one prompt are classified independently, then
40
+ * inline candidates compete for a shared aggregate budget. See
41
+ * `AGGREGATE_INLINE_BUDGET_BYTES` for the cap and the smallest-first
42
+ * walk that keeps the degradation graceful.
43
+ */
44
+ /** Per-file inlining cutoff. 128 KB ≈ 32K tokens. */
45
+ const INLINE_THRESHOLD_BYTES = 128 * 1024;
46
+ /** Aggregate cap on TOTAL bytes inlined across every `@<path>` in one prompt. 512 KB ≈ 128K tokens. */
47
+ const AGGREGATE_INLINE_BUDGET_BYTES = 512 * 1024;
48
+ /**
49
+ * Regex shared by `findRefs` and `parseFileReferences`. Match `@` at
50
+ * start-or-after-whitespace then either a `"path with spaces"` quoted
51
+ * form or a bare non-whitespace token.
52
+ */
53
+ const REF_RE = /(^|\s)@(?:"([^"\n]+)"|([^\s]+?))(?=[?,;:!)\]]?(?:\s|$))/g;
54
+ function findRefs(text) {
55
+ const matches = [];
56
+ REF_RE.lastIndex = 0;
57
+ let m;
58
+ while ((m = REF_RE.exec(text)) !== null) {
59
+ matches.push({
60
+ start: m.index,
61
+ end: m.index + m[0].length,
62
+ lead: m[1] ?? "",
63
+ path: m[2] ?? m[3] ?? "",
64
+ });
65
+ }
66
+ return matches;
67
+ }
68
+ /** Parse `@<path>` references out of a text without touching it. */
69
+ export function parseFileReferences(text) {
70
+ return findRefs(text).map((m) => m.path);
71
+ }
72
+ export async function expandFileReferences(text, workspacePath) {
73
+ const matches = findRefs(text);
74
+ if (matches.length === 0)
75
+ return text;
76
+ // Phase 1: classify every marker in parallel
77
+ const classifications = await Promise.all(matches.map(async (mm) => {
78
+ try {
79
+ const abs = join(workspacePath, mm.path);
80
+ const st = await stat(abs).catch(() => undefined);
81
+ if (st === undefined)
82
+ return { kind: "error", reason: "file not found" };
83
+ if (st.isDirectory())
84
+ return { kind: "directory" };
85
+ // Binary sniff — read first 8 KB
86
+ const fh = await fsOpen(abs, "r");
87
+ try {
88
+ const buf = Buffer.alloc(8000);
89
+ const { bytesRead } = await fh.read(buf, 0, 8000, 0);
90
+ const binary = looksBinary(buf.subarray(0, bytesRead));
91
+ if (binary)
92
+ return { kind: "error", reason: "binary file" };
93
+ }
94
+ finally {
95
+ await fh.close();
96
+ }
97
+ if (st.size > INLINE_THRESHOLD_BYTES)
98
+ return { kind: "deferLarge" };
99
+ return { kind: "inlineCandidate", size: st.size, abs };
100
+ }
101
+ catch (err) {
102
+ const e = err;
103
+ if (e.name === "NotFoundError" || e.code === "ENOENT") {
104
+ return { kind: "error", reason: "file not found" };
105
+ }
106
+ if (e.name === "PathOutsideRootError") {
107
+ return { kind: "error", reason: "path is outside allowed roots" };
108
+ }
109
+ return { kind: "error", reason: "unreadable" };
110
+ }
111
+ }));
112
+ // Phase 2: aggregate-budget walk, smallest-first
113
+ const inlineSet = new Set();
114
+ const candidateIndices = [];
115
+ for (let i = 0; i < classifications.length; i += 1) {
116
+ const c = classifications[i];
117
+ if (c?.kind === "inlineCandidate")
118
+ candidateIndices.push({ i, size: c.size });
119
+ }
120
+ candidateIndices.sort((a, b) => a.size - b.size);
121
+ let remaining = AGGREGATE_INLINE_BUDGET_BYTES;
122
+ for (const { i, size } of candidateIndices) {
123
+ if (size <= remaining) {
124
+ inlineSet.add(i);
125
+ remaining -= size;
126
+ }
127
+ }
128
+ // Phase 3: read content for budget survivors
129
+ const outcomes = await Promise.all(classifications.map(async (c, i) => {
130
+ if (c.kind === "directory")
131
+ return { kind: "directory" };
132
+ if (c.kind === "error")
133
+ return { kind: "error", reason: c.reason };
134
+ if (c.kind === "deferLarge")
135
+ return { kind: "defer" };
136
+ if (!inlineSet.has(i))
137
+ return { kind: "defer" };
138
+ try {
139
+ const result = await readFile(c.abs, workspacePath);
140
+ if (result.binary)
141
+ return { kind: "error", reason: "binary file" };
142
+ const mm = matches[i];
143
+ if (mm === undefined)
144
+ return { kind: "defer" };
145
+ return { kind: "inline", text: formatExpansion(mm.path, result.content) };
146
+ }
147
+ catch (err) {
148
+ const e = err;
149
+ if (e.name === "FileTooLargeError" || e.name === "NotFoundError" || e.code === "ENOENT") {
150
+ return { kind: "defer" };
151
+ }
152
+ return { kind: "error", reason: "unreadable" };
153
+ }
154
+ }));
155
+ // Walk in reverse so earlier indices stay valid
156
+ let out = text;
157
+ for (let i = matches.length - 1; i >= 0; i--) {
158
+ const outcome = outcomes[i];
159
+ const mm = matches[i];
160
+ if (outcome === undefined || mm === undefined)
161
+ continue;
162
+ const before = out.slice(0, mm.start) + mm.lead;
163
+ const after = out.slice(mm.end);
164
+ const marker = /\s/.test(mm.path) ? `@"${mm.path}"` : `@${mm.path}`;
165
+ if (outcome.kind === "inline") {
166
+ out = `${before}${marker}\n${outcome.text}\n${after}`;
167
+ }
168
+ else if (outcome.kind === "defer") {
169
+ out = `${before}${marker}${after}`;
170
+ }
171
+ else if (outcome.kind === "directory") {
172
+ const dirPath = mm.path.endsWith("/") ? mm.path : `${mm.path}/`;
173
+ const dirMarker = /\s/.test(dirPath) ? `@"${dirPath}"` : `@${dirPath}`;
174
+ out = `${before}${dirMarker}${after}`;
175
+ }
176
+ else {
177
+ out = `${before}[${marker} not included: ${outcome.reason}]${after}`;
178
+ }
179
+ }
180
+ return out;
181
+ }
182
+ function formatExpansion(path, content) {
183
+ const lang = languageHintForPath(path);
184
+ const fence = pickFence(content);
185
+ return `${fence}${lang} file: ${path}\n${content}\n${fence}`;
186
+ }
187
+ function pickFence(content) {
188
+ let max = 0;
189
+ let run = 0;
190
+ for (const ch of content) {
191
+ if (ch === "`") {
192
+ run += 1;
193
+ if (run > max)
194
+ max = run;
195
+ }
196
+ else {
197
+ run = 0;
198
+ }
199
+ }
200
+ return "`".repeat(Math.max(3, max + 1));
201
+ }
202
+ function looksBinary(buf) {
203
+ const limit = Math.min(buf.length, 8000);
204
+ for (let i = 0; i < limit; i++) {
205
+ if (buf[i] === 0)
206
+ return true;
207
+ }
208
+ return false;
209
+ }
210
+ const LANG_BY_EXT = {
211
+ ".ts": "ts",
212
+ ".tsx": "tsx",
213
+ ".js": "js",
214
+ ".jsx": "jsx",
215
+ ".mjs": "js",
216
+ ".cjs": "js",
217
+ ".json": "json",
218
+ ".py": "python",
219
+ ".rb": "ruby",
220
+ ".go": "go",
221
+ ".rs": "rust",
222
+ ".java": "java",
223
+ ".kt": "kotlin",
224
+ ".swift": "swift",
225
+ ".c": "c",
226
+ ".h": "c",
227
+ ".cpp": "cpp",
228
+ ".cc": "cpp",
229
+ ".hpp": "cpp",
230
+ ".cs": "csharp",
231
+ ".php": "php",
232
+ ".sh": "bash",
233
+ ".bash": "bash",
234
+ ".zsh": "bash",
235
+ ".yml": "yaml",
236
+ ".yaml": "yaml",
237
+ ".toml": "toml",
238
+ ".md": "markdown",
239
+ ".html": "html",
240
+ ".css": "css",
241
+ ".scss": "scss",
242
+ ".sql": "sql",
243
+ ".xml": "xml",
244
+ };
245
+ export function languageHintForPath(path) {
246
+ const ext = extname(path).toLowerCase();
247
+ return LANG_BY_EXT[ext] ?? "";
248
+ }
249
+ //# sourceMappingURL=path-refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-refs.js","sourceRoot":"","sources":["../src/path-refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Shared response schemas used across multiple route files.
3
+ */
4
+ export declare const errorSchema: {
5
+ readonly type: "object";
6
+ readonly required: readonly ["error"];
7
+ readonly properties: {
8
+ readonly error: {
9
+ readonly type: "string";
10
+ };
11
+ readonly message: {
12
+ readonly type: "string";
13
+ };
14
+ };
15
+ };
16
+ //# sourceMappingURL=_schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schemas.d.ts","sourceRoot":"","sources":["../../src/routes/_schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,WAAW;aACtB,IAAI,EAAE,QAAQ;aACd,QAAQ,YAAG,OAAO;aAClB,UAAU;iBACR,KAAK;qBAAI,IAAI,EAAE,QAAQ;;iBACvB,OAAO;qBAAI,IAAI,EAAE,QAAQ;;;CAEnB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared response schemas used across multiple route files.
3
+ */
4
+ export const errorSchema = {
5
+ type: "object",
6
+ required: ["error"],
7
+ properties: {
8
+ error: { type: "string" },
9
+ message: { type: "string" },
10
+ },
11
+ };
12
+ //# sourceMappingURL=_schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schemas.js","sourceRoot":"","sources":["../../src/routes/_schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5B;CACO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ export declare const askUserQuestionRoutes: FastifyPluginAsync;
3
+ //# sourceMappingURL=ask-user-question.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../src/routes/ask-user-question.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAsClD,eAAO,MAAM,qBAAqB,EAAE,kBAsFnC,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { getSession } from "../session-store.js";
2
+ import { answerPending, getPendingForSession } from "../ask-user-question/registry.js";
3
+ import { buildResult } from "../ask-user-question/envelope.js";
4
+ const answerBodySchema = {
5
+ type: "object",
6
+ required: ["requestId"],
7
+ additionalProperties: false,
8
+ properties: {
9
+ requestId: { type: "string", minLength: 1 },
10
+ cancelled: { type: "boolean" },
11
+ answers: {
12
+ type: "array",
13
+ items: {
14
+ type: "object",
15
+ required: ["questionIndex", "question", "kind"],
16
+ properties: {
17
+ questionIndex: { type: "integer", minimum: 0 },
18
+ question: { type: "string" },
19
+ kind: { type: "string", enum: ["option", "custom", "chat", "multi"] },
20
+ answer: { type: ["string", "null"] },
21
+ selected: { type: "array", items: { type: "string" } },
22
+ notes: { type: "string" },
23
+ preview: { type: "string" },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ };
29
+ export const askUserQuestionRoutes = async (fastify) => {
30
+ fastify.get("/sessions/:id/ask-user-question/pending", {
31
+ schema: {
32
+ params: {
33
+ type: "object",
34
+ required: ["id"],
35
+ properties: { id: { type: "string" } },
36
+ },
37
+ response: {
38
+ 200: {
39
+ type: "object",
40
+ required: ["pending"],
41
+ properties: {
42
+ pending: {
43
+ type: "array",
44
+ items: {
45
+ type: "object",
46
+ required: ["requestId", "questions"],
47
+ properties: {
48
+ requestId: { type: "string" },
49
+ questions: { type: "array" },
50
+ },
51
+ },
52
+ },
53
+ },
54
+ },
55
+ 404: {
56
+ type: "object",
57
+ properties: { error: { type: "string" } },
58
+ },
59
+ },
60
+ },
61
+ }, async (req, reply) => {
62
+ const live = getSession(req.params.id);
63
+ if (live === undefined) {
64
+ return reply.code(404).send({ error: "session_not_found" });
65
+ }
66
+ const pending = getPendingForSession(req.params.id).map((p) => ({
67
+ requestId: p.requestId,
68
+ questions: p.questions,
69
+ }));
70
+ return { pending };
71
+ });
72
+ fastify.post("/sessions/:id/ask-user-question/answer", {
73
+ schema: {
74
+ params: {
75
+ type: "object",
76
+ required: ["id"],
77
+ properties: { id: { type: "string" } },
78
+ },
79
+ body: answerBodySchema,
80
+ response: {
81
+ 204: { type: "null" },
82
+ 404: {
83
+ type: "object",
84
+ properties: { error: { type: "string" } },
85
+ },
86
+ },
87
+ },
88
+ }, async (req, reply) => {
89
+ const live = getSession(req.params.id);
90
+ if (live === undefined) {
91
+ return reply.code(404).send({ error: "session_not_found" });
92
+ }
93
+ const cancelled = req.body.cancelled === true;
94
+ const answers = Array.isArray(req.body.answers) ? req.body.answers : [];
95
+ const pending = getPendingForSession(req.params.id).find((p) => p.requestId === req.body.requestId);
96
+ const questionCount = pending?.questions.length ?? answers.length;
97
+ const envelope = buildResult(answers, { cancelled, questionCount });
98
+ const ok = answerPending(req.body.requestId, req.params.id, envelope);
99
+ if (!ok) {
100
+ return reply.code(404).send({ error: "request_not_found" });
101
+ }
102
+ return reply.code(204).send();
103
+ });
104
+ };
105
+ //# sourceMappingURL=ask-user-question.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../src/routes/ask-user-question.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ export declare function verifyHmac(token: string): string | undefined;
3
+ export declare function extractBearer(header: string | undefined): string | undefined;
4
+ export declare function authEnabled(): boolean;
5
+ export declare const versionRoutes: FastifyPluginAsync;
6
+ export declare const healthRoutes: FastifyPluginAsync;
7
+ export declare const authRoutes: FastifyPluginAsync;
8
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAmBlD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgB5D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AA8CD,eAAO,MAAM,aAAa,EAAE,kBA8E3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,kBA2B1B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,kBAgExB,CAAC"}