@skaile/workspaces 6.8.0 → 6.9.0

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 (335) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/ai-sdk.js +5 -5
  3. package/dist/{asset-feeds-NU5UOO5F.js → asset-feeds-JWRIWLVX.js} +19 -19
  4. package/dist/{asset-feeds-NU5UOO5F.js.map → asset-feeds-JWRIWLVX.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +4 -4
  6. package/dist/asset-manager/history.js +19 -1
  7. package/dist/asset-manager/index.js +11 -11
  8. package/dist/asset-manager/installer.js +7 -7
  9. package/dist/asset-manager/renderers.js +6 -6
  10. package/dist/asset-manager/src/history.d.ts.map +1 -1
  11. package/dist/asset-manager/src/index.d.ts +65 -3
  12. package/dist/asset-manager/src/index.d.ts.map +1 -1
  13. package/dist/bridge/harnesses/claude-sdk.js +9 -9
  14. package/dist/bridge/harnesses/codex.js +29 -12
  15. package/dist/bridge/harnesses/codex.js.map +1 -1
  16. package/dist/bridge/harnesses/continue.js +8 -8
  17. package/dist/bridge/harnesses/echo.js +3 -3
  18. package/dist/bridge/harnesses/gemini.js +8 -8
  19. package/dist/bridge/harnesses/goose.js +8 -8
  20. package/dist/bridge/harnesses/omp.js +156 -24
  21. package/dist/bridge/harnesses/omp.js.map +1 -1
  22. package/dist/bridge/harnesses/opencode.js +8 -8
  23. package/dist/bridge/harnesses/qwen.js +8 -8
  24. package/dist/bridge/index.js +14 -14
  25. package/dist/bridge/src/codex/friendly-error.d.ts +7 -1
  26. package/dist/bridge/src/codex/friendly-error.d.ts.map +1 -1
  27. package/dist/bridge/src/codex/login-fallback.d.ts +5 -0
  28. package/dist/bridge/src/codex/login-fallback.d.ts.map +1 -1
  29. package/dist/bridge/src/harnesses/codex.d.ts +2 -0
  30. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
  31. package/dist/bridge/src/harnesses/omp.d.ts +17 -0
  32. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  33. package/dist/{chunk-757G6TTZ.js → chunk-23Q5LT4U.js} +331 -59
  34. package/dist/chunk-23Q5LT4U.js.map +1 -0
  35. package/dist/{chunk-SBNUXJ6E.js → chunk-3AIEJSQR.js} +3 -3
  36. package/dist/{chunk-SBNUXJ6E.js.map → chunk-3AIEJSQR.js.map} +1 -1
  37. package/dist/{chunk-KHWGUXSF.js → chunk-3EPRTMXY.js} +5 -5
  38. package/dist/{chunk-KHWGUXSF.js.map → chunk-3EPRTMXY.js.map} +1 -1
  39. package/dist/{chunk-TMJBEGS4.js → chunk-4KPQ6ILH.js} +5 -34
  40. package/dist/chunk-4KPQ6ILH.js.map +1 -0
  41. package/dist/{chunk-G7NMF5WQ.js → chunk-4ROXSQEG.js} +3 -3
  42. package/dist/{chunk-G7NMF5WQ.js.map → chunk-4ROXSQEG.js.map} +1 -1
  43. package/dist/{chunk-I6XH46Q6.js → chunk-4WB4KSSQ.js} +3 -3
  44. package/dist/{chunk-I6XH46Q6.js.map → chunk-4WB4KSSQ.js.map} +1 -1
  45. package/dist/{chunk-NW7Y5SNK.js → chunk-5AQLCRR7.js} +4 -4
  46. package/dist/{chunk-NW7Y5SNK.js.map → chunk-5AQLCRR7.js.map} +1 -1
  47. package/dist/{chunk-WFK4MUBL.js → chunk-5J6JWGY4.js} +3 -3
  48. package/dist/{chunk-WFK4MUBL.js.map → chunk-5J6JWGY4.js.map} +1 -1
  49. package/dist/{chunk-O5Y7VMVQ.js → chunk-5KWQMCH7.js} +3 -3
  50. package/dist/{chunk-O5Y7VMVQ.js.map → chunk-5KWQMCH7.js.map} +1 -1
  51. package/dist/{chunk-YHNPWSSH.js → chunk-5NTB64PW.js} +45 -13
  52. package/dist/chunk-5NTB64PW.js.map +1 -0
  53. package/dist/{chunk-QGA2OBUJ.js → chunk-72BDCGBB.js} +3 -3
  54. package/dist/{chunk-QGA2OBUJ.js.map → chunk-72BDCGBB.js.map} +1 -1
  55. package/dist/{chunk-KTBKW2FI.js → chunk-7QYBKUAS.js} +4 -3
  56. package/dist/chunk-7QYBKUAS.js.map +1 -0
  57. package/dist/{chunk-E3KABQS3.js → chunk-AERQFD6T.js} +4 -4
  58. package/dist/{chunk-E3KABQS3.js.map → chunk-AERQFD6T.js.map} +1 -1
  59. package/dist/{chunk-XIIIGLSL.js → chunk-AVRTZAH2.js} +9 -9
  60. package/dist/{chunk-XIIIGLSL.js.map → chunk-AVRTZAH2.js.map} +1 -1
  61. package/dist/{chunk-2I5HNM7K.js → chunk-B2DGCYVC.js} +18 -18
  62. package/dist/chunk-B2DGCYVC.js.map +1 -0
  63. package/dist/{chunk-3QX2X77G.js → chunk-C7L5MFUL.js} +3 -3
  64. package/dist/{chunk-3QX2X77G.js.map → chunk-C7L5MFUL.js.map} +1 -1
  65. package/dist/{chunk-ORXV3UB6.js → chunk-CFTTXUM2.js} +3 -3
  66. package/dist/{chunk-ORXV3UB6.js.map → chunk-CFTTXUM2.js.map} +1 -1
  67. package/dist/{chunk-DRHJRTAS.js → chunk-DZRN3SNG.js} +5 -5
  68. package/dist/{chunk-DRHJRTAS.js.map → chunk-DZRN3SNG.js.map} +1 -1
  69. package/dist/{chunk-QCR5AE5E.js → chunk-E675QKFG.js} +5 -5
  70. package/dist/{chunk-QCR5AE5E.js.map → chunk-E675QKFG.js.map} +1 -1
  71. package/dist/{chunk-O7ADRMCR.js → chunk-FZO64PLQ.js} +45 -16
  72. package/dist/chunk-FZO64PLQ.js.map +1 -0
  73. package/dist/{chunk-Y6LC5PEZ.js → chunk-GYBDWW6K.js} +14 -5
  74. package/dist/chunk-GYBDWW6K.js.map +1 -0
  75. package/dist/{chunk-CMXDFTA2.js → chunk-GYPPVANR.js} +3 -3
  76. package/dist/{chunk-CMXDFTA2.js.map → chunk-GYPPVANR.js.map} +1 -1
  77. package/dist/{chunk-G44FFUMA.js → chunk-GZL6RN4Z.js} +92 -14
  78. package/dist/chunk-GZL6RN4Z.js.map +1 -0
  79. package/dist/{chunk-DFP476EU.js → chunk-JY2JXCL6.js} +89 -4
  80. package/dist/chunk-JY2JXCL6.js.map +1 -0
  81. package/dist/{chunk-ZBA4P5TD.js → chunk-LMADWO4Q.js} +9 -6
  82. package/dist/chunk-LMADWO4Q.js.map +1 -0
  83. package/dist/{chunk-3HSLJAMJ.js → chunk-LYVLDGML.js} +3 -3
  84. package/dist/{chunk-3HSLJAMJ.js.map → chunk-LYVLDGML.js.map} +1 -1
  85. package/dist/{chunk-YZD7DUEF.js → chunk-M4G2SVXI.js} +3 -3
  86. package/dist/{chunk-YZD7DUEF.js.map → chunk-M4G2SVXI.js.map} +1 -1
  87. package/dist/{chunk-SGI5MRKP.js → chunk-MDCI4RSG.js} +40 -5
  88. package/dist/chunk-MDCI4RSG.js.map +1 -0
  89. package/dist/{chunk-LJ6PLEDU.js → chunk-MPRWVZXF.js} +316 -51
  90. package/dist/chunk-MPRWVZXF.js.map +1 -0
  91. package/dist/{chunk-KO3VSZQP.js → chunk-NDBHEOIA.js} +6 -6
  92. package/dist/{chunk-KO3VSZQP.js.map → chunk-NDBHEOIA.js.map} +1 -1
  93. package/dist/{chunk-HKRME377.js → chunk-NJVHGS7X.js} +4 -4
  94. package/dist/{chunk-HKRME377.js.map → chunk-NJVHGS7X.js.map} +1 -1
  95. package/dist/{chunk-Q6FKWPRO.js → chunk-O3FYOS64.js} +93 -14
  96. package/dist/chunk-O3FYOS64.js.map +1 -0
  97. package/dist/{chunk-RDIGVPXX.js → chunk-PTJZCOBH.js} +2 -2
  98. package/dist/{chunk-RDIGVPXX.js.map → chunk-PTJZCOBH.js.map} +1 -1
  99. package/dist/{chunk-4CD2R4MJ.js → chunk-QBUJTVMY.js} +4 -4
  100. package/dist/{chunk-4CD2R4MJ.js.map → chunk-QBUJTVMY.js.map} +1 -1
  101. package/dist/{chunk-LL5GMUQG.js → chunk-SE6OL7Y5.js} +7 -7
  102. package/dist/{chunk-LL5GMUQG.js.map → chunk-SE6OL7Y5.js.map} +1 -1
  103. package/dist/{chunk-SILFO5RY.js → chunk-SQMDFM4N.js} +2 -2
  104. package/dist/{chunk-SILFO5RY.js.map → chunk-SQMDFM4N.js.map} +1 -1
  105. package/dist/{chunk-REAF7ZFA.js → chunk-T5EIWWEJ.js} +398 -36
  106. package/dist/chunk-T5EIWWEJ.js.map +1 -0
  107. package/dist/{chunk-QW5B3TEO.js → chunk-TMQFOJ6F.js} +3 -3
  108. package/dist/{chunk-QW5B3TEO.js.map → chunk-TMQFOJ6F.js.map} +1 -1
  109. package/dist/{chunk-BB5EJLKZ.js → chunk-TUOHA6BM.js} +2 -2
  110. package/dist/{chunk-BB5EJLKZ.js.map → chunk-TUOHA6BM.js.map} +1 -1
  111. package/dist/{chunk-HLAEYFUN.js → chunk-U3FI4DVT.js} +3 -3
  112. package/dist/{chunk-HLAEYFUN.js.map → chunk-U3FI4DVT.js.map} +1 -1
  113. package/dist/{chunk-237BMOZW.js → chunk-UWD7YBDR.js} +4 -4
  114. package/dist/{chunk-237BMOZW.js.map → chunk-UWD7YBDR.js.map} +1 -1
  115. package/dist/{chunk-6ZM5X2XW.js → chunk-V2CONXKD.js} +3 -3
  116. package/dist/{chunk-6ZM5X2XW.js.map → chunk-V2CONXKD.js.map} +1 -1
  117. package/dist/{chunk-3NJFPGEB.js → chunk-V3EJYOP2.js} +6 -6
  118. package/dist/{chunk-3NJFPGEB.js.map → chunk-V3EJYOP2.js.map} +1 -1
  119. package/dist/{chunk-K7ZGY2BY.js → chunk-WPLZGT5Z.js} +4095 -3888
  120. package/dist/chunk-WPLZGT5Z.js.map +1 -0
  121. package/dist/{chunk-VT6G5AJV.js → chunk-WS3BOCAT.js} +4 -3
  122. package/dist/chunk-WS3BOCAT.js.map +1 -0
  123. package/dist/{chunk-7YOHUX2M.js → chunk-X2B5GMJO.js} +18 -9
  124. package/dist/chunk-X2B5GMJO.js.map +1 -0
  125. package/dist/{chunk-YGP6XEPA.js → chunk-XPKUFOS3.js} +6 -6
  126. package/dist/{chunk-YGP6XEPA.js.map → chunk-XPKUFOS3.js.map} +1 -1
  127. package/dist/{chunk-XCGDRLMH.js → chunk-Y242OE4B.js} +3 -3
  128. package/dist/{chunk-XCGDRLMH.js.map → chunk-Y242OE4B.js.map} +1 -1
  129. package/dist/{chunk-K6HCOTOZ.js → chunk-Y2BQWZXT.js} +41 -35
  130. package/dist/chunk-Y2BQWZXT.js.map +1 -0
  131. package/dist/{chunk-5TLMHB2U.js → chunk-YGT3CGPD.js} +6 -3
  132. package/dist/chunk-YGT3CGPD.js.map +1 -0
  133. package/dist/{claude-code-AESK7XO4.js → claude-code-YRJIGXTL.js} +5 -5
  134. package/dist/{claude-code-AESK7XO4.js.map → claude-code-YRJIGXTL.js.map} +1 -1
  135. package/dist/cli/index.js +277 -143
  136. package/dist/cli/index.js.map +1 -1
  137. package/dist/cli/src/agent-pins.d.ts +8 -0
  138. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  139. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  140. package/dist/cli/src/commands/catalog.d.ts +4 -4
  141. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  142. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  143. package/dist/cli/src/commands/deploy.d.ts.map +1 -1
  144. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  145. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  146. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  147. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  148. package/dist/cli/src/commands/library-index.d.ts +42 -0
  149. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  150. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  151. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  152. package/dist/cli/src/commands/patch.d.ts.map +1 -1
  153. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  154. package/dist/cli/src/commands/project.d.ts.map +1 -1
  155. package/dist/cli/src/commands/run.d.ts.map +1 -1
  156. package/dist/cli/src/commands/serve-preflight.d.ts +10 -0
  157. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  158. package/dist/cli/src/commands/serve.d.ts +5 -3
  159. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  160. package/dist/cli/src/commands/session.d.ts.map +1 -1
  161. package/dist/cli/src/commands/source.d.ts.map +1 -1
  162. package/dist/cli/src/commands/store.d.ts.map +1 -1
  163. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  164. package/dist/cli/src/config-checks.d.ts +13 -0
  165. package/dist/cli/src/config-checks.d.ts.map +1 -1
  166. package/dist/cli/src/group-help.d.ts +11 -0
  167. package/dist/cli/src/group-help.d.ts.map +1 -0
  168. package/dist/connectors/config.js +2 -2
  169. package/dist/connectors/index.js +17 -17
  170. package/dist/connectors/src/config.d.ts.map +1 -1
  171. package/dist/connectors/src/connector-manager.d.ts +66 -2
  172. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  173. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  174. package/dist/connectors/src/connector-types.d.ts +6 -0
  175. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  176. package/dist/connectors/src/fleet-utils.d.ts +33 -0
  177. package/dist/connectors/src/fleet-utils.d.ts.map +1 -1
  178. package/dist/connectors/src/index.d.ts +2 -2
  179. package/dist/connectors/src/index.d.ts.map +1 -1
  180. package/dist/{connectors-5ZZRVAPD.js → connectors-JKT32HZT.js} +20 -20
  181. package/dist/{connectors-5ZZRVAPD.js.map → connectors-JKT32HZT.js.map} +1 -1
  182. package/dist/core/index.js +4 -4
  183. package/dist/core/logging.js +1 -1
  184. package/dist/core/runtime-assets.js +2 -2
  185. package/dist/core/src/index.d.ts +1 -1
  186. package/dist/core/src/index.d.ts.map +1 -1
  187. package/dist/core/src/logging/config.d.ts.map +1 -1
  188. package/dist/core/src/repo-manager.d.ts +6 -0
  189. package/dist/core/src/repo-manager.d.ts.map +1 -1
  190. package/dist/core/src/run-state-ignore.d.ts +6 -4
  191. package/dist/core/src/run-state-ignore.d.ts.map +1 -1
  192. package/dist/core/src/walker.d.ts.map +1 -1
  193. package/dist/core/src/workspace-config.d.ts +6 -0
  194. package/dist/core/src/workspace-config.d.ts.map +1 -1
  195. package/dist/core/workspace-config.js +1 -1
  196. package/dist/deploy/index.js +4 -4
  197. package/dist/discovery/index.js +2 -2
  198. package/dist/{ensure-sources-VLJ7AUUK.js → ensure-sources-GUJODKY5.js} +23 -23
  199. package/dist/{ensure-sources-VLJ7AUUK.js.map → ensure-sources-GUJODKY5.js.map} +1 -1
  200. package/dist/factory-assets/connectors/box.js +17 -17
  201. package/dist/factory-assets/connectors/deploy.js +17 -17
  202. package/dist/factory-assets/connectors/devserver.js +17 -17
  203. package/dist/factory-assets/connectors/flow/adapter.js +17 -17
  204. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  205. package/dist/factory-assets/connectors/flow/run-flow.js +18 -18
  206. package/dist/factory-assets/connectors/flow.js +17 -17
  207. package/dist/factory-assets/connectors/git.js +17 -17
  208. package/dist/factory-assets/connectors/gmail.js +17 -17
  209. package/dist/factory-assets/connectors/googledrive.js +17 -17
  210. package/dist/factory-assets/connectors/local.js +17 -17
  211. package/dist/factory-assets/connectors/mattermost.js +17 -17
  212. package/dist/factory-assets/connectors/memory.js +17 -17
  213. package/dist/factory-assets/connectors/minio.js +17 -17
  214. package/dist/factory-assets/connectors/postgres.js +17 -17
  215. package/dist/factory-assets/connectors/s3.js +17 -17
  216. package/dist/factory-assets/connectors/sharepoint.js +17 -17
  217. package/dist/factory-assets/connectors/sqlite.js +17 -17
  218. package/dist/factory-assets/connectors/static-server.js +17 -17
  219. package/dist/factory-assets/connectors/tunnel.js +17 -17
  220. package/dist/factory-assets/connectors/webdav.js +17 -17
  221. package/dist/factory-assets/connectors/xstate-store.js +17 -17
  222. package/dist/factory-assets/connectors/xstate.js +17 -17
  223. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +4 -4
  224. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +10 -10
  225. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +15 -15
  226. package/dist/factory-assets/skills/manifest-compliance/SKILL.md +1 -1
  227. package/dist/{flows-I6ODIPZZ.js → flows-UCP6ZUYS.js} +7 -7
  228. package/dist/{flows-I6ODIPZZ.js.map → flows-UCP6ZUYS.js.map} +1 -1
  229. package/dist/{helpers-APXGTZ5A.js → helpers-SO53MRHF.js} +23 -23
  230. package/dist/{helpers-APXGTZ5A.js.map → helpers-SO53MRHF.js.map} +1 -1
  231. package/dist/library/index.js +7 -7
  232. package/dist/library/src/index.d.ts +1 -1
  233. package/dist/library/src/index.d.ts.map +1 -1
  234. package/dist/library/src/remote/index.d.ts +1 -1
  235. package/dist/library/src/remote/index.d.ts.map +1 -1
  236. package/dist/library/src/remote/remote-catalog-source.d.ts +33 -2
  237. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  238. package/dist/{library-publish-B5HL4OBE.js → library-publish-Z5E3YZCZ.js} +61 -47
  239. package/dist/library-publish-Z5E3YZCZ.js.map +1 -0
  240. package/dist/model-endpoint/index.js +7 -7
  241. package/dist/model-endpoint/src/index.d.ts +1 -1
  242. package/dist/model-endpoint/src/index.d.ts.map +1 -1
  243. package/dist/model-endpoint/src/openai-agent.d.ts +60 -0
  244. package/dist/model-endpoint/src/openai-agent.d.ts.map +1 -0
  245. package/dist/model-endpoint/src/resolve.d.ts +12 -3
  246. package/dist/model-endpoint/src/resolve.d.ts.map +1 -1
  247. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  248. package/dist/model-endpoint/src/types.d.ts +33 -0
  249. package/dist/model-endpoint/src/types.d.ts.map +1 -1
  250. package/dist/model-endpoint/src/upstream-models.d.ts +20 -0
  251. package/dist/model-endpoint/src/upstream-models.d.ts.map +1 -0
  252. package/dist/{open-library-F56D46K7.js → open-library-A5OB72FD.js} +26 -26
  253. package/dist/{open-library-F56D46K7.js.map → open-library-A5OB72FD.js.map} +1 -1
  254. package/dist/{open-registry-RZW2AFD6.js → open-registry-BHBHQMBA.js} +11 -11
  255. package/dist/{open-registry-RZW2AFD6.js.map → open-registry-BHBHQMBA.js.map} +1 -1
  256. package/dist/{paths-RPK5PNZQ.js → paths-77PXOXZY.js} +7 -7
  257. package/dist/{paths-RPK5PNZQ.js.map → paths-77PXOXZY.js.map} +1 -1
  258. package/dist/{plugin-store-OJTERUEZ.js → plugin-store-XQP2CRYH.js} +7 -7
  259. package/dist/{plugin-store-OJTERUEZ.js.map → plugin-store-XQP2CRYH.js.map} +1 -1
  260. package/dist/{project-GLTP6VFV.js → project-KTEUN7KR.js} +39 -40
  261. package/dist/{project-GLTP6VFV.js.map → project-KTEUN7KR.js.map} +1 -1
  262. package/dist/resolver/index.js +4 -4
  263. package/dist/runner/index.js +28 -28
  264. package/dist/runner/src/agent-loop.d.ts +42 -0
  265. package/dist/runner/src/agent-loop.d.ts.map +1 -0
  266. package/dist/runner/src/agents/in-process-host.d.ts +9 -6
  267. package/dist/runner/src/agents/in-process-host.d.ts.map +1 -1
  268. package/dist/runner/src/model-endpoint-discovery.d.ts +3 -0
  269. package/dist/runner/src/model-endpoint-discovery.d.ts.map +1 -1
  270. package/dist/runner/src/resource-handler.d.ts +1 -1
  271. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  272. package/dist/runner/src/resources.d.ts +1 -0
  273. package/dist/runner/src/resources.d.ts.map +1 -1
  274. package/dist/runner/src/serve.d.ts.map +1 -1
  275. package/dist/runner/src/session-builder.d.ts +6 -4
  276. package/dist/runner/src/session-builder.d.ts.map +1 -1
  277. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  278. package/dist/runner/src/turn-scheduler.d.ts +29 -2
  279. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  280. package/dist/sdk/asset-manager.js +11 -11
  281. package/dist/sdk/bridge.js +14 -14
  282. package/dist/sdk/core.js +4 -4
  283. package/dist/sdk/flow.js +5 -5
  284. package/dist/sdk/index.js +28 -28
  285. package/dist/sdk/resolver.js +4 -4
  286. package/dist/sdk/runner.js +28 -28
  287. package/dist/sdk/transport/ws/server.js +5 -5
  288. package/dist/sdk/transport/ws.js +5 -5
  289. package/dist/sdk/transport.js +5 -5
  290. package/dist/{serve-preflight-EHLBSNUE.js → serve-preflight-ODQGVUFL.js} +27 -26
  291. package/dist/{serve-preflight-EHLBSNUE.js.map → serve-preflight-ODQGVUFL.js.map} +1 -1
  292. package/dist/{setup-PMZLMFCD.js → setup-QJDI5YAW.js} +24 -24
  293. package/dist/{setup-PMZLMFCD.js.map → setup-QJDI5YAW.js.map} +1 -1
  294. package/dist/{skills-KHHW3RZ3.js → skills-DE2BDQ6G.js} +6 -6
  295. package/dist/{skills-KHHW3RZ3.js.map → skills-DE2BDQ6G.js.map} +1 -1
  296. package/dist/{source-QNSGAM3S.js → source-FKOUYMEM.js} +39 -39
  297. package/dist/{source-QNSGAM3S.js.map → source-FKOUYMEM.js.map} +1 -1
  298. package/dist/{source-manifest-publish-AI725AVE.js → source-manifest-publish-JA4TY4Z6.js} +41 -41
  299. package/dist/{source-manifest-publish-AI725AVE.js.map → source-manifest-publish-JA4TY4Z6.js.map} +1 -1
  300. package/dist/transport/index.js +5 -5
  301. package/dist/transport/ws/server.js +5 -5
  302. package/dist/transport/ws.js +5 -5
  303. package/dist/tui/index.js +29 -29
  304. package/dist/tui/index.js.map +1 -1
  305. package/dist/tui/src/repl.d.ts.map +1 -1
  306. package/dist/types/manifests.js +1 -1
  307. package/dist/types/src/manifests/scaffold-body.d.ts +1 -1
  308. package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
  309. package/dist/workspace-plugin/adapters/mcp.js +20 -20
  310. package/dist/workspace-plugin/adapters/omp.js +14 -14
  311. package/dist/workspace-plugin/index.js +2 -2
  312. package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
  313. package/package.json +1 -1
  314. package/dist/chunk-2I5HNM7K.js.map +0 -1
  315. package/dist/chunk-5TLMHB2U.js.map +0 -1
  316. package/dist/chunk-757G6TTZ.js.map +0 -1
  317. package/dist/chunk-7YOHUX2M.js.map +0 -1
  318. package/dist/chunk-DFP476EU.js.map +0 -1
  319. package/dist/chunk-G44FFUMA.js.map +0 -1
  320. package/dist/chunk-K6HCOTOZ.js.map +0 -1
  321. package/dist/chunk-K7ZGY2BY.js.map +0 -1
  322. package/dist/chunk-KTBKW2FI.js.map +0 -1
  323. package/dist/chunk-LJ6PLEDU.js.map +0 -1
  324. package/dist/chunk-O7ADRMCR.js.map +0 -1
  325. package/dist/chunk-PMZMG3HC.js +0 -83
  326. package/dist/chunk-PMZMG3HC.js.map +0 -1
  327. package/dist/chunk-Q6FKWPRO.js.map +0 -1
  328. package/dist/chunk-REAF7ZFA.js.map +0 -1
  329. package/dist/chunk-SGI5MRKP.js.map +0 -1
  330. package/dist/chunk-TMJBEGS4.js.map +0 -1
  331. package/dist/chunk-VT6G5AJV.js.map +0 -1
  332. package/dist/chunk-Y6LC5PEZ.js.map +0 -1
  333. package/dist/chunk-YHNPWSSH.js.map +0 -1
  334. package/dist/chunk-ZBA4P5TD.js.map +0 -1
  335. package/dist/library-publish-B5HL4OBE.js.map +0 -1
@@ -1 +0,0 @@
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/usage-cost.ts","../model-endpoint/src/server.ts"],"names":["parseTools","item","isRecord","chunk"],"mappings":"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","file":"chunk-REAF7ZFA.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 and for the upstream calls of openai-completions chat requests. 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 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-harnesses.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\n/** OpenAI `response_format` and the OpenRouter body extensions, forwarded verbatim through pi `samplingParams` (only OpenAI-compatible adapters apply them). */\nexport const PASSTHROUGH_OBJECT_KEYS = [\"response_format\", \"usage\", \"provider\"] as const;\n\nconst RESPONSE_FORMAT_TYPES: readonly string[] = [\"text\", \"json_object\", \"json_schema\"];\n\n/**\n * Copies the object-valued request fields `pickSamplingParams` rejects\n * (`response_format`, OpenRouter `usage` and `provider`) after checking their\n * shape, so a malformed value fails with 400 instead of reaching the upstream.\n */\nexport function pickPassthroughObjects(body: Record<string, unknown>): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of PASSTHROUGH_OBJECT_KEYS) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n switch (key) {\n case \"response_format\":\n if (!isRecord(value) || !RESPONSE_FORMAT_TYPES.includes(value.type as string)) {\n throw badRequest(\"response_format.type must be text, json_object or json_schema\");\n }\n if (\n value.type === \"json_schema\" &&\n (!isRecord(value.json_schema) ||\n typeof value.json_schema.name !== \"string\" ||\n value.json_schema.name.length === 0)\n ) {\n throw badRequest(\"response_format.json_schema.name is required\");\n }\n break;\n case \"usage\":\n if (!isRecord(value) || typeof value.include !== \"boolean\") {\n throw badRequest(\"usage.include must be a boolean\");\n }\n break;\n case \"provider\":\n if (!isRecord(value)) throw badRequest(\"provider must be an object\");\n break;\n }\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 SamplingParams,\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 pickPassthroughObjects,\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 /** Upstream-reported cost in USD (OpenRouter); absent when the upstream reported none. */\n cost?: 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\nfunction mergeSamplingParams(\n ...parts: Array<SamplingParams | undefined>\n): SamplingParams | undefined {\n const merged: SamplingParams = Object.assign({}, ...parts);\n return Object.keys(merged).length > 0 ? merged : undefined;\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: mergeSamplingParams(\n pickSamplingParams(body, [\"top_p\", \"frequency_penalty\", \"presence_penalty\", \"seed\", \"stop\"]),\n pickPassthroughObjects(body),\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\"], cost?: number): 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 if (cost !== undefined) result.cost = cost;\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. `cost` is the upstream-reported USD\n * cost (pi does not surface it); it is copied into `usage.cost` when defined.\n */\nexport function toChatCompletion(\n message: AssistantMessage,\n meta: ChatResponseMeta,\n cost?: number,\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, cost),\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 /** Upstream-reported cost in USD; the server sets it before the `done` event is mapped. */\n cost?: number;\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, state.cost),\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 * Upstream `usage.cost` capture.\n *\n * OpenRouter reports the USD cost of a call as `usage.cost` in its response\n * (JSON body, or the last SSE usage chunk). pi-ai drops it: its usage parser\n * reads token counts only. The capture wraps the `fetch` pi uses for one\n * request and reads the cost off a copy of the upstream body.\n */\n\n/** Reads upstream `usage.cost` for the requests made through `fetch`. */\nexport interface CostCapture {\n /** Pass as pi's per-request `fetch`. */\n fetch: typeof fetch;\n /** Resolves once every captured upstream body ended; `undefined` when no cost was reported. */\n cost(): Promise<number | undefined>;\n}\n\n/** The finite `usage.cost` number of one parsed JSON payload, if it has one. */\nfunction costOf(payload: unknown): number | undefined {\n if (typeof payload !== \"object\" || payload === null || !(\"usage\" in payload)) return undefined;\n const { usage } = payload;\n if (typeof usage !== \"object\" || usage === null || !(\"cost\" in usage)) return undefined;\n const { cost } = usage;\n return typeof cost === \"number\" && Number.isFinite(cost) ? cost : undefined;\n}\n\n/** Last `usage.cost` among the `data:` lines of an SSE body; a read error yields `undefined`. */\nasync function sseCost(body: ReadableStream<Uint8Array>): Promise<number | undefined> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n let cost: number | undefined;\n const scan = (line: string): void => {\n if (!line.startsWith(\"data:\") || !line.includes('\"cost\"')) return;\n try {\n cost = costOf(JSON.parse(line.slice(\"data:\".length))) ?? cost;\n } catch {\n // Not a JSON frame (`[DONE]` carries no cost anyway).\n }\n };\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n pending += decoder.decode(value, { stream: true });\n const lines = pending.split(\"\\n\");\n pending = lines.pop() ?? \"\";\n for (const line of lines) scan(line.endsWith(\"\\r\") ? line.slice(0, -1) : line);\n }\n scan(pending + decoder.decode());\n return cost;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Wraps `base` so the cost of each OpenAI-compatible response that goes\n * through it can be read afterwards. The caller receives the body unchanged;\n * a copy (`tee()` for SSE, `clone()` for JSON) is read on the side, so the\n * capture never delays or fails the real request.\n */\nexport function createCostCapture(base: typeof fetch = globalThis.fetch): CostCapture {\n const reads: Promise<number | undefined>[] = [];\n const capturing = (async (input, init) => {\n const response = await base(input, init);\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (type.startsWith(\"text/event-stream\") && response.body) {\n const [forCaller, forCost] = response.body.tee();\n reads.push(sseCost(forCost));\n return new Response(forCaller, response);\n }\n if (type.startsWith(\"application/json\") && response.body) {\n reads.push(\n response\n .clone()\n .json()\n .then(costOf, () => undefined),\n );\n }\n return response;\n }) as typeof fetch;\n return {\n fetch: capturing,\n async cost() {\n const costs = await Promise.all(reads);\n return costs.reduce<number | undefined>((last, cost) => cost ?? last, undefined);\n },\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, loadHarnessSdk, loadHarnessSdkSubpath } 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 { createCostCapture } from \"./usage-cost.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/** Longest a response waits for the cost side-reader after the upstream answer is complete. */\nconst COST_WAIT_MS = 2000;\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 /**\n * Start the upstream pi stream for a parsed chat/responses request. With\n * `captureCost`, `cost()` resolves to the upstream-reported `usage.cost`\n * (OpenAI-completions upstreams only); otherwise it resolves to `undefined`.\n */\n async function startUpstream(\n request: GenerationRequest,\n resolved: ResolvedModel,\n signal: AbortSignal,\n captureCost = false,\n ): Promise<{\n events: AsyncIterable<AssistantMessageEvent>;\n cost(): Promise<number | undefined>;\n }> {\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 // Only the OpenAI-completions adapter has an upstream `usage.cost`; others\n // (Google) reject a custom fetch, so it is not injected for them.\n const capture =\n captureCost && surface === \"openai-completions\"\n ? createCostCapture(options.fetch ?? globalThis.fetch)\n : undefined;\n const common = {\n ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),\n ...(resolved.headers ? { headers: resolved.headers } : {}),\n signal,\n ...(capture ? { fetch: capture.fetch } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(samplingParams !== undefined ? { samplingParams } : {}),\n };\n const context = pi.normalizeContext(request.context);\n const cost = () =>\n capture ? withCeiling(capture.cost(), COST_WAIT_MS) : Promise.resolve(undefined);\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 {\n events: api.streamSimple(resolved.model, context, {\n ...common,\n reasoning,\n }) as AsyncIterable<AssistantMessageEvent>,\n cost,\n };\n }\n return {\n events: api.stream(resolved.model, context, common) as AsyncIterable<AssistantMessageEvent>,\n cost,\n };\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, cost } = await startUpstream(request, resolved, signal, true);\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(\n res,\n 200,\n toChatCompletion(message, { id, created, model: request.model }, await cost()),\n );\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: async (event) => {\n // The usage chunk is the one frame that carries the cost; wait for it\n // only when the caller asked for usage.\n if (event.type === \"done\" && state.includeUsage) state.cost = await cost();\n return chatCompletionChunks(event, state);\n },\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 loadHarnessSdk(\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 loadHarnessSdkSubpath<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\n/** `promise`, or `undefined` once `ms` passed: a slow cost side-reader must not hold the answer back. */\nfunction withCeiling<T>(promise: Promise<T>, ms: number): Promise<T | undefined> {\n const { promise: timeout, resolve } = Promise.withResolvers<undefined>();\n const timer = setTimeout(resolve, ms);\n return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));\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[] | Promise<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(await 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 +0,0 @@
1
- {"version":3,"sources":["../core/src/logging/sinks/sqlite-runtime.ts","../core/src/logging/sinks/sqlite-sink.ts","../core/src/logging/config.ts","../core/src/logging/retention.ts","../core/src/logging/log-safe-text.ts","../core/src/logging/sinks/on-log-bridge-sink.ts","../core/src/logging/sinks/ws-log-sink.ts"],"names":["path"],"mappings":"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","file":"chunk-SGI5MRKP.js","sourcesContent":["/**\n * Runtime-portable embedded SQLite for the logging sink.\n *\n * The log store needs a synchronous, embedded SQLite driver. Bun ships\n * `bun:sqlite`; Node 22.5+ ships `node:sqlite`. This shim selects the right\n * one at runtime so the CLI and runtime run unmodified under either — no Bun\n * dependency baked into the published build.\n *\n * Both drivers accept `$`-prefixed named-parameter keys directly, so callers\n * use one binding convention. The only API gap is transactions: `bun:sqlite`\n * has `db.transaction()`, `node:sqlite` does not — {@link openSqlite}\n * synthesizes it with manual `BEGIN`/`COMMIT`/`ROLLBACK`.\n */\nimport { createRequire } from \"node:module\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\n/** True when executing under the Bun runtime. */\nconst isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\n\n/** A prepared statement bound with `$`-prefixed named parameters. */\nexport interface PortableStatement {\n /** Returns the number of rows the statement changed. */\n run(params?: Record<string, unknown>): PortableRunResult;\n all<T = unknown>(params?: Record<string, unknown>): T[];\n get<T = unknown>(params?: Record<string, unknown>): T | undefined;\n}\n\n/** Outcome of {@link PortableStatement.run}, normalised across drivers. */\nexport interface PortableRunResult {\n changes: number;\n}\n\n/** A synchronous embedded SQLite handle, uniform across Bun and Node. */\nexport interface PortableDatabase {\n exec(sql: string): void;\n prepare(sql: string): PortableStatement;\n /** Wrap `fn` so the statements it runs commit as one transaction. */\n transaction<A extends unknown[]>(fn: (...args: A) => void): (...args: A) => void;\n close(): void;\n}\n\nexport interface OpenSqliteOptions {\n /** Open read-only. The database file must already exist. */\n readonly?: boolean;\n}\n\n/** Minimal structural shape shared by `bun:sqlite` and `node:sqlite` handles. */\ninterface RawStatement {\n run(params?: unknown): unknown;\n all(params?: unknown): unknown[];\n get(params?: unknown): unknown;\n}\ninterface RawDatabase {\n exec(sql: string): unknown;\n prepare(sql: string): RawStatement;\n close(): void;\n}\n\nfunction wrapStatement(stmt: RawStatement): PortableStatement {\n return {\n run: (params) => {\n const raw = (params === undefined ? stmt.run() : stmt.run(params)) as\n | { changes?: number | bigint }\n | undefined;\n return { changes: Number(raw?.changes ?? 0) };\n },\n all: (params) => (params === undefined ? stmt.all() : stmt.all(params)) as never,\n get: (params) => (params === undefined ? stmt.get() : stmt.get(params)) as never,\n };\n}\n\nfunction openBunSqlite(path: string, opts: OpenSqliteOptions): PortableDatabase {\n const { Database } = nodeRequire(\"bun:sqlite\") as {\n Database: new (\n p: string,\n o?: { readonly?: boolean },\n ) => RawDatabase & {\n transaction<A extends unknown[]>(fn: (...args: A) => void): (...args: A) => void;\n };\n };\n const db = opts.readonly ? new Database(path, { readonly: true }) : new Database(path);\n return {\n exec: (sql) => {\n db.exec(sql);\n },\n prepare: (sql) => wrapStatement(db.prepare(sql)),\n transaction: (fn) => db.transaction(fn),\n close: () => {\n db.close();\n },\n };\n}\n\n/**\n * Load `node:sqlite` without Node's \"SQLite is an experimental feature\"\n * `ExperimentalWarning` (Node 22.5–23). The warning is emitted synchronously by\n * the `require`, so the filter is installed for that one call only; every other\n * warning, before or after, is passed through untouched.\n */\nfunction requireNodeSqlite(): {\n DatabaseSync: new (p: string, o?: { readOnly?: boolean }) => RawDatabase;\n} {\n const original = process.emitWarning;\n process.emitWarning = function (this: unknown, warning: string | Error, ...args: unknown[]) {\n const first = args[0];\n const type = typeof first === \"string\" ? first : (first as { type?: string } | undefined)?.type;\n const text = typeof warning === \"string\" ? warning : warning?.message;\n if (type === \"ExperimentalWarning\" && /sqlite/i.test(text ?? \"\")) return;\n return (original as (...a: unknown[]) => void).call(process, warning, ...args);\n } as typeof process.emitWarning;\n try {\n return nodeRequire(\"node:sqlite\");\n } finally {\n process.emitWarning = original;\n }\n}\n\nfunction openNodeSqlite(path: string, opts: OpenSqliteOptions): PortableDatabase {\n const { DatabaseSync } = requireNodeSqlite();\n const db = opts.readonly ? new DatabaseSync(path, { readOnly: true }) : new DatabaseSync(path);\n return {\n exec: (sql) => {\n db.exec(sql);\n },\n prepare: (sql) => wrapStatement(db.prepare(sql)),\n transaction:\n (fn) =>\n (...args) => {\n db.exec(\"BEGIN\");\n try {\n fn(...args);\n db.exec(\"COMMIT\");\n } catch (err) {\n db.exec(\"ROLLBACK\");\n throw err;\n }\n },\n close: () => {\n db.close();\n },\n };\n}\n\n/**\n * Open an embedded SQLite database using the runtime's native driver —\n * `bun:sqlite` under Bun, `node:sqlite` under Node 22.5+.\n */\nexport function openSqlite(path: string, opts: OpenSqliteOptions = {}): PortableDatabase {\n return isBun ? openBunSqlite(path, opts) : openNodeSqlite(path, opts);\n}\n","import { chmodSync } from \"node:fs\";\nimport type { LogEntry, LogQuery, LogQueryResult } from \"@skaile/workspaces/types\";\nimport { openSqlite, type PortableDatabase, type PortableStatement } from \"./sqlite-runtime.js\";\nimport type { LogSink } from \"./types.js\";\n\nexport interface SqliteSinkOptions {\n path: string; // ':memory:' or filesystem path\n}\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS log_entries (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL,\n session_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n subkind TEXT NOT NULL,\n instance TEXT,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n data_json TEXT,\n error_json TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_logs_timestamp ON log_entries(timestamp);\nCREATE INDEX IF NOT EXISTS idx_logs_kind_level ON log_entries(kind, level);\nCREATE INDEX IF NOT EXISTS idx_logs_source ON log_entries(kind, subkind, instance);\n`;\n\ninterface LogEntryRow {\n id: string;\n timestamp: string;\n session_id: string;\n kind: string;\n subkind: string;\n instance: string | null;\n level: string;\n message: string;\n data_json: string | null;\n error_json: string | null;\n}\n\nexport class SqliteSink implements LogSink {\n private db: PortableDatabase;\n private insertStmt: PortableStatement;\n private insertMany: (entries: LogEntry[]) => void;\n private closed = false;\n\n constructor(opts: SqliteSinkOptions) {\n this.db = openSqlite(opts.path);\n if (opts.path !== \":memory:\") {\n // Wait for a concurrent skaile process on the same logs.db instead of SQLITE_BUSY.\n this.db.exec(\"PRAGMA busy_timeout = 5000\");\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n }\n this.db.exec(SCHEMA);\n if (opts.path !== \":memory:\") {\n // Group-writable so a co-grouped host process can open read-write for retention.\n makeGroupWritable(opts.path);\n }\n this.insertStmt = this.db.prepare(\n `INSERT INTO log_entries (id, timestamp, session_id, kind, subkind, instance, level, message, data_json, error_json)\n VALUES ($id, $timestamp, $session_id, $kind, $subkind, $instance, $level, $message, $data_json, $error_json)`,\n );\n this.insertMany = this.db.transaction((entries: LogEntry[]) => {\n for (const e of entries) this.insertStmt.run(this.toRow(e));\n });\n }\n\n write(entry: LogEntry): void {\n if (this.closed) return;\n this.insertStmt.run(this.toRow(entry));\n }\n\n writeBatch(entries: LogEntry[]): void {\n if (this.closed || entries.length === 0) return;\n this.insertMany(entries);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.db.close();\n }\n\n query(q: LogQuery): LogQueryResult {\n if (this.closed) return { entries: [] };\n const where: string[] = [\"session_id = $sessionId\"];\n const params: Record<string, unknown> = { $sessionId: q.sessionId };\n\n if (q.source?.kind) {\n where.push(\"kind = $kind\");\n params.$kind = q.source.kind;\n }\n if (q.source?.subkind) {\n where.push(\"subkind = $subkind\");\n params.$subkind = q.source.subkind;\n }\n if (q.source?.instance) {\n where.push(\"instance = $instance\");\n params.$instance = q.source.instance;\n }\n if (q.levels && q.levels.length > 0) {\n const placeholders = q.levels.map((_, i) => `$level${i}`).join(\", \");\n where.push(`level IN (${placeholders})`);\n q.levels.forEach((lvl, i) => {\n params[`$level${i}`] = lvl;\n });\n }\n if (q.since) {\n where.push(\"timestamp >= $since\");\n params.$since = q.since;\n }\n if (q.until) {\n where.push(\"timestamp < $until\");\n params.$until = q.until;\n }\n if (q.search) {\n // Escape SQL LIKE wildcards so a search for \"100%\" matches the literal string,\n // not \"100<anything>\". \\\\ is also escaped because it's the escape character itself.\n const escaped = q.search.replace(/[\\\\%_]/g, \"\\\\$&\");\n where.push(\"message LIKE $search ESCAPE '\\\\'\");\n params.$search = `%${escaped}%`;\n }\n if (q.cursor) {\n where.push(\"id < $cursor\");\n params.$cursor = q.cursor;\n }\n\n const limit = Math.min(q.limit ?? 500, 5000);\n params.$limit = limit + 1;\n\n const sql = `SELECT id, timestamp, session_id, kind, subkind, instance, level, message, data_json, error_json\n FROM log_entries\n WHERE ${where.join(\" AND \")}\n ORDER BY id DESC\n LIMIT $limit`;\n\n const rows = this.db.prepare(sql).all<LogEntryRow>(params);\n\n const hasMore = rows.length > limit;\n const sliced = hasMore ? rows.slice(0, limit) : rows;\n const entries: LogEntry[] = sliced.map((r) => ({\n id: r.id,\n timestamp: r.timestamp,\n sessionId: r.session_id,\n source: {\n kind: r.kind as LogEntry[\"source\"][\"kind\"],\n subkind: r.subkind,\n instance: r.instance ?? undefined,\n },\n level: r.level as LogEntry[\"level\"],\n message: r.message,\n data: r.data_json ? JSON.parse(r.data_json) : undefined,\n error: r.error_json ? JSON.parse(r.error_json) : undefined,\n }));\n\n return {\n entries,\n nextCursor: hasMore ? entries[entries.length - 1].id : undefined,\n };\n }\n\n // Both bun:sqlite and node:sqlite bind `$name` SQL placeholders from\n // matching `$`-prefixed object keys.\n private toRow(e: LogEntry): Record<string, unknown> {\n return {\n $id: e.id,\n $timestamp: e.timestamp,\n $session_id: e.sessionId,\n $kind: e.source.kind,\n $subkind: e.source.subkind,\n $instance: e.source.instance ?? null,\n $level: e.level,\n $message: e.message,\n $data_json: e.data ? JSON.stringify(e.data) : null,\n $error_json: e.error ? JSON.stringify(e.error) : null,\n };\n }\n}\n\n/**\n * Best-effort `chmod 0664` on the db file and its WAL/SHM siblings. Swallows all\n * errors (missing sibling, EPERM when not the owner) so logging never throws.\n */\nfunction makeGroupWritable(dbPath: string): void {\n for (const p of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {\n try {\n chmodSync(p, 0o664);\n } catch {\n // Sibling may not exist yet, or this process may not own the file.\n // Either way, retention degrades cleanly — never break logging.\n }\n }\n}\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { LogLevel, LogStoreConfig, LogStoreMode } from \"@skaile/workspaces/types\";\nimport { LogStore } from \"./log-store.js\";\nimport { NoOpSink } from \"./sinks/no-op-sink.js\";\nimport { SqliteSink } from \"./sinks/sqlite-sink.js\";\nimport { StdoutSink } from \"./sinks/stdout-sink.js\";\n\nconst VALID_MODES: LogStoreMode[] = [\"persistent\", \"ephemeral\", \"off\"];\nconst VALID_LEVELS: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\nexport interface ResolveLogStoreConfigInput {\n sessionId: string;\n workspacePath?: string;\n yamlBlock?: Partial<{\n mode: LogStoreMode;\n level: LogLevel;\n retention: { maxEntries?: number; maxAgeDays?: number };\n }>;\n}\n\nexport function resolveLogStoreConfig(input: ResolveLogStoreConfigInput): LogStoreConfig {\n const yaml = input.yamlBlock ?? {};\n const envMode = process.env.SKAILE_LOG_MODE as LogStoreMode | undefined;\n const envLevel = process.env.SKAILE_LOG_LEVEL as LogLevel | undefined;\n\n const mode = envMode ?? yaml.mode ?? \"persistent\";\n if (!VALID_MODES.includes(mode)) {\n throw new Error(`Invalid logging.mode: ${mode}`);\n }\n const level = envLevel ?? yaml.level ?? \"info\";\n if (!VALID_LEVELS.includes(level)) {\n throw new Error(`Invalid logging.level: ${level}`);\n }\n\n return {\n sessionId: input.sessionId,\n workspacePath: input.workspacePath,\n mode,\n level,\n retention: yaml.retention,\n };\n}\n\nexport interface CreateLogStoreOptions {\n /**\n * Mirror every entry to stdout as well (default `true`, for container logs).\n * A CLI host that already renders the entries itself passes `false` so a\n * record is not printed twice.\n */\n stdout?: boolean;\n}\n\nexport function createLogStoreFromConfig(\n cfg: LogStoreConfig,\n opts: CreateLogStoreOptions = {},\n): LogStore {\n const sinks = [];\n if (cfg.mode === \"off\") {\n sinks.push(new NoOpSink());\n } else if (cfg.mode === \"ephemeral\") {\n sinks.push(new SqliteSink({ path: \":memory:\" }));\n } else {\n if (!cfg.workspacePath) {\n throw new Error(\"logging.mode=persistent requires workspacePath\");\n }\n const dir = path.join(cfg.workspacePath, \".skaile\");\n mkdirSync(dir, { recursive: true });\n const dbPath = path.join(dir, \"logs.db\");\n sinks.push(new SqliteSink({ path: dbPath }));\n }\n // Include stdout for live container logs (dev-friendly) unless the host opts out.\n if (opts.stdout !== false) sinks.push(new StdoutSink());\n return new LogStore({\n sessionId: cfg.sessionId,\n level: cfg.level,\n sinks,\n });\n}\n","/**\n * Retention for the per-session structured-log SQLite store (`logs.db`).\n *\n * Mirrors the platform's `enforceLogsRetention`\n * (`platform/backend/libs/session/src/logs-retention.utils.ts`): the same\n * age-then-count semantics, batch size, pass ceiling and busy timeout. The\n * platform trims the host copy of the file once per wake; in broker mode that\n * copy is not the file the runner writes, so the runner trims its own file at\n * boot. In docker mode both trim the same file with the same rules, which is\n * harmless: a second pass finds nothing left to delete.\n */\nimport { existsSync } from \"node:fs\";\nimport type { LogStoreRetention } from \"@skaile/workspaces/types\";\nimport { isRetentionValue } from \"./retention-value.js\";\nimport { openSqlite, type PortableStatement } from \"./sinks/sqlite-runtime.js\";\n\n/** Rows removed by one {@link enforceLogsRetention} run. */\nexport interface EnforceLogsRetentionResult {\n deletedByAge: number;\n deletedByCount: number;\n}\n\n/**\n * The platform's cloud-mode retention defaults (docker and broker). Used when\n * `skaile.yaml` has no `logging.retention` value for a field.\n */\nexport const DEFAULT_LOGS_RETENTION: Readonly<Required<LogStoreRetention>> = Object.freeze({\n maxEntries: 100_000,\n maxAgeDays: 7,\n});\n\nconst DAY_MS = 86_400_000;\n\n/** Rows deleted per statement. Caps both the write lock and the loop stall. */\nconst BATCH_SIZE = 500;\n\n/**\n * Pass ceiling per statement. Concurrent inserts keep refilling the count-trim\n * delete-set, so \"loop until a short batch\" is not a guaranteed bound;\n * leftovers are trimmed on the next boot.\n */\nconst MAX_TRIM_PASSES = 200;\n\n/** Wait on a lock held by another connection instead of failing with SQLITE_BUSY. */\nconst BUSY_TIMEOUT_MS = 2_000;\n\n// `LIMIT` directly on `DELETE` needs SQLITE_ENABLE_UPDATE_DELETE_LIMIT; the\n// `id IN (SELECT ... LIMIT)` form works under both bun:sqlite and node:sqlite.\nconst AGE_TRIM_SQL = `DELETE FROM log_entries WHERE id IN (\n SELECT id FROM log_entries WHERE timestamp < $cutoff ORDER BY id LIMIT $batch\n)`;\n\nconst COUNT_TRIM_SQL = `DELETE FROM log_entries WHERE id IN (\n SELECT id FROM log_entries\n WHERE id NOT IN (SELECT id FROM log_entries ORDER BY id DESC LIMIT $keep)\n ORDER BY id LIMIT $batch\n)`;\n\n/**\n * Overlay the configured retention on {@link DEFAULT_LOGS_RETENTION}, field by\n * field. A value that is not a non-negative finite number counts as unset.\n * `0` is a valid value: `maxEntries: 0` or `maxAgeDays: 0` deletes every row,\n * as it does on the platform.\n */\nexport function resolveLogsRetention(\n configured: LogStoreRetention | undefined,\n): Required<LogStoreRetention> {\n return {\n maxEntries: isRetentionValue(configured?.maxEntries)\n ? configured.maxEntries\n : DEFAULT_LOGS_RETENTION.maxEntries,\n maxAgeDays: isRetentionValue(configured?.maxAgeDays)\n ? configured.maxAgeDays\n : DEFAULT_LOGS_RETENTION.maxAgeDays,\n };\n}\n\nfunction yieldToEventLoop(): Promise<void> {\n return new Promise<void>((resolve) => setImmediate(resolve));\n}\n\n/**\n * Run one bounded delete until it stops filling a batch. Each statement is its\n * own implicit transaction, so no lock is held across the yield and the\n * in-process sink can write between batches.\n */\nasync function runBoundedTrim(\n stmt: PortableStatement,\n params: Record<string, unknown>,\n): Promise<number> {\n let deleted = 0;\n for (let pass = 0; pass < MAX_TRIM_PASSES; pass++) {\n const { changes } = stmt.run(params);\n deleted += changes;\n if (changes < BATCH_SIZE) break;\n await yieldToEventLoop();\n }\n return deleted;\n}\n\n/**\n * Delete rows older than `maxAgeDays`, then keep at most the `maxEntries`\n * newest rows (by ULID id). Uses its own connection with a busy timeout, in\n * bounded batches that yield to the event loop between passes.\n *\n * Returns zero counts when the file does not exist or the policy is empty.\n * Other failures (lock timeout, not a log store) reject; the caller decides\n * how loud to be.\n */\nexport async function enforceLogsRetention(\n dbPath: string,\n retention: LogStoreRetention,\n): Promise<EnforceLogsRetentionResult> {\n const result: EnforceLogsRetentionResult = { deletedByAge: 0, deletedByCount: 0 };\n if (!existsSync(dbPath)) return result;\n if (retention.maxAgeDays == null && retention.maxEntries == null) return result;\n\n const db = openSqlite(dbPath);\n try {\n db.exec(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`);\n if (retention.maxAgeDays != null) {\n const cutoff = new Date(Date.now() - retention.maxAgeDays * DAY_MS).toISOString();\n result.deletedByAge = await runBoundedTrim(db.prepare(AGE_TRIM_SQL), {\n $cutoff: cutoff,\n $batch: BATCH_SIZE,\n });\n }\n if (retention.maxEntries != null) {\n result.deletedByCount = await runBoundedTrim(db.prepare(COUNT_TRIM_SQL), {\n $keep: retention.maxEntries,\n $batch: BATCH_SIZE,\n });\n }\n return result;\n } finally {\n db.close();\n }\n}\n","/**\n * Log-safe rendering of free text that may quote customer document paths.\n *\n * Rule (skaile-ai/platform#6909): logs carry ids and fingerprints, never document\n * paths, file names or folder names. Runner rows reach the zone log store on the\n * broker fleet, and SharePoint/OneDrive folder names routinely carry customer,\n * project and company names.\n *\n * The fingerprint is an unsalted sha256 prefix on purpose and matches the\n * platform's `backend/libs/log-sink/src/log-safe-path.ts`: the pinned literal\n * `\"Kunde AG/Projekt Nordwind/Vertrag final.pdf\"` -> `<path#bdead54ccb34>.pdf`\n * is shared with the platform tests, so an operator can match a tag across both.\n */\nimport { createHash } from \"node:crypto\";\n\nconst FINGERPRINT_LENGTH = 12;\n// Short and alphanumeric only, so a folder like `Kunde.Siemens` does not leak its tail.\nconst SAFE_EXTENSION = /^[a-z0-9]{1,5}$/;\n\nconst QUOTED = \"<quoted>\";\nconst PATH_TAG = /^<path#(?:[0-9a-f]{12}|none)>(?:\\.[a-z0-9]{1,5})?$/;\n\n// Each span is bounded and single-line so the scan stays linear on long input.\n// A single-quote span opens and closes on a non-word boundary, so `don't` survives.\nconst QUOTED_SPANS: RegExp[] = [\n /(?<!\\w)'[^\\n]{1,512}?'(?!\\w)/g,\n /\"[^\"\\n]{1,512}\"/g,\n /“[^”\\n]{1,512}”/g,\n /‘[^’\\n]{1,512}’/g,\n /`[^`\\n]{1,512}`/g,\n];\n\n// The host may be empty (`file:///srv/x`).\nconst URL = /\\b([a-z][a-z0-9+.-]{0,31}:\\/\\/)([^\\s/?#]*)([^\\s]*)/gi;\nconst TRAILING_PUNCT = /[.,;:)\\]}]+$/;\nconst LEADING_PUNCT = /^[([{]+/;\nconst SLASH_BETWEEN = /[^/\\\\][/\\\\]+[^/\\\\]/;\nconst ROOTED = /^(?:\\/|\\.\\/|~\\/|[A-Za-z]:\\\\|\\\\\\\\)\\S/;\n// A slash that is not a path: a MIME type or a protocol version.\nconst NOT_A_PATH =\n /^(?:(?:application|text|image|audio|video|multipart|font|model)\\/[\\w.+-]+|HTTPS?\\/\\d(?:\\.\\d)?)$/i;\n// `key=value`: only the value is a candidate, so the key stays readable and the tag of the\n// value matches the platform's tag for the same path.\nconst KEY_VALUE = /^([A-Za-z_][\\w.-]{0,63})=(.+)$/;\nconst DIGITS_AND_SLASHES = /^[\\d/]+$/;\nconst DOCUMENT_NAME =\n /^.+\\.(?:doc|docx|docm|dot|dotx|xls|xlsx|xlsm|ppt|pptx|pptm|pdf|csv|tsv|txt|rtf|odt|ods|odp|odg|pages|key|numbers|vsd|vsdx|one|mpp|dwg|msg|eml|ics|vcf|md|json|xml|htm|html|zip|7z|rar|tar|gz|png|jpg|jpeg|gif|tif|tiff|heic|webp|bmp|svg|mp3|mp4|mov)$/i;\n\n/** Trims and strips leading `./` / `/` and trailing `/`, so `/a/b/` and `a/b` fingerprint alike. */\nfunction normalizePath(value: string): string {\n let normalized = value.trim();\n for (;;) {\n if (normalized.startsWith(\"./\")) normalized = normalized.slice(2);\n else if (normalized.startsWith(\"/\")) normalized = normalized.slice(1);\n else break;\n }\n while (normalized.endsWith(\"/\")) normalized = normalized.slice(0, -1);\n return normalized;\n}\n\n/** First 12 hex characters of the sha256 of the normalized path (the platform's `pathFingerprint`). */\nexport function pathFingerprint(value: string): string {\n return createHash(\"sha256\")\n .update(normalizePath(value), \"utf8\")\n .digest(\"hex\")\n .slice(0, FINGERPRINT_LENGTH);\n}\n\n/**\n * `<path#12hex>[.ext]` for a path, or `<path#none>` when it is empty after\n * normalizing (the platform's `pathTag`). The extension is kept only when short\n * and alphanumeric. Like the platform, the hash normalizes the normalized path\n * once more, so the two agree on every input.\n */\nexport function pathTag(value: string): string {\n const normalized = normalizePath(value);\n if (!normalized) return \"<path#none>\";\n const hash = pathFingerprint(normalized);\n const basename = normalized.slice(normalized.lastIndexOf(\"/\") + 1);\n const dot = basename.lastIndexOf(\".\");\n const ext = dot > 0 ? basename.slice(dot + 1).toLowerCase() : \"\";\n return SAFE_EXTENSION.test(ext) ? `<path#${hash}>.${ext}` : `<path#${hash}>`;\n}\n\nfunction scrubUrl(match: string, scheme: string, host: string, rest: string): string {\n const trailing = rest.match(TRAILING_PUNCT)?.[0] ?? \"\";\n const body = trailing ? rest.slice(0, -trailing.length) : rest;\n if (body === \"\" || body === \"/\" || PATH_TAG.test(body.slice(1))) return match;\n const path = body.split(/[?#]/, 1)[0] ?? \"\";\n return `${scheme}${host}/${pathTag(path)}${trailing}`;\n}\n\nfunction scrubToken(token: string): string {\n if (token.includes(\"://\")) return token;\n const leading = token.match(LEADING_PUNCT)?.[0] ?? \"\";\n const afterLeading = token.slice(leading.length);\n const trailing = afterLeading.match(TRAILING_PUNCT)?.[0] ?? \"\";\n const core = trailing ? afterLeading.slice(0, -trailing.length) : afterLeading;\n // Skip only a token that IS a tag: `<quoted>/Projekt/Vertrag.pdf` still holds names.\n if (core === QUOTED || PATH_TAG.test(core)) return token;\n if (!core || DIGITS_AND_SLASHES.test(core) || NOT_A_PATH.test(core)) return token;\n const keyValue = core.match(KEY_VALUE);\n if (keyValue) return `${leading}${keyValue[1]}=${scrubToken(keyValue[2] ?? \"\")}${trailing}`;\n const isPath = SLASH_BETWEEN.test(core) || ROOTED.test(core);\n if (!isPath && !DOCUMENT_NAME.test(core)) return token;\n return `${leading}${pathTag(core)}${trailing}`;\n}\n\n/**\n * Removes document paths and names from free text whose names are not known\n * up front, such as a connector's error message: quoted spans become\n * `<quoted>`, URL paths and slash paths become `<path#…>` fingerprints (a URL\n * keeps its scheme and host), and bare document file names are fingerprinted.\n * Version numbers, host names and digit ratios/dates are left alone. Idempotent.\n * Words of a path that contains spaces and is not quoted can survive outside\n * the slash-bearing token; quote paths at the source when that matters.\n */\nexport function scrubLogText(text: string): string {\n let out = text;\n for (const span of QUOTED_SPANS) {\n out = out.replace(span, QUOTED);\n }\n out = out.replace(URL, scrubUrl);\n return out.replace(/\\S+/g, scrubToken);\n}\n","import type { LogEntry, LogSink } from \"@skaile/workspaces/types\";\n\n/**\n * OnLogBridgeSink — forwards every entry as a single formatted text line to\n * a legacy `onLog(line)` callback. Used as a back-compat bridge for callers\n * that historically received plain text lines from the runner.\n *\n * Format: `[level] [kind:subkind[:instance]] message [data-json] [— error.message]`\n */\nexport class OnLogBridgeSink implements LogSink {\n constructor(private readonly onLog: (line: string) => void) {}\n\n write(entry: LogEntry): void {\n const tag = entry.source.instance\n ? `${entry.source.kind}:${entry.source.subkind}:${entry.source.instance}`\n : `${entry.source.kind}:${entry.source.subkind}`;\n let line = `[${entry.level}] [${tag}] ${entry.message}`;\n if (entry.data && Object.keys(entry.data).length > 0) {\n line += ` ${JSON.stringify(entry.data)}`;\n }\n if (entry.error?.message) {\n line += ` — ${entry.error.message}`;\n }\n this.onLog(line);\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {\n /* no-op */\n }\n}\n","import type { LogEntry, LogEntryEvent } from \"@skaile/workspaces/types\";\nimport type { LogSink } from \"./types.js\";\n\nexport interface WsLogSinkOptions {\n /**\n * Transport send callback. Typically wired to `transport.send` on the\n * runner's `WebSocketServerTransport`. The transport already drops sends\n * when no client is connected — this sink does not buffer.\n */\n send: (event: LogEntryEvent) => void;\n}\n\n/**\n * Forwards every LogEntry recorded by LogStore as a `log_entry` AgentEvent\n * over the configured transport. Used by the runner to make container-side\n * structured logs visible to the platform gateway in real time. Historical\n * reads still go through SQLite — this sink is for live tail only.\n */\nexport class WsLogSink implements LogSink {\n private readonly send: (event: LogEntryEvent) => void;\n\n constructor(opts: WsLogSinkOptions) {\n this.send = opts.send;\n }\n\n write(entry: LogEntry): void {\n try {\n this.send({ type: \"log_entry\", entry });\n } catch {\n // Logging must never break the agent — drop on transport failure.\n }\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {\n /* nothing to release — transport lifecycle is owned by the caller */\n }\n}\n"]}