@skaile/workspaces 5.17.0 → 5.18.1

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 (332) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{asset-feeds-MALYFZUM.js → asset-feeds-MKB5JUML.js} +21 -21
  3. package/dist/{asset-feeds-MALYFZUM.js.map → asset-feeds-MKB5JUML.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +8 -8
  5. package/dist/asset-manager/index.js +18 -14
  6. package/dist/asset-manager/installer.js +10 -10
  7. package/dist/asset-manager/renderers.js +9 -9
  8. package/dist/asset-manager/src/index.d.ts +122 -5
  9. package/dist/asset-manager/src/index.d.ts.map +1 -1
  10. package/dist/asset-manager/src/installer.d.ts +13 -10
  11. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  12. package/dist/asset-manager/src/mcp-config.d.ts +61 -1
  13. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
  14. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  15. package/dist/bridge/drivers/claude-sdk.js +12 -12
  16. package/dist/bridge/drivers/codex.js +12 -12
  17. package/dist/bridge/drivers/continue.js +11 -11
  18. package/dist/bridge/drivers/echo.js +27 -8
  19. package/dist/bridge/drivers/echo.js.map +1 -1
  20. package/dist/bridge/drivers/gemini.js +7 -7
  21. package/dist/bridge/drivers/goose.js +11 -11
  22. package/dist/bridge/drivers/omp.js +31 -5
  23. package/dist/bridge/drivers/omp.js.map +1 -1
  24. package/dist/bridge/drivers/opencode.js +11 -11
  25. package/dist/bridge/drivers/qwen.js +7 -7
  26. package/dist/bridge/index.js +14 -14
  27. package/dist/bridge/src/driver-model-check.d.ts +8 -8
  28. package/dist/bridge/src/driver-model-check.d.ts.map +1 -1
  29. package/dist/bridge/src/drivers/echo.d.ts +3 -0
  30. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  31. package/dist/bridge/src/drivers/omp-models-yml.d.ts +5 -0
  32. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
  33. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  34. package/dist/bridge/src/index.d.ts +1 -1
  35. package/dist/bridge/src/index.d.ts.map +1 -1
  36. package/dist/{chunk-CWAWYXD5.js → chunk-2ABUJYVI.js} +3 -3
  37. package/dist/{chunk-CWAWYXD5.js.map → chunk-2ABUJYVI.js.map} +1 -1
  38. package/dist/{chunk-ZVZTCDUN.js → chunk-2NOLF7B2.js} +37 -9
  39. package/dist/chunk-2NOLF7B2.js.map +1 -0
  40. package/dist/{chunk-QSLXB44M.js → chunk-34C2EKWJ.js} +3 -3
  41. package/dist/{chunk-QSLXB44M.js.map → chunk-34C2EKWJ.js.map} +1 -1
  42. package/dist/{chunk-3OYOBTY4.js → chunk-3KMREAR2.js} +3 -3
  43. package/dist/{chunk-3OYOBTY4.js.map → chunk-3KMREAR2.js.map} +1 -1
  44. package/dist/{chunk-D54T2F54.js → chunk-5TBFN46Z.js} +4 -4
  45. package/dist/chunk-5TBFN46Z.js.map +1 -0
  46. package/dist/{chunk-PGZDSDOB.js → chunk-6Z5KTFJT.js} +3 -3
  47. package/dist/{chunk-PGZDSDOB.js.map → chunk-6Z5KTFJT.js.map} +1 -1
  48. package/dist/{chunk-WY22FMZF.js → chunk-7ANRSTNR.js} +5 -5
  49. package/dist/{chunk-WY22FMZF.js.map → chunk-7ANRSTNR.js.map} +1 -1
  50. package/dist/{chunk-GYZJKZPJ.js → chunk-7FHZB2QU.js} +3 -3
  51. package/dist/{chunk-GYZJKZPJ.js.map → chunk-7FHZB2QU.js.map} +1 -1
  52. package/dist/{chunk-QBY74UBH.js → chunk-AIBAOXDU.js} +7 -7
  53. package/dist/{chunk-QBY74UBH.js.map → chunk-AIBAOXDU.js.map} +1 -1
  54. package/dist/{chunk-ZPCABSSW.js → chunk-BBWSGVVE.js} +4 -4
  55. package/dist/{chunk-ZPCABSSW.js.map → chunk-BBWSGVVE.js.map} +1 -1
  56. package/dist/{chunk-QEX75L77.js → chunk-BO426QWN.js} +13 -7
  57. package/dist/chunk-BO426QWN.js.map +1 -0
  58. package/dist/{chunk-46IRZJV4.js → chunk-CD7SVH6W.js} +4 -4
  59. package/dist/{chunk-46IRZJV4.js.map → chunk-CD7SVH6W.js.map} +1 -1
  60. package/dist/{chunk-WKEBNB5S.js → chunk-CKBCX3HQ.js} +4 -4
  61. package/dist/{chunk-WKEBNB5S.js.map → chunk-CKBCX3HQ.js.map} +1 -1
  62. package/dist/{chunk-H7R7R5BN.js → chunk-CKICWXMU.js} +18 -15
  63. package/dist/chunk-CKICWXMU.js.map +1 -0
  64. package/dist/{chunk-YK3XLEQJ.js → chunk-CKNIYIV2.js} +83 -77
  65. package/dist/chunk-CKNIYIV2.js.map +1 -0
  66. package/dist/{chunk-SPV2CXJ3.js → chunk-D6UBEYQH.js} +4 -4
  67. package/dist/{chunk-SPV2CXJ3.js.map → chunk-D6UBEYQH.js.map} +1 -1
  68. package/dist/{chunk-D5REDKVU.js → chunk-FKU57Q5Q.js} +3 -3
  69. package/dist/{chunk-D5REDKVU.js.map → chunk-FKU57Q5Q.js.map} +1 -1
  70. package/dist/{chunk-5SWED2LW.js → chunk-GBYNC5V3.js} +3 -3
  71. package/dist/{chunk-5SWED2LW.js.map → chunk-GBYNC5V3.js.map} +1 -1
  72. package/dist/{chunk-YW2BNDSE.js → chunk-GOCWM7FN.js} +22 -4
  73. package/dist/chunk-GOCWM7FN.js.map +1 -0
  74. package/dist/{chunk-ZWUJ22RF.js → chunk-GOK4QRJR.js} +16 -23
  75. package/dist/chunk-GOK4QRJR.js.map +1 -0
  76. package/dist/{chunk-AP24HESN.js → chunk-H6UVIKQ2.js} +3 -3
  77. package/dist/{chunk-AP24HESN.js.map → chunk-H6UVIKQ2.js.map} +1 -1
  78. package/dist/{chunk-ES6ARJPQ.js → chunk-HPVMTX6M.js} +15 -10
  79. package/dist/chunk-HPVMTX6M.js.map +1 -0
  80. package/dist/{chunk-BVXXBZWA.js → chunk-IW6F6R2W.js} +24 -15
  81. package/dist/chunk-IW6F6R2W.js.map +1 -0
  82. package/dist/{chunk-HUKUYWBJ.js → chunk-JYWW32JI.js} +17 -6
  83. package/dist/chunk-JYWW32JI.js.map +1 -0
  84. package/dist/{chunk-5RDZ5JHH.js → chunk-KC6HGWXN.js} +4 -4
  85. package/dist/{chunk-5RDZ5JHH.js.map → chunk-KC6HGWXN.js.map} +1 -1
  86. package/dist/{chunk-FACRITOL.js → chunk-KSBDLCZI.js} +8 -4
  87. package/dist/chunk-KSBDLCZI.js.map +1 -0
  88. package/dist/{chunk-LQT2IKYY.js → chunk-KY4UXX7M.js} +2 -2
  89. package/dist/{chunk-LQT2IKYY.js.map → chunk-KY4UXX7M.js.map} +1 -1
  90. package/dist/{chunk-L6UMSKDF.js → chunk-LW7ZI6EQ.js} +8 -36
  91. package/dist/chunk-LW7ZI6EQ.js.map +1 -0
  92. package/dist/{chunk-DR5ZOEYI.js → chunk-OYIENLJI.js} +32 -18
  93. package/dist/chunk-OYIENLJI.js.map +1 -0
  94. package/dist/{chunk-EOKWTN4N.js → chunk-PBSN4RTV.js} +44 -29
  95. package/dist/chunk-PBSN4RTV.js.map +1 -0
  96. package/dist/{chunk-WXWQNJCT.js → chunk-PUK7TQT4.js} +3 -3
  97. package/dist/{chunk-WXWQNJCT.js.map → chunk-PUK7TQT4.js.map} +1 -1
  98. package/dist/{chunk-5DCOG5B5.js → chunk-RD6N2D7I.js} +3 -3
  99. package/dist/{chunk-5DCOG5B5.js.map → chunk-RD6N2D7I.js.map} +1 -1
  100. package/dist/{chunk-OXUCYHL5.js → chunk-RP3FZ2T6.js} +53 -16
  101. package/dist/chunk-RP3FZ2T6.js.map +1 -0
  102. package/dist/{chunk-6GSE63K2.js → chunk-SRNCN4X2.js} +13 -5
  103. package/dist/chunk-SRNCN4X2.js.map +1 -0
  104. package/dist/{chunk-PIC23DDE.js → chunk-T2TQAH2X.js} +42 -11
  105. package/dist/chunk-T2TQAH2X.js.map +1 -0
  106. package/dist/{chunk-SXWGLW23.js → chunk-U2FI547Z.js} +4 -4
  107. package/dist/{chunk-SXWGLW23.js.map → chunk-U2FI547Z.js.map} +1 -1
  108. package/dist/{chunk-KZWZRNIY.js → chunk-U7V5SIFW.js} +55 -17
  109. package/dist/chunk-U7V5SIFW.js.map +1 -0
  110. package/dist/{chunk-EYDRONKO.js → chunk-V3D4HQMS.js} +4 -4
  111. package/dist/{chunk-EYDRONKO.js.map → chunk-V3D4HQMS.js.map} +1 -1
  112. package/dist/{chunk-D3PU3C6F.js → chunk-VKPBUPH7.js} +41 -15
  113. package/dist/chunk-VKPBUPH7.js.map +1 -0
  114. package/dist/{chunk-W44KA24A.js → chunk-VM3PH7BB.js} +695 -96
  115. package/dist/chunk-VM3PH7BB.js.map +1 -0
  116. package/dist/{chunk-HLETG3CX.js → chunk-VOBXINUZ.js} +3 -3
  117. package/dist/{chunk-HLETG3CX.js.map → chunk-VOBXINUZ.js.map} +1 -1
  118. package/dist/{chunk-FT4ZHLYR.js → chunk-WDXZA7QW.js} +33 -3
  119. package/dist/chunk-WDXZA7QW.js.map +1 -0
  120. package/dist/{chunk-FSSRBWYL.js → chunk-WJCQFNF6.js} +4 -4
  121. package/dist/chunk-WJCQFNF6.js.map +1 -0
  122. package/dist/{chunk-2SKPPIV7.js → chunk-WJLYL6RY.js} +5 -5
  123. package/dist/{chunk-2SKPPIV7.js.map → chunk-WJLYL6RY.js.map} +1 -1
  124. package/dist/{chunk-MMARPEV7.js → chunk-WMF2C5U7.js} +6 -6
  125. package/dist/{chunk-MMARPEV7.js.map → chunk-WMF2C5U7.js.map} +1 -1
  126. package/dist/{chunk-OQN7PCI4.js → chunk-X3AUS4RW.js} +4 -4
  127. package/dist/{chunk-OQN7PCI4.js.map → chunk-X3AUS4RW.js.map} +1 -1
  128. package/dist/{chunk-BBRMS4IC.js → chunk-X6GUNN7X.js} +8 -8
  129. package/dist/{chunk-BBRMS4IC.js.map → chunk-X6GUNN7X.js.map} +1 -1
  130. package/dist/{chunk-QXA2W6UB.js → chunk-XTO436PV.js} +3 -3
  131. package/dist/{chunk-QXA2W6UB.js.map → chunk-XTO436PV.js.map} +1 -1
  132. package/dist/{chunk-QW534EZB.js → chunk-YARXR3CN.js} +53 -8
  133. package/dist/chunk-YARXR3CN.js.map +1 -0
  134. package/dist/{chunk-FSLVMZXR.js → chunk-YZ3N7IUU.js} +72 -31
  135. package/dist/chunk-YZ3N7IUU.js.map +1 -0
  136. package/dist/{chunk-V5CDPKDA.js → chunk-ZBMC6IAE.js} +44 -27
  137. package/dist/chunk-ZBMC6IAE.js.map +1 -0
  138. package/dist/cli/index.js +346 -147
  139. package/dist/cli/index.js.map +1 -1
  140. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  141. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  142. package/dist/cli/src/commands/config.d.ts.map +1 -1
  143. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  144. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  145. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  146. package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
  147. package/dist/cli/src/commands/plugin/codex.d.ts +6 -0
  148. package/dist/cli/src/commands/plugin/codex.d.ts.map +1 -1
  149. package/dist/cli/src/commands/project.d.ts.map +1 -1
  150. package/dist/cli/src/commands/run.d.ts.map +1 -1
  151. package/dist/cli/src/commands/serve.d.ts +5 -0
  152. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  153. package/dist/cli/src/commands/source.d.ts.map +1 -1
  154. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  155. package/dist/cli/src/commands/verify.d.ts.map +1 -1
  156. package/dist/cli/src/driver-error.d.ts +3 -1
  157. package/dist/cli/src/driver-error.d.ts.map +1 -1
  158. package/dist/cli/src/helpers.d.ts +6 -4
  159. package/dist/cli/src/helpers.d.ts.map +1 -1
  160. package/dist/cli/src/plugin-store/index.d.ts +6 -0
  161. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  162. package/dist/cli/src/skill-checks.d.ts +4 -3
  163. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  164. package/dist/connectors/config.js +5 -5
  165. package/dist/connectors/index.js +20 -20
  166. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  167. package/dist/connectors/src/connector-types.d.ts +5 -0
  168. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  169. package/dist/connectors/src/watcher.d.ts.map +1 -1
  170. package/dist/{connectors-CIEIMJY2.js → connectors-YNQ3WJGM.js} +23 -23
  171. package/dist/{connectors-CIEIMJY2.js.map → connectors-YNQ3WJGM.js.map} +1 -1
  172. package/dist/core/index.js +7 -7
  173. package/dist/core/manifest.js +2 -2
  174. package/dist/core/models.js +1 -1
  175. package/dist/core/publish-manifest.js +3 -3
  176. package/dist/core/ref.js +1 -1
  177. package/dist/core/runtime-assets.js +5 -5
  178. package/dist/core/src/bind.d.ts +30 -0
  179. package/dist/core/src/bind.d.ts.map +1 -0
  180. package/dist/core/src/index.d.ts +4 -3
  181. package/dist/core/src/index.d.ts.map +1 -1
  182. package/dist/core/src/lock.d.ts +11 -2
  183. package/dist/core/src/lock.d.ts.map +1 -1
  184. package/dist/core/src/manifest.d.ts.map +1 -1
  185. package/dist/core/src/models.d.ts +19 -0
  186. package/dist/core/src/models.d.ts.map +1 -1
  187. package/dist/core/src/publish-manifest.d.ts +15 -13
  188. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  189. package/dist/core/src/store.d.ts +2 -1
  190. package/dist/core/src/store.d.ts.map +1 -1
  191. package/dist/core/src/workspace-config.d.ts +26 -1
  192. package/dist/core/src/workspace-config.d.ts.map +1 -1
  193. package/dist/core/store.js +1 -1
  194. package/dist/core/workspace-config.js +4 -4
  195. package/dist/deploy/index.js +7 -7
  196. package/dist/discovery/index.js +5 -5
  197. package/dist/discovery/src/parse-manifest.d.ts +1 -1
  198. package/dist/discovery/src/source-config.d.ts +2 -1
  199. package/dist/discovery/src/source-config.d.ts.map +1 -1
  200. package/dist/{ensure-sources-I62QMZZP.js → ensure-sources-UJWEZSR3.js} +21 -17
  201. package/dist/ensure-sources-UJWEZSR3.js.map +1 -0
  202. package/dist/factory-assets/connectors/box.js +20 -20
  203. package/dist/factory-assets/connectors/deploy.js +20 -20
  204. package/dist/factory-assets/connectors/devserver.js +20 -20
  205. package/dist/factory-assets/connectors/flow/adapter.js +20 -20
  206. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  207. package/dist/factory-assets/connectors/flow/run-flow.js +22 -22
  208. package/dist/factory-assets/connectors/flow.js +20 -20
  209. package/dist/factory-assets/connectors/git.js +20 -20
  210. package/dist/factory-assets/connectors/gmail.js +20 -20
  211. package/dist/factory-assets/connectors/googledrive.js +20 -20
  212. package/dist/factory-assets/connectors/local.js +20 -20
  213. package/dist/factory-assets/connectors/mattermost.js +20 -20
  214. package/dist/factory-assets/connectors/memory.js +20 -20
  215. package/dist/factory-assets/connectors/minio.js +20 -20
  216. package/dist/factory-assets/connectors/postgres.js +20 -20
  217. package/dist/factory-assets/connectors/s3.js +20 -20
  218. package/dist/factory-assets/connectors/sharepoint.js +20 -20
  219. package/dist/factory-assets/connectors/sqlite.js +20 -20
  220. package/dist/factory-assets/connectors/static-server.js +20 -20
  221. package/dist/factory-assets/connectors/tunnel.js +20 -20
  222. package/dist/factory-assets/connectors/webdav.js +20 -20
  223. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts +1 -1
  224. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
  225. package/dist/factory-assets/connectors/xstate-store.js +20 -20
  226. package/dist/factory-assets/connectors/xstate.js +20 -20
  227. package/dist/{flows-YKC53LDP.js → flows-BHY73K3O.js} +12 -12
  228. package/dist/{flows-YKC53LDP.js.map → flows-BHY73K3O.js.map} +1 -1
  229. package/dist/{helpers-3FOM37BO.js → helpers-3CG7ZVX4.js} +21 -17
  230. package/dist/{helpers-3FOM37BO.js.map → helpers-3CG7ZVX4.js.map} +1 -1
  231. package/dist/library/index.js +11 -11
  232. package/dist/library/install.js +4 -4
  233. package/dist/library/src/index.d.ts +1 -1
  234. package/dist/library/src/index.d.ts.map +1 -1
  235. package/dist/library/src/manifest-writer.d.ts +17 -1
  236. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  237. package/dist/{library-publish-EFKITCGE.js → library-publish-NWWVYJUK.js} +60 -63
  238. package/dist/library-publish-NWWVYJUK.js.map +1 -0
  239. package/dist/model-endpoint/index.js +10 -10
  240. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  241. package/dist/open-library-7ZG2FFAX.js +42 -0
  242. package/dist/{open-library-NZUI4XGF.js.map → open-library-7ZG2FFAX.js.map} +1 -1
  243. package/dist/open-registry-RBELV5YH.js +32 -0
  244. package/dist/{open-registry-YPRQDUMK.js.map → open-registry-RBELV5YH.js.map} +1 -1
  245. package/dist/paths-BFM6K2QO.js +22 -0
  246. package/dist/{paths-P55DTBEK.js.map → paths-BFM6K2QO.js.map} +1 -1
  247. package/dist/plugin-store-QOQDM24E.js +23 -0
  248. package/dist/{plugin-store-IPIBZRBX.js.map → plugin-store-QOQDM24E.js.map} +1 -1
  249. package/dist/{project-2BNFZ2CR.js → project-YQM3I25D.js} +45 -45
  250. package/dist/{project-2BNFZ2CR.js.map → project-YQM3I25D.js.map} +1 -1
  251. package/dist/resolver/index.js +8 -8
  252. package/dist/runner/index.js +37 -37
  253. package/dist/runner/src/agent.d.ts.map +1 -1
  254. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  255. package/dist/sdk/asset-manager.js +18 -14
  256. package/dist/sdk/bridge.js +14 -14
  257. package/dist/sdk/core.js +7 -7
  258. package/dist/sdk/flow.js +9 -9
  259. package/dist/sdk/index.js +37 -37
  260. package/dist/sdk/resolver.js +8 -8
  261. package/dist/sdk/runner.js +37 -37
  262. package/dist/sdk/transport/ws/server.js +19 -1
  263. package/dist/sdk/transport/ws.js +19 -1
  264. package/dist/sdk/transport.js +19 -1
  265. package/dist/{serve-preflight-V5GM33T3.js → serve-preflight-5QMY7DBC.js} +9 -9
  266. package/dist/{serve-preflight-V5GM33T3.js.map → serve-preflight-5QMY7DBC.js.map} +1 -1
  267. package/dist/{setup-ZMAPTKJW.js → setup-AAHVAXRA.js} +28 -24
  268. package/dist/setup-AAHVAXRA.js.map +1 -0
  269. package/dist/{skills-7G6QCDEM.js → skills-RSZVUIYZ.js} +13 -13
  270. package/dist/{skills-7G6QCDEM.js.map → skills-RSZVUIYZ.js.map} +1 -1
  271. package/dist/{source-6BZA34F5.js → source-KWMCMEMB.js} +47 -47
  272. package/dist/{source-6BZA34F5.js.map → source-KWMCMEMB.js.map} +1 -1
  273. package/dist/{source-manifest-publish-MJXCSUKT.js → source-manifest-publish-EDYKM4YZ.js} +49 -49
  274. package/dist/{source-manifest-publish-MJXCSUKT.js.map → source-manifest-publish-EDYKM4YZ.js.map} +1 -1
  275. package/dist/transport/index.js +19 -1
  276. package/dist/transport/src/ws/server.d.ts +2 -16
  277. package/dist/transport/src/ws/server.d.ts.map +1 -1
  278. package/dist/transport/ws/server.js +19 -1
  279. package/dist/transport/ws.js +19 -1
  280. package/dist/tui/index.js +54 -42
  281. package/dist/tui/index.js.map +1 -1
  282. package/dist/tui/src/repl.d.ts +4 -1
  283. package/dist/tui/src/repl.d.ts.map +1 -1
  284. package/dist/types/manifests.js +1 -1
  285. package/dist/types/src/manifests/index.d.ts +1 -1
  286. package/dist/types/src/manifests/index.d.ts.map +1 -1
  287. package/dist/types/src/manifests/scaffold-body.d.ts +8 -0
  288. package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
  289. package/dist/types/src/manifests/skill.d.ts +0 -2
  290. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  291. package/dist/workspace-plugin/adapters/mcp.js +27 -27
  292. package/dist/workspace-plugin/adapters/omp.js +32 -18
  293. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  294. package/dist/workspace-plugin/index.js +1 -1
  295. package/dist/workspace-plugin/src/adapters/claude-code.d.ts +1 -1
  296. package/dist/workspace-plugin/src/adapters/omp.d.ts +8 -5
  297. package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
  298. package/dist/workspace-plugin/src/plugin.d.ts +7 -1
  299. package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
  300. package/package.json +1 -1
  301. package/dist/chunk-6GSE63K2.js.map +0 -1
  302. package/dist/chunk-BVXXBZWA.js.map +0 -1
  303. package/dist/chunk-D3PU3C6F.js.map +0 -1
  304. package/dist/chunk-D54T2F54.js.map +0 -1
  305. package/dist/chunk-DR5ZOEYI.js.map +0 -1
  306. package/dist/chunk-EOKWTN4N.js.map +0 -1
  307. package/dist/chunk-ES6ARJPQ.js.map +0 -1
  308. package/dist/chunk-FACRITOL.js.map +0 -1
  309. package/dist/chunk-FSLVMZXR.js.map +0 -1
  310. package/dist/chunk-FSSRBWYL.js.map +0 -1
  311. package/dist/chunk-FT4ZHLYR.js.map +0 -1
  312. package/dist/chunk-H7R7R5BN.js.map +0 -1
  313. package/dist/chunk-HUKUYWBJ.js.map +0 -1
  314. package/dist/chunk-KZWZRNIY.js.map +0 -1
  315. package/dist/chunk-L6UMSKDF.js.map +0 -1
  316. package/dist/chunk-OXUCYHL5.js.map +0 -1
  317. package/dist/chunk-PIC23DDE.js.map +0 -1
  318. package/dist/chunk-QEX75L77.js.map +0 -1
  319. package/dist/chunk-QW534EZB.js.map +0 -1
  320. package/dist/chunk-V5CDPKDA.js.map +0 -1
  321. package/dist/chunk-W44KA24A.js.map +0 -1
  322. package/dist/chunk-YK3XLEQJ.js.map +0 -1
  323. package/dist/chunk-YW2BNDSE.js.map +0 -1
  324. package/dist/chunk-ZVZTCDUN.js.map +0 -1
  325. package/dist/chunk-ZWUJ22RF.js.map +0 -1
  326. package/dist/ensure-sources-I62QMZZP.js.map +0 -1
  327. package/dist/library-publish-EFKITCGE.js.map +0 -1
  328. package/dist/open-library-NZUI4XGF.js +0 -40
  329. package/dist/open-registry-YPRQDUMK.js +0 -32
  330. package/dist/paths-P55DTBEK.js +0 -22
  331. package/dist/plugin-store-IPIBZRBX.js +0 -23
  332. package/dist/setup-ZMAPTKJW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../model-endpoint/src/types.ts","../model-endpoint/src/resolve.ts","../model-endpoint/src/openai-shared.ts","../model-endpoint/src/openai-chat.ts","../model-endpoint/src/openai-responses.ts","../model-endpoint/src/server.ts"],"names":["parseTools","item","isRecord","chunk"],"mappings":"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","file":"chunk-GOK4QRJR.js","sourcesContent":["/**\n * Shared types of the model endpoint.\n *\n * No import from pi-ai lives here, not even a type-only one: this file is part of\n * the public `.d.ts` of `@skaile/workspaces/model-endpoint`, and pi-ai is an\n * optional peer. A consumer without it must still type-check (p1007). The shapes\n * below describe what the server needs of pi-ai structurally; `server.ts` and\n * `resolve.ts` cast to pi-ai's own types at the call into pi-ai.\n */\n\nimport type { MergedAIProviderRegistry } from \"@skaile/workspaces/core/provider-registry\";\n\n/** The fields of a pi-ai `Model` the endpoint sets (pi-ai's own type is assignable to it). */\nexport interface PiModel {\n /** Provider-side model id (`model_map`). */\n id: string;\n /** Logical id the caller asked for. */\n name: string;\n /** Surface of the registry entry (pi-ai `Api`). */\n api: string;\n /** Registry id of the entry. */\n provider: string;\n /** pi-ready entry endpoint. */\n baseUrl: string;\n input: Array<\"text\" | \"image\">;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number };\n reasoning: boolean;\n contextWindow: number;\n maxTokens: number;\n headers?: Record<string, string>;\n}\n\n/** Everything one upstream call needs. */\nexport interface ResolvedModel {\n /** Registry id of the entry the model routes to. */\n providerId: string;\n /** Model id the caller asked for, after `@role` / provider-prefix stripping. */\n logicalId: string;\n /** pi model: `api` = entry surface, `baseUrl` = pi-ready entry endpoint, `id` = provider-side id (`model_map`). */\n model: PiModel;\n /** Resolved credential; `undefined` only for entries with an ambient credential chain. */\n apiKey?: string;\n /** Static `entry.headers`. */\n headers?: Record<string, string>;\n}\n\n/** One request-log line sink. */\nexport type ModelEndpointLog = (line: string) => void;\n\n/**\n * pi-ai's per-surface `stream`, widened to the shape the server calls. The\n * context and the event type are pi-ai's `TranscriptContext` and\n * `AssistantMessageEventStream`.\n */\nexport type StreamFn = (\n model: PiModel,\n context: unknown,\n options?: Record<string, unknown>,\n) => AsyncIterable<unknown>;\n\n/** The parts of a pi-ai `api/<surface>` module the server calls. */\nexport interface PiApiModule {\n stream: StreamFn;\n streamSimple?: StreamFn;\n}\n\n/** Options of `startModelEndpoint`. */\nexport interface ModelEndpointOptions {\n /** Live registry view; read on every request so a `session_init` can swap it. */\n getRegistry(): MergedAIProviderRegistry;\n /** Env that credential refs and `SKAILE_AIP_<ID>_KEY` values resolve against; read per request. */\n getLookupEnv(): Record<string, string | undefined>;\n /** Roles table for `@role` selectors. */\n getRoles?(): Record<string, string> | undefined;\n /** Bearer token every request must present. */\n token: string;\n /** Bind address. Default `\"127.0.0.1\"`. */\n host?: string;\n /** Bind port. Default `0` (ephemeral). */\n port?: number;\n /**\n * Project directory pi-ai is looked up from first (`<projectDir>/node_modules`);\n * the copy next to skaile is the fallback. Default: the current directory.\n */\n projectDir?: string;\n /** Request-log sink. */\n log?: ModelEndpointLog;\n /**\n * Test seam: override pi-ai api loading. Default: dynamic import of `@earendil-works/pi-ai/api/<surface>`.\n * `streamSimple` (every pi api module exports it) is used when the request asks for reasoning:\n * only it maps a provider-neutral thinking level onto the surface's own effort field.\n */\n loadApi?(surface: string): Promise<PiApiModule>;\n /** Test seam for the `/v1/embeddings` pass-through. Default `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\n/** A running endpoint. */\nexport interface ModelEndpointHandle {\n /** `http://${host}:${port}/v1` — what an OpenAI SDK takes as `baseURL`. */\n url: string;\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\n/** The OpenAI error `type` values the endpoint emits. */\nexport type ModelEndpointErrorType =\n | \"invalid_request_error\"\n | \"authentication_error\"\n | \"not_found_error\"\n | \"upstream_error\"\n | \"server_error\";\n\n/**\n * A failure with a defined HTTP shape. Translators and the resolver throw it\n * so the server can render the OpenAI-style `{ error: {...} }` body without\n * each call site knowing about HTTP.\n */\nexport class ModelEndpointError extends Error {\n readonly status: number;\n readonly type: ModelEndpointErrorType;\n readonly code?: string;\n\n constructor(status: number, message: string, code?: string, type?: ModelEndpointErrorType) {\n super(message);\n this.name = \"ModelEndpointError\";\n this.status = status;\n this.type = type ?? defaultErrorType(status);\n if (code !== undefined) this.code = code;\n }\n}\n\n/** Default OpenAI `type` for an HTTP status. */\nfunction defaultErrorType(status: number): ModelEndpointErrorType {\n if (status === 401 || status === 403) return \"authentication_error\";\n if (status === 404) return \"not_found_error\";\n if (status === 502 || status === 503 || status === 504) return \"upstream_error\";\n if (status >= 500 && status !== 501) return \"server_error\";\n return \"invalid_request_error\";\n}\n","/**\n * Registry → pi `Model` + request auth.\n *\n * Reuses the registry's own resolution (`parseModelRef`, `entrySurface`,\n * `entryBaseUrl`, `entryCredentialValue`) so the endpoint routes exactly like a\n * harness driver does; the only logic added here is the pi-specific base-URL\n * spelling and the \"unknown model\" check `parseModelRef` does not make.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n type MergedAIProviderRegistry,\n parseModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { entryCredentialValue } from \"../../bridge/src/provider-materialize/credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n selectableEntries,\n} from \"../../bridge/src/provider-materialize/env-drivers.js\";\nimport { ModelEndpointError, type ResolvedModel } from \"./types.js\";\n\n/** What {@link resolveModel} reads from the live session. */\nexport interface ResolveDeps {\n registry: MergedAIProviderRegistry;\n lookupEnv: Record<string, string | undefined>;\n roles?: Record<string, string>;\n}\n\n/** Context window assumed when an entry declares no `capabilities`. */\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\n/** pi requires a max-token figure; the caller's `max_tokens` overrides it per request. */\nconst DEFAULT_MAX_TOKENS = 8192;\n/** Placeholder for keyless entries: pi's OpenAI adapter refuses an empty key. */\nconst KEYLESS_PLACEHOLDER = \"unused\";\n\n/**\n * The `baseUrl` pi-ai wants for a registry endpoint — the registry's canonical\n * value, minus trailing slashes. Verified against pi-ai 1.3.0 `dist/api/*`:\n *\n * - `anthropic-messages`: `new Anthropic({ baseURL: model.baseUrl })`; the SDK\n * appends `/v1/messages`. The registry stores Anthropic as its host root\n * (`normalizeEntryBaseUrl` strips a trailing `/v1`), which is what the SDK needs.\n * - `openai-completions` / `openai-responses`: `new OpenAI({ baseURL })`; the SDK\n * appends `/chat/completions` / `/responses`. OpenAI-style presets already carry\n * their `/v1` (openai, groq, openrouter, mistral, xai); deepseek serves the\n * same paths at its host root.\n * - `google-generative-ai`: pi sets `apiVersion: \"\"` and expects the version in\n * `baseUrl`; the preset already ends in `/v1beta`.\n * - Other surfaces (azure, bedrock, vertex, codex) are passed through unverified.\n *\n * Trailing slashes are dropped because Google's client concatenates `baseUrl` and\n * the path without normalising.\n */\nfunction piBaseUrl(_surface: AIProviderSurface, registryBaseUrl: string): string {\n return registryBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve a request's `model` selector to everything one upstream call needs.\n *\n * The selector is `<providerId>/<model>`, a bare model id, or `@role`\n * (see `parseModelRef`). An entry that declares models (`model_map` /\n * `capabilities`) is a closed list: ids outside it are 404, matching what\n * `/v1/models` advertises. An entry that declares none is open and forwards the\n * id to the provider unchanged (discovery-based presets).\n */\nexport function resolveModel(selector: string, deps: ResolveDeps): ResolvedModel {\n assertKnownProviderPrefix(selector, deps);\n const ref = parseModelRef(selector, deps.registry, deps.roles);\n if (!ref || ref.modelId === undefined) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const found = selectableEntries(deps.registry).find(([id]) => id === ref.providerId);\n if (!found) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const [providerId, entry] = found;\n const logicalId = ref.modelId;\n\n const declared = entryModelIds(entry);\n if (declared.length > 0 && !declared.some(([id]) => id === logicalId)) {\n throw new ModelEndpointError(\n 404,\n `model '${logicalId}' is not declared by provider '${providerId}'`,\n \"model_not_found\",\n );\n }\n\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n if (!surface || !baseUrl) {\n throw new ModelEndpointError(\n 502,\n `provider '${providerId}' is incomplete: it needs a surface and a base_url`,\n \"provider_incomplete\",\n );\n }\n\n const providerModelId = ref.providerModelId ?? logicalId;\n const caps = entry.capabilities?.[logicalId];\n const model: Model<Api> = {\n id: providerModelId,\n name: logicalId,\n api: surface,\n provider: providerId,\n baseUrl: piBaseUrl(surface, baseUrl),\n input: caps?.images === false ? [\"text\"] : [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: true,\n contextWindow: caps?.context_window ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: DEFAULT_MAX_TOKENS,\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n\n const apiKey =\n entryCredentialValue(providerId, entry, { env: deps.lookupEnv, allowCommand: false }) ??\n (isKeyless(entry) ? KEYLESS_PLACEHOLDER : undefined);\n\n return {\n providerId,\n logicalId,\n model,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n}\n\n/**\n * `<x>/<y>` whose `<x>` is no entry is a typo, not a vendor-scoped bare id: sent\n * upstream it would reach the first entry and fail there (or worse, succeed). It\n * is 404, unless an entry declares the whole string in its `model_map` /\n * `capabilities`. A model of an open entry is named `<entry>/<id>`\n * (`openrouter/meta-llama/x`).\n */\nfunction assertKnownProviderPrefix(selector: string, deps: ResolveDeps): void {\n let target = selector.trim();\n if (target.startsWith(\"@\")) target = deps.roles?.[target.slice(1)]?.trim() ?? \"\";\n const slash = target.indexOf(\"/\");\n if (slash <= 0 || target.startsWith(\"@\")) return;\n const entries = selectableEntries(deps.registry);\n const head = target.slice(0, slash);\n if (entries.some(([id]) => id === head)) return;\n if (\n entries.some(\n ([, entry]) => entry.model_map?.[target] !== undefined || entry.capabilities?.[target],\n )\n ) {\n return;\n }\n throw new ModelEndpointError(\n 404,\n `model '${selector}' not found: '${head}' is not a provider of this endpoint (providers: ${entries.map(([id]) => id).join(\", \")})`,\n \"model_not_found\",\n );\n}\n\n/** True when the entry names no credential at all (local runtimes such as Ollama). */\nfunction isKeyless(entry: AIProviderLlmEntry): boolean {\n return !entry.preset && (!entry.credential || entry.credential.kind === \"none\");\n}\n\n/**\n * Ids of the entries that declare no models: any `<id>/<model>` is forwarded to\n * them as is, so `/v1/models` cannot list models for them.\n */\nexport function listPassThroughProviders(registry: MergedAIProviderRegistry): string[] {\n return selectableEntries(registry)\n .filter(([, entry]) => entryModelIds(entry).length === 0)\n .map(([providerId]) => providerId);\n}\n\n/**\n * Every model a caller can name, as `/v1/models` entries: ids are\n * `<providerId>/<logicalId>` so two providers serving the same logical id stay\n * distinguishable. Bare logical ids remain accepted on request.\n */\nexport function listModels(\n registry: MergedAIProviderRegistry,\n): Array<{ id: string; owned_by: string }> {\n return selectableEntries(registry).flatMap(([providerId, entry]) =>\n entryModelIds(entry).map(([logicalId]) => ({\n id: `${providerId}/${logicalId}`,\n owned_by: providerId,\n })),\n );\n}\n","import type {\n AssistantMessage,\n Context,\n ImageContent,\n JsonObject,\n Message,\n SamplingParams,\n ThinkingLevel,\n Tool,\n ToolResultMessage,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Model-call options both OpenAI surfaces translate into pi `stream()` options. */\nexport interface ModelRequestOptions {\n temperature?: number;\n maxTokens?: number;\n samplingParams?: SamplingParams;\n reasoning?: ThinkingLevel;\n}\n\n/**\n * Surface-independent result of parsing an OpenAI request. Both translators\n * return this so the server can drive pi without knowing which wire format\n * the caller spoke.\n */\nexport interface ParsedModelRequest {\n model: string;\n context: Context;\n options: ModelRequestOptions;\n stream: boolean;\n includeUsage: boolean;\n}\n\nconst THINKING_LEVELS: readonly ThinkingLevel[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n/** `400 invalid_request_error` for malformed or unsupported caller input. */\nexport function badRequest(message: string): ModelEndpointError {\n return new ModelEndpointError(400, message);\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function requireModel(body: Record<string, unknown>): string {\n if (typeof body.model !== \"string\" || body.model.length === 0) {\n throw badRequest(\"model is required\");\n }\n return body.model;\n}\n\nexport function optionalBoolean(value: unknown, field: string): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value !== \"boolean\") throw badRequest(`${field} must be a boolean`);\n return value;\n}\n\nexport function optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw badRequest(`${field} must be a number`);\n return value;\n}\n\nexport function optionalPositiveInt(value: unknown, field: string): number | undefined {\n const n = optionalNumber(value, field);\n if (n === undefined) return undefined;\n if (!Number.isInteger(n) || n <= 0) throw badRequest(`${field} must be a positive integer`);\n return n;\n}\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n/** `none` (or absent) disables reasoning; anything else must be a pi thinking level. */\nexport function parseReasoningEffort(value: unknown, field: string): ThinkingLevel | undefined {\n if (value === undefined || value === null || value === \"none\") return undefined;\n if (typeof value === \"string\" && isThinkingLevel(value)) return value;\n throw badRequest(`${field} must be one of none, ${THINKING_LEVELS.join(\", \")}`);\n}\n\n/**\n * Copies request fields pi has no named option for (top_p, seed, stop, ...)\n * into `samplingParams`, which OpenAI-compatible pi adapters merge into the\n * upstream body as-is.\n */\nexport function pickSamplingParams(\n body: Record<string, unknown>,\n keys: readonly string[],\n): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of keys) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n const ok =\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((v) => typeof v === \"string\"));\n if (!ok) throw badRequest(`${key} has an unsupported type`);\n picked[key] = value;\n }\n return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\nexport function buildOptions(parts: {\n temperature: number | undefined;\n maxTokens: number | undefined;\n samplingParams: SamplingParams | undefined;\n reasoning: ThinkingLevel | undefined;\n}): ModelRequestOptions {\n const options: ModelRequestOptions = {};\n if (parts.temperature !== undefined) options.temperature = parts.temperature;\n if (parts.maxTokens !== undefined) options.maxTokens = parts.maxTokens;\n if (parts.samplingParams !== undefined) options.samplingParams = parts.samplingParams;\n if (parts.reasoning !== undefined) options.reasoning = parts.reasoning;\n return options;\n}\n\nconst DATA_URL = /^data:([^;,]+)(?:;[^;,]*)*;base64,(.*)$/s;\n\n/**\n * Decodes a `data:` image URL into pi `ImageContent`. Remote URLs are rejected\n * on purpose: fetching caller-supplied URLs from the runner would be an SSRF\n * vector and the endpoint has no business doing I/O during translation.\n */\nexport function imageFromUrl(url: unknown, field: string): ImageContent {\n if (typeof url !== \"string\" || url.length === 0)\n throw badRequest(`${field} must be a non-empty string`);\n const match = DATA_URL.exec(url);\n if (!match) {\n throw badRequest(\n `${field}: only base64 data: image URLs are supported; http(s) image URLs are not fetched`,\n );\n }\n const mimeType = match[1] as string;\n if (!mimeType.startsWith(\"image/\"))\n throw badRequest(`${field}: data URL is not an image (${mimeType})`);\n return { type: \"image\", data: match[2] as string, mimeType };\n}\n\n/**\n * Tool `arguments` arrive as a JSON string; pi wants an object. Invalid JSON or a\n * non-object value becomes `{}` so one malformed history entry cannot fail the call.\n */\nexport function parseToolArguments(value: unknown): JsonObject {\n if (isRecord(value)) return value as JsonObject;\n if (typeof value !== \"string\" || value.trim().length === 0) return {};\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? (parsed as JsonObject) : {};\n } catch {\n return {};\n }\n}\n\nexport const DEFAULT_TOOL_PARAMETERS = { type: \"object\", properties: {} } as const;\n\nexport function toPiTool(name: string, description: unknown, parameters: unknown): Tool {\n return {\n name,\n description: typeof description === \"string\" ? description : \"\",\n parameters: (isRecord(parameters) ? parameters : DEFAULT_TOOL_PARAMETERS) as Tool[\"parameters\"],\n };\n}\n\n/**\n * Applies OpenAI `tool_choice` to the tool list. pi's `stream()` has no\n * tool-choice option, so the choice is enforced by what we declare: `none`\n * declares nothing, a named function declares only that function.\n */\nexport function selectTools(\n tools: Tool[],\n choice: unknown,\n forcedName: (choice: Record<string, unknown>) => unknown,\n): Tool[] {\n if (choice === undefined || choice === null || choice === \"auto\" || choice === \"required\")\n return tools;\n if (choice === \"none\") return [];\n if (isRecord(choice)) {\n const name = forcedName(choice);\n const matched = tools.filter((tool) => tool.name === name);\n if (typeof name !== \"string\" || matched.length === 0) {\n throw badRequest(\"tool_choice references an unknown function\");\n }\n return matched;\n }\n throw badRequest(\"tool_choice is not supported\");\n}\n\nexport function buildContext(systemParts: string[], messages: Message[], tools: Tool[]): Context {\n const context: Context = { messages };\n if (systemParts.length > 0) context.systemPrompt = systemParts.join(\"\\n\\n\");\n if (tools.length > 0) context.tools = tools;\n return context;\n}\n\nexport function emptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\n/** OpenAI counts cache reads/writes as prompt tokens; pi reports them separately. */\nexport function promptTokens(usage: Usage): number {\n return usage.input + usage.cacheRead + usage.cacheWrite;\n}\n\nexport function totalTokens(usage: Usage): number {\n return usage.totalTokens > 0 ? usage.totalTokens : promptTokens(usage) + usage.output;\n}\n\n/**\n * An assistant turn replayed from the caller's history. It is stamped with a\n * foreign api/provider so pi treats it as cross-provider history (dropping\n * provider-specific signatures) rather than as its own output.\n */\nexport function historyAssistant(\n model: string,\n content: AssistantMessage[\"content\"],\n): AssistantMessage {\n return {\n role: \"assistant\",\n content,\n api: \"openai-completions\",\n provider: \"openai\",\n model,\n usage: emptyUsage(),\n stopReason: content.some((block) => block.type === \"toolCall\") ? \"toolUse\" : \"stop\",\n timestamp: Date.now(),\n };\n}\n\nexport function historyToolResult(\n toolCallId: string,\n toolName: string,\n text: string,\n): ToolResultMessage {\n return {\n role: \"toolResult\",\n toolCallId,\n toolName,\n content: [{ type: \"text\", text }],\n isError: false,\n timestamp: Date.now(),\n };\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n StopReason,\n TextContent,\n Tool,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/chat/completions` body, in pi terms. */\nexport type ChatCompletionRequest = ParsedModelRequest;\n\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\";\n\nexport interface ChatCompletionToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport interface ChatCompletionMessage {\n role: \"assistant\";\n content: string | null;\n reasoning_content?: string;\n tool_calls?: ChatCompletionToolCall[];\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details: { cached_tokens: number };\n completion_tokens_details?: { reasoning_tokens: number };\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: Array<{ index: 0; message: ChatCompletionMessage; finish_reason: ChatFinishReason }>;\n usage: ChatCompletionUsage;\n}\n\nexport interface ChatCompletionChunkDelta {\n role?: \"assistant\";\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{ index: number } & ChatCompletionToolCall>;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: 0;\n delta: ChatCompletionChunkDelta;\n finish_reason: ChatFinishReason | null;\n }>;\n usage?: ChatCompletionUsage;\n}\n\nexport interface ChatResponseMeta {\n id: string;\n created: number;\n model: string;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction textOfParts(content: unknown, field: string, allowed: readonly string[]): string {\n if (content === undefined || content === null) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of text parts`);\n let text = \"\";\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n if (!isRecord(part) || typeof part.type !== \"string\" || !allowed.includes(part.type)) {\n throw badRequest(`${field}[${i}]: unsupported content part`);\n }\n const value = part.type === \"refusal\" ? part.refusal : part.text;\n if (typeof value !== \"string\")\n throw badRequest(\n `${field}[${i}].${part.type === \"refusal\" ? \"refusal\" : \"text\"} must be a string`,\n );\n text += value;\n }\n return text;\n}\n\nfunction parseUserContent(\n content: unknown,\n field: string,\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part)) throw badRequest(`${partField} must be an object`);\n if (part.type === \"text\") {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image_url\") {\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url.url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${String(part.type)}\"`);\n }\n }\n return parts;\n}\n\nfunction parseAssistantMessage(\n raw: Record<string, unknown>,\n field: string,\n model: string,\n toolNames: Map<string, string>,\n): AssistantMessage | undefined {\n const blocks: AssistantMessage[\"content\"] = [];\n const text = textOfParts(raw.content, `${field}.content`, [\"text\", \"refusal\"]);\n if (text.length > 0) blocks.push({ type: \"text\", text });\n if (raw.tool_calls !== undefined && raw.tool_calls !== null) {\n if (!Array.isArray(raw.tool_calls)) throw badRequest(`${field}.tool_calls must be an array`);\n for (let i = 0; i < raw.tool_calls.length; i++) {\n const call: unknown = raw.tool_calls[i];\n const callField = `${field}.tool_calls[${i}]`;\n if (!isRecord(call) || !isRecord(call.function))\n throw badRequest(`${callField} must be a function tool call`);\n if (call.type !== undefined && call.type !== \"function\")\n throw badRequest(`${callField}.type must be \"function\"`);\n if (typeof call.id !== \"string\" || call.id.length === 0)\n throw badRequest(`${callField}.id is required`);\n if (typeof call.function.name !== \"string\" || call.function.name.length === 0) {\n throw badRequest(`${callField}.function.name is required`);\n }\n toolNames.set(call.id, call.function.name);\n blocks.push({\n type: \"toolCall\",\n id: call.id,\n name: call.function.name,\n arguments: parseToolArguments(call.function.arguments),\n });\n }\n }\n // An empty assistant turn carries no information and some upstreams reject it.\n return blocks.length > 0 ? historyAssistant(model, blocks) : undefined;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\" || !isRecord(tool.function)) {\n throw badRequest(`tools[${i}] must be {type:\"function\", function:{...}}`);\n }\n const fn = tool.function;\n if (typeof fn.name !== \"string\" || fn.name.length === 0)\n throw badRequest(`tools[${i}].function.name is required`);\n tools.push(toPiTool(fn.name, fn.description, fn.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI chat-completions body and maps it to a pi `Context`.\n * System/developer messages collapse into `systemPrompt`; a tool message's\n * `toolName` is recovered from the earlier assistant `tool_calls` entry with the\n * same id because pi tool results carry the tool name and OpenAI's do not.\n * Unsupported features fail loudly with 400 instead of being silently dropped.\n */\nexport function parseChatCompletionRequest(body: unknown): ChatCompletionRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (!Array.isArray(body.messages) || body.messages.length === 0) {\n throw badRequest(\"messages must be a non-empty array\");\n }\n if (body.n !== undefined && body.n !== null && body.n !== 1) {\n throw badRequest(\"n must be 1; multiple choices are not supported\");\n }\n\n const systemParts: string[] = [];\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < body.messages.length; i++) {\n const raw: unknown = body.messages[i];\n const field = `messages[${i}]`;\n if (!isRecord(raw)) throw badRequest(`${field} must be an object`);\n switch (raw.role) {\n case \"system\":\n case \"developer\": {\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n if (text.length > 0) systemParts.push(text);\n break;\n }\n case \"user\":\n messages.push({\n role: \"user\",\n content: parseUserContent(raw.content, `${field}.content`),\n timestamp: Date.now(),\n });\n break;\n case \"assistant\": {\n const assistant = parseAssistantMessage(raw, field, model, toolNames);\n if (assistant) messages.push(assistant);\n break;\n }\n case \"tool\": {\n if (typeof raw.tool_call_id !== \"string\" || raw.tool_call_id.length === 0) {\n throw badRequest(`${field}.tool_call_id is required`);\n }\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n messages.push(\n historyToolResult(raw.tool_call_id, toolNames.get(raw.tool_call_id) ?? \"\", text),\n );\n break;\n }\n default:\n throw badRequest(`${field}.role \"${String(raw.role)}\" is not supported`);\n }\n }\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" && isRecord(choice.function) ? choice.function.name : undefined,\n );\n\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(\n body.max_completion_tokens ?? body.max_tokens,\n \"max_completion_tokens\",\n ),\n samplingParams: pickSamplingParams(body, [\n \"top_p\",\n \"frequency_penalty\",\n \"presence_penalty\",\n \"seed\",\n \"stop\",\n ]),\n reasoning: parseReasoningEffort(body.reasoning_effort, \"reasoning_effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: isRecord(body.stream_options) && body.stream_options.include_usage === true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction finishReason(stopReason: StopReason, errorMessage: string | undefined): ChatFinishReason {\n switch (stopReason) {\n case \"length\":\n return \"length\";\n case \"toolUse\":\n return \"tool_calls\";\n case \"error\":\n case \"aborted\":\n throw new ModelEndpointError(502, errorMessage ?? `upstream request ${stopReason}`);\n default:\n return \"stop\";\n }\n}\n\nfunction toChatUsage(usage: AssistantMessage[\"usage\"]): ChatCompletionUsage {\n const prompt = promptTokens(usage);\n const result: ChatCompletionUsage = {\n prompt_tokens: prompt,\n completion_tokens: usage.output,\n total_tokens: totalTokens(usage),\n prompt_tokens_details: { cached_tokens: usage.cacheRead },\n };\n if (usage.reasoning !== undefined)\n result.completion_tokens_details = { reasoning_tokens: usage.reasoning };\n return result;\n}\n\n/**\n * Maps a finished pi message to a non-streaming chat completion. `error` /\n * `aborted` messages throw 502 so the caller sees an upstream failure rather\n * than an empty \"successful\" completion.\n */\nexport function toChatCompletion(\n message: AssistantMessage,\n meta: ChatResponseMeta,\n): ChatCompletion {\n const reason = finishReason(message.stopReason, message.errorMessage);\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ChatCompletionToolCall[] = [];\n for (const block of message.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"thinking\") thinking += block.thinking;\n else {\n toolCalls.push({\n id: block.id,\n type: \"function\",\n function: { name: block.name, arguments: JSON.stringify(block.arguments) },\n });\n }\n }\n const out: ChatCompletionMessage = { role: \"assistant\", content: text.length > 0 ? text : null };\n if (thinking.length > 0) out.reasoning_content = thinking;\n if (toolCalls.length > 0) out.tool_calls = toolCalls;\n return {\n id: meta.id,\n object: \"chat.completion\",\n created: meta.created,\n model: meta.model,\n choices: [{ index: 0, message: out, finish_reason: reason }],\n usage: toChatUsage(message.usage),\n };\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting a chunk on upstream failure. */\nexport interface ChatStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n readonly includeUsage: boolean;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE error event. */\n error?: string;\n nextToolIndex: number;\n toolIndexByContent: Map<number, number>;\n}\n\nexport function createChatStreamState(init: {\n id: string;\n created: number;\n model: string;\n includeUsage: boolean;\n}): ChatStreamState {\n return { ...init, nextToolIndex: 0, toolIndexByContent: new Map() };\n}\n\nfunction chunk(\n state: ChatStreamState,\n delta: ChatCompletionChunkDelta,\n finish: ChatFinishReason | null = null,\n): ChatCompletionChunk {\n return {\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [{ index: 0, delta, finish_reason: finish }],\n };\n}\n\n/**\n * Stateful pi-event → OpenAI chunk mapper. Tool calls are buffered and emitted as\n * a single complete chunk at `toolcall_end` because pi only knows the call id and\n * name once the call is finished; OpenAI clients accept a whole call in one delta.\n */\nexport function chatCompletionChunks(\n event: AssistantMessageEvent,\n state: ChatStreamState,\n): ChatCompletionChunk[] {\n switch (event.type) {\n case \"start\":\n return [chunk(state, { role: \"assistant\", content: \"\" })];\n case \"text_delta\":\n return event.delta.length > 0 ? [chunk(state, { content: event.delta })] : [];\n case \"thinking_delta\":\n return event.delta.length > 0 ? [chunk(state, { reasoning_content: event.delta })] : [];\n case \"toolcall_start\":\n state.toolIndexByContent.set(event.contentIndex, state.nextToolIndex++);\n return [];\n case \"toolcall_end\": {\n let index = state.toolIndexByContent.get(event.contentIndex);\n if (index === undefined) {\n index = state.nextToolIndex++;\n state.toolIndexByContent.set(event.contentIndex, index);\n }\n return [\n chunk(state, {\n tool_calls: [\n {\n index,\n id: event.toolCall.id,\n type: \"function\",\n function: {\n name: event.toolCall.name,\n arguments: JSON.stringify(event.toolCall.arguments),\n },\n },\n ],\n }),\n ];\n }\n case \"done\": {\n const chunks = [chunk(state, {}, finishReason(event.reason, undefined))];\n if (state.includeUsage) {\n chunks.push({\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [],\n usage: toChatUsage(event.message.usage),\n });\n }\n return chunks;\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n TextContent,\n Tool,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/responses` body, in pi terms (`includeUsage` is always true: Responses always reports usage). */\nexport type ResponsesRequest = ParsedModelRequest;\n\nexport interface ResponseSummaryPart {\n type: \"summary_text\";\n text: string;\n}\n\nexport interface ResponseReasoningItem {\n type: \"reasoning\";\n id: string;\n summary: ResponseSummaryPart[];\n}\n\nexport interface ResponseMessageItem {\n type: \"message\";\n id: string;\n role: \"assistant\";\n status: \"in_progress\" | \"completed\";\n content: Array<{ type: \"output_text\"; text: string; annotations: never[] }>;\n}\n\nexport interface ResponseFunctionCallItem {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: \"in_progress\" | \"completed\";\n}\n\nexport type ResponseOutputItem =\n | ResponseReasoningItem\n | ResponseMessageItem\n | ResponseFunctionCallItem;\n\nexport interface ResponseUsage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: { cached_tokens: number };\n output_tokens_details: { reasoning_tokens: number };\n}\n\nexport interface ResponseObject {\n id: string;\n object: \"response\";\n created_at: number;\n model: string;\n status: \"in_progress\" | \"completed\" | \"incomplete\";\n incomplete_details: { reason: \"max_output_tokens\" } | null;\n error: null;\n output: ResponseOutputItem[];\n usage: ResponseUsage | null;\n}\n\nexport interface ResponsesMeta {\n id: string;\n created: number;\n model: string;\n}\n\n/** One SSE event; `sequence_number` increases by one per event within a response. */\nexport interface ResponsesStreamEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction parseParts(\n content: unknown,\n field: string,\n role: \"user\" | \"system\" | \"assistant\",\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const textTypes = role === \"assistant\" ? [\"output_text\", \"text\"] : [\"input_text\", \"text\"];\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part) || typeof part.type !== \"string\")\n throw badRequest(`${partField} must be a content part`);\n if (textTypes.includes(part.type)) {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (\n part.type === \"refusal\" &&\n role === \"assistant\" &&\n typeof part.refusal === \"string\"\n ) {\n parts.push({ type: \"text\", text: part.refusal });\n } else if (part.type === \"input_image\" && role === \"user\") {\n if (part.file_id !== undefined && part.file_id !== null)\n throw badRequest(`${partField}.file_id is not supported`);\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${part.type}\"`);\n }\n }\n return parts;\n}\n\nfunction joinText(parts: string | (TextContent | ImageContent)[]): string {\n if (typeof parts === \"string\") return parts;\n return parts.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\");\n}\n\nfunction parseOutputText(output: unknown, field: string): string {\n if (typeof output === \"string\") return output;\n if (output === undefined || output === null) return \"\";\n return joinText(parseParts(output, field, \"user\"));\n}\n\nfunction parseInput(input: unknown, model: string, systemParts: string[]): Message[] {\n if (typeof input === \"string\") return [{ role: \"user\", content: input, timestamp: Date.now() }];\n if (!Array.isArray(input)) throw badRequest(\"input must be a string or an array of items\");\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < input.length; i++) {\n const item: unknown = input[i];\n const field = `input[${i}]`;\n if (!isRecord(item)) throw badRequest(`${field} must be an object`);\n const type = item.type ?? \"message\";\n switch (type) {\n case \"message\": {\n const role = item.role;\n if (role === \"system\" || role === \"developer\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"system\"));\n if (text.length > 0) systemParts.push(text);\n } else if (role === \"user\") {\n messages.push({\n role: \"user\",\n content: parseParts(item.content, `${field}.content`, \"user\"),\n timestamp: Date.now(),\n });\n } else if (role === \"assistant\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"assistant\"));\n if (text.length > 0) messages.push(historyAssistant(model, [{ type: \"text\", text }]));\n } else {\n throw badRequest(`${field}.role \"${String(role)}\" is not supported`);\n }\n break;\n }\n case \"function_call\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n if (typeof item.name !== \"string\" || item.name.length === 0)\n throw badRequest(`${field}.name is required`);\n toolNames.set(item.call_id, item.name);\n const call = {\n type: \"toolCall\" as const,\n id: item.call_id,\n name: item.name,\n arguments: parseToolArguments(item.arguments),\n };\n // Parallel calls arrive as consecutive items and belong to one assistant turn.\n const last = messages.at(-1);\n if (last?.role === \"assistant\") {\n last.content.push(call);\n last.stopReason = \"toolUse\";\n } else {\n messages.push(historyAssistant(model, [call]));\n }\n break;\n }\n case \"function_call_output\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n messages.push(\n historyToolResult(\n item.call_id,\n toolNames.get(item.call_id) ?? \"\",\n parseOutputText(item.output, `${field}.output`),\n ),\n );\n break;\n }\n case \"reasoning\":\n // Encrypted/summary reasoning from earlier turns is not replayable across providers.\n break;\n default:\n throw badRequest(`${field}.type \"${String(type)}\" is not supported`);\n }\n }\n return messages;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\") {\n throw badRequest(`tools[${i}]: only function tools are supported`);\n }\n if (typeof tool.name !== \"string\" || tool.name.length === 0)\n throw badRequest(`tools[${i}].name is required`);\n tools.push(toPiTool(tool.name, tool.description, tool.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI Responses body (stateless subset) and maps it to a pi `Context`.\n * `previous_response_id` is rejected because the endpoint keeps no response state.\n */\nexport function parseResponsesRequest(body: unknown): ResponsesRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (body.input === undefined || body.input === null) throw badRequest(\"input is required\");\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw badRequest(\"previous_response_id is not supported; the endpoint is stateless\");\n }\n\n const systemParts: string[] = [];\n if (body.instructions !== undefined && body.instructions !== null) {\n if (typeof body.instructions !== \"string\") throw badRequest(\"instructions must be a string\");\n if (body.instructions.length > 0) systemParts.push(body.instructions);\n }\n\n const messages = parseInput(body.input, model, systemParts);\n if (messages.length === 0) throw badRequest(\"input must contain at least one message\");\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" ? choice.name : undefined,\n );\n\n const reasoning = isRecord(body.reasoning) ? body.reasoning.effort : undefined;\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(body.max_output_tokens, \"max_output_tokens\"),\n samplingParams: pickSamplingParams(body, [\"top_p\"]),\n reasoning: parseReasoningEffort(reasoning, \"reasoning.effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction itemId(prefix: string, responseId: string, index: number): string {\n return `${prefix}_${responseId.replace(/^resp_/, \"\")}_${index}`;\n}\n\nfunction toResponseUsage(usage: Usage): ResponseUsage {\n return {\n input_tokens: promptTokens(usage),\n output_tokens: usage.output,\n total_tokens: totalTokens(usage),\n input_tokens_details: { cached_tokens: usage.cacheRead },\n output_tokens_details: { reasoning_tokens: usage.reasoning ?? 0 },\n };\n}\n\nfunction messageItem(\n id: string,\n text: string,\n status: \"in_progress\" | \"completed\",\n): ResponseMessageItem {\n return {\n type: \"message\",\n id,\n role: \"assistant\",\n status,\n content: status === \"completed\" ? [{ type: \"output_text\", text, annotations: [] }] : [],\n };\n}\n\nfunction buildOutput(message: AssistantMessage, responseId: string): ResponseOutputItem[] {\n const output: ResponseOutputItem[] = [];\n const summaries: ResponseSummaryPart[] = [];\n let text = \"\";\n const calls: ResponseFunctionCallItem[] = [];\n for (const block of message.content) {\n if (block.type === \"thinking\") {\n if (block.thinking.length > 0) summaries.push({ type: \"summary_text\", text: block.thinking });\n } else if (block.type === \"text\") {\n text += block.text;\n } else {\n calls.push({\n type: \"function_call\",\n id: \"\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.arguments),\n status: \"completed\",\n });\n }\n }\n if (summaries.length > 0) {\n output.push({\n type: \"reasoning\",\n id: itemId(\"rs\", responseId, output.length),\n summary: summaries,\n });\n }\n if (text.length > 0) {\n output.push(messageItem(itemId(\"msg\", responseId, output.length), text, \"completed\"));\n }\n for (const call of calls) {\n call.id = itemId(\"fc\", responseId, output.length);\n output.push(call);\n }\n return output;\n}\n\nfunction responseObject(\n meta: ResponsesMeta,\n status: ResponseObject[\"status\"],\n output: ResponseOutputItem[],\n usage: Usage | undefined,\n): ResponseObject {\n return {\n id: meta.id,\n object: \"response\",\n created_at: meta.created,\n model: meta.model,\n status,\n incomplete_details: status === \"incomplete\" ? { reason: \"max_output_tokens\" } : null,\n error: null,\n output,\n usage: usage ? toResponseUsage(usage) : null,\n };\n}\n\n/**\n * Maps a finished pi message to a non-streaming Responses object. Output order is\n * reasoning, message, then function calls. `error`/`aborted` throw 502.\n */\nexport function toResponse(message: AssistantMessage, meta: ResponsesMeta): ResponseObject {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream request ${message.stopReason}`,\n );\n }\n const status = message.stopReason === \"length\" ? \"incomplete\" : \"completed\";\n return responseObject(meta, status, buildOutput(message, meta.id), message.usage);\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\ninterface OpenBlock {\n kind: \"message\" | \"reasoning\";\n outputIndex: number;\n itemId: string;\n text: string;\n}\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting an event on upstream failure. */\nexport interface ResponsesStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE `error` event. */\n error?: string;\n sequence: number;\n nextOutputIndex: number;\n open: Map<number, OpenBlock>;\n completed: Map<number, ResponseOutputItem>;\n}\n\nexport function createResponsesStreamState(init: ResponsesMeta): ResponsesStreamState {\n return {\n ...init,\n sequence: 0,\n nextOutputIndex: 0,\n open: new Map(),\n completed: new Map(),\n };\n}\n\nfunction ev(\n state: ResponsesStreamState,\n type: string,\n fields: Record<string, unknown>,\n): ResponsesStreamEvent {\n return { type, sequence_number: state.sequence++, ...fields };\n}\n\nfunction openBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n): { block: OpenBlock; events: ResponsesStreamEvent[] } {\n const existing = state.open.get(contentIndex);\n if (existing) return { block: existing, events: [] };\n const outputIndex = state.nextOutputIndex++;\n const block: OpenBlock = {\n kind,\n outputIndex,\n itemId: itemId(kind === \"message\" ? \"msg\" : \"rs\", state.id, outputIndex),\n text: \"\",\n };\n state.open.set(contentIndex, block);\n if (kind === \"message\") {\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: messageItem(block.itemId, \"\", \"in_progress\"),\n }),\n ev(state, \"response.content_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n ],\n };\n }\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { type: \"reasoning\", id: block.itemId, summary: [] },\n }),\n ev(state, \"response.reasoning_summary_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n ],\n };\n}\n\nfunction closeBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n finalText: string,\n): ResponsesStreamEvent[] {\n const { block, events } = openBlock(state, contentIndex, kind);\n state.open.delete(contentIndex);\n if (kind === \"message\") {\n const item = messageItem(block.itemId, finalText, \"completed\");\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.output_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n text: finalText,\n }),\n ev(state, \"response.content_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: finalText, annotations: [] },\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n }\n const part: ResponseSummaryPart = { type: \"summary_text\", text: finalText };\n const item: ResponseReasoningItem = { type: \"reasoning\", id: block.itemId, summary: [part] };\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.reasoning_summary_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n text: finalText,\n }),\n ev(state, \"response.reasoning_summary_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n}\n\n/**\n * Stateful pi-event → Responses SSE mapper. Function calls are buffered until\n * `toolcall_end` (pi only knows call id and name then) and then emitted as a\n * complete added/arguments/done sequence. A length stop ends with\n * `response.incomplete`, everything else with `response.completed`.\n */\nexport function responsesEvents(\n event: AssistantMessageEvent,\n state: ResponsesStreamState,\n): ResponsesStreamEvent[] {\n const meta: ResponsesMeta = { id: state.id, created: state.created, model: state.model };\n switch (event.type) {\n case \"start\": {\n const response = responseObject(meta, \"in_progress\", [], undefined);\n return [\n ev(state, \"response.created\", { response }),\n ev(state, \"response.in_progress\", { response }),\n ];\n }\n case \"text_start\":\n return openBlock(state, event.contentIndex, \"message\").events;\n case \"text_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"message\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.output_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"text_end\":\n return closeBlock(state, event.contentIndex, \"message\", event.content);\n case \"thinking_start\":\n return openBlock(state, event.contentIndex, \"reasoning\").events;\n case \"thinking_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"reasoning\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.reasoning_summary_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"thinking_end\":\n return closeBlock(state, event.contentIndex, \"reasoning\", event.content);\n case \"toolcall_end\": {\n const outputIndex = state.nextOutputIndex++;\n const id = itemId(\"fc\", state.id, outputIndex);\n const args = JSON.stringify(event.toolCall.arguments);\n const item: ResponseFunctionCallItem = {\n type: \"function_call\",\n id,\n call_id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: args,\n status: \"completed\",\n };\n state.completed.set(outputIndex, item);\n return [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { ...item, arguments: \"\", status: \"in_progress\" },\n }),\n ev(state, \"response.function_call_arguments.delta\", {\n item_id: id,\n output_index: outputIndex,\n delta: args,\n }),\n ev(state, \"response.function_call_arguments.done\", {\n item_id: id,\n output_index: outputIndex,\n name: item.name,\n arguments: args,\n }),\n ev(state, \"response.output_item.done\", { output_index: outputIndex, item }),\n ];\n }\n case \"done\": {\n const streamed = [...state.completed.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, item]) => item);\n const output = streamed.length > 0 ? streamed : buildOutput(event.message, state.id);\n const incomplete = event.reason === \"length\";\n const response = responseObject(\n meta,\n incomplete ? \"incomplete\" : \"completed\",\n output,\n event.message.usage,\n );\n return [ev(state, incomplete ? \"response.incomplete\" : \"response.completed\", { response })];\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","/**\n * The loopback OpenAI-compatible HTTP server.\n *\n * Plain `node:http` so it runs identically under Node and Bun. pi-ai is\n * imported lazily inside the handlers: the package is an optional peer, and\n * merely importing `@skaile/workspaces/model-endpoint` must not fail without it.\n */\n\nimport { createHash, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport type { AssistantMessage, AssistantMessageEvent } from \"@earendil-works/pi-ai\";\nimport { listenWithProbe, loadDriverSdk, loadDriverSdkSubpath } from \"@skaile/workspaces/core\";\nimport {\n chatCompletionChunks,\n createChatStreamState,\n parseChatCompletionRequest,\n toChatCompletion,\n} from \"./openai-chat.js\";\nimport {\n createResponsesStreamState,\n parseResponsesRequest,\n responsesEvents,\n toResponse,\n} from \"./openai-responses.js\";\nimport { listModels, listPassThroughProviders, type ResolveDeps, resolveModel } from \"./resolve.js\";\nimport {\n ModelEndpointError,\n type ModelEndpointHandle,\n type ModelEndpointOptions,\n type PiApiModule,\n type ResolvedModel,\n} from \"./types.js\";\n\n/** Largest accepted request body. Chat transcripts with inline images get big. */\nconst MAX_BODY_BYTES = 10 * 1024 * 1024;\n/** Surfaces whose upstream serves `POST <base>/embeddings`. */\nconst EMBEDDING_SURFACES = new Set([\"openai-completions\", \"openai-responses\"]);\n\ntype GenerationRequest = ReturnType<typeof parseChatCompletionRequest>;\n\n/** Per-request facts the access log reports. */\ninterface Trace {\n target?: string;\n}\n\n/**\n * Start the endpoint. Resolves once the socket is listening.\n *\n * Registry, env and roles are read per request through the getters so a\n * session swap is visible immediately.\n */\nexport async function startModelEndpoint(\n options: ModelEndpointOptions,\n): Promise<ModelEndpointHandle> {\n if (!options.token) throw new Error(\"model endpoint requires a non-empty token\");\n const host = options.host ?? \"127.0.0.1\";\n const log = options.log ?? (() => {});\n const projectDir = options.projectDir ?? process.cwd();\n const loadApi = options.loadApi ?? ((surface: string) => defaultLoadApi(surface, projectDir));\n const tokenDigest = digest(options.token);\n\n const deps = (): ResolveDeps => ({\n registry: options.getRegistry(),\n lookupEnv: options.getLookupEnv(),\n roles: options.getRoles?.(),\n });\n\n function authenticate(req: IncomingMessage): void {\n const match = /^Bearer\\s+(.+)$/i.exec(req.headers.authorization ?? \"\");\n // Hash both sides so the comparison is constant-time regardless of length.\n if (!match || !timingSafeEqual(digest(match[1] ?? \"\"), tokenDigest)) {\n throw new ModelEndpointError(401, \"invalid or missing bearer token\", \"invalid_api_key\");\n }\n }\n\n /** Start the upstream pi stream for a parsed chat/responses request. */\n async function startUpstream(\n request: GenerationRequest,\n resolved: ResolvedModel,\n signal: AbortSignal,\n ): Promise<AsyncIterable<AssistantMessageEvent>> {\n const pi = await loadPi(projectDir);\n const surface = resolved.model.api;\n let api: PiApiModule;\n try {\n api = await loadApi(surface);\n } catch (cause) {\n throw new ModelEndpointError(\n 501,\n `surface '${surface}' is not supported by the installed pi-ai: ${errorText(cause)}`,\n \"surface_unsupported\",\n );\n }\n const { temperature, maxTokens, samplingParams, reasoning } = request.options;\n const common = {\n ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),\n ...(resolved.headers ? { headers: resolved.headers } : {}),\n signal,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(samplingParams !== undefined ? { samplingParams } : {}),\n };\n const context = pi.normalizeContext(request.context);\n // Only `streamSimple` maps a provider-neutral thinking level onto the\n // surface's own effort field (`reasoning_effort`, Anthropic `effort`, …).\n if (reasoning !== undefined && api.streamSimple) {\n return api.streamSimple(resolved.model, context, {\n ...common,\n reasoning,\n }) as AsyncIterable<AssistantMessageEvent>;\n }\n return api.stream(resolved.model, context, common) as AsyncIterable<AssistantMessageEvent>;\n }\n\n async function handleChat(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseChatCompletionRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `chatcmpl-${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toChatCompletion(message, { id, created, model: request.model }));\n return;\n }\n const state = createChatStreamState({\n id,\n created,\n model: request.model,\n includeUsage: request.includeUsage,\n });\n await pipeSse(res, events, {\n frames: (event) => chatCompletionChunks(event, state),\n errorFrame: (message) => ({ error: { message, type: \"upstream_error\" } }),\n terminator: \"[DONE]\",\n });\n }\n\n async function handleResponses(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseResponsesRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `resp_${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toResponse(message, { id, created, model: request.model }));\n return;\n }\n const state = createResponsesStreamState({ id, created, model: request.model });\n await pipeSse(res, events, {\n frames: (event) => responsesEvents(event, state),\n errorFrame: (message) => ({ type: \"error\", code: \"upstream_error\", message, param: null }),\n eventName: (frame) =>\n isRecord(frame) && typeof frame.type === \"string\" ? frame.type : undefined,\n });\n }\n\n async function handleEmbeddings(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const body = await readJson(req);\n if (!isRecord(body) || typeof body.model !== \"string\" || body.model === \"\") {\n throw new ModelEndpointError(400, \"`model` is required\", \"missing_model\");\n }\n const resolved = resolveModel(body.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n if (!EMBEDDING_SURFACES.has(resolved.model.api)) {\n throw new ModelEndpointError(\n 501,\n `embeddings not supported for surface ${resolved.model.api}`,\n \"embeddings_unsupported\",\n );\n }\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n ...resolved.headers,\n };\n if (resolved.apiKey) headers.authorization = `Bearer ${resolved.apiKey}`;\n\n let upstream: Response;\n try {\n upstream = await (options.fetch ?? globalThis.fetch)(`${resolved.model.baseUrl}/embeddings`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...body, model: resolved.model.id }),\n signal,\n });\n } catch (cause) {\n if (signal.aborted) return;\n throw new ModelEndpointError(\n 502,\n `embeddings upstream unreachable: ${errorText(cause)}`,\n \"upstream_unreachable\",\n );\n }\n // fetch has already decoded the body, so content-encoding/length are not copied.\n const payload = Buffer.from(await upstream.arrayBuffer());\n res.writeHead(upstream.status, {\n \"content-type\": upstream.headers.get(\"content-type\") ?? \"application/json\",\n \"content-length\": payload.length,\n });\n res.end(payload);\n }\n\n async function dispatch(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n path: string,\n trace: Trace,\n ): Promise<void> {\n if (!path.startsWith(\"/v1/\")) throw notFound(path);\n authenticate(req);\n switch (`${req.method} ${path}`) {\n case \"GET /v1/models\":\n sendJson(res, 200, {\n object: \"list\",\n data: listModels(options.getRegistry()).map((m) => ({\n id: m.id,\n object: \"model\",\n created: 0,\n owned_by: m.owned_by,\n })),\n // Entries that declare no models forward any `<id>/<model>`: nothing to list.\n pass_through_providers: listPassThroughProviders(options.getRegistry()),\n });\n return;\n case \"POST /v1/chat/completions\":\n return handleChat(req, res, signal, trace);\n case \"POST /v1/responses\":\n return handleResponses(req, res, signal, trace);\n case \"POST /v1/embeddings\":\n return handleEmbeddings(req, res, signal, trace);\n default:\n throw notFound(path);\n }\n }\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const started = performance.now();\n const controller = new AbortController();\n // `req` 'close' fires once the body is read; the response closing early is\n // the reliable \"client went away\" signal.\n res.on(\"close\", () => {\n if (!res.writableFinished) controller.abort();\n });\n const trace: Trace = {};\n let path = req.url ?? \"/\";\n try {\n path = requestPath(req);\n await dispatch(req, res, controller.signal, path, trace);\n } catch (err) {\n if (!(err instanceof ModelEndpointError)) {\n log(\n `error ${req.method} ${path}: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n }\n sendError(res, err);\n } finally {\n const ms = Math.round(performance.now() - started);\n log(`${req.method} ${path} ${trace.target ?? \"-\"} ${res.statusCode} ${ms}ms`);\n }\n }\n\n const server = createServer((req, res) => {\n void handle(req, res);\n });\n try {\n await listenWithProbe(server, options.port ?? 0, host);\n } catch (err) {\n if (!(err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\")) throw err;\n // The same one-line form the WebSocket port gets (transport/ws/server.ts).\n throw Object.assign(\n new Error(\n `${host}:${options.port ?? 0} is already in use: another process listens there. Pick another port for the model endpoint (--model-endpoint <port>, or model_endpoint.port in skaile.yaml).`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n const address = server.address() as AddressInfo;\n const hostPart = host.includes(\":\") ? `[${host}]` : host;\n return {\n url: `http://${hostPart}:${address.port}/v1`,\n port: address.port,\n token: options.token,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections?.();\n }),\n };\n}\n\n// ── pi-ai loading ───────────────────────────────────────────────────────────\n\n/** What a pi-ai load failure says. One line; names both places pi-ai was looked for. */\nfunction piAiNotInstalled(cause: unknown): ModelEndpointError {\n return new ModelEndpointError(500, errorText(cause), \"pi_ai_not_installed\", \"server_error\");\n}\n\nconst PI_AI = \"@earendil-works/pi-ai\";\nconst PI_AI_LABEL = `the model endpoint needs ${PI_AI}, which is`;\n\n/**\n * pi-ai root, loaded on first use: from `<projectDir>/node_modules` first, then\n * next to skaile. A missing peer becomes a clear 500 that names both places.\n */\nasync function loadPi(projectDir: string): Promise<typeof import(\"@earendil-works/pi-ai\")> {\n try {\n return await loadDriverSdk(\n PI_AI,\n projectDir,\n () => import(\"@earendil-works/pi-ai\"),\n PI_AI_LABEL,\n );\n } catch (cause) {\n throw piAiNotInstalled(cause);\n }\n}\n\n/**\n * Check that pi-ai can be loaded for `projectDir`; `skaile serve --model-endpoint`\n * runs it before its ready line.\n *\n * @returns The one-line problem (both places looked in, the install command), or `null`.\n */\nexport async function checkPiAiInstalled(projectDir: string): Promise<string | null> {\n try {\n await loadPi(projectDir);\n return null;\n } catch (err) {\n return errorText(err);\n }\n}\n\n/** Default api loader: the surface is runtime-selected per entry and pi-ai is an optional peer. */\nasync function defaultLoadApi(surface: string, projectDir: string): Promise<PiApiModule> {\n if (!/^[a-z0-9-]+$/.test(surface)) throw new Error(`invalid surface '${surface}'`);\n return loadDriverSdkSubpath<PiApiModule>(\n PI_AI,\n `api/${surface}`,\n projectDir,\n () => import(/* @vite-ignore */ `${PI_AI}/api/${surface}`) as Promise<PiApiModule>,\n `${PI_AI} (surface ${surface})`,\n );\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Drain the stream to its final message; an `error` event becomes a 502. */\nasync function collectFinal(\n events: AsyncIterable<AssistantMessageEvent>,\n): Promise<AssistantMessage> {\n for await (const event of events) {\n if (event.type === \"done\") return event.message;\n if (event.type === \"error\") throw upstreamFailure(event.error);\n }\n throw new ModelEndpointError(\n 502,\n \"upstream ended without a final message\",\n \"upstream_incomplete\",\n );\n}\n\nfunction upstreamFailure(message: AssistantMessage): ModelEndpointError {\n return new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream ${message.stopReason}`,\n \"upstream_error\",\n );\n}\n\ninterface SsePipe {\n /** Map one pi event to wire frames. Never called with `error` events. */\n frames(event: AssistantMessageEvent): unknown[];\n /** Frame announcing a failure once the stream has started. */\n errorFrame(message: string): unknown;\n /** SSE `event:` name for a frame, when the protocol uses one. */\n eventName?(frame: unknown): string | undefined;\n /** Sentinel written after the last frame. */\n terminator?: \"[DONE]\";\n}\n\n/**\n * Relay pi events as SSE. Headers go out with the first event, not before: an\n * upstream failure that precedes it (bad credential, unknown model) then\n * surfaces as a real HTTP 502 instead of a 200 stream carrying an error.\n */\nasync function pipeSse(\n res: ServerResponse,\n events: AsyncIterable<AssistantMessageEvent>,\n pipe: SsePipe,\n): Promise<void> {\n let sse: Sse | undefined;\n const sendAll = async (frames: unknown[]) => {\n for (const frame of frames) await sse?.send(frame, pipe.eventName?.(frame));\n };\n try {\n for await (const event of events) {\n if (!sse) {\n if (event.type === \"error\") throw upstreamFailure(event.error);\n sse = openSse(res);\n }\n if (event.type === \"error\") {\n await sendAll([pipe.errorFrame(event.error.errorMessage ?? `upstream ${event.reason}`)]);\n break;\n }\n await sendAll(pipe.frames(event));\n }\n } catch (err) {\n if (!sse) throw err;\n await sendAll([pipe.errorFrame(errorText(err))]);\n }\n if (!sse)\n throw new ModelEndpointError(502, \"upstream ended without events\", \"upstream_incomplete\");\n if (pipe.terminator) await sse.raw(pipe.terminator);\n res.end();\n}\n\ninterface Sse {\n send(frame: unknown, eventName?: string): Promise<void>;\n raw(data: string): Promise<void>;\n}\n\nfunction openSse(res: ServerResponse): Sse {\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n });\n res.flushHeaders();\n const write = async (text: string): Promise<void> => {\n if (res.destroyed || res.writableEnded) return;\n if (res.write(text)) return;\n await new Promise<void>((resolve) => {\n const done = () => {\n res.off(\"drain\", done);\n res.off(\"close\", done);\n resolve();\n };\n res.once(\"drain\", done);\n res.once(\"close\", done);\n });\n };\n return {\n send: (frame, eventName) =>\n write(`${eventName ? `event: ${eventName}\\n` : \"\"}data: ${JSON.stringify(frame)}\\n\\n`),\n raw: (data) => write(`data: ${data}\\n\\n`),\n };\n}\n\n// ── HTTP plumbing ───────────────────────────────────────────────────────────\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n if (res.writableEnded) return;\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(payload),\n });\n res.end(payload);\n}\n\nfunction sendError(res: ServerResponse, err: unknown): void {\n if (res.writableEnded || res.destroyed) return;\n if (res.headersSent) {\n res.end();\n return;\n }\n const failure =\n err instanceof ModelEndpointError\n ? err\n : new ModelEndpointError(500, \"internal server error\", undefined, \"server_error\");\n if (failure.status === 413) res.setHeader(\"connection\", \"close\");\n sendJson(res, failure.status, {\n error: {\n message: failure.message,\n type: failure.type,\n ...(failure.code !== undefined ? { code: failure.code } : {}),\n },\n });\n}\n\nfunction notFound(path: string): ModelEndpointError {\n return new ModelEndpointError(404, `unknown route '${path}'`, undefined, \"invalid_request_error\");\n}\n\nfunction requestPath(req: IncomingMessage): string {\n if (!URL.canParse(req.url ?? \"/\", \"http://localhost\")) {\n throw new ModelEndpointError(400, \"invalid request target\");\n }\n const path = new URL(req.url ?? \"/\", \"http://localhost\").pathname;\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n const tooLarge = () =>\n new ModelEndpointError(413, `request body exceeds ${MAX_BODY_BYTES} bytes`, \"body_too_large\");\n if (Number(req.headers[\"content-length\"]) > MAX_BODY_BYTES) throw tooLarge();\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = chunk as Buffer;\n size += buffer.length;\n if (size > MAX_BODY_BYTES) throw tooLarge();\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString(\"utf8\");\n if (text.trim() === \"\") throw new ModelEndpointError(400, \"request body is empty\", \"empty_body\");\n try {\n return JSON.parse(text);\n } catch {\n throw new ModelEndpointError(400, \"request body is not valid JSON\", \"invalid_json\");\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash(\"sha256\").update(value).digest();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { tryWithFsDeadline, withFsDeadline, fsDeadlineMs } from './chunk-YW2BNDSE.js';
1
+ import { tryWithFsDeadline, withFsDeadline, fsDeadlineMs } from './chunk-GOCWM7FN.js';
2
2
  import { createLogger } from './chunk-BOFL7GIF.js';
3
3
  import { stat, mkdir, cp, writeFile, rm } from 'fs/promises';
4
4
  import { resolve, sep, join } from 'path';
@@ -155,5 +155,5 @@ function resolveFlowSkills(flow, allEntries) {
155
155
  }
156
156
 
157
157
  export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs };
158
- //# sourceMappingURL=chunk-AP24HESN.js.map
159
- //# sourceMappingURL=chunk-AP24HESN.js.map
158
+ //# sourceMappingURL=chunk-H6UVIKQ2.js.map
159
+ //# sourceMappingURL=chunk-H6UVIKQ2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../asset-manager/src/catalog-deployer.ts"],"names":[],"mappings":"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","file":"chunk-AP24HESN.js","sourcesContent":["/**\n * Platform-triggered asset deployment.\n *\n * Takes catalog entries (with source_path relative to ai-assets/) and deploys\n * them to a session's .claude/skills/ directory. Handles skill context injection\n * and catalog priority-based name resolution.\n */\n\nimport { cp, mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport { fsDeadlineMs, tryWithFsDeadline, withFsDeadline } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\n\n// ---------------------------------------------------------------------------\n// Types (formerly in catalog-compiler.ts, inlined after tear-out in Task 1.5)\n// ---------------------------------------------------------------------------\n\n/**\n * A single user-facing input parameter declared in a SKILL.md.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface InputSpec {\n /** Input parameter key used in skill invocation. */\n key: string;\n /** Whether the input must be provided before running the skill. */\n required?: boolean;\n /** Question string shown to the user when collecting this input. */\n prompt?: string;\n /** Short display label for UI forms. */\n label?: string;\n /** Input data type hint (e.g. `\"string\"`, `\"number\"`, `\"file\"`). */\n type?: string;\n /** Additional guidance text shown alongside the input field. */\n hint?: string;\n}\n\n/**\n * A compiled catalog entry (skill or flow).\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface CatalogEntryCompiled {\n /** Unique ID in `publisher/name` form (e.g. `skaileup/cf_overview`). */\n id: string;\n /** Asset kind. */\n kind: \"skill\" | \"flow\";\n /** Human-readable asset name. */\n name: string;\n /** One-line description. */\n description: string;\n /** Semantic version string. */\n version: string;\n /** Maturity stage. */\n stage: \"alpha\" | \"beta\" | \"stable\";\n /** Searchable keywords. */\n keywords: string[];\n /** User-facing input specifications. */\n inputs: InputSpec[];\n /** Asset path relative to assetsRoot. */\n source_path: string;\n /** Optional icon identifier. */\n icon?: string;\n /** Flow-only: required skill names. */\n required_skills?: string[];\n /** Flow-only: optional skill names. */\n optional_skills?: string[];\n}\n\n/**\n * Options controlling how platform-triggered skill deployment is performed.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployFromCatalogOptions {\n /** Root directory of ai-assets (where `source_path` in catalog entries is relative to). */\n assetsRoot: string;\n /** Target directory for deployed skills (e.g. `/workspace/.claude/skills/`). */\n skillsDir: string;\n /** Optional context markdown appended to the deployed skill directory as `CONTEXT.md`. */\n context?: string;\n}\n\n/**\n * Result of a platform-triggered batch skill deployment.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployResult {\n /** IDs of catalog entries successfully deployed. */\n deployed: string[];\n /** IDs of catalog entries skipped (non-skill kinds). */\n skipped: string[];\n /** Error messages for entries that could not be deployed. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Workspace-mount awareness\n// ---------------------------------------------------------------------------\n\n/**\n * Multiplier applied to the base filesystem deadline for whole-tree operations\n * (recursive copy / remove), which legitimately outlast a single `stat`.\n */\nconst TREE_OP_DEADLINE_FACTOR = 4;\n\n/** Default number of parent levels {@link findAiAssetsRoot} inspects. */\nconst AI_ASSETS_WALK_LEVELS = 6;\n\nlet deployerLogger: ReturnType<typeof createLogger> | undefined;\n\nfunction log(): ReturnType<typeof createLogger> {\n deployerLogger ??= createLogger({ kind: \"runner\", subkind: \"catalog-deployer\" });\n return deployerLogger;\n}\n\n/**\n * Where the agent container binds its rclone FUSE mount. Nothing under this\n * path is a safe place to read an asset tree from: the mount is remote\n * (SharePoint / OneDrive / WebDAV) and can wedge indefinitely.\n */\nconst DEFAULT_WORKSPACE_MOUNT_DIR = \"/skaile/workspace\";\n\n/**\n * Env override for the workspace-mount path(s), comma-separated.\n *\n * Set it when the runner binds the mount somewhere other than\n * {@link DEFAULT_WORKSPACE_MOUNT_DIR}; set it to the empty string to disable\n * the guard entirely (single-machine dev, where nothing is a network mount).\n */\nexport const WORKSPACE_MOUNT_ENV_VAR = \"SKAILE_WORKSPACE_MOUNT_DIR\";\n\n/**\n * Resolve the directories treated as network mounts.\n *\n * Read per call rather than cached: the runner mutates `process.env` while\n * wiring a session, so a module-load snapshot would pin a pre-configuration\n * value.\n *\n * @returns Absolute mount paths; empty when the guard is disabled.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function workspaceMountDirs(): string[] {\n const raw = process.env[WORKSPACE_MOUNT_ENV_VAR];\n if (raw === undefined) return [DEFAULT_WORKSPACE_MOUNT_DIR];\n return raw\n .split(\",\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .map((segment) => resolve(segment));\n}\n\n/**\n * Is `candidate` at, or inside, one of the known workspace mount paths?\n *\n * Pure path arithmetic — deliberately no filesystem access, because the whole\n * point is to decide *before* touching a path that might be unresponsive.\n *\n * @param candidate - Path to test.\n * @param mountDirs - Mount roots; defaults to {@link workspaceMountDirs}.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function isUnderWorkspaceMount(\n candidate: string,\n mountDirs: string[] = workspaceMountDirs(),\n): boolean {\n const target = resolve(candidate);\n return mountDirs.some((dir) => {\n const root = resolve(dir);\n return target === root || target.startsWith(root + sep);\n });\n}\n\n/**\n * Walk upward from `startDir` looking for an `ai-assets/` directory.\n *\n * Two properties matter beyond \"find the folder\":\n *\n * 1. **Never synchronous.** The walk probes up to six directories; any one of\n * them can be on a FUSE mount, and the former `existsSync` chain blocked the\n * event loop on the first unresponsive probe. Each probe is now awaited and\n * deadline-bounded, so a wedged mount costs one skipped candidate.\n * 2. **Never resolves onto a mount.** A hit under the workspace mount is\n * skipped with a warning rather than returned: accepting it would wire every\n * later skill deploy — a recursive copy — to a remote filesystem. The walk\n * continues upward, so a legitimate `ai-assets/` in a parent still wins.\n *\n * Only a **directory** counts. An `ai-assets` file would otherwise be returned\n * as a root and every later `join(root, source_path)` would fail with ENOTDIR.\n *\n * @param startDir - Directory to start from (typically the project dir).\n * @param opts - `levels` caps the upward walk; `mountDirs` overrides the mount\n * roots (defaults to {@link workspaceMountDirs}).\n * @returns Absolute path to the `ai-assets/` directory, or `null` if none is\n * reachable within `levels`.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function findAiAssetsRoot(\n startDir: string,\n opts?: { levels?: number; mountDirs?: string[] },\n): Promise<string | null> {\n const mountDirs = opts?.mountDirs ?? workspaceMountDirs();\n const levels = opts?.levels ?? AI_ASSETS_WALK_LEVELS;\n let dir = resolve(startDir);\n // Every level of a `/skaile/workspace/...` start dir is under the mount, so\n // an unconditional warn would fire once per level for one lookup. Collect and\n // report once — the operator needs the fact, not six copies of it.\n const refused: string[] = [];\n\n for (let i = 0; i < levels; i++) {\n const candidate = join(dir, \"ai-assets\");\n if (isUnderWorkspaceMount(candidate, mountDirs)) {\n refused.push(candidate);\n } else {\n const isDir = await tryWithFsDeadline(\n `stat ${candidate}`,\n async () => (await stat(candidate)).isDirectory(),\n false,\n );\n if (isDir) {\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return candidate;\n }\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break; // filesystem root — nothing further up\n dir = parent;\n }\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return null;\n}\n\n/** Single warning for every `ai-assets` candidate skipped for sitting on a mount. */\nfunction warnRefused(refused: string[], mountDirs: string[]): void {\n log().warn(\n \"findAiAssetsRoot refused candidates under a workspace mount — deploying skills from a network mount can stall the session\",\n { refused, mountDirs },\n );\n}\n\n/**\n * Deploy a single catalog entry to the session skills directory.\n *\n * Copies the entire skill source directory into `skillsDir/<entry.name>/`.\n * If `context` is provided, a separate `CONTEXT.md` is written alongside\n * `SKILL.md` so the source file is never modified.\n *\n * Only `skill` entries are deployable; other kinds return an error.\n *\n * **Async by necessity.** This runs from the `session_init` command handler\n * with the WebSocket live, and both `assetsRoot` and `skillsDir` can sit on a\n * network mount. The former `cpSync`/`rmSync` pair parked the event loop for\n * the whole copy; every call is now awaited and deadline-bounded, so an\n * unresponsive mount fails one deployment instead of the session.\n *\n * @param entry - Compiled catalog entry to deploy.\n * @param options - Deployment target and optional context.\n * @returns `{ success: true }` on success, `{ success: false, error }` on failure.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployCatalogEntry(\n entry: CatalogEntryCompiled,\n options: DeployFromCatalogOptions,\n): Promise<{ success: boolean; error?: string }> {\n const { assetsRoot, skillsDir, context } = options;\n\n if (entry.kind !== \"skill\") {\n return { success: false, error: `Cannot deploy ${entry.kind} directly — only skills` };\n }\n\n const sourcePath = join(assetsRoot, entry.source_path);\n const skillMdPath = join(sourcePath, \"SKILL.md\");\n\n const hasSkillMd = await tryWithFsDeadline(\n `stat ${skillMdPath}`,\n async () => {\n await stat(skillMdPath);\n return true;\n },\n false,\n );\n if (!hasSkillMd) {\n return { success: false, error: `SKILL.md not found at ${skillMdPath}` };\n }\n\n const destDir = join(skillsDir, entry.name);\n\n try {\n await withFsDeadline(`mkdir ${destDir}`, () => mkdir(destDir, { recursive: true }));\n\n // Copy the entire skill directory\n await withFsDeadline(\n `cp ${sourcePath} -> ${destDir}`,\n () => cp(sourcePath, destDir, { recursive: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n\n // Write context to a separate CONTEXT.md — never modify the original SKILL.md.\n // The agent discovers both files in the skill directory.\n const contextPath = join(destDir, \"CONTEXT.md\");\n if (context) {\n await withFsDeadline(`write ${contextPath}`, () =>\n writeFile(contextPath, `# Additional Context\\n\\n${context}\\n`, \"utf8\"),\n );\n } else {\n // `force: true` makes this a single call: a stale CONTEXT.md is removed,\n // an absent one is a no-op. The former existsSync probe only added a\n // second trip to the same possibly-wedged mount.\n await withFsDeadline(`rm ${contextPath}`, () => rm(contextPath, { force: true }));\n }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n return { success: true };\n}\n\n/**\n * Remove a deployed skill directory from the session skills directory.\n *\n * @param name - Skill name (directory basename under `skillsDir`).\n * @param skillsDir - Absolute path to the session skills directory.\n * @returns `true` if the skill was found and removed; `false` if it was not\n * deployed, or if the directory could not be reached within the deadline.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function undeployCatalogEntry(name: string, skillsDir: string): Promise<boolean> {\n const destDir = join(skillsDir, name);\n const exists = await tryWithFsDeadline(\n `stat ${destDir}`,\n async () => {\n await stat(destDir);\n return true;\n },\n false,\n );\n if (!exists) return false;\n await withFsDeadline(\n `rm -r ${destDir}`,\n () => rm(destDir, { recursive: true, force: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n return true;\n}\n\n/**\n * Deploy multiple catalog entries in a single batch operation.\n *\n * Non-skill entries (flows, agents, etc.) are automatically skipped and\n * recorded in `result.skipped`. Deployment failures are collected in\n * `result.errors` without aborting the rest of the batch.\n *\n * @param entries - Compiled catalog entries to deploy.\n * @param options - Deployment target and optional context.\n * @returns Aggregated {@link DeployResult} with deployed, skipped, and error lists.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployAll(\n entries: CatalogEntryCompiled[],\n options: DeployFromCatalogOptions,\n): Promise<DeployResult> {\n const result: DeployResult = { deployed: [], skipped: [], errors: [] };\n\n for (const entry of entries) {\n if (entry.kind !== \"skill\") {\n result.skipped.push(entry.id);\n continue;\n }\n\n // Serial on purpose: concurrent recursive copies onto one mount multiply\n // the queue depth on the exact resource that is already the bottleneck.\n const r = await deployCatalogEntry(entry, options);\n if (r.success) {\n result.deployed.push(entry.id);\n } else {\n result.errors.push(`${entry.id}: ${r.error}`);\n }\n }\n\n return result;\n}\n\n/**\n * Resolve a flow's skill dependencies from the full catalog entry list.\n *\n * Partitions `flow.required_skills` and `flow.optional_skills` into resolved\n * entries and a list of names that could not be found. Missing optional skills\n * are silently ignored (they do not appear in `missing`).\n *\n * @param flow - Compiled flow entry whose skill dependencies should be resolved.\n * @param allEntries - Full set of compiled catalog entries to search.\n * @returns Object containing resolved `required` entries, resolved `optional` entries,\n * and `missing` skill names that were listed as required but not found.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function resolveFlowSkills(\n flow: CatalogEntryCompiled,\n allEntries: CatalogEntryCompiled[],\n): { required: CatalogEntryCompiled[]; optional: CatalogEntryCompiled[]; missing: string[] } {\n const skillsByName = new Map<string, CatalogEntryCompiled>();\n for (const e of allEntries) {\n if (e.kind === \"skill\") skillsByName.set(e.name, e);\n }\n\n const required: CatalogEntryCompiled[] = [];\n const optional: CatalogEntryCompiled[] = [];\n const missing: string[] = [];\n\n for (const name of flow.required_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) required.push(entry);\n else missing.push(name);\n }\n\n for (const name of flow.optional_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) optional.push(entry);\n // Optional skills don't count as missing\n }\n\n return { required, optional, missing };\n}\n"]}
1
+ {"version":3,"sources":["../asset-manager/src/catalog-deployer.ts"],"names":[],"mappings":"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","file":"chunk-H6UVIKQ2.js","sourcesContent":["/**\n * Platform-triggered asset deployment.\n *\n * Takes catalog entries (with source_path relative to ai-assets/) and deploys\n * them to a session's .claude/skills/ directory. Handles skill context injection\n * and catalog priority-based name resolution.\n */\n\nimport { cp, mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport { fsDeadlineMs, tryWithFsDeadline, withFsDeadline } from \"@skaile/workspaces/core\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\n\n// ---------------------------------------------------------------------------\n// Types (formerly in catalog-compiler.ts, inlined after tear-out in Task 1.5)\n// ---------------------------------------------------------------------------\n\n/**\n * A single user-facing input parameter declared in a SKILL.md.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface InputSpec {\n /** Input parameter key used in skill invocation. */\n key: string;\n /** Whether the input must be provided before running the skill. */\n required?: boolean;\n /** Question string shown to the user when collecting this input. */\n prompt?: string;\n /** Short display label for UI forms. */\n label?: string;\n /** Input data type hint (e.g. `\"string\"`, `\"number\"`, `\"file\"`). */\n type?: string;\n /** Additional guidance text shown alongside the input field. */\n hint?: string;\n}\n\n/**\n * A compiled catalog entry (skill or flow).\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface CatalogEntryCompiled {\n /** Unique ID in `publisher/name` form (e.g. `skaileup/cf_overview`). */\n id: string;\n /** Asset kind. */\n kind: \"skill\" | \"flow\";\n /** Human-readable asset name. */\n name: string;\n /** One-line description. */\n description: string;\n /** Semantic version string. */\n version: string;\n /** Maturity stage. */\n stage: \"alpha\" | \"beta\" | \"stable\";\n /** Searchable keywords. */\n keywords: string[];\n /** User-facing input specifications. */\n inputs: InputSpec[];\n /** Asset path relative to assetsRoot. */\n source_path: string;\n /** Optional icon identifier. */\n icon?: string;\n /** Flow-only: required skill names. */\n required_skills?: string[];\n /** Flow-only: optional skill names. */\n optional_skills?: string[];\n}\n\n/**\n * Options controlling how platform-triggered skill deployment is performed.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployFromCatalogOptions {\n /** Root directory of ai-assets (where `source_path` in catalog entries is relative to). */\n assetsRoot: string;\n /** Target directory for deployed skills (e.g. `/workspace/.claude/skills/`). */\n skillsDir: string;\n /** Optional context markdown appended to the deployed skill directory as `CONTEXT.md`. */\n context?: string;\n}\n\n/**\n * Result of a platform-triggered batch skill deployment.\n *\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport interface DeployResult {\n /** IDs of catalog entries successfully deployed. */\n deployed: string[];\n /** IDs of catalog entries skipped (non-skill kinds). */\n skipped: string[];\n /** Error messages for entries that could not be deployed. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Workspace-mount awareness\n// ---------------------------------------------------------------------------\n\n/**\n * Multiplier applied to the base filesystem deadline for whole-tree operations\n * (recursive copy / remove), which legitimately outlast a single `stat`.\n */\nconst TREE_OP_DEADLINE_FACTOR = 4;\n\n/** Default number of parent levels {@link findAiAssetsRoot} inspects. */\nconst AI_ASSETS_WALK_LEVELS = 6;\n\nlet deployerLogger: ReturnType<typeof createLogger> | undefined;\n\nfunction log(): ReturnType<typeof createLogger> {\n deployerLogger ??= createLogger({ kind: \"runner\", subkind: \"catalog-deployer\" });\n return deployerLogger;\n}\n\n/**\n * Where the agent container binds its rclone FUSE mount. Nothing under this\n * path is a safe place to read an asset tree from: the mount is remote\n * (SharePoint / OneDrive / WebDAV) and can wedge indefinitely.\n */\nconst DEFAULT_WORKSPACE_MOUNT_DIR = \"/skaile/workspace\";\n\n/**\n * Env override for the workspace-mount path(s), comma-separated.\n *\n * Set it when the runner binds the mount somewhere other than\n * {@link DEFAULT_WORKSPACE_MOUNT_DIR}; set it to the empty string to disable\n * the guard entirely (single-machine dev, where nothing is a network mount).\n */\nexport const WORKSPACE_MOUNT_ENV_VAR = \"SKAILE_WORKSPACE_MOUNT_DIR\";\n\n/**\n * Resolve the directories treated as network mounts.\n *\n * Read per call rather than cached: the runner mutates `process.env` while\n * wiring a session, so a module-load snapshot would pin a pre-configuration\n * value.\n *\n * @returns Absolute mount paths; empty when the guard is disabled.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function workspaceMountDirs(): string[] {\n const raw = process.env[WORKSPACE_MOUNT_ENV_VAR];\n if (raw === undefined) return [DEFAULT_WORKSPACE_MOUNT_DIR];\n return raw\n .split(\",\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .map((segment) => resolve(segment));\n}\n\n/**\n * Is `candidate` at, or inside, one of the known workspace mount paths?\n *\n * Pure path arithmetic — deliberately no filesystem access, because the whole\n * point is to decide *before* touching a path that might be unresponsive.\n *\n * @param candidate - Path to test.\n * @param mountDirs - Mount roots; defaults to {@link workspaceMountDirs}.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function isUnderWorkspaceMount(\n candidate: string,\n mountDirs: string[] = workspaceMountDirs(),\n): boolean {\n const target = resolve(candidate);\n return mountDirs.some((dir) => {\n const root = resolve(dir);\n return target === root || target.startsWith(root + sep);\n });\n}\n\n/**\n * Walk upward from `startDir` looking for an `ai-assets/` directory.\n *\n * Two properties matter beyond \"find the folder\":\n *\n * 1. **Never synchronous.** The walk probes up to six directories; any one of\n * them can be on a FUSE mount, and the former `existsSync` chain blocked the\n * event loop on the first unresponsive probe. Each probe is now awaited and\n * deadline-bounded, so a wedged mount costs one skipped candidate.\n * 2. **Never resolves onto a mount.** A hit under the workspace mount is\n * skipped with a warning rather than returned: accepting it would wire every\n * later skill deploy — a recursive copy — to a remote filesystem. The walk\n * continues upward, so a legitimate `ai-assets/` in a parent still wins.\n *\n * Only a **directory** counts. An `ai-assets` file would otherwise be returned\n * as a root and every later `join(root, source_path)` would fail with ENOTDIR.\n *\n * @param startDir - Directory to start from (typically the project dir).\n * @param opts - `levels` caps the upward walk; `mountDirs` overrides the mount\n * roots (defaults to {@link workspaceMountDirs}).\n * @returns Absolute path to the `ai-assets/` directory, or `null` if none is\n * reachable within `levels`.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function findAiAssetsRoot(\n startDir: string,\n opts?: { levels?: number; mountDirs?: string[] },\n): Promise<string | null> {\n const mountDirs = opts?.mountDirs ?? workspaceMountDirs();\n const levels = opts?.levels ?? AI_ASSETS_WALK_LEVELS;\n let dir = resolve(startDir);\n // Every level of a `/skaile/workspace/...` start dir is under the mount, so\n // an unconditional warn would fire once per level for one lookup. Collect and\n // report once — the operator needs the fact, not six copies of it.\n const refused: string[] = [];\n\n for (let i = 0; i < levels; i++) {\n const candidate = join(dir, \"ai-assets\");\n if (isUnderWorkspaceMount(candidate, mountDirs)) {\n refused.push(candidate);\n } else {\n const isDir = await tryWithFsDeadline(\n `stat ${candidate}`,\n async () => (await stat(candidate)).isDirectory(),\n false,\n );\n if (isDir) {\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return candidate;\n }\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break; // filesystem root — nothing further up\n dir = parent;\n }\n if (refused.length > 0) warnRefused(refused, mountDirs);\n return null;\n}\n\n/** Single warning for every `ai-assets` candidate skipped for sitting on a mount. */\nfunction warnRefused(refused: string[], mountDirs: string[]): void {\n log().warn(\n \"findAiAssetsRoot refused candidates under a workspace mount — deploying skills from a network mount can stall the session\",\n { refused, mountDirs },\n );\n}\n\n/**\n * Deploy a single catalog entry to the session skills directory.\n *\n * Copies the entire skill source directory into `skillsDir/<entry.name>/`.\n * If `context` is provided, a separate `CONTEXT.md` is written alongside\n * `SKILL.md` so the source file is never modified.\n *\n * Only `skill` entries are deployable; other kinds return an error.\n *\n * **Async by necessity.** This runs from the `session_init` command handler\n * with the WebSocket live, and both `assetsRoot` and `skillsDir` can sit on a\n * network mount. The former `cpSync`/`rmSync` pair parked the event loop for\n * the whole copy; every call is now awaited and deadline-bounded, so an\n * unresponsive mount fails one deployment instead of the session.\n *\n * @param entry - Compiled catalog entry to deploy.\n * @param options - Deployment target and optional context.\n * @returns `{ success: true }` on success, `{ success: false, error }` on failure.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployCatalogEntry(\n entry: CatalogEntryCompiled,\n options: DeployFromCatalogOptions,\n): Promise<{ success: boolean; error?: string }> {\n const { assetsRoot, skillsDir, context } = options;\n\n if (entry.kind !== \"skill\") {\n return { success: false, error: `Cannot deploy ${entry.kind} directly — only skills` };\n }\n\n const sourcePath = join(assetsRoot, entry.source_path);\n const skillMdPath = join(sourcePath, \"SKILL.md\");\n\n const hasSkillMd = await tryWithFsDeadline(\n `stat ${skillMdPath}`,\n async () => {\n await stat(skillMdPath);\n return true;\n },\n false,\n );\n if (!hasSkillMd) {\n return { success: false, error: `SKILL.md not found at ${skillMdPath}` };\n }\n\n const destDir = join(skillsDir, entry.name);\n\n try {\n await withFsDeadline(`mkdir ${destDir}`, () => mkdir(destDir, { recursive: true }));\n\n // Copy the entire skill directory\n await withFsDeadline(\n `cp ${sourcePath} -> ${destDir}`,\n () => cp(sourcePath, destDir, { recursive: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n\n // Write context to a separate CONTEXT.md — never modify the original SKILL.md.\n // The agent discovers both files in the skill directory.\n const contextPath = join(destDir, \"CONTEXT.md\");\n if (context) {\n await withFsDeadline(`write ${contextPath}`, () =>\n writeFile(contextPath, `# Additional Context\\n\\n${context}\\n`, \"utf8\"),\n );\n } else {\n // `force: true` makes this a single call: a stale CONTEXT.md is removed,\n // an absent one is a no-op. The former existsSync probe only added a\n // second trip to the same possibly-wedged mount.\n await withFsDeadline(`rm ${contextPath}`, () => rm(contextPath, { force: true }));\n }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n return { success: true };\n}\n\n/**\n * Remove a deployed skill directory from the session skills directory.\n *\n * @param name - Skill name (directory basename under `skillsDir`).\n * @param skillsDir - Absolute path to the session skills directory.\n * @returns `true` if the skill was found and removed; `false` if it was not\n * deployed, or if the directory could not be reached within the deadline.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function undeployCatalogEntry(name: string, skillsDir: string): Promise<boolean> {\n const destDir = join(skillsDir, name);\n const exists = await tryWithFsDeadline(\n `stat ${destDir}`,\n async () => {\n await stat(destDir);\n return true;\n },\n false,\n );\n if (!exists) return false;\n await withFsDeadline(\n `rm -r ${destDir}`,\n () => rm(destDir, { recursive: true, force: true }),\n fsDeadlineMs() * TREE_OP_DEADLINE_FACTOR,\n );\n return true;\n}\n\n/**\n * Deploy multiple catalog entries in a single batch operation.\n *\n * Non-skill entries (flows, agents, etc.) are automatically skipped and\n * recorded in `result.skipped`. Deployment failures are collected in\n * `result.errors` without aborting the rest of the batch.\n *\n * @param entries - Compiled catalog entries to deploy.\n * @param options - Deployment target and optional context.\n * @returns Aggregated {@link DeployResult} with deployed, skipped, and error lists.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport async function deployAll(\n entries: CatalogEntryCompiled[],\n options: DeployFromCatalogOptions,\n): Promise<DeployResult> {\n const result: DeployResult = { deployed: [], skipped: [], errors: [] };\n\n for (const entry of entries) {\n if (entry.kind !== \"skill\") {\n result.skipped.push(entry.id);\n continue;\n }\n\n // Serial on purpose: concurrent recursive copies onto one mount multiply\n // the queue depth on the exact resource that is already the bottleneck.\n const r = await deployCatalogEntry(entry, options);\n if (r.success) {\n result.deployed.push(entry.id);\n } else {\n result.errors.push(`${entry.id}: ${r.error}`);\n }\n }\n\n return result;\n}\n\n/**\n * Resolve a flow's skill dependencies from the full catalog entry list.\n *\n * Partitions `flow.required_skills` and `flow.optional_skills` into resolved\n * entries and a list of names that could not be found. Missing optional skills\n * are silently ignored (they do not appear in `missing`).\n *\n * @param flow - Compiled flow entry whose skill dependencies should be resolved.\n * @param allEntries - Full set of compiled catalog entries to search.\n * @returns Object containing resolved `required` entries, resolved `optional` entries,\n * and `missing` skill names that were listed as required but not found.\n * @docLink packages/asset-manager/concepts#catalog-deployer\n */\nexport function resolveFlowSkills(\n flow: CatalogEntryCompiled,\n allEntries: CatalogEntryCompiled[],\n): { required: CatalogEntryCompiled[]; optional: CatalogEntryCompiled[]; missing: string[] } {\n const skillsByName = new Map<string, CatalogEntryCompiled>();\n for (const e of allEntries) {\n if (e.kind === \"skill\") skillsByName.set(e.name, e);\n }\n\n const required: CatalogEntryCompiled[] = [];\n const optional: CatalogEntryCompiled[] = [];\n const missing: string[] = [];\n\n for (const name of flow.required_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) required.push(entry);\n else missing.push(name);\n }\n\n for (const name of flow.optional_skills ?? []) {\n const entry = skillsByName.get(name);\n if (entry) optional.push(entry);\n // Optional skills don't count as missing\n }\n\n return { required, optional, missing };\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import { AssetKindRegistryFrozenError, AssetKindConflictError, AssetKindPatternConflictError, AssetKindPathAmbiguityError } from './chunk-3TXEJN4W.js';
2
- import { validateSkill, validateAgent, validateConnector, validateMcpServer, validateContract, validatePrompt, validatePersona, validateRuleset, validatePreset } from './chunk-YK3XLEQJ.js';
3
- import { sha256Hex, decodeSkaileManifest, SKAILE_MANIFEST_FILENAME, isNonAssetPath, isNonAssetFile, compositeSha256, isNonAssetDir } from './chunk-H7R7R5BN.js';
2
+ import { validateSkill, validateAgent, validateConnector, validateMcpServer, validateContract, validatePrompt, validatePersona, validateRuleset, validatePreset } from './chunk-CKNIYIV2.js';
3
+ import { sha256Hex, decodeSkaileManifest, SKAILE_MANIFEST_FILENAME, isNonAssetPath, isNonAssetFile, compositeSha256, isNonAssetDir } from './chunk-CKICWXMU.js';
4
4
  import { readPluginGroupings } from './chunk-RVRB27AN.js';
5
- import { parseFrontmatter } from './chunk-YW2BNDSE.js';
6
- import { isValidPublisher, PUBLISHER_HINT, isValidAssetName } from './chunk-FT4ZHLYR.js';
5
+ import { parseFrontmatter } from './chunk-GOCWM7FN.js';
6
+ import { isValidPublisher, PUBLISHER_HINT, isValidAssetName } from './chunk-WDXZA7QW.js';
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  import * as yaml from 'js-yaml';
@@ -591,14 +591,19 @@ function flowFileNameError(parsed, fileName) {
591
591
  if (fileName === void 0 || typeof id !== "string" || id.length === 0) return void 0;
592
592
  const stem = fileName.replace(/\.flow\.(yaml|yml|json)$/, "");
593
593
  if (stem === fileName || stem === id) return void 0;
594
- return `flow id "${id}" does not match the file name "${fileName}"; a flow asset is named by its id and the flow engine loads it only from "${id}.flow.yaml". Rename the file to "${id}.flow.yaml" or set id: ${stem}`;
594
+ return `flow id "${id}" does not match the file name "${fileName}"; a flow asset is named by its id and \`add\` deploys it as "${id}/${id}.flow.yaml", the one file name the flow engine loads from a flow directory (it ignores "${fileName}" there). Rename the file to "${id}.flow.yaml" or set id: ${stem}`;
595
595
  }
596
596
  var SEMVER_RE = /^(?:0|[1-9]\d{0,14})\.(?:0|[1-9]\d{0,14})\.(?:0|[1-9]\d{0,14})(?:-(?:0|[1-9]\d{0,14}|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d{0,14}|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;
597
- var SEMVER_UNBOUNDED_RE = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:[-+].*)?$/;
597
+ var SEMVER_UNBOUNDED_RE = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;
598
598
  function invalidSemverMessage(version) {
599
599
  const base = `version "${version}" is not valid semver`;
600
- const [core = ""] = version.split(/[-+]/, 1);
601
- const tooLarge = SEMVER_UNBOUNDED_RE.test(version) && core.split(".").some((part) => part.length > 15);
600
+ const [withoutBuild = ""] = version.split("+", 1);
601
+ const dash = withoutBuild.indexOf("-");
602
+ const identifiers = [
603
+ ...(dash < 0 ? withoutBuild : withoutBuild.slice(0, dash)).split("."),
604
+ ...dash < 0 ? [] : withoutBuild.slice(dash + 1).split(".")
605
+ ];
606
+ const tooLarge = SEMVER_UNBOUNDED_RE.test(version) && identifiers.some((part) => /^\d+$/.test(part) && part.length > 15);
602
607
  return tooLarge ? `${base} (this CLI accepts numbers of at most 15 digits)` : base;
603
608
  }
604
609
  var PublisherOverrideSchema = z.object({
@@ -2207,5 +2212,5 @@ function expandRootFilesTree(assetPath, blobByPath) {
2207
2212
  var VERSION = "0.0.0";
2208
2213
 
2209
2214
  export { AGENT_COMPANION_DIRS, AssetKindRegistry, BUILTIN_PROVIDERS, DEFAULT_ATOMIZATION_POLICY, REQUIRES_ENTRY_RE, SEMVER_RE, SKILL_COMPANION_DIRS, SourceConfigSchema, VERSION, agentProvider, barePublisher, buildRequiresGraph, closeOverReferences, computeDeterministicHash, computeDeterministicHashDetailed, connectorProvider, contractProvider, createDefaultKindRegistry, createNodeAssetFs, decodeManifestSourceConfig, detectCycles, discoverAssetsInTree, discoverAssetsInTreeEntries, discoverFromManifest, extractPathCandidates, extractRequires, extractSlashCommands, flowFileNameError, invalidSemverMessage, isExcludedDevPath, isManifestMode, lintUncoveredReferences, loadMergedSourceConfig, loadMergedSourceConfigFromFile, loadSourceConfig, manifestToSourceConfig, mcpServerProvider, mergeSourceConfigs, parseManifestFile, parseSourceConfig, personaProvider, presetProvider, promptProvider, readManifestSourceConfig, requiresSyntaxErrors, rulesetProvider, scanAssetReferences, scanSlashCommandNames, sharesItsFolder, skillProvider, validateSourceConfig };
2210
- //# sourceMappingURL=chunk-ES6ARJPQ.js.map
2211
- //# sourceMappingURL=chunk-ES6ARJPQ.js.map
2215
+ //# sourceMappingURL=chunk-HPVMTX6M.js.map
2216
+ //# sourceMappingURL=chunk-HPVMTX6M.js.map