@skaile/workspaces 5.17.0 → 5.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{asset-feeds-MALYFZUM.js → asset-feeds-MKB5JUML.js} +21 -21
  3. package/dist/{asset-feeds-MALYFZUM.js.map → asset-feeds-MKB5JUML.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +8 -8
  5. package/dist/asset-manager/index.js +18 -14
  6. package/dist/asset-manager/installer.js +10 -10
  7. package/dist/asset-manager/renderers.js +9 -9
  8. package/dist/asset-manager/src/index.d.ts +122 -5
  9. package/dist/asset-manager/src/index.d.ts.map +1 -1
  10. package/dist/asset-manager/src/installer.d.ts +13 -10
  11. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  12. package/dist/asset-manager/src/mcp-config.d.ts +61 -1
  13. package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
  14. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  15. package/dist/bridge/drivers/claude-sdk.js +12 -12
  16. package/dist/bridge/drivers/codex.js +12 -12
  17. package/dist/bridge/drivers/continue.js +11 -11
  18. package/dist/bridge/drivers/echo.js +27 -8
  19. package/dist/bridge/drivers/echo.js.map +1 -1
  20. package/dist/bridge/drivers/gemini.js +7 -7
  21. package/dist/bridge/drivers/goose.js +11 -11
  22. package/dist/bridge/drivers/omp.js +31 -5
  23. package/dist/bridge/drivers/omp.js.map +1 -1
  24. package/dist/bridge/drivers/opencode.js +11 -11
  25. package/dist/bridge/drivers/qwen.js +7 -7
  26. package/dist/bridge/index.js +14 -14
  27. package/dist/bridge/src/driver-model-check.d.ts +8 -8
  28. package/dist/bridge/src/driver-model-check.d.ts.map +1 -1
  29. package/dist/bridge/src/drivers/echo.d.ts +3 -0
  30. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  31. package/dist/bridge/src/drivers/omp-models-yml.d.ts +5 -0
  32. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
  33. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  34. package/dist/bridge/src/index.d.ts +1 -1
  35. package/dist/bridge/src/index.d.ts.map +1 -1
  36. package/dist/{chunk-CWAWYXD5.js → chunk-2ABUJYVI.js} +3 -3
  37. package/dist/{chunk-CWAWYXD5.js.map → chunk-2ABUJYVI.js.map} +1 -1
  38. package/dist/{chunk-ZVZTCDUN.js → chunk-2NOLF7B2.js} +37 -9
  39. package/dist/chunk-2NOLF7B2.js.map +1 -0
  40. package/dist/{chunk-QSLXB44M.js → chunk-34C2EKWJ.js} +3 -3
  41. package/dist/{chunk-QSLXB44M.js.map → chunk-34C2EKWJ.js.map} +1 -1
  42. package/dist/{chunk-3OYOBTY4.js → chunk-3KMREAR2.js} +3 -3
  43. package/dist/{chunk-3OYOBTY4.js.map → chunk-3KMREAR2.js.map} +1 -1
  44. package/dist/{chunk-D54T2F54.js → chunk-5TBFN46Z.js} +4 -4
  45. package/dist/chunk-5TBFN46Z.js.map +1 -0
  46. package/dist/{chunk-PGZDSDOB.js → chunk-6Z5KTFJT.js} +3 -3
  47. package/dist/{chunk-PGZDSDOB.js.map → chunk-6Z5KTFJT.js.map} +1 -1
  48. package/dist/{chunk-WY22FMZF.js → chunk-7ANRSTNR.js} +5 -5
  49. package/dist/{chunk-WY22FMZF.js.map → chunk-7ANRSTNR.js.map} +1 -1
  50. package/dist/{chunk-GYZJKZPJ.js → chunk-7FHZB2QU.js} +3 -3
  51. package/dist/{chunk-GYZJKZPJ.js.map → chunk-7FHZB2QU.js.map} +1 -1
  52. package/dist/{chunk-QBY74UBH.js → chunk-AIBAOXDU.js} +7 -7
  53. package/dist/{chunk-QBY74UBH.js.map → chunk-AIBAOXDU.js.map} +1 -1
  54. package/dist/{chunk-ZPCABSSW.js → chunk-BBWSGVVE.js} +4 -4
  55. package/dist/{chunk-ZPCABSSW.js.map → chunk-BBWSGVVE.js.map} +1 -1
  56. package/dist/{chunk-QEX75L77.js → chunk-BO426QWN.js} +13 -7
  57. package/dist/chunk-BO426QWN.js.map +1 -0
  58. package/dist/{chunk-46IRZJV4.js → chunk-CD7SVH6W.js} +4 -4
  59. package/dist/{chunk-46IRZJV4.js.map → chunk-CD7SVH6W.js.map} +1 -1
  60. package/dist/{chunk-WKEBNB5S.js → chunk-CKBCX3HQ.js} +4 -4
  61. package/dist/{chunk-WKEBNB5S.js.map → chunk-CKBCX3HQ.js.map} +1 -1
  62. package/dist/{chunk-H7R7R5BN.js → chunk-CKICWXMU.js} +18 -15
  63. package/dist/chunk-CKICWXMU.js.map +1 -0
  64. package/dist/{chunk-YK3XLEQJ.js → chunk-CKNIYIV2.js} +83 -77
  65. package/dist/chunk-CKNIYIV2.js.map +1 -0
  66. package/dist/{chunk-SPV2CXJ3.js → chunk-D6UBEYQH.js} +4 -4
  67. package/dist/{chunk-SPV2CXJ3.js.map → chunk-D6UBEYQH.js.map} +1 -1
  68. package/dist/{chunk-D5REDKVU.js → chunk-FKU57Q5Q.js} +3 -3
  69. package/dist/{chunk-D5REDKVU.js.map → chunk-FKU57Q5Q.js.map} +1 -1
  70. package/dist/{chunk-5SWED2LW.js → chunk-GBYNC5V3.js} +3 -3
  71. package/dist/{chunk-5SWED2LW.js.map → chunk-GBYNC5V3.js.map} +1 -1
  72. package/dist/{chunk-YW2BNDSE.js → chunk-GOCWM7FN.js} +22 -4
  73. package/dist/chunk-GOCWM7FN.js.map +1 -0
  74. package/dist/{chunk-ZWUJ22RF.js → chunk-GOK4QRJR.js} +16 -23
  75. package/dist/chunk-GOK4QRJR.js.map +1 -0
  76. package/dist/{chunk-AP24HESN.js → chunk-H6UVIKQ2.js} +3 -3
  77. package/dist/{chunk-AP24HESN.js.map → chunk-H6UVIKQ2.js.map} +1 -1
  78. package/dist/{chunk-ES6ARJPQ.js → chunk-HPVMTX6M.js} +15 -10
  79. package/dist/chunk-HPVMTX6M.js.map +1 -0
  80. package/dist/{chunk-BVXXBZWA.js → chunk-IW6F6R2W.js} +24 -15
  81. package/dist/chunk-IW6F6R2W.js.map +1 -0
  82. package/dist/{chunk-HUKUYWBJ.js → chunk-JYWW32JI.js} +17 -6
  83. package/dist/chunk-JYWW32JI.js.map +1 -0
  84. package/dist/{chunk-5RDZ5JHH.js → chunk-KC6HGWXN.js} +4 -4
  85. package/dist/{chunk-5RDZ5JHH.js.map → chunk-KC6HGWXN.js.map} +1 -1
  86. package/dist/{chunk-FACRITOL.js → chunk-KSBDLCZI.js} +8 -4
  87. package/dist/chunk-KSBDLCZI.js.map +1 -0
  88. package/dist/{chunk-LQT2IKYY.js → chunk-KY4UXX7M.js} +2 -2
  89. package/dist/{chunk-LQT2IKYY.js.map → chunk-KY4UXX7M.js.map} +1 -1
  90. package/dist/{chunk-L6UMSKDF.js → chunk-LW7ZI6EQ.js} +8 -36
  91. package/dist/chunk-LW7ZI6EQ.js.map +1 -0
  92. package/dist/{chunk-DR5ZOEYI.js → chunk-OYIENLJI.js} +32 -18
  93. package/dist/chunk-OYIENLJI.js.map +1 -0
  94. package/dist/{chunk-EOKWTN4N.js → chunk-PBSN4RTV.js} +44 -29
  95. package/dist/chunk-PBSN4RTV.js.map +1 -0
  96. package/dist/{chunk-WXWQNJCT.js → chunk-PUK7TQT4.js} +3 -3
  97. package/dist/{chunk-WXWQNJCT.js.map → chunk-PUK7TQT4.js.map} +1 -1
  98. package/dist/{chunk-5DCOG5B5.js → chunk-RD6N2D7I.js} +3 -3
  99. package/dist/{chunk-5DCOG5B5.js.map → chunk-RD6N2D7I.js.map} +1 -1
  100. package/dist/{chunk-OXUCYHL5.js → chunk-RP3FZ2T6.js} +53 -16
  101. package/dist/chunk-RP3FZ2T6.js.map +1 -0
  102. package/dist/{chunk-6GSE63K2.js → chunk-SRNCN4X2.js} +13 -5
  103. package/dist/chunk-SRNCN4X2.js.map +1 -0
  104. package/dist/{chunk-PIC23DDE.js → chunk-T2TQAH2X.js} +42 -11
  105. package/dist/chunk-T2TQAH2X.js.map +1 -0
  106. package/dist/{chunk-SXWGLW23.js → chunk-U2FI547Z.js} +4 -4
  107. package/dist/{chunk-SXWGLW23.js.map → chunk-U2FI547Z.js.map} +1 -1
  108. package/dist/{chunk-KZWZRNIY.js → chunk-U7V5SIFW.js} +55 -17
  109. package/dist/chunk-U7V5SIFW.js.map +1 -0
  110. package/dist/{chunk-EYDRONKO.js → chunk-V3D4HQMS.js} +4 -4
  111. package/dist/{chunk-EYDRONKO.js.map → chunk-V3D4HQMS.js.map} +1 -1
  112. package/dist/{chunk-D3PU3C6F.js → chunk-VKPBUPH7.js} +41 -15
  113. package/dist/chunk-VKPBUPH7.js.map +1 -0
  114. package/dist/{chunk-W44KA24A.js → chunk-VM3PH7BB.js} +695 -96
  115. package/dist/chunk-VM3PH7BB.js.map +1 -0
  116. package/dist/{chunk-HLETG3CX.js → chunk-VOBXINUZ.js} +3 -3
  117. package/dist/{chunk-HLETG3CX.js.map → chunk-VOBXINUZ.js.map} +1 -1
  118. package/dist/{chunk-FT4ZHLYR.js → chunk-WDXZA7QW.js} +33 -3
  119. package/dist/chunk-WDXZA7QW.js.map +1 -0
  120. package/dist/{chunk-FSSRBWYL.js → chunk-WJCQFNF6.js} +4 -4
  121. package/dist/chunk-WJCQFNF6.js.map +1 -0
  122. package/dist/{chunk-2SKPPIV7.js → chunk-WJLYL6RY.js} +5 -5
  123. package/dist/{chunk-2SKPPIV7.js.map → chunk-WJLYL6RY.js.map} +1 -1
  124. package/dist/{chunk-MMARPEV7.js → chunk-WMF2C5U7.js} +6 -6
  125. package/dist/{chunk-MMARPEV7.js.map → chunk-WMF2C5U7.js.map} +1 -1
  126. package/dist/{chunk-OQN7PCI4.js → chunk-X3AUS4RW.js} +4 -4
  127. package/dist/{chunk-OQN7PCI4.js.map → chunk-X3AUS4RW.js.map} +1 -1
  128. package/dist/{chunk-BBRMS4IC.js → chunk-X6GUNN7X.js} +8 -8
  129. package/dist/{chunk-BBRMS4IC.js.map → chunk-X6GUNN7X.js.map} +1 -1
  130. package/dist/{chunk-QXA2W6UB.js → chunk-XTO436PV.js} +3 -3
  131. package/dist/{chunk-QXA2W6UB.js.map → chunk-XTO436PV.js.map} +1 -1
  132. package/dist/{chunk-QW534EZB.js → chunk-YARXR3CN.js} +53 -8
  133. package/dist/chunk-YARXR3CN.js.map +1 -0
  134. package/dist/{chunk-FSLVMZXR.js → chunk-YZ3N7IUU.js} +72 -31
  135. package/dist/chunk-YZ3N7IUU.js.map +1 -0
  136. package/dist/{chunk-V5CDPKDA.js → chunk-ZBMC6IAE.js} +44 -27
  137. package/dist/chunk-ZBMC6IAE.js.map +1 -0
  138. package/dist/cli/index.js +346 -147
  139. package/dist/cli/index.js.map +1 -1
  140. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  141. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  142. package/dist/cli/src/commands/config.d.ts.map +1 -1
  143. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  144. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  145. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  146. package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
  147. package/dist/cli/src/commands/plugin/codex.d.ts +6 -0
  148. package/dist/cli/src/commands/plugin/codex.d.ts.map +1 -1
  149. package/dist/cli/src/commands/project.d.ts.map +1 -1
  150. package/dist/cli/src/commands/run.d.ts.map +1 -1
  151. package/dist/cli/src/commands/serve.d.ts +5 -0
  152. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  153. package/dist/cli/src/commands/source.d.ts.map +1 -1
  154. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  155. package/dist/cli/src/commands/verify.d.ts.map +1 -1
  156. package/dist/cli/src/driver-error.d.ts +3 -1
  157. package/dist/cli/src/driver-error.d.ts.map +1 -1
  158. package/dist/cli/src/helpers.d.ts +6 -4
  159. package/dist/cli/src/helpers.d.ts.map +1 -1
  160. package/dist/cli/src/plugin-store/index.d.ts +6 -0
  161. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  162. package/dist/cli/src/skill-checks.d.ts +4 -3
  163. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  164. package/dist/connectors/config.js +5 -5
  165. package/dist/connectors/index.js +20 -20
  166. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  167. package/dist/connectors/src/connector-types.d.ts +5 -0
  168. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  169. package/dist/connectors/src/watcher.d.ts.map +1 -1
  170. package/dist/{connectors-CIEIMJY2.js → connectors-YNQ3WJGM.js} +23 -23
  171. package/dist/{connectors-CIEIMJY2.js.map → connectors-YNQ3WJGM.js.map} +1 -1
  172. package/dist/core/index.js +7 -7
  173. package/dist/core/manifest.js +2 -2
  174. package/dist/core/models.js +1 -1
  175. package/dist/core/publish-manifest.js +3 -3
  176. package/dist/core/ref.js +1 -1
  177. package/dist/core/runtime-assets.js +5 -5
  178. package/dist/core/src/bind.d.ts +30 -0
  179. package/dist/core/src/bind.d.ts.map +1 -0
  180. package/dist/core/src/index.d.ts +4 -3
  181. package/dist/core/src/index.d.ts.map +1 -1
  182. package/dist/core/src/lock.d.ts +11 -2
  183. package/dist/core/src/lock.d.ts.map +1 -1
  184. package/dist/core/src/manifest.d.ts.map +1 -1
  185. package/dist/core/src/models.d.ts +19 -0
  186. package/dist/core/src/models.d.ts.map +1 -1
  187. package/dist/core/src/publish-manifest.d.ts +15 -13
  188. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  189. package/dist/core/src/store.d.ts +2 -1
  190. package/dist/core/src/store.d.ts.map +1 -1
  191. package/dist/core/src/workspace-config.d.ts +26 -1
  192. package/dist/core/src/workspace-config.d.ts.map +1 -1
  193. package/dist/core/store.js +1 -1
  194. package/dist/core/workspace-config.js +4 -4
  195. package/dist/deploy/index.js +7 -7
  196. package/dist/discovery/index.js +5 -5
  197. package/dist/discovery/src/parse-manifest.d.ts +1 -1
  198. package/dist/discovery/src/source-config.d.ts +2 -1
  199. package/dist/discovery/src/source-config.d.ts.map +1 -1
  200. package/dist/{ensure-sources-I62QMZZP.js → ensure-sources-UJWEZSR3.js} +21 -17
  201. package/dist/ensure-sources-UJWEZSR3.js.map +1 -0
  202. package/dist/factory-assets/connectors/box.js +20 -20
  203. package/dist/factory-assets/connectors/deploy.js +20 -20
  204. package/dist/factory-assets/connectors/devserver.js +20 -20
  205. package/dist/factory-assets/connectors/flow/adapter.js +20 -20
  206. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  207. package/dist/factory-assets/connectors/flow/run-flow.js +22 -22
  208. package/dist/factory-assets/connectors/flow.js +20 -20
  209. package/dist/factory-assets/connectors/git.js +20 -20
  210. package/dist/factory-assets/connectors/gmail.js +20 -20
  211. package/dist/factory-assets/connectors/googledrive.js +20 -20
  212. package/dist/factory-assets/connectors/local.js +20 -20
  213. package/dist/factory-assets/connectors/mattermost.js +20 -20
  214. package/dist/factory-assets/connectors/memory.js +20 -20
  215. package/dist/factory-assets/connectors/minio.js +20 -20
  216. package/dist/factory-assets/connectors/postgres.js +20 -20
  217. package/dist/factory-assets/connectors/s3.js +20 -20
  218. package/dist/factory-assets/connectors/sharepoint.js +20 -20
  219. package/dist/factory-assets/connectors/sqlite.js +20 -20
  220. package/dist/factory-assets/connectors/static-server.js +20 -20
  221. package/dist/factory-assets/connectors/tunnel.js +20 -20
  222. package/dist/factory-assets/connectors/webdav.js +20 -20
  223. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts +1 -1
  224. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
  225. package/dist/factory-assets/connectors/xstate-store.js +20 -20
  226. package/dist/factory-assets/connectors/xstate.js +20 -20
  227. package/dist/{flows-YKC53LDP.js → flows-BHY73K3O.js} +12 -12
  228. package/dist/{flows-YKC53LDP.js.map → flows-BHY73K3O.js.map} +1 -1
  229. package/dist/{helpers-3FOM37BO.js → helpers-3CG7ZVX4.js} +21 -17
  230. package/dist/{helpers-3FOM37BO.js.map → helpers-3CG7ZVX4.js.map} +1 -1
  231. package/dist/library/index.js +11 -11
  232. package/dist/library/install.js +4 -4
  233. package/dist/library/src/index.d.ts +1 -1
  234. package/dist/library/src/index.d.ts.map +1 -1
  235. package/dist/library/src/manifest-writer.d.ts +17 -1
  236. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  237. package/dist/{library-publish-EFKITCGE.js → library-publish-NWWVYJUK.js} +60 -63
  238. package/dist/library-publish-NWWVYJUK.js.map +1 -0
  239. package/dist/model-endpoint/index.js +10 -10
  240. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  241. package/dist/open-library-7ZG2FFAX.js +42 -0
  242. package/dist/{open-library-NZUI4XGF.js.map → open-library-7ZG2FFAX.js.map} +1 -1
  243. package/dist/open-registry-RBELV5YH.js +32 -0
  244. package/dist/{open-registry-YPRQDUMK.js.map → open-registry-RBELV5YH.js.map} +1 -1
  245. package/dist/paths-BFM6K2QO.js +22 -0
  246. package/dist/{paths-P55DTBEK.js.map → paths-BFM6K2QO.js.map} +1 -1
  247. package/dist/plugin-store-QOQDM24E.js +23 -0
  248. package/dist/{plugin-store-IPIBZRBX.js.map → plugin-store-QOQDM24E.js.map} +1 -1
  249. package/dist/{project-2BNFZ2CR.js → project-YQM3I25D.js} +45 -45
  250. package/dist/{project-2BNFZ2CR.js.map → project-YQM3I25D.js.map} +1 -1
  251. package/dist/resolver/index.js +8 -8
  252. package/dist/runner/index.js +37 -37
  253. package/dist/runner/src/agent.d.ts.map +1 -1
  254. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  255. package/dist/sdk/asset-manager.js +18 -14
  256. package/dist/sdk/bridge.js +14 -14
  257. package/dist/sdk/core.js +7 -7
  258. package/dist/sdk/flow.js +9 -9
  259. package/dist/sdk/index.js +37 -37
  260. package/dist/sdk/resolver.js +8 -8
  261. package/dist/sdk/runner.js +37 -37
  262. package/dist/sdk/transport/ws/server.js +19 -1
  263. package/dist/sdk/transport/ws.js +19 -1
  264. package/dist/sdk/transport.js +19 -1
  265. package/dist/{serve-preflight-V5GM33T3.js → serve-preflight-5QMY7DBC.js} +9 -9
  266. package/dist/{serve-preflight-V5GM33T3.js.map → serve-preflight-5QMY7DBC.js.map} +1 -1
  267. package/dist/{setup-ZMAPTKJW.js → setup-AAHVAXRA.js} +28 -24
  268. package/dist/setup-AAHVAXRA.js.map +1 -0
  269. package/dist/{skills-7G6QCDEM.js → skills-RSZVUIYZ.js} +13 -13
  270. package/dist/{skills-7G6QCDEM.js.map → skills-RSZVUIYZ.js.map} +1 -1
  271. package/dist/{source-6BZA34F5.js → source-KWMCMEMB.js} +47 -47
  272. package/dist/{source-6BZA34F5.js.map → source-KWMCMEMB.js.map} +1 -1
  273. package/dist/{source-manifest-publish-MJXCSUKT.js → source-manifest-publish-EDYKM4YZ.js} +49 -49
  274. package/dist/{source-manifest-publish-MJXCSUKT.js.map → source-manifest-publish-EDYKM4YZ.js.map} +1 -1
  275. package/dist/transport/index.js +19 -1
  276. package/dist/transport/src/ws/server.d.ts +2 -16
  277. package/dist/transport/src/ws/server.d.ts.map +1 -1
  278. package/dist/transport/ws/server.js +19 -1
  279. package/dist/transport/ws.js +19 -1
  280. package/dist/tui/index.js +54 -42
  281. package/dist/tui/index.js.map +1 -1
  282. package/dist/tui/src/repl.d.ts +4 -1
  283. package/dist/tui/src/repl.d.ts.map +1 -1
  284. package/dist/types/manifests.js +1 -1
  285. package/dist/types/src/manifests/index.d.ts +1 -1
  286. package/dist/types/src/manifests/index.d.ts.map +1 -1
  287. package/dist/types/src/manifests/scaffold-body.d.ts +8 -0
  288. package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
  289. package/dist/types/src/manifests/skill.d.ts +0 -2
  290. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  291. package/dist/workspace-plugin/adapters/mcp.js +27 -27
  292. package/dist/workspace-plugin/adapters/omp.js +32 -18
  293. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  294. package/dist/workspace-plugin/index.js +1 -1
  295. package/dist/workspace-plugin/src/adapters/claude-code.d.ts +1 -1
  296. package/dist/workspace-plugin/src/adapters/omp.d.ts +8 -5
  297. package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
  298. package/dist/workspace-plugin/src/plugin.d.ts +7 -1
  299. package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
  300. package/package.json +1 -1
  301. package/dist/chunk-6GSE63K2.js.map +0 -1
  302. package/dist/chunk-BVXXBZWA.js.map +0 -1
  303. package/dist/chunk-D3PU3C6F.js.map +0 -1
  304. package/dist/chunk-D54T2F54.js.map +0 -1
  305. package/dist/chunk-DR5ZOEYI.js.map +0 -1
  306. package/dist/chunk-EOKWTN4N.js.map +0 -1
  307. package/dist/chunk-ES6ARJPQ.js.map +0 -1
  308. package/dist/chunk-FACRITOL.js.map +0 -1
  309. package/dist/chunk-FSLVMZXR.js.map +0 -1
  310. package/dist/chunk-FSSRBWYL.js.map +0 -1
  311. package/dist/chunk-FT4ZHLYR.js.map +0 -1
  312. package/dist/chunk-H7R7R5BN.js.map +0 -1
  313. package/dist/chunk-HUKUYWBJ.js.map +0 -1
  314. package/dist/chunk-KZWZRNIY.js.map +0 -1
  315. package/dist/chunk-L6UMSKDF.js.map +0 -1
  316. package/dist/chunk-OXUCYHL5.js.map +0 -1
  317. package/dist/chunk-PIC23DDE.js.map +0 -1
  318. package/dist/chunk-QEX75L77.js.map +0 -1
  319. package/dist/chunk-QW534EZB.js.map +0 -1
  320. package/dist/chunk-V5CDPKDA.js.map +0 -1
  321. package/dist/chunk-W44KA24A.js.map +0 -1
  322. package/dist/chunk-YK3XLEQJ.js.map +0 -1
  323. package/dist/chunk-YW2BNDSE.js.map +0 -1
  324. package/dist/chunk-ZVZTCDUN.js.map +0 -1
  325. package/dist/chunk-ZWUJ22RF.js.map +0 -1
  326. package/dist/ensure-sources-I62QMZZP.js.map +0 -1
  327. package/dist/library-publish-EFKITCGE.js.map +0 -1
  328. package/dist/open-library-NZUI4XGF.js +0 -40
  329. package/dist/open-registry-YPRQDUMK.js +0 -32
  330. package/dist/paths-P55DTBEK.js +0 -22
  331. package/dist/plugin-store-IPIBZRBX.js +0 -23
  332. package/dist/setup-ZMAPTKJW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workspace-plugin/src/adapters/claude-code.ts","../workspace-plugin/src/store.ts","../workspace-plugin/src/plugin.ts","../workspace-plugin/src/utils/project-dir.ts"],"names":["err"],"mappings":"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","file":"chunk-KSBDLCZI.js","sourcesContent":["// ── Claude Code plugin-directory generator (STATELESS) ──────────────────────\n// Generates the contents of a Claude Code plugin directory\n// (`.claude/plugins/skaile/`) as an in-memory file map. No plugin instance or\n// boot() is required — safe to call from install commands.\n//\n// The previous standalone `@skaile/workspace-plugin-claude` package shipped\n// these as static files plus loose `.mjs` hook scripts; they are now\n// CLI-owned templates. Hooks invoke the `skaile` binary directly\n// (`skaile integration hook <event>`) and MCP runs via `skaile mcp-server` — no\n// generated script files, no shebang, no runtime assumption.\n\n/**\n * The Claude Code plugin manifest. `name` is `skaile`; `hooks` and\n * `mcpServers` point at sibling files in the generated directory.\n */\nconst PLUGIN_JSON = {\n name: \"skaile\",\n version: \"0.1.0\",\n description: \"Skaile workspace — connectors, mounts, skills, flows, shared state\",\n author: { name: \"skaile-ai\", url: \"https://github.com/skaile-ai\" },\n repository: \"https://github.com/skaile-ai/workspaces\",\n keywords: [\"skaile\", \"connectors\", \"workspace\", \"ai-assets\"],\n hooks: \"./hooks/hooks.json\",\n mcpServers: \"./.mcp.json\",\n userConfig: {\n skaile_yaml_path: {\n type: \"string\",\n title: \"skaile.yaml path\",\n description: \"Override path to skaile.yaml (default: auto-detect from project root)\",\n },\n },\n};\n\n/**\n * Hook wiring. Each lifecycle event invokes the `skaile` binary directly —\n * no loose `.mjs` scripts. `skaile integration hook <event>` resolves the project\n * directory itself (`CLAUDE_PROJECT_DIR` / cwd) and always exits 0.\n */\nconst HOOKS_JSON = {\n hooks: {\n SessionStart: [\n { hooks: [{ type: \"command\", command: \"skaile integration hook session-start\" }] },\n ],\n SessionEnd: [{ hooks: [{ type: \"command\", command: \"skaile integration hook session-end\" }] }],\n UserPromptSubmit: [\n { hooks: [{ type: \"command\", command: \"skaile integration hook user-prompt-submit\" }] },\n ],\n },\n};\n\n/**\n * MCP server wiring. Spawns `skaile mcp-server` — a stdio MCP subprocess that\n * runs on plain Node (no Claude Agent SDK).\n */\nconst MCP_JSON = {\n mcpServers: {\n \"skaile-workspace\": {\n command: \"skaile\",\n args: [\"mcp-server\"],\n env: {},\n },\n },\n};\n\n/**\n * Build the Claude Code plugin directory as an in-memory file map.\n *\n * Returns `{ relativePath: contents }` for every file the installer must\n * write under `<projectDir>/.claude/plugins/skaile/`. The installer is also\n * responsible for populating `skills/` with the project's installed skills (`.claude/skills/`, `.skaile/skills/`).\n *\n * Stateless — no plugin instance, no `boot()`. The generated artifacts carry\n * no project-specific paths: hooks and the MCP server resolve the project\n * directory themselves at runtime.\n *\n * @returns A map of plugin-relative file paths to their string contents.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildClaudePluginFiles(): Record<string, string> {\n return {\n \".claude-plugin/plugin.json\": `${JSON.stringify(PLUGIN_JSON, null, 2)}\\n`,\n \"hooks/hooks.json\": `${JSON.stringify(HOOKS_JSON, null, 2)}\\n`,\n \".mcp.json\": `${JSON.stringify(MCP_JSON, null, 2)}\\n`,\n \"skills/.gitkeep\": \"\",\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\ninterface Subscriber {\n regex: RegExp;\n handler: (key: string, value: unknown) => void;\n}\n\n/**\n * Disk-backed reactive key-value store for plugin state.\n *\n * Keeps an in-memory map that can be flushed to / loaded from a JSON file.\n * Supports glob-style subscriptions (`connector:*`, `*`).\n *\n * State is persisted to `<projectDir>/.skaile/plugin-state.json`.\n * The instance is available on {@link WorkspacePlugin} as the public `store`\n * field after `boot()` resolves.\n *\n * @docLink packages/workspace-plugin/concepts#plugin-store\n */\nexport class PluginStore {\n private readonly statePath: string;\n private data: Map<string, unknown> = new Map();\n private subscribers: Subscriber[] = [];\n\n constructor(statePath: string) {\n this.statePath = statePath;\n }\n\n /** Synchronous read from in-memory map. */\n get<T>(key: string): T | undefined {\n return this.data.get(key) as T | undefined;\n }\n\n /** Write to in-memory map and notify matching subscribers. */\n set<T>(key: string, value: T): void {\n this.data.set(key, value);\n this.notify(key, value);\n }\n\n /** Remove key and notify matching subscribers. */\n delete(key: string): void {\n this.data.delete(key);\n this.notify(key, undefined);\n }\n\n /**\n * Subscribe to changes matching a glob-style pattern.\n * `*` matches any sequence of characters.\n * Returns an unsubscribe function.\n */\n subscribe(pattern: string, handler: (key: string, value: unknown) => void): () => void {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = `^${escaped.replace(/\\*/g, \".*\")}$`;\n const sub: Subscriber = { regex: new RegExp(regexStr), handler };\n this.subscribers.push(sub);\n\n return () => {\n const idx = this.subscribers.indexOf(sub);\n if (idx !== -1) this.subscribers.splice(idx, 1);\n };\n }\n\n /** Rehydrate from disk JSON. Missing file = empty store (no throw). */\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.statePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n this.data = new Map(Object.entries(parsed));\n }\n } catch (e: unknown) {\n // Missing file or invalid JSON — start with empty store\n }\n }\n\n /** Write entire store to disk as JSON. Creates parent dirs if needed. */\n async flush(): Promise<void> {\n const obj = Object.fromEntries(this.data);\n const json = JSON.stringify(obj, null, 2);\n await mkdir(dirname(this.statePath), { recursive: true });\n await writeFile(this.statePath, json, \"utf-8\");\n }\n\n private notify(key: string, value: unknown): void {\n for (const sub of this.subscribers) {\n if (sub.regex.test(key)) {\n sub.handler(key, value);\n }\n }\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ConnectorManager } from \"@skaile/workspaces/connectors\";\nimport { DEFAULT_DRIVER_ID } from \"@skaile/workspaces/core/framework\";\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { PluginStore } from \"./store.js\";\n\n/**\n * Construction options for {@link WorkspacePlugin}.\n *\n * At minimum `projectDir` must be supplied. All other fields are optional\n * and are pre-resolved by the caller when available (e.g. the runner already\n * knows `driver`/`model` from its own settings resolution).\n *\n * @docLink packages/workspace-plugin/concepts#workspaceplugin-lifecycle\n */\nexport interface WorkspacePluginOpts {\n projectDir: string;\n /**\n * Active connector manager. The unified `ConnectorManager` owns both\n * filesystem-face (mountable) and tool-face connectors.\n */\n connectorManager?: ConnectorManager;\n bootOwned?: boolean;\n onLog?: (msg: string) => void;\n /** Pre-resolved driver type (avoids needing boot() to read settings). */\n driver?: string;\n /** Pre-resolved model. */\n model?: string;\n}\n\n/**\n * Shared runtime core for the skaile workspace plugin.\n *\n * Manages the full lifecycle (`boot` → tools available → `shutdown`) and\n * surfaces workspace capabilities — mounts, connectors, flows, skills,\n * sessions, and config validation — through two adapters:\n *\n * - **MCP, in-process** (runner): call {@link buildWorkspaceMcpServer} for the\n * Claude Agent SDK server the runner embeds into its `query()` call.\n * - **MCP, stdio** (`skaile mcp-server`): call {@link runMcpServerStdio} for a\n * raw `@modelcontextprotocol/sdk` server — no Claude Agent SDK.\n * - **OMP**: call {@link buildOmpToolSet} for the 13-tool native subset and\n * {@link buildOmpExtensionSource} for the generated extension file.\n *\n * Two boot modes are supported via {@link WorkspacePluginOpts.bootOwned}:\n * - `bootOwned: false` (default) — managers injected externally by the runner.\n * - `bootOwned: true` — plugin owns the full manager lifecycle (standalone MCP\n * subprocess or OMP extension).\n *\n * @docLink packages/workspace-plugin/concepts#workspaceplugin-lifecycle\n */\nexport class WorkspacePlugin {\n readonly projectDir: string;\n connectorManager: ConnectorManager | null;\n readonly store: PluginStore;\n\n private readonly bootOwned: boolean;\n private readonly onLog: (msg: string) => void;\n private readonly log: Logger = createLogger({\n kind: \"mcp\",\n subkind: \"skaile-workspace\",\n });\n driver?: string;\n model?: string;\n\n constructor(opts: WorkspacePluginOpts) {\n this.projectDir = opts.projectDir;\n this.connectorManager = opts.connectorManager ?? null;\n this.store = new PluginStore(join(opts.projectDir, \".skaile\", \"plugin-state.json\"));\n this.bootOwned = opts.bootOwned ?? false;\n if (opts.driver) this.driver = opts.driver;\n if (opts.model) this.model = opts.model;\n this.onLog = opts.onLog ?? (() => {});\n this.log.debug(\"plugin constructed\", {\n driver: opts.driver,\n hasConnectors: !!opts.connectorManager,\n model: opts.model,\n bootOwned: this.bootOwned,\n });\n }\n\n async boot(): Promise<void> {\n if (!this.bootOwned) {\n // Managers were injected externally — resolve settings only (non-fatal)\n try {\n const { resolveSettings } = await import(\"@skaile/workspaces/core\");\n const settings = await resolveSettings(this.projectDir);\n this.driver = settings.driver ?? DEFAULT_DRIVER_ID;\n this.model = settings.model;\n } catch {\n /* non-fatal */\n }\n await this.store.load();\n return;\n }\n\n // bootOwned: we own the managers lifecycle\n try {\n const { resolveSettings } = await import(\"@skaile/workspaces/core\");\n const settings = await resolveSettings(this.projectDir);\n this.driver = settings.driver ?? DEFAULT_DRIVER_ID;\n this.model = settings.model;\n } catch {\n /* non-fatal */\n }\n\n try {\n const {\n ConnectorManager,\n loadConnectorDeclarations,\n registerBuiltinConnectors,\n createCliSecretProviderChain,\n } = await import(\"@skaile/workspaces/connectors\");\n\n registerBuiltinConnectors();\n\n const secrets = createCliSecretProviderChain();\n\n const connectorDecls = await loadConnectorDeclarations(this.projectDir);\n const cm = new ConnectorManager(this.projectDir, { secrets });\n await cm.connectAll(connectorDecls);\n this.connectorManager = cm;\n\n this.log.info(\"workspace plugin booted\", {\n connectors: connectorDecls.length,\n });\n this.onLog(`WorkspacePlugin booted: ${connectorDecls.length} connectors`);\n } catch (err) {\n this.log.warn(\"workspace plugin boot warning\", {\n error: err instanceof Error ? err.message : String(err),\n });\n this.onLog(`WorkspacePlugin boot warning: ${err}`);\n }\n\n await this.store.load();\n }\n\n async reload(): Promise<void> {\n if (!this.bootOwned) return;\n await this.shutdown();\n await this.boot();\n }\n\n async shutdown(): Promise<void> {\n this.log.info(\"workspace plugin shutdown\");\n await this.store.flush();\n if (!this.bootOwned) return;\n try {\n await (this.connectorManager as any)?.disconnectAll?.();\n } catch {\n /* best-effort */\n }\n this.connectorManager = null;\n }\n\n buildSystemPromptSection(driver?: string): string {\n const d = driver ?? this.driver ?? \"unknown\";\n // The unified ConnectorManager owns both mountable (filesystem-face) and\n // tool-face connectors. Filesystem-face connectors expose a `mountPath`.\n const all = (this.connectorManager as any)?.listConnectors?.() ?? [];\n const mounts = (all as any[]).filter((c) => typeof c.mountPath === \"string\");\n const connectors = (all as any[]).filter((c) => typeof c.mountPath !== \"string\");\n const lines = [\"## Workspace (skaile)\", \"\", `Driver: ${d}`, `Project: ${this.projectDir}`];\n if (mounts.length > 0) {\n lines.push(\"\", \"Mounts:\");\n for (const v of mounts) {\n lines.push(` · ${v.id} (${v.driver}) → ${v.mountPath ?? \"(unmounted)\"}`);\n }\n }\n if (connectors.length > 0) {\n lines.push(\"\", \"Connectors:\");\n for (const c of connectors) {\n lines.push(` · ${c.id} (${c.driver})`);\n }\n }\n lines.push(\"\", \"Use workspace_info for full details. Use workspace_validate to check health.\");\n\n for (const name of [\"SOUL.md\", \"RULES.md\"]) {\n const skaileOverride = join(this.projectDir, \".skaile\", name);\n const rootFile = join(this.projectDir, name);\n for (const candidate of [skaileOverride, rootFile]) {\n try {\n const content = readFileSync(candidate, \"utf-8\").trim();\n if (content) {\n lines.push(\"\", `## ${name.replace(\".md\", \"\")}`, \"\", content);\n break;\n }\n } catch {\n // file not found, try next\n }\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Build the in-process Claude Agent SDK MCP server (runner embedding).\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is unavailable.\n */\n async buildWorkspaceMcpServer(): Promise<unknown | null> {\n this.log.info(\"building workspace MCP server\");\n try {\n const { buildWorkspaceMcpServer } = await import(\"./adapters/mcp.js\");\n const server = await buildWorkspaceMcpServer(this);\n if (server) this.log.info(\"workspace MCP server ready\");\n else this.log.debug(\"workspace MCP server skipped (no tools)\");\n return server;\n } catch (err) {\n this.log.error(\"workspace MCP server build failed\", err);\n throw err;\n }\n }\n\n /**\n * Build the raw `@modelcontextprotocol/sdk` stdio MCP server — no Claude\n * Agent SDK. Used by the `skaile mcp-server` subprocess. The returned\n * server is not yet connected to a transport.\n */\n async buildWorkspaceMcpStdioServer(): Promise<unknown> {\n this.log.info(\"building workspace stdio MCP server\");\n const { buildWorkspaceMcpStdioServer } = await import(\"./adapters/mcp.js\");\n return buildWorkspaceMcpStdioServer(this);\n }\n\n /**\n * Build and run the stdio MCP server: builds the raw\n * `@modelcontextprotocol/sdk` server and connects a `StdioServerTransport`.\n * Used by the `skaile mcp-server` subprocess.\n */\n async runMcpServerStdio(): Promise<void> {\n this.log.info(\"starting workspace stdio MCP server\");\n const { runMcpServerStdio } = await import(\"./adapters/mcp.js\");\n await runMcpServerStdio(this);\n }\n\n async buildOmpToolSet(): Promise<unknown[]> {\n const { buildOmpToolSet } = await import(\"./adapters/omp.js\");\n return buildOmpToolSet(this);\n }\n\n /**\n * The generated `.omp/extensions/skaile.ts`. Path-independent unless `pinProjectDir` is set\n * (an ephemeral file written outside the project).\n */\n async buildOmpExtensionSource(opts: { pinProjectDir?: boolean } = {}): Promise<string> {\n const { buildOmpExtensionSource } = await import(\"./adapters/omp.js\");\n return buildOmpExtensionSource(opts.pinProjectDir ? this.projectDir : null);\n }\n\n async handleSlashCommand(group: string, args: string[]): Promise<string> {\n const { handleSlashCommand } = await import(\"./adapters/omp.js\");\n return handleSlashCommand(this, group, args);\n }\n}\n","// utils/project-dir.ts\n// Centralised project-directory resolution used by all plugin entry points.\n\n/**\n * Resolve the skaile project directory from environment variables.\n *\n * Resolution order:\n * 1. `SKAILE_PROJECT_DIR` (always checked first)\n * 2. Any additional env var keys supplied by the caller (in order)\n * 3. `process.cwd()` as final fallback\n *\n * @param additionalEnvVars - Optional list of extra environment variable names\n * to check before falling back to `process.cwd()`.\n * @returns Absolute path to the resolved project directory.\n *\n * @example\n * // Claude Code — also checks CLAUDE_PROJECT_DIR\n * const projectDir = resolveProjectDir([\"CLAUDE_PROJECT_DIR\"]);\n *\n * // OMP / standalone — SKAILE_PROJECT_DIR or cwd only\n * const projectDir = resolveProjectDir();\n *\n * @docLink packages/workspace-plugin/concepts#workspaceplugin-lifecycle\n */\nexport function resolveProjectDir(additionalEnvVars?: string[]): string {\n if (process.env.SKAILE_PROJECT_DIR) return process.env.SKAILE_PROJECT_DIR;\n for (const key of additionalEnvVars ?? []) {\n const val = process.env[key];\n if (val) return val;\n }\n return process.cwd();\n}\n"]}
@@ -663,5 +663,5 @@ async function listModelsForDriver(driverId, registry, options) {
663
663
  }
664
664
 
665
665
  export { AI_PROVIDER_PRESETS, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, PROVIDER_CREDENTIAL_ENV_PREFIX, PROVIDER_CREDENTIAL_ENV_SUFFIX, buildCredentialHeaders, catalogLayer, conventionalCredentialEnvName, createDriver, driverCapabilities, entryCredentialEnv, entryCredentialValue, expandPreset, getProviderPreset, listDrivers, listModelsForDriver, listProviderPresets, presetBaseUrl, probeProviderEntry, providerCredentialEnvName, registerBuiltinDrivers, registryCredentialEnv, resolveEntryCredential, resolvePresetBaseUrl, resolveProbeUrl, supportsLiveToolUpdates, unresolvedProviderCredentials };
666
- //# sourceMappingURL=chunk-LQT2IKYY.js.map
667
- //# sourceMappingURL=chunk-LQT2IKYY.js.map
666
+ //# sourceMappingURL=chunk-KY4UXX7M.js.map
667
+ //# sourceMappingURL=chunk-KY4UXX7M.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/provider-catalog.ts","../bridge/src/provider-materialize/credential-env.ts","../bridge/src/driver-capabilities.ts","../bridge/src/registry.ts"],"names":[],"mappings":"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","file":"chunk-LQT2IKYY.js","sourcesContent":["/**\n * The AI provider catalog — the preset layer of the provider registry (§1.5,\n * layer 5).\n *\n * A preset is the three-or-four literals an endpoint needs beyond a credential:\n * its wire `surface`, its `base_url` (or the transport that derives one), the\n * header the credential rides in, and the path a read-only probe can GET. With\n * them, `skaile providers add --preset groq` needs nothing but an env var name.\n *\n * This replaced `provider-endpoints.ts` `PROVIDER_ENDPOINTS`: every endpoint\n * that table knew is present here, with the surface/transport/credential facts\n * it could not express.\n *\n * The record types come from `@skaile/workspaces/core/provider-registry` — the\n * schema has exactly one home.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.2, §1.3, §2.5\n */\n\nimport {\n AI_PROVIDER_BASE_URL_TEMPLATES,\n type AIProviderCredentialKind,\n type AIProviderDiscovery,\n type AIProviderEntry,\n type AIProviderKind,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n type AIProviderRegistryLayer,\n type AIProviderRegistryPatch,\n type AIProviderSurface,\n type AIProviderTransport,\n type AIProviderVoiceParams,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\n\n/**\n * Where the credential goes on the wire. `{credential}` is replaced with the\n * resolved secret. Needed because `credential.kind` alone is ambiguous:\n * `api_key_header` is `x-api-key` for Anthropic, `x-goog-api-key` for Gemini,\n * `api-key` for Azure OpenAI and `Authorization: Token …` for Deepgram.\n */\nexport interface AIProviderAuthHeader {\n name: string;\n template: string;\n}\n\n/** A catalog preset — the fields an entry inherits by naming it. */\nexport interface AIProviderPreset {\n /** Preset id; also the default entry id `skaile providers add` writes. */\n id: string;\n kind: AIProviderKind;\n label: string;\n /** `llm`/`embed` only. */\n surface?: AIProviderSurface;\n /** `llm`/`embed` only; omitted means `direct`. */\n transport?: AIProviderTransport;\n /** Literal endpoint. Absent when the transport derives one from `params`. */\n base_url?: string;\n /**\n * Env var the vendor's own SDK reads as a base-URL override, when one\n * exists. Consulted by the callers that still address an endpoint by preset\n * id — model discovery, key validation, and `skaile migrate providers` — so\n * a shell already pointed at a gateway keeps pointing there.\n */\n base_url_env?: string;\n /** Static non-secret headers, e.g. Anthropic's `anthropic-version`. */\n headers?: Record<string, string>;\n /** Credential shape plus the conventional env var holding the secret. */\n credential: { kind: AIProviderCredentialKind; env?: string };\n /** Header the credential rides in; defaults per surface when omitted. */\n auth_header?: AIProviderAuthHeader;\n /** Default routing/voice parameters. */\n params?: Record<string, string>;\n /** `params` keys the operator must supply — the preset cannot know them. */\n required_params?: string[];\n /**\n * Read-only path a health probe GETs, relative to `base_url`: the models\n * list for LLM surfaces, an equivalent authenticated read for voice.\n * Absent when the endpoint has none (Bedrock's runtime host).\n */\n probe_path?: string;\n discovery?: AIProviderDiscovery;\n /** Anything the operator has to know that the fields do not say. */\n notes?: string;\n}\n\nconst ANTHROPIC_VERSION_HEADER: Record<string, string> = { \"anthropic-version\": \"2023-06-01\" };\n\nconst X_API_KEY: AIProviderAuthHeader = { name: \"x-api-key\", template: \"{credential}\" };\n\nconst OPENAI_MODELS_PATH = \"/v1/models\";\n\n/**\n * Every preset the runtime ships.\n *\n * Insertion order is display order in `skaile providers list`: first-party\n * clouds, then OpenAI-compatible vendors, then the transports that need\n * routing parameters, then local runtimes and gateways, then voice.\n *\n * Sources: `platform/_devlog/reports/2026-09-20-inference-provider-market-survey.md`\n * (36 endpoints, base URLs and auth headers verified there).\n */\nexport const AI_PROVIDER_PRESETS: Record<string, AIProviderPreset> = {\n anthropic: {\n id: \"anthropic\",\n kind: \"llm\",\n label: \"Anthropic\",\n surface: \"anthropic-messages\",\n base_url: \"https://api.anthropic.com\",\n base_url_env: \"ANTHROPIC_BASE_URL\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_API_KEY\" },\n auth_header: X_API_KEY,\n probe_path: \"/v1/models\",\n discovery: { type: \"anthropic-models-list\" },\n },\n openai: {\n id: \"openai\",\n kind: \"llm\",\n label: \"OpenAI\",\n surface: \"openai-responses\",\n base_url: \"https://api.openai.com/v1\",\n base_url_env: \"OPENAI_BASE_URL\",\n credential: { kind: \"bearer\", env: \"OPENAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Responses is OpenAI's current API; set surface openai-completions for chat-only clients.\",\n },\n google: {\n id: \"google\",\n kind: \"llm\",\n label: \"Google Gemini API\",\n surface: \"google-generative-ai\",\n base_url: \"https://generativelanguage.googleapis.com/v1beta\",\n credential: { kind: \"api_key_header\", env: \"GEMINI_API_KEY\" },\n auth_header: { name: \"x-goog-api-key\", template: \"{credential}\" },\n probe_path: \"/v1beta/models\",\n discovery: { type: \"google-models-list\" },\n },\n groq: {\n id: \"groq\",\n kind: \"llm\",\n label: \"Groq\",\n surface: \"openai-completions\",\n base_url: \"https://api.groq.com/openai/v1\",\n credential: { kind: \"bearer\", env: \"GROQ_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n deepseek: {\n id: \"deepseek\",\n kind: \"llm\",\n label: \"DeepSeek\",\n surface: \"openai-completions\",\n base_url: \"https://api.deepseek.com\",\n credential: { kind: \"bearer\", env: \"DEEPSEEK_API_KEY\" },\n probe_path: \"/models\",\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Anthropic-shaped clients use https://api.deepseek.com/anthropic with surface anthropic-messages.\",\n },\n openrouter: {\n id: \"openrouter\",\n kind: \"llm\",\n label: \"OpenRouter\",\n surface: \"openai-completions\",\n base_url: \"https://openrouter.ai/api/v1\",\n credential: { kind: \"bearer\", env: \"OPENROUTER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n mistral: {\n id: \"mistral\",\n kind: \"llm\",\n label: \"Mistral\",\n surface: \"openai-completions\",\n base_url: \"https://api.mistral.ai/v1\",\n credential: { kind: \"bearer\", env: \"MISTRAL_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n xai: {\n id: \"xai\",\n kind: \"llm\",\n label: \"xAI (Grok)\",\n surface: \"openai-completions\",\n base_url: \"https://api.x.ai/v1\",\n credential: { kind: \"bearer\", env: \"XAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n together: {\n id: \"together\",\n kind: \"llm\",\n label: \"Together AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.together.ai/v1\",\n credential: { kind: \"bearer\", env: \"TOGETHER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n fireworks: {\n id: \"fireworks\",\n kind: \"llm\",\n label: \"Fireworks AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.fireworks.ai/inference/v1\",\n credential: { kind: \"bearer\", env: \"FIREWORKS_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n bedrock: {\n id: \"bedrock\",\n kind: \"llm\",\n label: \"AWS Bedrock\",\n surface: \"bedrock-converse-stream\",\n transport: \"bedrock\",\n credential: { kind: \"sigv4\" },\n required_params: [\"region\"],\n notes: \"Credentials come from the AWS default chain; the runtime host serves no models list.\",\n },\n vertex: {\n id: \"vertex\",\n kind: \"llm\",\n label: \"Google Vertex AI\",\n surface: \"google-vertex\",\n transport: \"vertex\",\n credential: { kind: \"google_adc\" },\n params: { publisher: \"google\" },\n required_params: [\"project\", \"location\"],\n probe_path: \"/models\",\n },\n \"azure-openai\": {\n id: \"azure-openai\",\n kind: \"llm\",\n label: \"Azure OpenAI\",\n surface: \"azure-openai-responses\",\n transport: \"azure-openai\",\n credential: { kind: \"api_key_header\", env: \"AZURE_OPENAI_API_KEY\" },\n auth_header: { name: \"api-key\", template: \"{credential}\" },\n required_params: [\"resource\", \"deployment\", \"api_version\"],\n probe_path: \"/models\",\n notes:\n \"api_version is mirrored into query_params['api-version']; switch credential.kind to azure_entra for Entra tokens.\",\n },\n foundry: {\n id: \"foundry\",\n kind: \"llm\",\n label: \"Claude on Microsoft Foundry\",\n surface: \"anthropic-messages\",\n transport: \"foundry\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_FOUNDRY_API_KEY\" },\n auth_header: X_API_KEY,\n required_params: [\"resource\"],\n probe_path: \"/v1/models\",\n },\n ollama: {\n id: \"ollama\",\n kind: \"llm\",\n label: \"Ollama (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:11434/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n lmstudio: {\n id: \"lmstudio\",\n kind: \"llm\",\n label: \"LM Studio (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:1234/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n vllm: {\n id: \"vllm\",\n kind: \"llm\",\n label: \"vLLM (self-hosted)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:8000/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"A server started with --api-key expects credential.kind bearer and an env: ref.\",\n },\n litellm: {\n id: \"litellm\",\n kind: \"llm\",\n label: \"LiteLLM proxy\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:4000\",\n credential: { kind: \"bearer\", env: \"LITELLM_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"The credential is the proxy's virtual key; upstream keys stay in the proxy config.\",\n },\n deepgram: {\n id: \"deepgram\",\n kind: \"stt\",\n label: \"Deepgram\",\n base_url: \"https://api.deepgram.com\",\n credential: { kind: \"api_key_header\", env: \"DEEPGRAM_API_KEY\" },\n auth_header: { name: \"Authorization\", template: \"Token {credential}\" },\n params: { model: \"nova-3\", language: \"en\" },\n probe_path: \"/v1/projects\",\n },\n elevenlabs: {\n id: \"elevenlabs\",\n kind: \"tts\",\n label: \"ElevenLabs\",\n base_url: \"https://api.elevenlabs.io\",\n credential: { kind: \"api_key_header\", env: \"ELEVENLABS_API_KEY\" },\n auth_header: { name: \"xi-api-key\", template: \"{credential}\" },\n params: { voice_id: \"21m00Tcm4TlvDq8ikWAM\", output_format: \"mp3_44100_128\" },\n probe_path: \"/v1/models\",\n },\n};\n\n/** Presets in catalog order. */\nexport function listProviderPresets(): AIProviderPreset[] {\n return Object.values(AI_PROVIDER_PRESETS);\n}\n\n/** Look up a preset by id. */\nexport function getProviderPreset(id: string): AIProviderPreset | undefined {\n return AI_PROVIDER_PRESETS[id];\n}\n\n/**\n * The endpoint `skaile providers list` shows for a preset: the literal when\n * there is one, otherwise the transport's `base_url` template (§1.3) with its\n * `{param}` placeholders left in — they are exactly what the operator must\n * supply.\n */\nexport function presetBaseUrl(preset: AIProviderPreset): string | undefined {\n if (preset.base_url) return preset.base_url;\n if (!preset.transport || preset.transport === \"direct\") return undefined;\n return AI_PROVIDER_BASE_URL_TEMPLATES[preset.transport];\n}\n\n/**\n * The endpoint a request to this preset should actually go to: an explicit\n * override first, then the vendor's own `*_BASE_URL` variable\n * ({@link AIProviderPreset.base_url_env}), then the preset literal.\n *\n * Behind a gateway the credential in play is the *gateway's*, not the\n * vendor's, so discovery and key validation have to follow dispatch — firing\n * either at the vendor's public API 401s and yields an empty catalog, which a\n * caller that reads \"empty\" as \"unknown\" then degrades into \"accept anything\".\n *\n * Pure: reads only the `env` record it is handed.\n */\nexport function resolvePresetBaseUrl(\n preset: AIProviderPreset,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): string | undefined {\n const explicit = options.baseUrl?.trim();\n if (explicit) return explicit;\n const fromEnv = preset.base_url_env ? options.env?.[preset.base_url_env]?.trim() : undefined;\n return fromEnv || preset.base_url;\n}\n\n/** Overrides {@link expandPreset} accepts from `skaile providers add`. */\nexport interface ExpandPresetOptions {\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…`. Never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n /** Transport routing parameters, or voice parameters for `stt`/`tts`. */\n params?: Record<string, string>;\n}\n\n/**\n * Materialize a preset into a registry entry.\n *\n * The credential is always a reference: the preset's conventional `env:` var\n * unless the caller names another ref. No code path here can write a secret.\n * For `transport: azure-openai` the `api_version` parameter is mirrored into\n * `query_params['api-version']`, which is where the wire expects it (§1.3).\n */\nexport function expandPreset(\n preset: AIProviderPreset,\n options: ExpandPresetOptions = {},\n): AIProviderEntry {\n const ref =\n options.credentialRef ?? (preset.credential.env ? `env:${preset.credential.env}` : undefined);\n const credential = ref ? { kind: preset.credential.kind, ref } : { kind: preset.credential.kind };\n const base_url = options.baseUrl ?? preset.base_url;\n const params = { ...preset.params, ...options.params };\n\n if (preset.kind === \"stt\" || preset.kind === \"tts\") {\n return {\n kind: preset.kind,\n label: options.label ?? preset.label,\n preset: preset.id,\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(Object.keys(params).length > 0 ? { params: params as AIProviderVoiceParams } : {}),\n };\n }\n\n const transport = preset.transport ?? \"direct\";\n const entry: AIProviderLlmEntry = {\n kind: preset.kind === \"embed\" ? \"embed\" : \"llm\",\n label: options.label ?? preset.label,\n preset: preset.id,\n ...((options.surface ?? preset.surface) ? { surface: options.surface ?? preset.surface } : {}),\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(preset.discovery ? { discovery: { ...preset.discovery } } : {}),\n } as AIProviderLlmEntry;\n\n if (transport !== \"direct\") {\n Object.assign(entry, { transport, params });\n if (transport === \"azure-openai\" && params.api_version) {\n entry.query_params = { \"api-version\": params.api_version };\n }\n }\n return entry;\n}\n\n/**\n * Build the catalog merge layer for a set of configured entries (§1.5).\n *\n * Only the presets actually referenced by a `preset:` key are expanded, keyed\n * by the *entry* id — so `groq: {kind: llm, preset: groq}` deep-merges onto a\n * full Groq definition while an unreferenced preset stays out of the registry.\n *\n * Takes the **pre-gate** merge (`LoadedProviderRegistry.patches`), not the\n * gated registry: an entry that leaves `kind` or its transport `params` to the\n * preset is exactly the one the gate drops before this layer exists, and a\n * dropped entry names no preset to expand.\n */\nexport function catalogLayer(providers: AIProviderRegistryPatch): AIProviderRegistryLayer {\n const expanded: AIProviderRegistry = {};\n for (const [id, entry] of Object.entries(providers)) {\n if (!entry.preset) continue;\n const preset = AI_PROVIDER_PRESETS[entry.preset];\n if (!preset) continue;\n expanded[id] = expandPreset(preset);\n }\n return { layer: \"catalog\", providers: expanded };\n}\n\n/**\n * Join a base URL and a path without duplicating a shared leading segment:\n * `(\"https://gw/v1\", \"/v1/models\")` → `https://gw/v1/models`. Both spellings\n * are common in the wild, and a preset's path must work against a gateway base\n * the operator typed either way.\n */\nfunction joinBaseAndPath(base: string, path: string): string {\n const trimmed = base.replace(/\\/+$/, \"\");\n const segments = path.split(\"/\").filter(Boolean);\n const lead = segments[0];\n if (lead && trimmed.toLowerCase().endsWith(`/${lead.toLowerCase()}`)) {\n return `${trimmed}/${segments.slice(1).join(\"/\")}`;\n }\n return `${trimmed}${path}`;\n}\n\n/**\n * The read-only URL a health probe or model discovery can GET for an entry —\n * the models list on LLM surfaces, the equivalent authenticated read on voice\n * ones. `undefined` when the entry has no endpoint yet (missing transport\n * parameters) or the surface serves no such path (Bedrock runtime).\n *\n * This is the catalog method that supersedes `resolveProviderModelsUrl`.\n */\nexport function resolveProbeUrl(entry: AIProviderEntry): string | undefined {\n const base = resolveEntryBaseUrl(entry);\n if (!base) return undefined;\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n const path = (entry as AIProviderLlmEntry).discovery?.path ?? preset?.probe_path;\n if (!path) return undefined;\n const url = joinBaseAndPath(base, path);\n const query = (entry as AIProviderLlmEntry).query_params;\n if (!query || Object.keys(query).length === 0) return url;\n const search = new URLSearchParams(query).toString();\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${search}`;\n}\n\n/**\n * The header(s) that present a credential on the wire for an entry.\n *\n * `credential.kind` alone does not determine the header — `api_key_header` is\n * `x-api-key` at Anthropic, `x-goog-api-key` at Google and `api-key` at Azure —\n * so the preset's `auth_header` wins, then a per-surface default.\n * Returns `{}` when the credential is signed elsewhere (`sigv4`, `google_adc`)\n * or absent.\n */\nexport function buildCredentialHeaders(\n entry: AIProviderEntry,\n secret: string | undefined,\n): Record<string, string> {\n const kind = entry.credential?.kind ?? \"none\";\n if (!secret || kind === \"none\" || kind === \"sigv4\" || kind === \"google_adc\") return {};\n\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.auth_header) {\n return {\n [preset.auth_header.name]: preset.auth_header.template.replace(\"{credential}\", secret),\n };\n }\n if (kind === \"api_key_header\") {\n const surface = (entry as AIProviderLlmEntry).surface;\n if (surface === \"google-generative-ai\") return { \"x-goog-api-key\": secret };\n if (surface === \"azure-openai-responses\") return { \"api-key\": secret };\n return { \"x-api-key\": secret };\n }\n return { Authorization: `Bearer ${secret}` };\n}\n\n/** Outcome of {@link probeProviderEntry}. Never carries the credential. */\nexport interface AIProviderProbeResult {\n /** The endpoint answered 2xx. */\n ok: boolean;\n /** `false` when no request was made — nothing was verified either way. */\n probed: boolean;\n url?: string;\n status?: number;\n /** Human-readable outcome. Secret-free. */\n detail: string;\n}\n\n/** Options for {@link probeProviderEntry}. */\nexport interface ProbeProviderOptions {\n /** Resolved credential value, if the entry has one. Never logged. */\n secret?: string;\n /** Request deadline; default 8000 ms, matching `validateApiKey`. */\n timeoutMs?: number;\n}\n\n/**\n * Send one minimal, read-only request to an entry's endpoint and report what\n * came back.\n *\n * Returns `probed: false` — rather than a false negative — when the entry has\n * no probe path (Bedrock's runtime host) or no resolvable endpoint yet: a\n * SigV4- or ADC-signed request is the transport SDK's job, not this function's.\n */\nexport async function probeProviderEntry(\n entry: AIProviderEntry,\n options: ProbeProviderOptions = {},\n): Promise<AIProviderProbeResult> {\n const url = resolveProbeUrl(entry);\n if (!url) {\n const base = resolveEntryBaseUrl(entry);\n return {\n ok: false,\n probed: false,\n detail: base\n ? `no read-only probe endpoint is defined for this entry (${base})`\n : \"no base_url could be resolved — set base_url or the transport's params\",\n };\n }\n\n const headers: Record<string, string> = {\n ...entry.headers,\n ...buildCredentialHeaders(entry, options.secret),\n };\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n try {\n const response = await fetch(url, { method: \"GET\", headers, signal: controller.signal });\n if (response.ok) {\n return { ok: true, probed: true, url, status: response.status, detail: \"endpoint reachable\" };\n }\n const detail =\n response.status === 401 || response.status === 403\n ? \"credential rejected (authentication failed)\"\n : `endpoint returned HTTP ${response.status}`;\n return { ok: false, probed: true, url, status: response.status, detail };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const detail =\n err instanceof Error && err.name === \"AbortError\"\n ? `request timed out after ${options.timeoutMs ?? 8000}ms`\n : message;\n return { ok: false, probed: true, url, detail };\n } finally {\n clearTimeout(timeout);\n }\n}\n","/**\n * Credential delivery for driver adapters — the one naming rule (§2.3).\n *\n * Every adapter that hands a registry entry's secret to a child process, and\n * every renderer that has to *name* that secret in a config file it writes\n * (omp's `models.yml` `apiKey:`, Codex's `env_key`, OpenCode's `{env:…}`),\n * agrees on one env-var name per entry: `SKAILE_AIP_<UPPER_ID>_KEY`. The name\n * goes in the file, the value goes in the child environment — a rendered\n * config never contains a secret.\n *\n * The platform's secret-env allowlist is a prefix rule on exactly that name,\n * and forge-common delivers the same names when it spawns `skaile serve`, so\n * the transform below is a cross-repo contract: uppercase, every character\n * outside `[A-Za-z0-9]` mapped to `_` (registry ids are `[a-z0-9][a-z0-9_-]*`,\n * so in practice only `-`).\n *\n * Alongside the canonical name, {@link registryCredentialEnv} also sets the\n * *conventional* carrier a CLI already reads (`ANTHROPIC_API_KEY`,\n * `GEMINI_API_KEY`, `GROQ_API_KEY`, …) so a catalog-preset entry works in a\n * harness that has no per-endpoint config file yet.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.4, §2.3\n */\n\nimport {\n type AIProviderEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { resolveCredential } from \"@skaile/workspaces/core/provider-registry-credentials\";\nimport { AI_PROVIDER_PRESETS } from \"../provider-catalog.js\";\n\n/** Options shared by every registry-shaped credential resolution. */\nexport interface RegistryCredentialOptions {\n /** Restrict resolution to one entry — the provider half of a `modelRef`. */\n providerId?: string;\n /** Environment `env:` refs resolve against. Defaults to `process.env`. */\n env?: Record<string, string | undefined>;\n /** Control-plane secrets keyed by config id, for `platform:` refs. */\n secrets?: Record<string, string>;\n /** Run `cmd:` references. Default `true`. */\n allowCommand?: boolean;\n}\n\n/** Prefix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_PREFIX = \"SKAILE_AIP_\";\n\n/** Suffix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_SUFFIX = \"_KEY\";\n\n/**\n * The env-var name that carries a registry entry's credential:\n * `anthropic` → `SKAILE_AIP_ANTHROPIC_KEY`, `my-gw.eu` → `SKAILE_AIP_MY_GW_EU_KEY`.\n *\n * Pure: no environment, no registry, no I/O. Renderers call it per entry while\n * emitting a config file, adapters call it while assembling a child env, and\n * the platform allowlist matches the prefix.\n */\nexport function providerCredentialEnvName(providerId: string): string {\n const slug = providerId.replace(/[^A-Za-z0-9]/g, \"_\").toUpperCase();\n return `${PROVIDER_CREDENTIAL_ENV_PREFIX}${slug}${PROVIDER_CREDENTIAL_ENV_SUFFIX}`;\n}\n\n/**\n * The env var a harness already looks for on its own, when the entry names one.\n *\n * The catalog preset's conventional carrier wins (`GEMINI_API_KEY` for\n * `google`), because that is the name the vendor's own CLI reads; otherwise an\n * `env:NAME` credential reference is taken at face value — the operator named\n * that variable, so the child gets it under the same name. `cmd:`, `platform:`\n * and `keyring:` refs have no conventional carrier and return `undefined`.\n */\nexport function conventionalCredentialEnvName(entry: AIProviderEntry): string | undefined {\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.credential.env) return preset.credential.env;\n const ref = entry.credential?.ref ? parseCredentialRef(entry.credential.ref) : undefined;\n return ref?.form === \"env\" ? ref.name : undefined;\n}\n\n/**\n * Resolve one entry's credential to its value, or `undefined` when there is\n * none to hand over (`kind: none`, an ambient `sigv4`/`google_adc` chain, an\n * unset variable, a reserved `keyring:` ref).\n */\nexport function resolveEntryCredential(\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n }).value;\n}\n\n/**\n * One entry's credential value, including the one the session boundary\n * already resolved for it.\n *\n * A `platform:<configId>` reference is resolved by the runner — it holds the\n * `session_init` secrets map, the driver does not — and materialized into the\n * child environment under {@link providerCredentialEnvName}. So when the\n * reference itself yields nothing, that carrier is consulted: it is the same\n * secret, delivered one step earlier.\n */\nexport function entryCredentialValue(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return (\n resolveEntryCredential(entry, options) ?? options.env?.[providerCredentialEnvName(providerId)]\n );\n}\n\n/** One enabled entry whose credential is declared but cannot be resolved. */\nexport interface UnresolvedProviderCredential {\n providerId: string;\n /** Why it does not resolve, e.g. `environment variable ANTHROPIC_API_KEY is not set`. */\n reason: string;\n}\n\n/**\n * The enabled LLM/embed entries that name a credential this process cannot\n * resolve (the variable is unset, the command fails). A driver must not be\n * handed such an entry: the child would send an empty key and fail with a 401\n * instead of using its own login. Entries with no credential, an ambient\n * signing chain, or a value the session boundary already delivered under\n * {@link providerCredentialEnvName} are fine.\n */\nexport function unresolvedProviderCredentials(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialOptions = {},\n): UnresolvedProviderCredential[] {\n const out: UnresolvedProviderCredential[] = [];\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n if (options.providerId && id !== options.providerId) continue;\n const resolved = resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n });\n if (!resolved.error) continue;\n if (options.env?.[providerCredentialEnvName(id)]) continue;\n out.push({ providerId: id, reason: resolved.error });\n }\n return out;\n}\n\n/** Options for {@link entryCredentialEnv} / {@link registryCredentialEnv}. */\nexport interface RegistryCredentialEnvOptions extends RegistryCredentialOptions {\n /**\n * Also set the harness-conventional carrier\n * ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a\n * harness that reads every endpoint out of a rendered config file and must\n * not inherit a vendor default from a neighbouring entry.\n */\n aliases?: boolean;\n}\n\n/**\n * The credential variables one entry contributes: always\n * `SKAILE_AIP_<ID>_KEY`, plus the conventional carrier unless `aliases` is\n * `false`. Empty when the entry has no resolvable secret.\n */\nexport function entryCredentialEnv(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const value = resolveEntryCredential(entry, options);\n if (!value) return {};\n const out: Record<string, string> = { [providerCredentialEnvName(providerId)]: value };\n if (options.aliases !== false) {\n const alias = conventionalCredentialEnvName(entry);\n if (alias) out[alias] = value;\n }\n return out;\n}\n\n/**\n * Every enabled entry's credential, as a child-process environment fragment.\n *\n * One canonical `SKAILE_AIP_<ID>_KEY` per entry whose credential resolves; the\n * conventional carriers are added underneath, first entry in registry order\n * winning a collision (registry order is highest-precedence layer first, so\n * the alias follows the same precedence the selector does). Entries whose\n * credential cannot be resolved contribute nothing.\n */\nexport function registryCredentialEnv(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const canonical: Record<string, string> = {};\n const aliases: Record<string, string> = {};\n for (const [id, entry] of registryEntries(registry)) {\n if (options.providerId && id !== options.providerId) continue;\n if (!isEntryEnabled(entry)) continue;\n const value = resolveEntryCredential(entry, options);\n if (!value) continue;\n canonical[providerCredentialEnvName(id)] = value;\n if (options.aliases === false) continue;\n const alias = conventionalCredentialEnvName(entry);\n if (alias && aliases[alias] === undefined) aliases[alias] = value;\n }\n return { ...aliases, ...canonical };\n}\n","/**\n * What the runner may ask of a harness, by driver id.\n *\n * Deliberately light: this module imports no driver, no SDK and no `zod`, so a\n * runner file that only needs a capability can import it without loading the\n * driver graph. The plugin-registry singleton is read through its `internal`\n * module (the same file `@skaile/workspaces/plugin-registry` re-exports, so one\n * instance under the bundler's shared chunks), not through the package index,\n * which pulls in the deploy helpers and their `zod` schemas.\n *\n * @docLink packages/bridge/api-reference#registry\n */\n\nimport { pluginRegistry } from \"../../plugin-registry/src/internal.js\";\nimport type { DriverCapabilities } from \"@skaile/workspaces/types\";\n\n/**\n * Capabilities of a harness that declares none: it recomposes its tools per\n * turn like every bridge driver that is not an in-process SDK, and has no\n * managed session, credentials file or transcript-file resume.\n */\nconst GENERIC_DRIVER_CAPABILITIES: DriverCapabilities = {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n};\n\n/**\n * Declared capabilities of the built-in harnesses that differ from nothing.\n * `BUILTIN_DRIVER_CATALOG` rows point at these entries, so `listDrivers()` and\n * {@link driverCapabilities} read one table. A built-in absent here (echo,\n * gemini, qwen, opencode, goose, continue) takes the generic defaults.\n */\nexport const BUILTIN_DRIVER_CAPABILITIES = {\n // Recomposes its tools per turn, so a hot-plugged MCP server is live.\n omp: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n // The SDK takes in-process server instances and bakes its tool set at\n // creation; it reads Claude's `~/.claude` credentials and JSONL transcripts.\n \"claude-sdk\": {\n inProcessMcpServers: true,\n liveToolUpdates: false,\n managedSession: false,\n claudeCodeCredentials: true,\n resumeNeedsTranscript: true,\n },\n // Standalone SDK recomposes its tools per turn. A host-managed session\n // (native app-server) refreshes its own native tool snapshot instead.\n codex: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: true,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n} as const satisfies Record<string, DriverCapabilities>;\n\n/**\n * Resolve what the runner may ask of a harness, by driver id, without loading\n * its module. Built-ins read {@link BUILTIN_DRIVER_CAPABILITIES}; a third-party\n * driver reads its registered `DriverTarget`; an unknown or absent id gets the\n * generic defaults. Fields a driver omits take the generic default too.\n *\n * This is the one place the runner learns driver facts — it never compares an\n * id against `\"claude-sdk\"`, `\"codex\"` or `\"omp\"`.\n *\n * @param id - Driver id (e.g. a session's `driverType`); `undefined` resolves to the defaults.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function driverCapabilities(id: string | undefined): DriverCapabilities {\n const declared = id\n ? Object.hasOwn(BUILTIN_DRIVER_CAPABILITIES, id)\n ? BUILTIN_DRIVER_CAPABILITIES[id as keyof typeof BUILTIN_DRIVER_CAPABILITIES]\n : pluginRegistry.get(\"driver\", id)?.capabilities\n : undefined;\n return { ...GENERIC_DRIVER_CAPABILITIES, ...declared };\n}\n\n/**\n * Whether a hot-plugged MCP server reaches the agent's next turn without a\n * driver restart. A host-managed session refreshes its native tool snapshot\n * itself, so it never takes live updates, whatever the standalone driver does.\n *\n * @param id - Driver id of the live session.\n * @param managed - Whether the session is host-managed (`managedCodex`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport function supportsLiveToolUpdates(id: string | undefined, managed = false): boolean {\n const caps = driverCapabilities(id);\n return caps.liveToolUpdates && !(managed && caps.managedSession);\n}\n","import type {\n AIProviderRegistry,\n AIProviderSurface,\n MergedAIProviderRegistry,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { DriverContext } from \"@skaile/workspaces/plugin-registry\";\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport { BUILTIN_DRIVER_CAPABILITIES } from \"./driver-capabilities.js\";\nimport type { AgentConfig, AgentDriver, DriverInfo } from \"./types.js\";\n\n// Build-time harness gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded harness's driver module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every harness is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\n/**\n * Every wire surface omp can speak — it is the harness the `surface` enum was\n * lifted from, so its list is the enum.\n */\nconst OMP_SURFACES = [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"openai-codex-responses\",\n \"azure-openai-responses\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n] as const satisfies readonly AIProviderSurface[];\n\n/**\n * Static capability metadata for every built-in harness.\n *\n * Pure data — this object imports no driver module and references no harness\n * SDK. {@link listDrivers} returns it (merged with any third-party drivers)\n * so selection UIs can enumerate every harness without loading a single\n * driver module. The matching driver module's `DriverTarget` is registered\n * into the plugin registry by {@link registerBuiltinDrivers}.\n *\n * `surfaces` and `providerPlurality` are the driver-capability declaration\n * the AI provider registry resolves against (plan §2.3): which wire protocols\n * a harness can be pointed at, and how many registry entries it can use at\n * once. The platform's resolver filters candidate entries on `surfaces`\n * instead of matching vendor names.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const BUILTIN_DRIVER_CATALOG: Record<string, DriverInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n surfaces: OMP_SURFACES,\n // omp renders the whole registry as its own `models.yml`, so every entry\n // stays selectable and roles / per-subagent models resolve across them.\n providerPlurality: \"registry\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES.omp,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Anthropic's own API, plus the two clouds the SDK addresses natively.\n // Foundry is `anthropic-messages` at a different host, not a surface.\n surfaces: [\"anthropic-messages\", \"bedrock-converse-stream\", \"google-vertex\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES[\"claude-sdk\"],\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Codex's `wire_api` is `responses` or `chat`; its subscription transport\n // is the codex-specific responses flavour.\n surfaces: [\"openai-codex-responses\", \"openai-responses\", \"openai-completions\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES.codex,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Deterministic mock: it never opens a connection, so it speaks no wire\n // surface and no registry entry can be dispatched to it.\n surfaces: [],\n providerPlurality: \"single\",\n },\n gemini: {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n surfaces: [\"google-generative-ai\"],\n providerPlurality: \"single\",\n },\n qwen: {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Driven entirely through OPENAI_BASE_URL / OPENAI_API_KEY.\n surfaces: [\"openai-completions\"],\n providerPlurality: \"single\",\n },\n opencode: {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"google-generative-ai\",\n ],\n providerPlurality: \"credentials-n\",\n },\n goose: {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"bedrock-converse-stream\",\n ],\n providerPlurality: \"credentials-n\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\"anthropic-messages\", \"openai-completions\", \"google-generative-ai\"],\n providerPlurality: \"credentials-n\",\n },\n};\n\n/**\n * Back-compat alias for {@link BUILTIN_DRIVER_CATALOG}. Consumers and tests that\n * predate the plugin-registry refactor still import `DRIVER_CATALOG`.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const DRIVER_CATALOG = BUILTIN_DRIVER_CATALOG;\n\nlet _driversRegistered = false;\n\n/**\n * Register every built-in driver's `DriverTarget` into the plugin registry.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the driver module\n * (and, transitively, its SDK). The in-process-SDK harnesses (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded harness's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * **Static import discipline.** Every `import()` specifier below must be a\n * string literal — never aliased through a variable. Indirection defeats\n * `bun --compile`'s static analysis and silently drops the module from the\n * binary.\n *\n * Idempotent: guarded by a module flag so a second call is a no-op (a duplicate\n * `register` would otherwise throw `RegistrationError`).\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function registerBuiltinDrivers(\n registry: PluginRegistry = pluginRegistry,\n): Promise<void> {\n if (registry === pluginRegistry && _driversRegistered) return;\n\n if (!registry.get(\"driver\", \"omp\")) {\n const m = await import(\"@skaile/workspaces/drivers/omp\");\n registry.register(\"driver\", m.ompDriverTarget);\n }\n if (!registry.get(\"driver\", \"echo\")) {\n const m = await import(\"@skaile/workspaces/drivers/echo\");\n registry.register(\"driver\", m.echoDriverTarget);\n }\n if (INCLUDE_CLAUDE_SDK && !registry.get(\"driver\", \"claude-sdk\")) {\n const m = await import(\"@skaile/workspaces/drivers/claude-sdk\");\n registry.register(\"driver\", m.claudeSdkDriverTarget);\n }\n if (INCLUDE_CODEX && !registry.get(\"driver\", \"codex\")) {\n const m = await import(\"@skaile/workspaces/drivers/codex\");\n registry.register(\"driver\", m.codexDriverTarget);\n }\n // Subprocess CLI harnesses spawn an external binary the user installs\n // separately — no bundled SDK to dead-code-strip, so (like omp/echo) they\n // carry no build constant and are always registered.\n if (!registry.get(\"driver\", \"gemini\")) {\n const m = await import(\"@skaile/workspaces/drivers/gemini\");\n registry.register(\"driver\", m.geminiDriverTarget);\n }\n if (!registry.get(\"driver\", \"qwen\")) {\n const m = await import(\"@skaile/workspaces/drivers/qwen\");\n registry.register(\"driver\", m.qwenDriverTarget);\n }\n if (!registry.get(\"driver\", \"opencode\")) {\n const m = await import(\"@skaile/workspaces/drivers/opencode\");\n registry.register(\"driver\", m.opencodeDriverTarget);\n }\n if (!registry.get(\"driver\", \"goose\")) {\n const m = await import(\"@skaile/workspaces/drivers/goose\");\n registry.register(\"driver\", m.gooseDriverTarget);\n }\n if (!registry.get(\"driver\", \"continue\")) {\n const m = await import(\"@skaile/workspaces/drivers/continue\");\n registry.register(\"driver\", m.continueDriverTarget);\n }\n\n if (registry === pluginRegistry) _driversRegistered = true;\n}\n\n/**\n * Creates a new driver instance for the given harness id.\n *\n * Ensures the built-in driver targets are registered (idempotent), then looks\n * up the target in the plugin registry and calls its `create()`. The returned\n * driver has not been started yet — call `driver.start()` before sending\n * prompts.\n *\n * @param id - Registered driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the driver constructor.\n * @param ctx - Optional driver context (logger / abort signal). Defaults to `{}`.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered driver at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createDriver(\n id: string,\n config: AgentConfig,\n ctx?: DriverContext,\n): Promise<AgentDriver> {\n const target = await resolveDriverTarget(id);\n return target.create(config, ctx ?? {});\n}\n\n/**\n * Resolve a registered driver target by id, ensuring the built-ins are\n * registered first. Throws the canonical \"not bundled\" / \"unknown driver\"\n * errors so every caller (`createDriver`, `listModelsForDriver`) reports an\n * unrecognized id the same way instead of silently degrading.\n *\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered driver at all.\n */\nasync function resolveDriverTarget(id: string) {\n await registerBuiltinDrivers();\n const target = pluginRegistry.get(\"driver\", id);\n if (!target) {\n if (id in BUILTIN_DRIVER_CATALOG) {\n throw new Error(`Agent driver \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent driver: \"${id}\". Available: ${listDrivers()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return target;\n}\n\n/**\n * Returns the capability metadata for every available driver.\n *\n * Enumerates every built-in harness from {@link BUILTIN_DRIVER_CATALOG} without\n * loading a single driver module or harness SDK, then merges in any third-party\n * driver targets registered into the plugin registry that are not already in\n * the catalog. Use this to populate driver selection UIs.\n *\n * @returns Array of {@link DriverInfo} objects, one per available driver.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listDrivers(): DriverInfo[] {\n const merged = new Map<string, DriverInfo>();\n for (const info of Object.values(BUILTIN_DRIVER_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const meta of pluginRegistry.list(\"driver\")) {\n if (!merged.has(meta.id)) {\n // Third-party drivers carry no DriverInfo row; read the capability flags\n // off the registered target (defaulting to conservative false) so a\n // model-agnostic / in-band-abort harness can still advertise them.\n const target = pluginRegistry.get(\"driver\", meta.id);\n merged.set(meta.id, {\n id: meta.id,\n name: meta.displayName,\n modelAgnostic: target?.modelAgnostic ?? false,\n supportsInBandAbort: target?.supportsInBandAbort ?? false,\n // Left absent when the target declares nothing: \"speaks no surface\" and\n // \"did not say\" are different claims, and the platform resolver must be\n // able to tell them apart before it filters a driver out.\n ...(target?.surfaces ? { surfaces: target.surfaces } : {}),\n ...(target?.providerPlurality ? { providerPlurality: target.providerPlurality } : {}),\n ...(target?.capabilities ? { capabilities: target.capabilities } : {}),\n });\n }\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific driver without starting a full agent session.\n *\n * Ensures the built-in driver targets are registered (idempotent), then\n * delegates to the target's optional `listModels()`. Throws on an unknown /\n * not-bundled id (same contract as {@link createDriver}); returns `[]` only\n * when the target exists but exposes no `listModels`.\n *\n * @param driverId - Registered driver id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param registry - The AI provider registry to discover against — either the\n * bare `id → entry` map or a merged view. Each entry names its credential by\n * reference, resolved through `options` and delivered to the throwaway\n * driver as `SKAILE_AIP_<ID>_KEY` environment entries.\n * @param options - Which entry to restrict to, and where `env:` / `platform:`\n * references resolve from. Defaults to the whole registry against\n * `process.env`.\n * @throws {Error} When `driverId` is unknown or excluded from this build.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForDriver(\n driverId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options?: RegistryCredentialOptions,\n): Promise<ModelEntry[]> {\n const target = await resolveDriverTarget(driverId);\n return (await target.listModels?.(registry, options)) ?? [];\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/provider-catalog.ts","../bridge/src/provider-materialize/credential-env.ts","../bridge/src/driver-capabilities.ts","../bridge/src/registry.ts"],"names":[],"mappings":"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","file":"chunk-KY4UXX7M.js","sourcesContent":["/**\n * The AI provider catalog — the preset layer of the provider registry (§1.5,\n * layer 5).\n *\n * A preset is the three-or-four literals an endpoint needs beyond a credential:\n * its wire `surface`, its `base_url` (or the transport that derives one), the\n * header the credential rides in, and the path a read-only probe can GET. With\n * them, `skaile providers add --preset groq` needs nothing but an env var name.\n *\n * This replaced `provider-endpoints.ts` `PROVIDER_ENDPOINTS`: every endpoint\n * that table knew is present here, with the surface/transport/credential facts\n * it could not express.\n *\n * The record types come from `@skaile/workspaces/core/provider-registry` — the\n * schema has exactly one home.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.2, §1.3, §2.5\n */\n\nimport {\n AI_PROVIDER_BASE_URL_TEMPLATES,\n type AIProviderCredentialKind,\n type AIProviderDiscovery,\n type AIProviderEntry,\n type AIProviderKind,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n type AIProviderRegistryLayer,\n type AIProviderRegistryPatch,\n type AIProviderSurface,\n type AIProviderTransport,\n type AIProviderVoiceParams,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\n\n/**\n * Where the credential goes on the wire. `{credential}` is replaced with the\n * resolved secret. Needed because `credential.kind` alone is ambiguous:\n * `api_key_header` is `x-api-key` for Anthropic, `x-goog-api-key` for Gemini,\n * `api-key` for Azure OpenAI and `Authorization: Token …` for Deepgram.\n */\nexport interface AIProviderAuthHeader {\n name: string;\n template: string;\n}\n\n/** A catalog preset — the fields an entry inherits by naming it. */\nexport interface AIProviderPreset {\n /** Preset id; also the default entry id `skaile providers add` writes. */\n id: string;\n kind: AIProviderKind;\n label: string;\n /** `llm`/`embed` only. */\n surface?: AIProviderSurface;\n /** `llm`/`embed` only; omitted means `direct`. */\n transport?: AIProviderTransport;\n /** Literal endpoint. Absent when the transport derives one from `params`. */\n base_url?: string;\n /**\n * Env var the vendor's own SDK reads as a base-URL override, when one\n * exists. Consulted by the callers that still address an endpoint by preset\n * id — model discovery, key validation, and `skaile migrate providers` — so\n * a shell already pointed at a gateway keeps pointing there.\n */\n base_url_env?: string;\n /** Static non-secret headers, e.g. Anthropic's `anthropic-version`. */\n headers?: Record<string, string>;\n /** Credential shape plus the conventional env var holding the secret. */\n credential: { kind: AIProviderCredentialKind; env?: string };\n /** Header the credential rides in; defaults per surface when omitted. */\n auth_header?: AIProviderAuthHeader;\n /** Default routing/voice parameters. */\n params?: Record<string, string>;\n /** `params` keys the operator must supply — the preset cannot know them. */\n required_params?: string[];\n /**\n * Read-only path a health probe GETs, relative to `base_url`: the models\n * list for LLM surfaces, an equivalent authenticated read for voice.\n * Absent when the endpoint has none (Bedrock's runtime host).\n */\n probe_path?: string;\n discovery?: AIProviderDiscovery;\n /** Anything the operator has to know that the fields do not say. */\n notes?: string;\n}\n\nconst ANTHROPIC_VERSION_HEADER: Record<string, string> = { \"anthropic-version\": \"2023-06-01\" };\n\nconst X_API_KEY: AIProviderAuthHeader = { name: \"x-api-key\", template: \"{credential}\" };\n\nconst OPENAI_MODELS_PATH = \"/v1/models\";\n\n/**\n * Every preset the runtime ships.\n *\n * Insertion order is display order in `skaile providers list`: first-party\n * clouds, then OpenAI-compatible vendors, then the transports that need\n * routing parameters, then local runtimes and gateways, then voice.\n *\n * Sources: `platform/_devlog/reports/2026-09-20-inference-provider-market-survey.md`\n * (36 endpoints, base URLs and auth headers verified there).\n */\nexport const AI_PROVIDER_PRESETS: Record<string, AIProviderPreset> = {\n anthropic: {\n id: \"anthropic\",\n kind: \"llm\",\n label: \"Anthropic\",\n surface: \"anthropic-messages\",\n base_url: \"https://api.anthropic.com\",\n base_url_env: \"ANTHROPIC_BASE_URL\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_API_KEY\" },\n auth_header: X_API_KEY,\n probe_path: \"/v1/models\",\n discovery: { type: \"anthropic-models-list\" },\n },\n openai: {\n id: \"openai\",\n kind: \"llm\",\n label: \"OpenAI\",\n surface: \"openai-responses\",\n base_url: \"https://api.openai.com/v1\",\n base_url_env: \"OPENAI_BASE_URL\",\n credential: { kind: \"bearer\", env: \"OPENAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Responses is OpenAI's current API; set surface openai-completions for chat-only clients.\",\n },\n google: {\n id: \"google\",\n kind: \"llm\",\n label: \"Google Gemini API\",\n surface: \"google-generative-ai\",\n base_url: \"https://generativelanguage.googleapis.com/v1beta\",\n credential: { kind: \"api_key_header\", env: \"GEMINI_API_KEY\" },\n auth_header: { name: \"x-goog-api-key\", template: \"{credential}\" },\n probe_path: \"/v1beta/models\",\n discovery: { type: \"google-models-list\" },\n },\n groq: {\n id: \"groq\",\n kind: \"llm\",\n label: \"Groq\",\n surface: \"openai-completions\",\n base_url: \"https://api.groq.com/openai/v1\",\n credential: { kind: \"bearer\", env: \"GROQ_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n deepseek: {\n id: \"deepseek\",\n kind: \"llm\",\n label: \"DeepSeek\",\n surface: \"openai-completions\",\n base_url: \"https://api.deepseek.com\",\n credential: { kind: \"bearer\", env: \"DEEPSEEK_API_KEY\" },\n probe_path: \"/models\",\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Anthropic-shaped clients use https://api.deepseek.com/anthropic with surface anthropic-messages.\",\n },\n openrouter: {\n id: \"openrouter\",\n kind: \"llm\",\n label: \"OpenRouter\",\n surface: \"openai-completions\",\n base_url: \"https://openrouter.ai/api/v1\",\n credential: { kind: \"bearer\", env: \"OPENROUTER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n mistral: {\n id: \"mistral\",\n kind: \"llm\",\n label: \"Mistral\",\n surface: \"openai-completions\",\n base_url: \"https://api.mistral.ai/v1\",\n credential: { kind: \"bearer\", env: \"MISTRAL_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n xai: {\n id: \"xai\",\n kind: \"llm\",\n label: \"xAI (Grok)\",\n surface: \"openai-completions\",\n base_url: \"https://api.x.ai/v1\",\n credential: { kind: \"bearer\", env: \"XAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n together: {\n id: \"together\",\n kind: \"llm\",\n label: \"Together AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.together.ai/v1\",\n credential: { kind: \"bearer\", env: \"TOGETHER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n fireworks: {\n id: \"fireworks\",\n kind: \"llm\",\n label: \"Fireworks AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.fireworks.ai/inference/v1\",\n credential: { kind: \"bearer\", env: \"FIREWORKS_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n bedrock: {\n id: \"bedrock\",\n kind: \"llm\",\n label: \"AWS Bedrock\",\n surface: \"bedrock-converse-stream\",\n transport: \"bedrock\",\n credential: { kind: \"sigv4\" },\n required_params: [\"region\"],\n notes: \"Credentials come from the AWS default chain; the runtime host serves no models list.\",\n },\n vertex: {\n id: \"vertex\",\n kind: \"llm\",\n label: \"Google Vertex AI\",\n surface: \"google-vertex\",\n transport: \"vertex\",\n credential: { kind: \"google_adc\" },\n params: { publisher: \"google\" },\n required_params: [\"project\", \"location\"],\n probe_path: \"/models\",\n },\n \"azure-openai\": {\n id: \"azure-openai\",\n kind: \"llm\",\n label: \"Azure OpenAI\",\n surface: \"azure-openai-responses\",\n transport: \"azure-openai\",\n credential: { kind: \"api_key_header\", env: \"AZURE_OPENAI_API_KEY\" },\n auth_header: { name: \"api-key\", template: \"{credential}\" },\n required_params: [\"resource\", \"deployment\", \"api_version\"],\n probe_path: \"/models\",\n notes:\n \"api_version is mirrored into query_params['api-version']; switch credential.kind to azure_entra for Entra tokens.\",\n },\n foundry: {\n id: \"foundry\",\n kind: \"llm\",\n label: \"Claude on Microsoft Foundry\",\n surface: \"anthropic-messages\",\n transport: \"foundry\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_FOUNDRY_API_KEY\" },\n auth_header: X_API_KEY,\n required_params: [\"resource\"],\n probe_path: \"/v1/models\",\n },\n ollama: {\n id: \"ollama\",\n kind: \"llm\",\n label: \"Ollama (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:11434/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n lmstudio: {\n id: \"lmstudio\",\n kind: \"llm\",\n label: \"LM Studio (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:1234/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n vllm: {\n id: \"vllm\",\n kind: \"llm\",\n label: \"vLLM (self-hosted)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:8000/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"A server started with --api-key expects credential.kind bearer and an env: ref.\",\n },\n litellm: {\n id: \"litellm\",\n kind: \"llm\",\n label: \"LiteLLM proxy\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:4000\",\n credential: { kind: \"bearer\", env: \"LITELLM_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"The credential is the proxy's virtual key; upstream keys stay in the proxy config.\",\n },\n deepgram: {\n id: \"deepgram\",\n kind: \"stt\",\n label: \"Deepgram\",\n base_url: \"https://api.deepgram.com\",\n credential: { kind: \"api_key_header\", env: \"DEEPGRAM_API_KEY\" },\n auth_header: { name: \"Authorization\", template: \"Token {credential}\" },\n params: { model: \"nova-3\", language: \"en\" },\n probe_path: \"/v1/projects\",\n },\n elevenlabs: {\n id: \"elevenlabs\",\n kind: \"tts\",\n label: \"ElevenLabs\",\n base_url: \"https://api.elevenlabs.io\",\n credential: { kind: \"api_key_header\", env: \"ELEVENLABS_API_KEY\" },\n auth_header: { name: \"xi-api-key\", template: \"{credential}\" },\n params: { voice_id: \"21m00Tcm4TlvDq8ikWAM\", output_format: \"mp3_44100_128\" },\n probe_path: \"/v1/models\",\n },\n};\n\n/** Presets in catalog order. */\nexport function listProviderPresets(): AIProviderPreset[] {\n return Object.values(AI_PROVIDER_PRESETS);\n}\n\n/** Look up a preset by id. */\nexport function getProviderPreset(id: string): AIProviderPreset | undefined {\n return AI_PROVIDER_PRESETS[id];\n}\n\n/**\n * The endpoint `skaile providers list` shows for a preset: the literal when\n * there is one, otherwise the transport's `base_url` template (§1.3) with its\n * `{param}` placeholders left in — they are exactly what the operator must\n * supply.\n */\nexport function presetBaseUrl(preset: AIProviderPreset): string | undefined {\n if (preset.base_url) return preset.base_url;\n if (!preset.transport || preset.transport === \"direct\") return undefined;\n return AI_PROVIDER_BASE_URL_TEMPLATES[preset.transport];\n}\n\n/**\n * The endpoint a request to this preset should actually go to: an explicit\n * override first, then the vendor's own `*_BASE_URL` variable\n * ({@link AIProviderPreset.base_url_env}), then the preset literal.\n *\n * Behind a gateway the credential in play is the *gateway's*, not the\n * vendor's, so discovery and key validation have to follow dispatch — firing\n * either at the vendor's public API 401s and yields an empty catalog, which a\n * caller that reads \"empty\" as \"unknown\" then degrades into \"accept anything\".\n *\n * Pure: reads only the `env` record it is handed.\n */\nexport function resolvePresetBaseUrl(\n preset: AIProviderPreset,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): string | undefined {\n const explicit = options.baseUrl?.trim();\n if (explicit) return explicit;\n const fromEnv = preset.base_url_env ? options.env?.[preset.base_url_env]?.trim() : undefined;\n return fromEnv || preset.base_url;\n}\n\n/** Overrides {@link expandPreset} accepts from `skaile providers add`. */\nexport interface ExpandPresetOptions {\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…`. Never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n /** Transport routing parameters, or voice parameters for `stt`/`tts`. */\n params?: Record<string, string>;\n}\n\n/**\n * Materialize a preset into a registry entry.\n *\n * The credential is always a reference: the preset's conventional `env:` var\n * unless the caller names another ref. No code path here can write a secret.\n * For `transport: azure-openai` the `api_version` parameter is mirrored into\n * `query_params['api-version']`, which is where the wire expects it (§1.3).\n */\nexport function expandPreset(\n preset: AIProviderPreset,\n options: ExpandPresetOptions = {},\n): AIProviderEntry {\n const ref =\n options.credentialRef ?? (preset.credential.env ? `env:${preset.credential.env}` : undefined);\n const credential = ref ? { kind: preset.credential.kind, ref } : { kind: preset.credential.kind };\n const base_url = options.baseUrl ?? preset.base_url;\n const params = { ...preset.params, ...options.params };\n\n if (preset.kind === \"stt\" || preset.kind === \"tts\") {\n return {\n kind: preset.kind,\n label: options.label ?? preset.label,\n preset: preset.id,\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(Object.keys(params).length > 0 ? { params: params as AIProviderVoiceParams } : {}),\n };\n }\n\n const transport = preset.transport ?? \"direct\";\n const entry: AIProviderLlmEntry = {\n kind: preset.kind === \"embed\" ? \"embed\" : \"llm\",\n label: options.label ?? preset.label,\n preset: preset.id,\n ...((options.surface ?? preset.surface) ? { surface: options.surface ?? preset.surface } : {}),\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(preset.discovery ? { discovery: { ...preset.discovery } } : {}),\n } as AIProviderLlmEntry;\n\n if (transport !== \"direct\") {\n Object.assign(entry, { transport, params });\n if (transport === \"azure-openai\" && params.api_version) {\n entry.query_params = { \"api-version\": params.api_version };\n }\n }\n return entry;\n}\n\n/**\n * Build the catalog merge layer for a set of configured entries (§1.5).\n *\n * Only the presets actually referenced by a `preset:` key are expanded, keyed\n * by the *entry* id — so `groq: {kind: llm, preset: groq}` deep-merges onto a\n * full Groq definition while an unreferenced preset stays out of the registry.\n *\n * Takes the **pre-gate** merge (`LoadedProviderRegistry.patches`), not the\n * gated registry: an entry that leaves `kind` or its transport `params` to the\n * preset is exactly the one the gate drops before this layer exists, and a\n * dropped entry names no preset to expand.\n */\nexport function catalogLayer(providers: AIProviderRegistryPatch): AIProviderRegistryLayer {\n const expanded: AIProviderRegistry = {};\n for (const [id, entry] of Object.entries(providers)) {\n if (!entry.preset) continue;\n const preset = AI_PROVIDER_PRESETS[entry.preset];\n if (!preset) continue;\n expanded[id] = expandPreset(preset);\n }\n return { layer: \"catalog\", providers: expanded };\n}\n\n/**\n * Join a base URL and a path without duplicating a shared leading segment:\n * `(\"https://gw/v1\", \"/v1/models\")` → `https://gw/v1/models`. Both spellings\n * are common in the wild, and a preset's path must work against a gateway base\n * the operator typed either way.\n */\nfunction joinBaseAndPath(base: string, path: string): string {\n const trimmed = base.replace(/\\/+$/, \"\");\n const segments = path.split(\"/\").filter(Boolean);\n const lead = segments[0];\n if (lead && trimmed.toLowerCase().endsWith(`/${lead.toLowerCase()}`)) {\n return `${trimmed}/${segments.slice(1).join(\"/\")}`;\n }\n return `${trimmed}${path}`;\n}\n\n/**\n * The read-only URL a health probe or model discovery can GET for an entry —\n * the models list on LLM surfaces, the equivalent authenticated read on voice\n * ones. `undefined` when the entry has no endpoint yet (missing transport\n * parameters) or the surface serves no such path (Bedrock runtime).\n *\n * This is the catalog method that supersedes `resolveProviderModelsUrl`.\n */\nexport function resolveProbeUrl(entry: AIProviderEntry): string | undefined {\n const base = resolveEntryBaseUrl(entry);\n if (!base) return undefined;\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n const path = (entry as AIProviderLlmEntry).discovery?.path ?? preset?.probe_path;\n if (!path) return undefined;\n const url = joinBaseAndPath(base, path);\n const query = (entry as AIProviderLlmEntry).query_params;\n if (!query || Object.keys(query).length === 0) return url;\n const search = new URLSearchParams(query).toString();\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${search}`;\n}\n\n/**\n * The header(s) that present a credential on the wire for an entry.\n *\n * `credential.kind` alone does not determine the header — `api_key_header` is\n * `x-api-key` at Anthropic, `x-goog-api-key` at Google and `api-key` at Azure —\n * so the preset's `auth_header` wins, then a per-surface default.\n * Returns `{}` when the credential is signed elsewhere (`sigv4`, `google_adc`)\n * or absent.\n */\nexport function buildCredentialHeaders(\n entry: AIProviderEntry,\n secret: string | undefined,\n): Record<string, string> {\n const kind = entry.credential?.kind ?? \"none\";\n if (!secret || kind === \"none\" || kind === \"sigv4\" || kind === \"google_adc\") return {};\n\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.auth_header) {\n return {\n [preset.auth_header.name]: preset.auth_header.template.replace(\"{credential}\", secret),\n };\n }\n if (kind === \"api_key_header\") {\n const surface = (entry as AIProviderLlmEntry).surface;\n if (surface === \"google-generative-ai\") return { \"x-goog-api-key\": secret };\n if (surface === \"azure-openai-responses\") return { \"api-key\": secret };\n return { \"x-api-key\": secret };\n }\n return { Authorization: `Bearer ${secret}` };\n}\n\n/** Outcome of {@link probeProviderEntry}. Never carries the credential. */\nexport interface AIProviderProbeResult {\n /** The endpoint answered 2xx. */\n ok: boolean;\n /** `false` when no request was made — nothing was verified either way. */\n probed: boolean;\n url?: string;\n status?: number;\n /** Human-readable outcome. Secret-free. */\n detail: string;\n}\n\n/** Options for {@link probeProviderEntry}. */\nexport interface ProbeProviderOptions {\n /** Resolved credential value, if the entry has one. Never logged. */\n secret?: string;\n /** Request deadline; default 8000 ms, matching `validateApiKey`. */\n timeoutMs?: number;\n}\n\n/**\n * Send one minimal, read-only request to an entry's endpoint and report what\n * came back.\n *\n * Returns `probed: false` — rather than a false negative — when the entry has\n * no probe path (Bedrock's runtime host) or no resolvable endpoint yet: a\n * SigV4- or ADC-signed request is the transport SDK's job, not this function's.\n */\nexport async function probeProviderEntry(\n entry: AIProviderEntry,\n options: ProbeProviderOptions = {},\n): Promise<AIProviderProbeResult> {\n const url = resolveProbeUrl(entry);\n if (!url) {\n const base = resolveEntryBaseUrl(entry);\n return {\n ok: false,\n probed: false,\n detail: base\n ? `no read-only probe endpoint is defined for this entry (${base})`\n : \"no base_url could be resolved — set base_url or the transport's params\",\n };\n }\n\n const headers: Record<string, string> = {\n ...entry.headers,\n ...buildCredentialHeaders(entry, options.secret),\n };\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n try {\n const response = await fetch(url, { method: \"GET\", headers, signal: controller.signal });\n if (response.ok) {\n return { ok: true, probed: true, url, status: response.status, detail: \"endpoint reachable\" };\n }\n const detail =\n response.status === 401 || response.status === 403\n ? \"credential rejected (authentication failed)\"\n : `endpoint returned HTTP ${response.status}`;\n return { ok: false, probed: true, url, status: response.status, detail };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const detail =\n err instanceof Error && err.name === \"AbortError\"\n ? `request timed out after ${options.timeoutMs ?? 8000}ms`\n : message;\n return { ok: false, probed: true, url, detail };\n } finally {\n clearTimeout(timeout);\n }\n}\n","/**\n * Credential delivery for driver adapters — the one naming rule (§2.3).\n *\n * Every adapter that hands a registry entry's secret to a child process, and\n * every renderer that has to *name* that secret in a config file it writes\n * (omp's `models.yml` `apiKey:`, Codex's `env_key`, OpenCode's `{env:…}`),\n * agrees on one env-var name per entry: `SKAILE_AIP_<UPPER_ID>_KEY`. The name\n * goes in the file, the value goes in the child environment — a rendered\n * config never contains a secret.\n *\n * The platform's secret-env allowlist is a prefix rule on exactly that name,\n * and forge-common delivers the same names when it spawns `skaile serve`, so\n * the transform below is a cross-repo contract: uppercase, every character\n * outside `[A-Za-z0-9]` mapped to `_` (registry ids are `[a-z0-9][a-z0-9_-]*`,\n * so in practice only `-`).\n *\n * Alongside the canonical name, {@link registryCredentialEnv} also sets the\n * *conventional* carrier a CLI already reads (`ANTHROPIC_API_KEY`,\n * `GEMINI_API_KEY`, `GROQ_API_KEY`, …) so a catalog-preset entry works in a\n * harness that has no per-endpoint config file yet.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.4, §2.3\n */\n\nimport {\n type AIProviderEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { resolveCredential } from \"@skaile/workspaces/core/provider-registry-credentials\";\nimport { AI_PROVIDER_PRESETS } from \"../provider-catalog.js\";\n\n/** Options shared by every registry-shaped credential resolution. */\nexport interface RegistryCredentialOptions {\n /** Restrict resolution to one entry — the provider half of a `modelRef`. */\n providerId?: string;\n /** Environment `env:` refs resolve against. Defaults to `process.env`. */\n env?: Record<string, string | undefined>;\n /** Control-plane secrets keyed by config id, for `platform:` refs. */\n secrets?: Record<string, string>;\n /** Run `cmd:` references. Default `true`. */\n allowCommand?: boolean;\n}\n\n/** Prefix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_PREFIX = \"SKAILE_AIP_\";\n\n/** Suffix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_SUFFIX = \"_KEY\";\n\n/**\n * The env-var name that carries a registry entry's credential:\n * `anthropic` → `SKAILE_AIP_ANTHROPIC_KEY`, `my-gw.eu` → `SKAILE_AIP_MY_GW_EU_KEY`.\n *\n * Pure: no environment, no registry, no I/O. Renderers call it per entry while\n * emitting a config file, adapters call it while assembling a child env, and\n * the platform allowlist matches the prefix.\n */\nexport function providerCredentialEnvName(providerId: string): string {\n const slug = providerId.replace(/[^A-Za-z0-9]/g, \"_\").toUpperCase();\n return `${PROVIDER_CREDENTIAL_ENV_PREFIX}${slug}${PROVIDER_CREDENTIAL_ENV_SUFFIX}`;\n}\n\n/**\n * The env var a harness already looks for on its own, when the entry names one.\n *\n * The catalog preset's conventional carrier wins (`GEMINI_API_KEY` for\n * `google`), because that is the name the vendor's own CLI reads; otherwise an\n * `env:NAME` credential reference is taken at face value — the operator named\n * that variable, so the child gets it under the same name. `cmd:`, `platform:`\n * and `keyring:` refs have no conventional carrier and return `undefined`.\n */\nexport function conventionalCredentialEnvName(entry: AIProviderEntry): string | undefined {\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.credential.env) return preset.credential.env;\n const ref = entry.credential?.ref ? parseCredentialRef(entry.credential.ref) : undefined;\n return ref?.form === \"env\" ? ref.name : undefined;\n}\n\n/**\n * Resolve one entry's credential to its value, or `undefined` when there is\n * none to hand over (`kind: none`, an ambient `sigv4`/`google_adc` chain, an\n * unset variable, a reserved `keyring:` ref).\n */\nexport function resolveEntryCredential(\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n }).value;\n}\n\n/**\n * One entry's credential value, including the one the session boundary\n * already resolved for it.\n *\n * A `platform:<configId>` reference is resolved by the runner — it holds the\n * `session_init` secrets map, the driver does not — and materialized into the\n * child environment under {@link providerCredentialEnvName}. So when the\n * reference itself yields nothing, that carrier is consulted: it is the same\n * secret, delivered one step earlier.\n */\nexport function entryCredentialValue(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return (\n resolveEntryCredential(entry, options) ?? options.env?.[providerCredentialEnvName(providerId)]\n );\n}\n\n/** One enabled entry whose credential is declared but cannot be resolved. */\nexport interface UnresolvedProviderCredential {\n providerId: string;\n /** Why it does not resolve, e.g. `environment variable ANTHROPIC_API_KEY is not set`. */\n reason: string;\n}\n\n/**\n * The enabled LLM/embed entries that name a credential this process cannot\n * resolve (the variable is unset, the command fails). A driver must not be\n * handed such an entry: the child would send an empty key and fail with a 401\n * instead of using its own login. Entries with no credential, an ambient\n * signing chain, or a value the session boundary already delivered under\n * {@link providerCredentialEnvName} are fine.\n */\nexport function unresolvedProviderCredentials(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialOptions = {},\n): UnresolvedProviderCredential[] {\n const out: UnresolvedProviderCredential[] = [];\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n if (options.providerId && id !== options.providerId) continue;\n const resolved = resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n });\n if (!resolved.error) continue;\n if (options.env?.[providerCredentialEnvName(id)]) continue;\n out.push({ providerId: id, reason: resolved.error });\n }\n return out;\n}\n\n/** Options for {@link entryCredentialEnv} / {@link registryCredentialEnv}. */\nexport interface RegistryCredentialEnvOptions extends RegistryCredentialOptions {\n /**\n * Also set the harness-conventional carrier\n * ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a\n * harness that reads every endpoint out of a rendered config file and must\n * not inherit a vendor default from a neighbouring entry.\n */\n aliases?: boolean;\n}\n\n/**\n * The credential variables one entry contributes: always\n * `SKAILE_AIP_<ID>_KEY`, plus the conventional carrier unless `aliases` is\n * `false`. Empty when the entry has no resolvable secret.\n */\nexport function entryCredentialEnv(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const value = resolveEntryCredential(entry, options);\n if (!value) return {};\n const out: Record<string, string> = { [providerCredentialEnvName(providerId)]: value };\n if (options.aliases !== false) {\n const alias = conventionalCredentialEnvName(entry);\n if (alias) out[alias] = value;\n }\n return out;\n}\n\n/**\n * Every enabled entry's credential, as a child-process environment fragment.\n *\n * One canonical `SKAILE_AIP_<ID>_KEY` per entry whose credential resolves; the\n * conventional carriers are added underneath, first entry in registry order\n * winning a collision (registry order is highest-precedence layer first, so\n * the alias follows the same precedence the selector does). Entries whose\n * credential cannot be resolved contribute nothing.\n */\nexport function registryCredentialEnv(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const canonical: Record<string, string> = {};\n const aliases: Record<string, string> = {};\n for (const [id, entry] of registryEntries(registry)) {\n if (options.providerId && id !== options.providerId) continue;\n if (!isEntryEnabled(entry)) continue;\n const value = resolveEntryCredential(entry, options);\n if (!value) continue;\n canonical[providerCredentialEnvName(id)] = value;\n if (options.aliases === false) continue;\n const alias = conventionalCredentialEnvName(entry);\n if (alias && aliases[alias] === undefined) aliases[alias] = value;\n }\n return { ...aliases, ...canonical };\n}\n","/**\n * What the runner may ask of a harness, by driver id.\n *\n * Deliberately light: this module imports no driver, no SDK and no `zod`, so a\n * runner file that only needs a capability can import it without loading the\n * driver graph. The plugin-registry singleton is read through its `internal`\n * module (the same file `@skaile/workspaces/plugin-registry` re-exports, so one\n * instance under the bundler's shared chunks), not through the package index,\n * which pulls in the deploy helpers and their `zod` schemas.\n *\n * @docLink packages/bridge/api-reference#registry\n */\n\nimport { pluginRegistry } from \"../../plugin-registry/src/internal.js\";\nimport type { DriverCapabilities } from \"@skaile/workspaces/types\";\n\n/**\n * Capabilities of a harness that declares none: it recomposes its tools per\n * turn like every bridge driver that is not an in-process SDK, and has no\n * managed session, credentials file or transcript-file resume.\n */\nconst GENERIC_DRIVER_CAPABILITIES: DriverCapabilities = {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n};\n\n/**\n * Declared capabilities of the built-in harnesses that differ from nothing.\n * `BUILTIN_DRIVER_CATALOG` rows point at these entries, so `listDrivers()` and\n * {@link driverCapabilities} read one table. A built-in absent here (echo,\n * gemini, qwen, opencode, goose, continue) takes the generic defaults.\n */\nexport const BUILTIN_DRIVER_CAPABILITIES = {\n // Recomposes its tools per turn, so a hot-plugged MCP server is live.\n omp: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n // The SDK takes in-process server instances and bakes its tool set at\n // creation; it reads Claude's `~/.claude` credentials and JSONL transcripts.\n \"claude-sdk\": {\n inProcessMcpServers: true,\n liveToolUpdates: false,\n managedSession: false,\n claudeCodeCredentials: true,\n resumeNeedsTranscript: true,\n },\n // Standalone SDK recomposes its tools per turn. A host-managed session\n // (native app-server) refreshes its own native tool snapshot instead.\n codex: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: true,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n} as const satisfies Record<string, DriverCapabilities>;\n\n/**\n * Resolve what the runner may ask of a harness, by driver id, without loading\n * its module. Built-ins read {@link BUILTIN_DRIVER_CAPABILITIES}; a third-party\n * driver reads its registered `DriverTarget`; an unknown or absent id gets the\n * generic defaults. Fields a driver omits take the generic default too.\n *\n * This is the one place the runner learns driver facts — it never compares an\n * id against `\"claude-sdk\"`, `\"codex\"` or `\"omp\"`.\n *\n * @param id - Driver id (e.g. a session's `driverType`); `undefined` resolves to the defaults.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function driverCapabilities(id: string | undefined): DriverCapabilities {\n const declared = id\n ? Object.hasOwn(BUILTIN_DRIVER_CAPABILITIES, id)\n ? BUILTIN_DRIVER_CAPABILITIES[id as keyof typeof BUILTIN_DRIVER_CAPABILITIES]\n : pluginRegistry.get(\"driver\", id)?.capabilities\n : undefined;\n return { ...GENERIC_DRIVER_CAPABILITIES, ...declared };\n}\n\n/**\n * Whether a hot-plugged MCP server reaches the agent's next turn without a\n * driver restart. A host-managed session refreshes its native tool snapshot\n * itself, so it never takes live updates, whatever the standalone driver does.\n *\n * @param id - Driver id of the live session.\n * @param managed - Whether the session is host-managed (`managedCodex`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport function supportsLiveToolUpdates(id: string | undefined, managed = false): boolean {\n const caps = driverCapabilities(id);\n return caps.liveToolUpdates && !(managed && caps.managedSession);\n}\n","import type {\n AIProviderRegistry,\n AIProviderSurface,\n MergedAIProviderRegistry,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { DriverContext } from \"@skaile/workspaces/plugin-registry\";\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport { BUILTIN_DRIVER_CAPABILITIES } from \"./driver-capabilities.js\";\nimport type { AgentConfig, AgentDriver, DriverInfo } from \"./types.js\";\n\n// Build-time harness gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded harness's driver module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every harness is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\n/**\n * Every wire surface omp can speak — it is the harness the `surface` enum was\n * lifted from, so its list is the enum.\n */\nconst OMP_SURFACES = [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"openai-codex-responses\",\n \"azure-openai-responses\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n] as const satisfies readonly AIProviderSurface[];\n\n/**\n * Static capability metadata for every built-in harness.\n *\n * Pure data — this object imports no driver module and references no harness\n * SDK. {@link listDrivers} returns it (merged with any third-party drivers)\n * so selection UIs can enumerate every harness without loading a single\n * driver module. The matching driver module's `DriverTarget` is registered\n * into the plugin registry by {@link registerBuiltinDrivers}.\n *\n * `surfaces` and `providerPlurality` are the driver-capability declaration\n * the AI provider registry resolves against (plan §2.3): which wire protocols\n * a harness can be pointed at, and how many registry entries it can use at\n * once. The platform's resolver filters candidate entries on `surfaces`\n * instead of matching vendor names.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const BUILTIN_DRIVER_CATALOG: Record<string, DriverInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n surfaces: OMP_SURFACES,\n // omp renders the whole registry as its own `models.yml`, so every entry\n // stays selectable and roles / per-subagent models resolve across them.\n providerPlurality: \"registry\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES.omp,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Anthropic's own API, plus the two clouds the SDK addresses natively.\n // Foundry is `anthropic-messages` at a different host, not a surface.\n surfaces: [\"anthropic-messages\", \"bedrock-converse-stream\", \"google-vertex\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES[\"claude-sdk\"],\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Codex's `wire_api` is `responses` or `chat`; its subscription transport\n // is the codex-specific responses flavour.\n surfaces: [\"openai-codex-responses\", \"openai-responses\", \"openai-completions\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_DRIVER_CAPABILITIES.codex,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Deterministic mock: it never opens a connection, so it speaks no wire\n // surface and no registry entry can be dispatched to it.\n surfaces: [],\n providerPlurality: \"single\",\n },\n gemini: {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n surfaces: [\"google-generative-ai\"],\n providerPlurality: \"single\",\n },\n qwen: {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Driven entirely through OPENAI_BASE_URL / OPENAI_API_KEY.\n surfaces: [\"openai-completions\"],\n providerPlurality: \"single\",\n },\n opencode: {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"google-generative-ai\",\n ],\n providerPlurality: \"credentials-n\",\n },\n goose: {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"bedrock-converse-stream\",\n ],\n providerPlurality: \"credentials-n\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\"anthropic-messages\", \"openai-completions\", \"google-generative-ai\"],\n providerPlurality: \"credentials-n\",\n },\n};\n\n/**\n * Back-compat alias for {@link BUILTIN_DRIVER_CATALOG}. Consumers and tests that\n * predate the plugin-registry refactor still import `DRIVER_CATALOG`.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const DRIVER_CATALOG = BUILTIN_DRIVER_CATALOG;\n\nlet _driversRegistered = false;\n\n/**\n * Register every built-in driver's `DriverTarget` into the plugin registry.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the driver module\n * (and, transitively, its SDK). The in-process-SDK harnesses (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded harness's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * **Static import discipline.** Every `import()` specifier below must be a\n * string literal — never aliased through a variable. Indirection defeats\n * `bun --compile`'s static analysis and silently drops the module from the\n * binary.\n *\n * Idempotent: guarded by a module flag so a second call is a no-op (a duplicate\n * `register` would otherwise throw `RegistrationError`).\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function registerBuiltinDrivers(\n registry: PluginRegistry = pluginRegistry,\n): Promise<void> {\n if (registry === pluginRegistry && _driversRegistered) return;\n\n if (!registry.get(\"driver\", \"omp\")) {\n const m = await import(\"@skaile/workspaces/drivers/omp\");\n registry.register(\"driver\", m.ompDriverTarget);\n }\n if (!registry.get(\"driver\", \"echo\")) {\n const m = await import(\"@skaile/workspaces/drivers/echo\");\n registry.register(\"driver\", m.echoDriverTarget);\n }\n if (INCLUDE_CLAUDE_SDK && !registry.get(\"driver\", \"claude-sdk\")) {\n const m = await import(\"@skaile/workspaces/drivers/claude-sdk\");\n registry.register(\"driver\", m.claudeSdkDriverTarget);\n }\n if (INCLUDE_CODEX && !registry.get(\"driver\", \"codex\")) {\n const m = await import(\"@skaile/workspaces/drivers/codex\");\n registry.register(\"driver\", m.codexDriverTarget);\n }\n // Subprocess CLI harnesses spawn an external binary the user installs\n // separately — no bundled SDK to dead-code-strip, so (like omp/echo) they\n // carry no build constant and are always registered.\n if (!registry.get(\"driver\", \"gemini\")) {\n const m = await import(\"@skaile/workspaces/drivers/gemini\");\n registry.register(\"driver\", m.geminiDriverTarget);\n }\n if (!registry.get(\"driver\", \"qwen\")) {\n const m = await import(\"@skaile/workspaces/drivers/qwen\");\n registry.register(\"driver\", m.qwenDriverTarget);\n }\n if (!registry.get(\"driver\", \"opencode\")) {\n const m = await import(\"@skaile/workspaces/drivers/opencode\");\n registry.register(\"driver\", m.opencodeDriverTarget);\n }\n if (!registry.get(\"driver\", \"goose\")) {\n const m = await import(\"@skaile/workspaces/drivers/goose\");\n registry.register(\"driver\", m.gooseDriverTarget);\n }\n if (!registry.get(\"driver\", \"continue\")) {\n const m = await import(\"@skaile/workspaces/drivers/continue\");\n registry.register(\"driver\", m.continueDriverTarget);\n }\n\n if (registry === pluginRegistry) _driversRegistered = true;\n}\n\n/**\n * Creates a new driver instance for the given harness id.\n *\n * Ensures the built-in driver targets are registered (idempotent), then looks\n * up the target in the plugin registry and calls its `create()`. The returned\n * driver has not been started yet — call `driver.start()` before sending\n * prompts.\n *\n * @param id - Registered driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the driver constructor.\n * @param ctx - Optional driver context (logger / abort signal). Defaults to `{}`.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered driver at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createDriver(\n id: string,\n config: AgentConfig,\n ctx?: DriverContext,\n): Promise<AgentDriver> {\n const target = await resolveDriverTarget(id);\n return target.create(config, ctx ?? {});\n}\n\n/**\n * Resolve a registered driver target by id, ensuring the built-ins are\n * registered first. Throws the canonical \"not bundled\" / \"unknown driver\"\n * errors so every caller (`createDriver`, `listModelsForDriver`) reports an\n * unrecognized id the same way instead of silently degrading.\n *\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered driver at all.\n */\nasync function resolveDriverTarget(id: string) {\n await registerBuiltinDrivers();\n const target = pluginRegistry.get(\"driver\", id);\n if (!target) {\n if (id in BUILTIN_DRIVER_CATALOG) {\n throw new Error(`Agent driver \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent driver: \"${id}\". Available: ${listDrivers()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return target;\n}\n\n/**\n * Returns the capability metadata for every available driver.\n *\n * Enumerates every built-in harness from {@link BUILTIN_DRIVER_CATALOG} without\n * loading a single driver module or harness SDK, then merges in any third-party\n * driver targets registered into the plugin registry that are not already in\n * the catalog. Use this to populate driver selection UIs.\n *\n * @returns Array of {@link DriverInfo} objects, one per available driver.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listDrivers(): DriverInfo[] {\n const merged = new Map<string, DriverInfo>();\n for (const info of Object.values(BUILTIN_DRIVER_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const meta of pluginRegistry.list(\"driver\")) {\n if (!merged.has(meta.id)) {\n // Third-party drivers carry no DriverInfo row; read the capability flags\n // off the registered target (defaulting to conservative false) so a\n // model-agnostic / in-band-abort harness can still advertise them.\n const target = pluginRegistry.get(\"driver\", meta.id);\n merged.set(meta.id, {\n id: meta.id,\n name: meta.displayName,\n modelAgnostic: target?.modelAgnostic ?? false,\n supportsInBandAbort: target?.supportsInBandAbort ?? false,\n // Left absent when the target declares nothing: \"speaks no surface\" and\n // \"did not say\" are different claims, and the platform resolver must be\n // able to tell them apart before it filters a driver out.\n ...(target?.surfaces ? { surfaces: target.surfaces } : {}),\n ...(target?.providerPlurality ? { providerPlurality: target.providerPlurality } : {}),\n ...(target?.capabilities ? { capabilities: target.capabilities } : {}),\n });\n }\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific driver without starting a full agent session.\n *\n * Ensures the built-in driver targets are registered (idempotent), then\n * delegates to the target's optional `listModels()`. Throws on an unknown /\n * not-bundled id (same contract as {@link createDriver}); returns `[]` only\n * when the target exists but exposes no `listModels`.\n *\n * @param driverId - Registered driver id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param registry - The AI provider registry to discover against — either the\n * bare `id → entry` map or a merged view. Each entry names its credential by\n * reference, resolved through `options` and delivered to the throwaway\n * driver as `SKAILE_AIP_<ID>_KEY` environment entries.\n * @param options - Which entry to restrict to, and where `env:` / `platform:`\n * references resolve from. Defaults to the whole registry against\n * `process.env`.\n * @throws {Error} When `driverId` is unknown or excluded from this build.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForDriver(\n driverId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options?: RegistryCredentialOptions,\n): Promise<ModelEntry[]> {\n const target = await resolveDriverTarget(driverId);\n return (await target.listModels?.(registry, options)) ?? [];\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { decodeBearerFromHeader, tokensEqual } from './chunk-32NA4TVC.js';
2
- import { createServer as createServer$1 } from 'http';
3
- import { createServer } from 'net';
2
+ import { listenWithProbe } from './chunk-T2TQAH2X.js';
3
+ import { createServer } from 'http';
4
4
  import { WebSocketServer } from 'ws';
5
5
 
6
6
  var DEFAULT_HEARTBEAT_MS = 3e4;
@@ -29,11 +29,7 @@ function validateSessionInitShape(cmd) {
29
29
  }
30
30
  return null;
31
31
  }
32
- function needsWildcardProbe(host, port, platform) {
33
- if (!host || port === 0 || platform !== "darwin") return false;
34
- return !["0.0.0.0", "::", "::0", "0:0:0:0:0:0:0:0"].includes(host);
35
- }
36
- var WebSocketServerTransport = class _WebSocketServerTransport {
32
+ var WebSocketServerTransport = class {
37
33
  httpServer = null;
38
34
  wss = null;
39
35
  activeClient = null;
@@ -56,23 +52,9 @@ var WebSocketServerTransport = class _WebSocketServerTransport {
56
52
  this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;
57
53
  this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;
58
54
  }
59
- /**
60
- * Whether another process holds `port` on every interface. A specific-address
61
- * bind coexists with a wildcard listener on some platforms (macOS), so the
62
- * bind alone would succeed while the other process keeps answering other
63
- * clients (p842). Only EADDRINUSE counts; any other probe error (no wildcard
64
- * address, no permission) leaves the decision to the real bind.
65
- */
66
- static holdsWildcard(port) {
67
- const { promise, resolve } = Promise.withResolvers();
68
- const probe = createServer();
69
- probe.once("error", (err) => resolve(err.code === "EADDRINUSE"));
70
- probe.listen(port, () => probe.close(() => resolve(false)));
71
- return promise;
72
- }
73
55
  /** Start the server and accept connections. */
74
56
  async listen() {
75
- const httpServer = createServer$1((_req, res) => {
57
+ const httpServer = createServer((_req, res) => {
76
58
  res.writeHead(200, { "content-type": "text/plain" });
77
59
  res.end("skaile agent server");
78
60
  });
@@ -96,17 +78,7 @@ var WebSocketServerTransport = class _WebSocketServerTransport {
96
78
  this.httpServer = httpServer;
97
79
  this.wss = wss;
98
80
  try {
99
- if (needsWildcardProbe(this.host, this.port, process.platform) && await _WebSocketServerTransport.holdsWildcard(this.port))
100
- throw Object.assign(new Error("wildcard probe"), { code: "EADDRINUSE" });
101
- await new Promise((resolve, reject) => {
102
- httpServer.once("error", reject);
103
- const onBound = () => {
104
- httpServer.off("error", reject);
105
- resolve();
106
- };
107
- if (this.host) httpServer.listen(this.port, this.host, onBound);
108
- else httpServer.listen(this.port, onBound);
109
- });
81
+ await listenWithProbe(httpServer, this.port, this.host);
110
82
  } catch (err) {
111
83
  wss.close();
112
84
  this.wss = null;
@@ -283,6 +255,6 @@ var WebSocketServerTransport = class _WebSocketServerTransport {
283
255
  }
284
256
  };
285
257
 
286
- export { WebSocketServerTransport, needsWildcardProbe };
287
- //# sourceMappingURL=chunk-L6UMSKDF.js.map
288
- //# sourceMappingURL=chunk-L6UMSKDF.js.map
258
+ export { WebSocketServerTransport };
259
+ //# sourceMappingURL=chunk-LW7ZI6EQ.js.map
260
+ //# sourceMappingURL=chunk-LW7ZI6EQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../transport/src/ws/server.ts"],"names":[],"mappings":"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","file":"chunk-LW7ZI6EQ.js","sourcesContent":["/**\n * WebSocketServerTransport — `ws`-based WebSocket server.\n *\n * Accepts one client at a time. Implements ServerTransport from @skaile/workspaces/types.\n * Built on the `ws` package + `node:http`, both of which run under Node and Bun.\n */\n\nimport { createServer, type Server as HttpServer } from \"node:http\";\nimport { listenWithProbe } from \"@skaile/workspaces/core\";\nimport type { AgentCommand, AgentEvent, ServerTransport } from \"@skaile/workspaces/types\";\nimport { type WebSocket, WebSocketServer } from \"ws\";\nimport { decodeBearerFromHeader, tokensEqual } from \"./auth.js\";\n\n/** Moved to `@skaile/workspaces/core` (`core/bind`); re-exported so this subpath keeps it. */\nexport { needsWildcardProbe } from \"@skaile/workspaces/core\";\n\n/**\n * Options for {@link WebSocketServerTransport}.\n *\n * @param port - TCP port to bind to; `0` picks a free port (read it back via `boundPort`).\n * @param onLog - Optional callback for internal log lines (client connect/disconnect events).\n * @param host - Address to bind. Default: every interface (Node's unspecified address).\n * `127.0.0.1` accepts local clients only.\n * @param authToken - When set, every upgrade must present this token via the\n * `skaile-bearer.<base64url>` subprotocol or the handshake is rejected with\n * HTTP 401. When unset, no auth is enforced (back-compatible default).\n * @param onListening - Called once the socket is bound, with the address a client\n * connects to (`url`) and whether it needs a token. For a plain-text ready line\n * (the `onLog` record carries the port only inside a log sentence).\n * @param heartbeatMs - Interval in milliseconds between pings to the active\n * client. Default: 30 000.\n * @param maxMissedPongs - Heartbeat ticks the client may go without a pong (or\n * any inbound frame) before its socket is terminated, so a client lost behind a\n * dead path (no FIN) fires `onDisconnect` instead of swallowing every event\n * sent to it. Default: 2, i.e. detection within 3 x `heartbeatMs`. `0` turns\n * the heartbeat off. Every WebSocket client answers pings on its own.\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport interface WebSocketServerOptions {\n port: number;\n host?: string;\n onLog?: (line: string) => void;\n authToken?: string;\n onListening?: (info: { url: string; port: number; tokenRequired: boolean }) => void;\n heartbeatMs?: number;\n maxMissedPongs?: number;\n}\n\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_MISSED_PONGS = 2;\n\n/**\n * Shape-validate a `session_init` frame at ingress before forwarding to the\n * runner. Protocol v3 requires the deterministic bootstrap envelope to carry\n * an identity tuple, a semver-shaped `protocolVersion`, a resolved config\n * object, and a `credentials` map keyed by `mounts` / `connectors`. Frames\n * that fail the guard are rejected on the wire so the runner never sees a\n * malformed boot envelope.\n *\n * Returns `null` when the frame is well-formed, or a human-readable reason\n * when it should be rejected.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"SessionInitCommand schema\".\n *\n * @internal\n */\nfunction validateSessionInitShape(cmd: Record<string, unknown>): string | null {\n if (cmd.type !== \"session_init\") return \"type must be 'session_init'\";\n\n const identity = cmd.identity as Record<string, unknown> | undefined;\n if (!identity || typeof identity !== \"object\" || Array.isArray(identity)) {\n return \"identity must be an object\";\n }\n if (typeof identity.containerId !== \"string\") return \"identity.containerId must be a string\";\n if (typeof identity.sessionId !== \"string\") return \"identity.sessionId must be a string\";\n if (typeof identity.projectId !== \"string\") return \"identity.projectId must be a string\";\n\n const protocolVersion = cmd.protocolVersion as Record<string, unknown> | undefined;\n if (!protocolVersion || typeof protocolVersion !== \"object\" || Array.isArray(protocolVersion)) {\n return \"protocolVersion must be an object\";\n }\n if (typeof protocolVersion.major !== \"number\") return \"protocolVersion.major must be a number\";\n if (typeof protocolVersion.minor !== \"number\") return \"protocolVersion.minor must be a number\";\n if (typeof protocolVersion.patch !== \"number\") return \"protocolVersion.patch must be a number\";\n\n if (\n !cmd.resolvedConfig ||\n typeof cmd.resolvedConfig !== \"object\" ||\n Array.isArray(cmd.resolvedConfig)\n ) {\n return \"resolvedConfig must be an object\";\n }\n\n if (!cmd.credentials || typeof cmd.credentials !== \"object\" || Array.isArray(cmd.credentials)) {\n return \"credentials must be an object\";\n }\n\n return null;\n}\n\n/**\n * `ServerTransport` implementation backed by the `ws` package on top of a\n * `node:http` server.\n *\n * Enforces a single-client policy: if a new connection arrives while a client is\n * already connected, the stale connection is closed with code 4001 and replaced.\n * Incoming frames are parsed as JSON `AgentCommand` messages and fanned out to\n * registered `onCommand` handlers; outgoing `AgentEvent` objects are JSON-serialised\n * before sending. Call `listen()` to start accepting connections and `close()` to\n * shut down cleanly — `close()` terminates the active socket immediately rather\n * than keeping the event loop alive.\n *\n * @example\n * ```ts\n * const server = new WebSocketServerTransport({ port: 8080 });\n * await server.listen();\n * server.onCommand((cmd) => console.log(cmd));\n * server.send({ type: 'agent_end' });\n * await server.close();\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport class WebSocketServerTransport implements ServerTransport {\n private httpServer: HttpServer | null = null;\n private wss: WebSocketServer | null = null;\n private activeClient: WebSocket | null = null;\n private readonly port: number;\n private readonly log: (line: string) => void;\n private readonly host?: string;\n private readonly authToken?: string;\n private readonly heartbeatMs: number;\n private readonly maxMissedPongs: number;\n\n private readonly onListening: WebSocketServerOptions[\"onListening\"];\n private readonly commandHandlers = new Set<(command: AgentCommand) => void>();\n private readonly connectHandlers = new Set<() => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketServerOptions) {\n this.port = options.port;\n this.log = options.onLog ?? console.log;\n this.host = options.host;\n this.authToken = options.authToken;\n this.onListening = options.onListening;\n this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;\n }\n\n /** Start the server and accept connections. */\n async listen(): Promise<void> {\n const httpServer = createServer((_req, res) => {\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"skaile agent server\");\n });\n // When an auth token is configured, reject the upgrade at handshake time\n // (HTTP 401) unless the client presents the matching bearer subprotocol.\n // Rejecting here — before `connection` — keeps unauthenticated sockets from\n // ever reaching the command handlers.\n const expected = this.authToken;\n const wss = new WebSocketServer({\n server: httpServer,\n verifyClient: expected\n ? (info, cb) => {\n const presented = decodeBearerFromHeader(info.req.headers[\"sec-websocket-protocol\"]);\n if (presented !== null && tokensEqual(presented, expected)) {\n cb(true);\n } else {\n this.log(\"[ws-server] rejecting unauthenticated upgrade\");\n cb(false, 401, \"Unauthorized\");\n }\n }\n : undefined,\n });\n wss.on(\"connection\", (ws) => this.handleConnection(ws));\n // `ws` re-emits the http server's errors on `wss`; unhandled during the bind,\n // that throws before the reject below runs and `listen()` hangs. Scoped to the\n // bind so a post-startup server error still surfaces loudly.\n const swallowBindError = () => {};\n wss.on(\"error\", swallowBindError);\n this.httpServer = httpServer;\n this.wss = wss;\n\n try {\n await listenWithProbe(httpServer, this.port, this.host);\n } catch (err) {\n wss.close();\n this.wss = null;\n this.httpServer = null;\n if (err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\") {\n const where = this.host ? `${this.host}:${this.port}` : `port ${this.port}`;\n throw Object.assign(\n new Error(\n `${where} is already in use: another process listens there. Pick another port.`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n throw err;\n } finally {\n wss.off(\"error\", swallowBindError);\n }\n\n const addr = httpServer.address();\n const boundPort = typeof addr === \"object\" && addr ? addr.port : this.port;\n const bind = this.host ?? \"all interfaces\";\n this.log(\n `[ws-server] listening on port ${boundPort} (${bind}; ${this.authToken ? \"token required\" : \"no authentication\"})`,\n );\n // A wildcard bind is reachable on loopback; that is the URL worth printing.\n const urlHost =\n !this.host || this.host === \"0.0.0.0\" || this.host === \"::\"\n ? \"127.0.0.1\"\n : this.host.includes(\":\") && !this.host.startsWith(\"[\")\n ? `[${this.host}]`\n : this.host;\n this.onListening?.({\n url: `ws://${urlHost}:${boundPort}`,\n port: boundPort,\n tokenRequired: this.authToken !== undefined,\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n if (this.activeClient) {\n // Close the stale connection instead of rejecting the new one.\n // This handles the race where waitForWsReady's probe hasn't\n // fully disconnected before the real gateway client connects.\n this.log(\"[ws-server] replacing previous connection\");\n try {\n this.activeClient.close(4001, \"Replaced by new connection\");\n } catch {\n // already closed\n }\n }\n this.log(\"[ws-server] client connected\");\n this.activeClient = ws;\n for (const handler of this.connectHandlers) {\n handler();\n }\n\n const stopHeartbeat = this.startHeartbeat(ws);\n\n ws.on(\"message\", (data) => {\n try {\n const parsed = JSON.parse(String(data)) as Record<string, unknown>;\n // Protocol v3: shape-validate `session_init` at ingress so the\n // runner never receives a malformed boot envelope. Other command\n // shapes pass through unchanged — invalid `AgentCommand`s surface\n // through the existing per-command handlers in serve.ts.\n if (parsed && typeof parsed === \"object\" && parsed.type === \"session_init\") {\n const reason = validateSessionInitShape(parsed);\n if (reason !== null) {\n this.log(`[ws-server] rejecting invalid session_init: ${reason}`);\n this.sendRaw({\n type: \"error\",\n message: `Invalid session_init: ${reason}`,\n fatal: false,\n });\n return;\n }\n }\n const cmd = parsed as unknown as AgentCommand;\n for (const handler of this.commandHandlers) {\n handler(cmd);\n }\n } catch (err) {\n this.sendRaw({\n type: \"error\",\n message: `Invalid message: ${err instanceof Error ? err.message : String(err)}`,\n fatal: false,\n });\n }\n });\n\n ws.on(\"close\", () => {\n stopHeartbeat();\n this.log(\"[ws-server] client disconnected\");\n if (this.activeClient === ws) {\n this.activeClient = null;\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n }\n });\n }\n\n /**\n * Ping `ws` every {@link heartbeatMs}; terminate it after\n * {@link maxMissedPongs} unanswered ticks. `terminate()` makes `ws` emit\n * `close`, which runs the normal disconnect path. Returns the stop function.\n */\n private startHeartbeat(ws: WebSocket): () => void {\n if (this.maxMissedPongs <= 0) return () => {};\n let missed = 0;\n const markAlive = () => {\n missed = 0;\n };\n ws.on(\"pong\", markAlive);\n ws.on(\"message\", markAlive);\n const timer = setInterval(() => {\n if (ws.readyState !== ws.OPEN) return;\n if (missed >= this.maxMissedPongs) {\n this.log(\n `[ws-server] no pong for ${missed} heartbeats of ${this.heartbeatMs}ms; terminating client`,\n );\n clearInterval(timer);\n ws.terminate();\n return;\n }\n missed++;\n try {\n ws.ping();\n } catch {\n // socket closing underneath us; the close event cleans up\n }\n }, this.heartbeatMs);\n timer.unref?.();\n return () => clearInterval(timer);\n }\n\n /**\n * Stop the server.\n *\n * Terminates the active socket immediately — otherwise a still-connected\n * client would keep the event loop alive and block process shutdown.\n */\n async close(): Promise<void> {\n try {\n this.activeClient?.terminate();\n } catch {\n // already closed\n }\n this.activeClient = null;\n this.wss?.close();\n this.wss = null;\n const httpServer = this.httpServer;\n this.httpServer = null;\n if (httpServer) {\n httpServer.closeAllConnections();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n }\n }\n\n send(event: AgentEvent): void {\n this.sendRaw(event);\n }\n\n onCommand(handler: (command: AgentCommand) => void): () => void {\n this.commandHandlers.add(handler);\n return () => {\n this.commandHandlers.delete(handler);\n };\n }\n\n onConnect(handler: () => void): () => void {\n this.connectHandlers.add(handler);\n return () => {\n this.connectHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.activeClient !== null;\n }\n\n /** The port actually bound by `listen()` (resolves `port: 0`); `undefined` when not listening. */\n get boundPort(): number | undefined {\n const addr = this.httpServer?.address();\n return typeof addr === \"object\" && addr ? addr.port : undefined;\n }\n\n private sendRaw(data: unknown): void {\n try {\n const client = this.activeClient;\n if (client && client.readyState === 1) {\n client.send(JSON.stringify(data));\n }\n } catch {\n // Silently ignore send failures\n }\n }\n}\n"]}