@skaile/workspaces 4.11.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{asset-feeds-3TOP4ZKE.js → asset-feeds-WSKIL5GA.js} +13 -13
  3. package/dist/{asset-feeds-3TOP4ZKE.js.map → asset-feeds-WSKIL5GA.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +9 -9
  5. package/dist/asset-manager/index.js +13 -13
  6. package/dist/asset-manager/installer.js +9 -9
  7. package/dist/bridge/drivers/claude-sdk.js +16 -14
  8. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  9. package/dist/bridge/drivers/codex.js +11 -11
  10. package/dist/bridge/drivers/continue.js +13 -12
  11. package/dist/bridge/drivers/continue.js.map +1 -1
  12. package/dist/bridge/drivers/echo.js +10 -8
  13. package/dist/bridge/drivers/echo.js.map +1 -1
  14. package/dist/bridge/drivers/gemini.js +9 -8
  15. package/dist/bridge/drivers/goose.js +12 -11
  16. package/dist/bridge/drivers/goose.js.map +1 -1
  17. package/dist/bridge/drivers/omp.js +7 -6
  18. package/dist/bridge/drivers/omp.js.map +1 -1
  19. package/dist/bridge/drivers/opencode.js +14 -12
  20. package/dist/bridge/drivers/opencode.js.map +1 -1
  21. package/dist/bridge/drivers/qwen.js +9 -8
  22. package/dist/bridge/drivers/qwen.js.map +1 -1
  23. package/dist/bridge/index.js +13 -13
  24. package/dist/bridge/src/cloud.d.ts.map +1 -1
  25. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  26. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  27. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
  28. package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts.map +1 -1
  29. package/dist/bridge/src/provider-materialize/env-drivers.d.ts +20 -5
  30. package/dist/bridge/src/provider-materialize/env-drivers.d.ts.map +1 -1
  31. package/dist/bridge/src/provider-materialize/opencode-config.d.ts.map +1 -1
  32. package/dist/bridge/src/types.d.ts +6 -2
  33. package/dist/bridge/src/types.d.ts.map +1 -1
  34. package/dist/{chunk-MKZOK4JU.js → chunk-2FBPAR2V.js} +3 -3
  35. package/dist/{chunk-MKZOK4JU.js.map → chunk-2FBPAR2V.js.map} +1 -1
  36. package/dist/{chunk-HO4UO25I.js → chunk-2J3PASYF.js} +3 -3
  37. package/dist/{chunk-HO4UO25I.js.map → chunk-2J3PASYF.js.map} +1 -1
  38. package/dist/{chunk-JECDED7B.js → chunk-3QCLMSXU.js} +5 -5
  39. package/dist/{chunk-JECDED7B.js.map → chunk-3QCLMSXU.js.map} +1 -1
  40. package/dist/{chunk-BXV6RLF4.js → chunk-4G6HFU27.js} +4 -4
  41. package/dist/{chunk-BXV6RLF4.js.map → chunk-4G6HFU27.js.map} +1 -1
  42. package/dist/{chunk-OUJVFZWJ.js → chunk-4SIMGJIU.js} +4 -9
  43. package/dist/chunk-4SIMGJIU.js.map +1 -0
  44. package/dist/{chunk-L3PZINDD.js → chunk-5UPJWC3M.js} +8 -8
  45. package/dist/{chunk-L3PZINDD.js.map → chunk-5UPJWC3M.js.map} +1 -1
  46. package/dist/{chunk-O3DHAGBO.js → chunk-626UIDZT.js} +6 -5
  47. package/dist/chunk-626UIDZT.js.map +1 -0
  48. package/dist/{chunk-2HUQUTJ3.js → chunk-6XIIGQXL.js} +4 -4
  49. package/dist/{chunk-2HUQUTJ3.js.map → chunk-6XIIGQXL.js.map} +1 -1
  50. package/dist/{chunk-A3X4LDOD.js → chunk-7EYRYGIM.js} +6 -6
  51. package/dist/{chunk-A3X4LDOD.js.map → chunk-7EYRYGIM.js.map} +1 -1
  52. package/dist/{chunk-7IRJ4K4F.js → chunk-7IH3RKKK.js} +3 -3
  53. package/dist/{chunk-7IRJ4K4F.js.map → chunk-7IH3RKKK.js.map} +1 -1
  54. package/dist/chunk-ALLCAFHQ.js +365 -0
  55. package/dist/chunk-ALLCAFHQ.js.map +1 -0
  56. package/dist/{chunk-W4IPN3DD.js → chunk-BOFL7GIF.js} +62 -10
  57. package/dist/chunk-BOFL7GIF.js.map +1 -0
  58. package/dist/{chunk-JM2LRJ46.js → chunk-BVYTXIN5.js} +3 -3
  59. package/dist/{chunk-JM2LRJ46.js.map → chunk-BVYTXIN5.js.map} +1 -1
  60. package/dist/{chunk-S2MT6SDZ.js → chunk-BYBIEHQX.js} +98 -39
  61. package/dist/chunk-BYBIEHQX.js.map +1 -0
  62. package/dist/{chunk-WXB6YEHZ.js → chunk-C7DPL3YA.js} +3 -3
  63. package/dist/{chunk-WXB6YEHZ.js.map → chunk-C7DPL3YA.js.map} +1 -1
  64. package/dist/{chunk-CJXSTOGW.js → chunk-C7R65ZTD.js} +4 -4
  65. package/dist/{chunk-CJXSTOGW.js.map → chunk-C7R65ZTD.js.map} +1 -1
  66. package/dist/{chunk-35PMOWAD.js → chunk-CPIAQTYM.js} +4 -4
  67. package/dist/chunk-CPIAQTYM.js.map +1 -0
  68. package/dist/{chunk-REYJKU7T.js → chunk-DHMBE5J7.js} +12 -364
  69. package/dist/chunk-DHMBE5J7.js.map +1 -0
  70. package/dist/chunk-DMJ4FUEO.js +141 -0
  71. package/dist/chunk-DMJ4FUEO.js.map +1 -0
  72. package/dist/{chunk-7ZJXFQ42.js → chunk-DPKRBLYC.js} +3 -3
  73. package/dist/{chunk-7ZJXFQ42.js.map → chunk-DPKRBLYC.js.map} +1 -1
  74. package/dist/{chunk-KSIRR5PL.js → chunk-DPLIN2RA.js} +3 -3
  75. package/dist/{chunk-KSIRR5PL.js.map → chunk-DPLIN2RA.js.map} +1 -1
  76. package/dist/{chunk-ILG4BXYE.js → chunk-GZZPKAV5.js} +27 -3
  77. package/dist/chunk-GZZPKAV5.js.map +1 -0
  78. package/dist/{chunk-M5H4DWIA.js → chunk-HGPSZXZP.js} +3 -3
  79. package/dist/{chunk-M5H4DWIA.js.map → chunk-HGPSZXZP.js.map} +1 -1
  80. package/dist/{chunk-MMLXSVQ3.js → chunk-IGI6M7MS.js} +5 -5
  81. package/dist/{chunk-MMLXSVQ3.js.map → chunk-IGI6M7MS.js.map} +1 -1
  82. package/dist/{chunk-VLXODO37.js → chunk-KECSNBET.js} +3 -3
  83. package/dist/{chunk-VLXODO37.js.map → chunk-KECSNBET.js.map} +1 -1
  84. package/dist/{chunk-3YTFHHMI.js → chunk-LHBWHIIT.js} +3 -3
  85. package/dist/{chunk-3YTFHHMI.js.map → chunk-LHBWHIIT.js.map} +1 -1
  86. package/dist/{chunk-IGGHUTOW.js → chunk-MH4GYGOW.js} +4 -4
  87. package/dist/{chunk-IGGHUTOW.js.map → chunk-MH4GYGOW.js.map} +1 -1
  88. package/dist/{chunk-WILO77HE.js → chunk-N4DHPRBS.js} +4 -4
  89. package/dist/{chunk-WILO77HE.js.map → chunk-N4DHPRBS.js.map} +1 -1
  90. package/dist/{chunk-SIGVAFRJ.js → chunk-N5O6Z7HV.js} +10 -10
  91. package/dist/{chunk-SIGVAFRJ.js.map → chunk-N5O6Z7HV.js.map} +1 -1
  92. package/dist/{chunk-FAI2SMFE.js → chunk-P2DLXBZK.js} +4 -4
  93. package/dist/{chunk-FAI2SMFE.js.map → chunk-P2DLXBZK.js.map} +1 -1
  94. package/dist/{chunk-GUZNTYHE.js → chunk-PCM75ICY.js} +4 -4
  95. package/dist/{chunk-GUZNTYHE.js.map → chunk-PCM75ICY.js.map} +1 -1
  96. package/dist/{chunk-7BUZQVRR.js → chunk-Q6NDQ6BH.js} +4 -4
  97. package/dist/{chunk-7BUZQVRR.js.map → chunk-Q6NDQ6BH.js.map} +1 -1
  98. package/dist/{chunk-PBCNRS7Q.js → chunk-QOCH3LO7.js} +6 -6
  99. package/dist/{chunk-PBCNRS7Q.js.map → chunk-QOCH3LO7.js.map} +1 -1
  100. package/dist/{chunk-GXACG5ZE.js → chunk-QUSE2T4N.js} +50 -41
  101. package/dist/chunk-QUSE2T4N.js.map +1 -0
  102. package/dist/{chunk-AT2TJEWG.js → chunk-RE2XE2AP.js} +11 -11
  103. package/dist/chunk-RE2XE2AP.js.map +1 -0
  104. package/dist/{chunk-DMUY5C3X.js → chunk-RJNBMEFG.js} +7 -7
  105. package/dist/{chunk-DMUY5C3X.js.map → chunk-RJNBMEFG.js.map} +1 -1
  106. package/dist/{chunk-2D5BYAL6.js → chunk-RQLL7L72.js} +3 -3
  107. package/dist/{chunk-2D5BYAL6.js.map → chunk-RQLL7L72.js.map} +1 -1
  108. package/dist/{chunk-3T5DRUNZ.js → chunk-RQRWMKST.js} +5 -5
  109. package/dist/{chunk-3T5DRUNZ.js.map → chunk-RQRWMKST.js.map} +1 -1
  110. package/dist/{chunk-3HKYCT2M.js → chunk-RUBPZLMO.js} +3 -3
  111. package/dist/{chunk-3HKYCT2M.js.map → chunk-RUBPZLMO.js.map} +1 -1
  112. package/dist/{chunk-3XXQPHGL.js → chunk-T3YUSWVK.js} +4 -4
  113. package/dist/{chunk-3XXQPHGL.js.map → chunk-T3YUSWVK.js.map} +1 -1
  114. package/dist/{chunk-6XKQEDF7.js → chunk-TMOS6KL5.js} +6 -5
  115. package/dist/chunk-TMOS6KL5.js.map +1 -0
  116. package/dist/{chunk-7SNYWCQS.js → chunk-TVQPJZSO.js} +3 -3
  117. package/dist/{chunk-7SNYWCQS.js.map → chunk-TVQPJZSO.js.map} +1 -1
  118. package/dist/{chunk-IECQMSQ5.js → chunk-UE4AKJNQ.js} +4 -129
  119. package/dist/chunk-UE4AKJNQ.js.map +1 -0
  120. package/dist/{chunk-ELPR5XBG.js → chunk-V4RGCKYC.js} +5 -3
  121. package/dist/chunk-V4RGCKYC.js.map +1 -0
  122. package/dist/{chunk-UKJMQZV6.js → chunk-VOEBLPXO.js} +2 -2
  123. package/dist/chunk-VOEBLPXO.js.map +1 -0
  124. package/dist/{chunk-KJM7Y2FW.js → chunk-WNDDWWGU.js} +7 -7
  125. package/dist/{chunk-KJM7Y2FW.js.map → chunk-WNDDWWGU.js.map} +1 -1
  126. package/dist/{chunk-KLMXMW6Z.js → chunk-XPDB4O4H.js} +3 -3
  127. package/dist/{chunk-KLMXMW6Z.js.map → chunk-XPDB4O4H.js.map} +1 -1
  128. package/dist/{chunk-I3UWSGEB.js → chunk-ZK7DQRB2.js} +3 -3
  129. package/dist/{chunk-I3UWSGEB.js.map → chunk-ZK7DQRB2.js.map} +1 -1
  130. package/dist/{chunk-UXUDNBJM.js → chunk-ZSB2SPV4.js} +3 -3
  131. package/dist/{chunk-UXUDNBJM.js.map → chunk-ZSB2SPV4.js.map} +1 -1
  132. package/dist/cli/index.js +69 -68
  133. package/dist/cli/index.js.map +1 -1
  134. package/dist/connectors/config.js +4 -13
  135. package/dist/connectors/index.js +21 -20
  136. package/dist/connectors/src/config.d.ts.map +1 -1
  137. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  138. package/dist/connectors/src/materialized-connectors.d.ts.map +1 -1
  139. package/dist/connectors/src/secrets.d.ts.map +1 -1
  140. package/dist/core/index.js +8 -8
  141. package/dist/core/logging.js +2 -2
  142. package/dist/core/manifest.js +2 -2
  143. package/dist/core/provider-registry-credentials.js +2 -2
  144. package/dist/core/provider-registry.js +1 -1
  145. package/dist/core/runtime-assets.js +4 -4
  146. package/dist/core/src/index.d.ts +1 -1
  147. package/dist/core/src/index.d.ts.map +1 -1
  148. package/dist/core/src/logging/create-logger.d.ts.map +1 -1
  149. package/dist/core/src/logging/index.d.ts +1 -0
  150. package/dist/core/src/logging/index.d.ts.map +1 -1
  151. package/dist/core/src/logging/redact.d.ts +33 -0
  152. package/dist/core/src/logging/redact.d.ts.map +1 -0
  153. package/dist/core/src/logging/sanitize.d.ts +11 -0
  154. package/dist/core/src/logging/sanitize.d.ts.map +1 -1
  155. package/dist/core/src/provider-registry.d.ts +22 -0
  156. package/dist/core/src/provider-registry.d.ts.map +1 -1
  157. package/dist/core/workspace-config.js +3 -3
  158. package/dist/deploy/index.js +8 -8
  159. package/dist/discovery/index.js +3 -3
  160. package/dist/{ensure-sources-2OC2X3ZM.js → ensure-sources-ZZRU74UG.js} +16 -16
  161. package/dist/{ensure-sources-2OC2X3ZM.js.map → ensure-sources-ZZRU74UG.js.map} +1 -1
  162. package/dist/factory-assets/connectors/box.js +21 -20
  163. package/dist/factory-assets/connectors/deploy.js +21 -20
  164. package/dist/factory-assets/connectors/devserver.js +21 -20
  165. package/dist/factory-assets/connectors/flow/CONNECTOR.md +4 -2
  166. package/dist/factory-assets/connectors/flow/adapter.js +21 -20
  167. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +12 -0
  168. package/dist/factory-assets/connectors/flow/contract/schema.d.ts.map +1 -1
  169. package/dist/factory-assets/connectors/flow/contract.js +4 -3
  170. package/dist/factory-assets/connectors/flow/engine/node-shape.d.ts.map +1 -1
  171. package/dist/factory-assets/connectors/flow/engine.js +12 -11
  172. package/dist/factory-assets/connectors/flow/prompt-fragments.js +3 -2
  173. package/dist/factory-assets/connectors/flow/run-flow.js +23 -22
  174. package/dist/factory-assets/connectors/flow.js +21 -20
  175. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  176. package/dist/factory-assets/connectors/git.js +21 -20
  177. package/dist/factory-assets/connectors/gmail.js +21 -20
  178. package/dist/factory-assets/connectors/googledrive.js +21 -20
  179. package/dist/factory-assets/connectors/local.js +21 -20
  180. package/dist/factory-assets/connectors/mattermost.js +21 -20
  181. package/dist/factory-assets/connectors/memory.js +21 -20
  182. package/dist/factory-assets/connectors/minio.js +21 -20
  183. package/dist/factory-assets/connectors/postgres.js +21 -20
  184. package/dist/factory-assets/connectors/s3.js +21 -20
  185. package/dist/factory-assets/connectors/sharepoint.js +21 -20
  186. package/dist/factory-assets/connectors/sqlite.js +21 -20
  187. package/dist/factory-assets/connectors/static-server.js +21 -20
  188. package/dist/factory-assets/connectors/tunnel.js +21 -20
  189. package/dist/factory-assets/connectors/webdav.js +21 -20
  190. package/dist/factory-assets/connectors/xstate-store.js +21 -20
  191. package/dist/factory-assets/connectors/xstate.js +21 -20
  192. package/dist/flows-XHRUNYJV.js +23 -0
  193. package/dist/{flows-H6FL4NZU.js.map → flows-XHRUNYJV.js.map} +1 -1
  194. package/dist/{helpers-RPJUSSG3.js → helpers-M76C6JVC.js} +16 -16
  195. package/dist/{helpers-RPJUSSG3.js.map → helpers-M76C6JVC.js.map} +1 -1
  196. package/dist/library/index.js +11 -11
  197. package/dist/library/install.js +1 -15
  198. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  199. package/dist/{library-publish-AAD6GTIF.js → library-publish-EQYEJXWO.js} +23 -22
  200. package/dist/library-publish-EQYEJXWO.js.map +1 -0
  201. package/dist/open-library-YTP7CVVT.js +36 -0
  202. package/dist/{open-library-HDOM4MLS.js.map → open-library-YTP7CVVT.js.map} +1 -1
  203. package/dist/paths-BG3I2LPM.js +19 -0
  204. package/dist/{paths-RL6NZW5X.js.map → paths-BG3I2LPM.js.map} +1 -1
  205. package/dist/{plugin-store-ZTAJCMTY.js → plugin-store-BCNR6ZBP.js} +10 -10
  206. package/dist/{plugin-store-ZTAJCMTY.js.map → plugin-store-BCNR6ZBP.js.map} +1 -1
  207. package/dist/{project-2B52FKAY.js → project-THCZLS67.js} +17 -17
  208. package/dist/{project-2B52FKAY.js.map → project-THCZLS67.js.map} +1 -1
  209. package/dist/resolver/index.js +9 -9
  210. package/dist/runner/index.js +32 -31
  211. package/dist/runner/src/capability-registry.d.ts +13 -1
  212. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  213. package/dist/runner/src/lifecycle-handler.d.ts.map +1 -1
  214. package/dist/runner/src/log-content.d.ts +22 -0
  215. package/dist/runner/src/log-content.d.ts.map +1 -0
  216. package/dist/runner/src/serve.d.ts.map +1 -1
  217. package/dist/runner/src/session-builder.d.ts.map +1 -1
  218. package/dist/sdk/asset-manager.js +13 -13
  219. package/dist/sdk/bridge.js +13 -13
  220. package/dist/sdk/core.js +8 -8
  221. package/dist/sdk/flow.js +12 -11
  222. package/dist/sdk/index.js +32 -31
  223. package/dist/sdk/index.js.map +1 -1
  224. package/dist/sdk/resolver.js +9 -9
  225. package/dist/sdk/runner.js +32 -31
  226. package/dist/{setup-MVBITSVT.js → setup-QN4HKSFJ.js} +22 -22
  227. package/dist/{setup-MVBITSVT.js.map → setup-QN4HKSFJ.js.map} +1 -1
  228. package/dist/skills-FKVBIDNM.js +23 -0
  229. package/dist/{skills-Y6MU2NRI.js.map → skills-FKVBIDNM.js.map} +1 -1
  230. package/dist/source-5EAGZA6K.js +37 -0
  231. package/dist/{source-53PY7DXF.js.map → source-5EAGZA6K.js.map} +1 -1
  232. package/dist/{source-manifest-publish-ALRZKEBO.js → source-manifest-publish-57SGT7Q3.js} +24 -23
  233. package/dist/source-manifest-publish-57SGT7Q3.js.map +1 -0
  234. package/dist/tui/index.js +32 -31
  235. package/dist/tui/index.js.map +1 -1
  236. package/dist/types/src/manifests/preset.d.ts +5 -5
  237. package/dist/workspace-plugin/adapters/mcp.js +14 -14
  238. package/dist/workspace-plugin/adapters/omp.js +7 -7
  239. package/dist/workspace-plugin/index.js +3 -3
  240. package/package.json +2 -1
  241. package/dist/chunk-35PMOWAD.js.map +0 -1
  242. package/dist/chunk-6XKQEDF7.js.map +0 -1
  243. package/dist/chunk-AT2TJEWG.js.map +0 -1
  244. package/dist/chunk-ELPR5XBG.js.map +0 -1
  245. package/dist/chunk-GXACG5ZE.js.map +0 -1
  246. package/dist/chunk-IECQMSQ5.js.map +0 -1
  247. package/dist/chunk-ILG4BXYE.js.map +0 -1
  248. package/dist/chunk-O3DHAGBO.js.map +0 -1
  249. package/dist/chunk-OUJVFZWJ.js.map +0 -1
  250. package/dist/chunk-REYJKU7T.js.map +0 -1
  251. package/dist/chunk-S2MT6SDZ.js.map +0 -1
  252. package/dist/chunk-UKJMQZV6.js.map +0 -1
  253. package/dist/chunk-W4IPN3DD.js.map +0 -1
  254. package/dist/flows-H6FL4NZU.js +0 -23
  255. package/dist/library-publish-AAD6GTIF.js.map +0 -1
  256. package/dist/open-library-HDOM4MLS.js +0 -35
  257. package/dist/paths-RL6NZW5X.js +0 -19
  258. package/dist/skills-Y6MU2NRI.js +0 -23
  259. package/dist/source-53PY7DXF.js +0 -36
  260. package/dist/source-manifest-publish-ALRZKEBO.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/provider-materialize/env-drivers.ts","../bridge/src/drivers/_subprocess-cli.ts"],"names":[],"mappings":"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","file":"chunk-IECQMSQ5.js","sourcesContent":["/**\n * Registry adapter for the **env-shaped CLI drivers** — Gemini, Qwen, OpenCode,\n * Goose and Continue (§2.3).\n *\n * These backends take their endpoint from the environment rather than from a\n * config file, so the adapter's job is three things: resolve which registry\n * entry the session's model selector names, refuse at start when that entry\n * speaks a wire surface the backend cannot, and hand the driver the\n * provider-side model id it must put on the command line.\n *\n * Two pluralities meet here (`BUILTIN_DRIVER_CATALOG.providerPlurality`):\n *\n * - `single` — Gemini and Qwen address exactly one endpoint. The bound entry\n * supplies the credential *and* the base URL, and a surface mismatch is\n * fatal: a Gemini CLI pointed at an `openai-completions` endpoint cannot\n * work, and failing at start names the surface instead of leaving the user\n * with an opaque error mid-turn.\n * - `credentials-n` — OpenCode, Goose and Continue accept every enabled\n * entry's credential at once and select one active model. The credential\n * fan-out is `registryCredentialEnv`; the active model is this module's\n * `<provider>/<model>` binding.\n *\n * Writing the per-endpoint config files those three need for *custom*\n * endpoints (`opencode.json`, Goose `custom_providers/*.json`, Continue\n * `config.yaml`) is the file half, and is deliberately not here.\n *\n * @see PROVIDER-CONFIG-PLAN.md §2.3\n */\n\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n mergeRegistries,\n parseModelRef,\n registryEntries,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig } from \"../types.js\";\nimport { providerCredentialEnvName, registryCredentialEnv } from \"./credential-env.js\";\n\n/**\n * Everything a CLI driver needs to know about this session's AI providers,\n * resolved once from its {@link AgentConfig}.\n */\nexport interface EnvDriverSession {\n /** The merged registry this session may address. Empty when none was configured. */\n registry: MergedAIProviderRegistry;\n /**\n * Environment `credential.ref` lookups resolve against — the process\n * environment widened with `config.env`, which is where the session\n * boundary delivered every resolved `SKAILE_AIP_<ID>_KEY`.\n */\n lookupEnv: Record<string, string | undefined>;\n /** Model selector: `<providerId>/<modelId>`, a bare id, or `@role`. */\n modelRef?: string;\n /** Roles table an `@role` selector resolves through. */\n roles?: Record<string, string>;\n}\n\n/**\n * Resolve the session's providers once, from its {@link AgentConfig}.\n *\n * `config.env` is folded into `lookupEnv` rather than kept apart: it is part\n * of the session's environment, not an extra, and a credential or\n * `*_BASE_URL` delivered there must be visible exactly as the child will see\n * it.\n */\nexport function resolveEnvDriverSession(\n config: AgentConfig,\n processEnv: Record<string, string | undefined> = process.env,\n): EnvDriverSession {\n return {\n registry: config.registry ?? mergeRegistries([]),\n lookupEnv: { ...processEnv, ...config.env },\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n ...(config.roles ? { roles: config.roles } : {}),\n };\n}\n\n/** One resolved endpoint + model — everything a driver needs to spawn. */\nexport interface RegistryModelBinding {\n /** Registry id of the selected entry. */\n providerId: string;\n /** The selected entry itself. */\n entry: AIProviderLlmEntry;\n /** Logical model id, after `@role` expansion and before `model_map`. */\n modelId?: string;\n /** Provider-side model id — what goes on the wire / command line. */\n providerModelId?: string;\n /** Wire protocol, from the entry or its preset. */\n surface?: AIProviderSurface;\n /** Resolved endpoint, from the entry, its transport params, or its preset. */\n baseUrl?: string;\n /**\n * The provider name the *backend* knows this endpoint by — a catalog preset\n * id for a stock endpoint, the registry id for anything custom. See\n * {@link backendProviderName}.\n */\n backendProviderId: string;\n /** Non-fatal notes from `parseModelRef` (dangling role, disabled provider). */\n warnings: string[];\n}\n\n/** The entry's wire surface: its own, else its preset's. */\nexport function entrySurface(entry: AIProviderLlmEntry): AIProviderSurface | undefined {\n if (entry.surface) return entry.surface;\n return entry.preset ? getProviderPreset(entry.preset)?.surface : undefined;\n}\n\n/**\n * The entry's endpoint: its literal or transport-derived URL, else its\n * preset's literal. Transport templates that still carry `{param}`\n * placeholders never come back — `resolveEntryBaseUrl` withholds those, and a\n * preset's template is not a URL.\n */\nexport function entryBaseUrl(entry: AIProviderLlmEntry): string | undefined {\n const resolved = resolveEntryBaseUrl(entry);\n if (resolved) return resolved;\n return entry.preset ? getProviderPreset(entry.preset)?.base_url : undefined;\n}\n\n/**\n * True when a `credentials-n` backend already knows this endpoint under its\n * own catalog name — the entry names a preset and did not move it somewhere\n * else.\n *\n * The one rule both halves of §2.3 read: it decides the name the env half\n * puts on the command line ({@link backendProviderName}) *and* whether the\n * file half has to describe the endpoint at all. Reading it twice is what\n * keeps `-m <name>/<model>` and the generated provider file talking about the\n * same thing.\n */\nexport function isStockCatalogEndpoint(entry: AIProviderLlmEntry): boolean {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n return preset !== undefined && entryBaseUrl(entry) === preset.base_url;\n}\n\n/**\n * The provider name to give a `credentials-n` backend (`-m <name>/<model>`,\n * `GOOSE_PROVIDER`).\n *\n * A stock catalog endpoint is named by its preset, because that is the name\n * OpenCode's models.dev list and Goose's built-in provider table already use —\n * `prod-claude: {preset: anthropic}` is still Anthropic to them. An entry with\n * an endpoint of its own is named by its registry id: no built-in table knows\n * it, so the id is what its generated provider file is keyed by (the file half\n * of §2.3).\n */\nexport function backendProviderName(providerId: string, entry: AIProviderLlmEntry): string {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n if (!preset || !isStockCatalogEndpoint(entry)) return providerId;\n return preset.id;\n}\n\n/**\n * Enabled `llm`/`embed` entries, in registry order. Also the set the file\n * adapters render (`opencode-config.ts`, `goose-custom-providers.ts`,\n * `continue-config-yaml.ts`): the env half and the file half must agree on\n * which entries exist before they can agree on what to call them.\n */\nexport function selectableEntries(\n registry: MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\n/**\n * The provider-side model ids an entry declares, as `[logicalId, providerId]`\n * pairs in declaration order: every `model_map` entry, plus every\n * `capabilities` key the map does not rename.\n */\nexport function entryModelIds(entry: AIProviderLlmEntry): Array<[string, string]> {\n const logicalIds = [\n ...Object.keys(entry.model_map ?? {}),\n ...Object.keys(entry.capabilities ?? {}).filter((id) => !(id in (entry.model_map ?? {}))),\n ];\n return logicalIds.map((id) => [id, entry.model_map?.[id] ?? id]);\n}\n\nfunction describeBinding(\n providerId: string,\n entry: AIProviderLlmEntry,\n modelId: string | undefined,\n providerModelId: string | undefined,\n warnings: string[],\n): RegistryModelBinding {\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n return {\n providerId,\n entry,\n ...(modelId === undefined ? {} : { modelId }),\n ...(providerModelId === undefined ? {} : { providerModelId }),\n ...(surface ? { surface } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n backendProviderId: backendProviderName(providerId, entry),\n warnings,\n };\n}\n\n/**\n * Resolve the session's endpoint + model.\n *\n * With no selector the first entry in registry order wins and the backend\n * keeps its own default model — exactly what an absent `model` meant before\n * the registry existed. Returns `undefined` when no entry can serve a model\n * (an empty, fully-disabled or voice-only registry).\n */\nexport function resolveRegistryBinding(\n session: EnvDriverSession,\n): RegistryModelBinding | undefined {\n const entries = selectableEntries(session.registry);\n if (entries.length === 0) return undefined;\n\n const selector = session.modelRef?.trim();\n if (!selector) {\n const [providerId, entry] = entries[0];\n return describeBinding(providerId, entry, undefined, undefined, []);\n }\n\n // A selector that is exactly an entry id names the endpoint and nothing\n // else: the backend keeps its own default model. `parseModelRef` would read\n // it as a bare *model* id and fall back to registry order.\n const named = entries.find(([id]) => id === selector);\n if (named) return describeBinding(named[0], named[1], undefined, undefined, []);\n\n const resolved = parseModelRef(selector, session.registry, session.roles);\n if (!resolved) return undefined;\n const match = entries.find(([id]) => id === resolved.providerId);\n if (!match) return undefined;\n return describeBinding(\n match[0],\n match[1],\n resolved.modelId,\n resolved.providerModelId,\n resolved.warnings,\n );\n}\n\n/**\n * Every credential a `credentials-n` backend may use: one variable per\n * enabled registry entry. OpenCode, Goose and Continue have always received\n * *all* of them, not just the selected endpoint's, because they route across\n * providers inside a single session.\n */\nexport function credentialsForEveryProvider(session: EnvDriverSession): Record<string, string> {\n return registryCredentialEnv(session.registry, { env: session.lookupEnv });\n}\n\n/**\n * Throw when the bound entry speaks a wire surface this driver cannot.\n *\n * The message names the offending surface and lists the ones the backend does\n * speak (`BUILTIN_DRIVER_CATALOG[driverId].surfaces`). An entry that declares\n * no surface and names no preset is not judged — there is nothing to compare.\n */\nexport function assertDriverSpeaksSurface(\n driverId: string,\n productName: string,\n binding: RegistryModelBinding,\n): void {\n const supported = BUILTIN_DRIVER_CATALOG[driverId]?.surfaces;\n if (!supported || supported.length === 0) return;\n const surface = binding.surface;\n if (!surface || supported.includes(surface)) return;\n throw new Error(\n `${productName} cannot speak the '${surface}' surface of AI provider entry ` +\n `'${binding.providerId}'. ${productName} speaks: ${supported.join(\", \")}. ` +\n `Point this session's model at an entry with one of those surfaces, ` +\n `or run it on a driver that speaks '${surface}'.`,\n );\n}\n\n/**\n * The models a `credentials-n` backend can be pointed at, straight from the\n * registry: every enabled entry's mapped ids, namespaced the way the backend\n * takes them (`-m <provider>/<model>`).\n *\n * These backends have no model-list endpoint of their own — OpenCode reads\n * models.dev, Goose and Continue read their config — so the registry is the\n * only list that describes *this* session's reachable models, and it needs no\n * network call to produce.\n */\nexport function registryModelEntries(session: EnvDriverSession): ModelEntry[] {\n const out: ModelEntry[] = [];\n const seen = new Set<string>();\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n const backendId = backendProviderName(providerId, entry);\n const label = entry.label ?? providerId;\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n const id = `${backendId}/${providerModelId}`;\n if (seen.has(id)) continue;\n seen.add(id);\n out.push({ id, name: `${label} ${logicalId}` });\n }\n }\n return out;\n}\n\n/**\n * Resolve the binding and enforce the surface — what a `single`-plurality\n * driver does at start.\n *\n * The registry is authoritative: pointing the driver at an entry it cannot\n * speak throws rather than silently running somewhere else. `undefined` when\n * the session configured no endpoint at all, which leaves the driver on its\n * own native auth.\n */\nexport function bindSingleProviderEntry(\n driverId: string,\n productName: string,\n session: EnvDriverSession,\n): RegistryModelBinding | undefined {\n const binding = resolveRegistryBinding(session);\n if (!binding) return undefined;\n assertDriverSpeaksSurface(driverId, productName, binding);\n return binding;\n}\n\n/**\n * The `<provider>/<model>` selector a `credentials-n` backend takes on its\n * command line (`opencode -m`). `undefined` when no model was selected — the\n * backend then uses its own default rather than being handed a bare provider.\n */\nexport function backendModelSelector(binding: RegistryModelBinding): string | undefined {\n if (!binding.providerModelId) return undefined;\n return `${binding.backendProviderId}/${binding.providerModelId}`;\n}\n\n/**\n * Continue's model selection is a **role binding**, not a flag: `cn` has no\n * `--model` option (only `--config <slug>`), and its `config.yaml` binds each\n * model to roles (`chat`, `edit`, `apply`, …). This is the binding for the\n * role a headless `cn -p` turn runs as, and the shape its generated\n * `config.yaml` is rendered from.\n *\n * `apiKeyEnv` is a variable *name*: the secret travels in the child\n * environment, never in a rendered config.\n */\nexport interface ContinueRoleBinding {\n /** Continue role this model serves. A headless prompt is a `chat` turn. */\n role: \"chat\";\n /** Registry id of the entry. */\n providerId: string;\n /** Provider name Continue knows the endpoint by. */\n provider: string;\n /** Provider-side model id. */\n model?: string;\n /** Endpoint, when the entry states one. */\n apiBase?: string;\n /** Env var holding the credential — the name, never the value. */\n apiKeyEnv: string;\n}\n\n/**\n * Map the session's chosen endpoint onto the Continue role a headless turn\n * runs as. `undefined` when the session configured no endpoint — `cn` then\n * runs against whatever its own `config.yaml` / Hub login provides.\n */\nexport function continueRoleBinding(session: EnvDriverSession): ContinueRoleBinding | undefined {\n const binding = resolveRegistryBinding(session);\n if (!binding) return undefined;\n return {\n role: \"chat\",\n providerId: binding.providerId,\n provider: binding.backendProviderId,\n ...(binding.providerModelId ? { model: binding.providerModelId } : {}),\n ...(binding.baseUrl ? { apiBase: binding.baseUrl } : {}),\n apiKeyEnv: providerCredentialEnvName(binding.providerId),\n };\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n} from \"../types.js\";\n\n/**\n * Shared base for one-shot **subprocess CLI** agent backends (Gemini, Qwen,\n * OpenCode, Goose, Continue).\n *\n * These backends are neither persistent JSON-RPC subprocesses (`omp`) nor\n * in-process SDKs (`claude-sdk`, `codex`). In headless mode each is invoked\n * **once per turn** — `prompt()` spawns the CLI fresh, a `readline` loop maps\n * newline-delimited JSON on stdout to the unified {@link AgentEvent} stream, and\n * **process exit marks the end of the turn**. Multi-turn continuity comes from\n * capturing a backend session id (emitted as `session_info`) and replaying it\n * via a resume flag on the next spawn.\n *\n * Subclasses implement {@link buildArgs}, {@link buildEnv}, and either\n * {@link handleJson} (streaming JSONL, the default) or {@link handleBuffered}\n * (`mode = \"buffered\"`, for CLIs that print a single JSON blob at the end).\n *\n * **Terminal-sequence invariant.** Subclasses MUST NOT emit `agent_end`. The\n * base emits exactly one `result` (synthesizing a success result when the\n * stream produced none) followed by a single `agent_end` on clean exit, or an\n * `error` + `agent_end` on crash. This keeps the turn-completion contract\n * (`prompt()` resolves after `agent_end`) identical across every CLI driver.\n *\n * @docLink packages/bridge/drivers#subprocess-cli\n */\nexport abstract class SubprocessCliDriver extends AgentDriver {\n /** Per-driver logger, constructed once by the subclass. */\n protected abstract readonly log: Logger;\n /** Default binary name spawned in production (e.g. `\"gemini\"`). */\n protected abstract readonly defaultBin: string;\n /** Human product name used in error messages / hints (e.g. `\"Gemini CLI\"`). */\n protected abstract readonly productName: string;\n /**\n * Test-seam env prefix. `<PREFIX>_BRIDGE_BIN` overrides the spawn binary and\n * `<PREFIX>_BRIDGE_PREARGS` (space-delimited) supplies leading argv — used by\n * the fake-CLI harness to redirect spawn without monkey-patching\n * `child_process`. Both are ignored in production.\n */\n protected abstract readonly envPrefix: string;\n /** `\"jsonl\"` streams events line-by-line; `\"buffered\"` parses all stdout once on exit. */\n protected readonly mode: \"jsonl\" | \"buffered\" = \"jsonl\";\n\n protected config: AgentConfig;\n\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private stderrBuffer: string[] = [];\n private stdoutBuffer = \"\";\n private started = false;\n\n // ── Per-turn state ──────────────────────────────────────────────────────\n private prevText = \"\";\n private activeAssistant = false;\n private pendingToolResults: AgentMessage[] = [];\n private sawResult = false;\n private aborting = false;\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n\n protected _sessionId?: string;\n protected _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._sessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n if (patch.model !== undefined) this.config.model = patch.model;\n if (patch.thinking !== undefined) this.config.thinking = patch.thinking;\n if (patch.effort !== undefined) this.config.effort = patch.effort;\n }\n\n /**\n * No-op for one-shot CLIs — there is no long-lived process to spawn until the\n * first prompt. Kept so the runner's `start()` → `prompt()` ordering works\n * uniformly; binary-presence failures surface as a `config` error on the\n * first spawn (see {@link classifyProcessError}).\n */\n async start(): Promise<void> {\n this.started = true;\n }\n\n get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends a user message to the CLI and resolves after the turn completes\n * (`agent_end`). Spawns a fresh child per call; rejects if the child exits\n * non-zero before emitting a result, so the caller never hangs.\n */\n async prompt(message: string): Promise<void> {\n if (this.proc) throw new Error(`${this.productName} turn already in progress`);\n if (!this.started) await this.start();\n\n this.prevText = \"\";\n this.activeAssistant = false;\n this.pendingToolResults = [];\n this.sawResult = false;\n this.aborting = false;\n this.stderrBuffer = [];\n this.stdoutBuffer = \"\";\n this._lastTokens = null;\n\n const composed = this.composePrompt(message);\n const overrideBin = process.env[`${this.envPrefix}_BRIDGE_BIN`];\n const preArgs = process.env[`${this.envPrefix}_BRIDGE_PREARGS`]\n ? (process.env[`${this.envPrefix}_BRIDGE_PREARGS`] as string).split(/\\s+/).filter(Boolean)\n : [];\n const bin = overrideBin || this.defaultBin;\n const args = [...preArgs, ...this.buildArgs(composed, this._sessionId)];\n const env = this.buildEnv();\n\n return new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n this.log.info(\"spawning CLI\", {\n bin,\n cwd: this.config.cwd,\n resume: Boolean(this._sessionId),\n });\n\n const proc = spawn(bin, args, {\n cwd: this.config.cwd,\n env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"spawn error\", err, { detail });\n this.pushError(detail);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(detail.message), { detail }));\n });\n\n if (proc.stdout) {\n if (this.mode === \"jsonl\") {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => this.onStdoutLine(line));\n } else {\n proc.stdout.setEncoding(\"utf8\");\n proc.stdout.on(\"data\", (chunk: string) => {\n this.stdoutBuffer += chunk;\n });\n }\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.debug(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"CLI exited\", { code, signal });\n this.onExit(code, signal);\n });\n });\n }\n\n /** Out-of-band abort: terminates the current child. Driver stays usable for the next prompt. */\n async abort(): Promise<void> {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n }\n\n kill(): void {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n this.cleanup();\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this._sessionId = undefined;\n this._lastTokens = null;\n }\n\n // ── Subclass hooks ────────────────────────────────────────────────────────\n\n /** Build the CLI argv (binary excluded) for one turn. `resumeId` is the captured session id, if any. */\n protected abstract buildArgs(message: string, resumeId: string | undefined): string[];\n\n /** Build the child-process env (explicit allowlist — see {@link baseEnv}). */\n protected abstract buildEnv(): Record<string, string>;\n\n /** Map one parsed stdout JSON object to events via the `push*` helpers. Streaming (`jsonl`) mode only. */\n protected handleJson(_json: unknown): void {}\n\n /** Parse the full stdout blob once on clean exit. `buffered` mode only. */\n protected handleBuffered(_raw: string): void {}\n\n /** Install-failure hint surfaced when the binary is missing. */\n protected abstract installHint(): string;\n\n /**\n * Classify a non-zero exit into an {@link AgentError}, or `null` to treat the\n * exit as success (e.g. a turn-limit code where a result was already\n * emitted). Default: code `0` / clean signal → success; otherwise `process`.\n */\n protected classifyExit(code: number | null, signal: NodeJS.Signals | null): AgentError | null {\n if (code === 0 || (code === null && signal === null)) return null;\n const tail = this.stderrBuffer.slice(-10).join(\"\\n\");\n return {\n message: `${this.productName} exited with code ${code ?? \"null\"}${tail ? `: ${tail}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint: tail || `The ${this.productName} process exited unexpectedly. Try the prompt again.`,\n };\n }\n\n // ── Protected emit helpers (used by handleJson / handleBuffered) ────────────\n\n /** Prepend `systemPrompt` to the user message — uniform across CLIs lacking a reliable system flag. */\n protected composePrompt(message: string): string {\n return this.config.systemPrompt ? `${this.config.systemPrompt}\\n\\n---\\n\\n${message}` : message;\n }\n\n protected pushAssistantDelta(fullText: string): void {\n if (!this.activeAssistant) {\n this.activeAssistant = true;\n this.prevText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: asstMessage(\"\"),\n } satisfies AgentEvent);\n }\n const delta = fullText.startsWith(this.prevText)\n ? fullText.slice(this.prevText.length)\n : fullText;\n this.prevText = fullText;\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: asstMessage(fullText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n }\n\n protected pushAssistantEnd(fullText?: string): void {\n if (!this.activeAssistant) return;\n const text = fullText ?? this.prevText;\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: asstMessage(text),\n } satisfies AgentEvent);\n this.activeAssistant = false;\n this.prevText = \"\";\n }\n\n protected pushToolCall(name: string, input: unknown): void {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name,\n tool: { name },\n input,\n } satisfies AgentEvent);\n }\n\n protected pushToolResult(name: string, data: unknown, isError = false): void {\n this.pendingToolResults.push({ role: \"tool\", toolName: name, content: \"\", data, isError });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: name,\n } satisfies AgentEvent);\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n protected pushResult(opts: {\n tokens?: TokenUsage | null;\n costUsd?: number;\n summary?: string;\n subtype?: string;\n }): void {\n this.pushAssistantEnd();\n this.flushToolResults();\n if (opts.tokens) this._lastTokens = opts.tokens;\n this.sawResult = true;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: opts.subtype ?? \"success\",\n summary: opts.summary,\n costUsd: opts.costUsd ?? 0,\n ...(opts.tokens ? { tokens: opts.tokens } : {}),\n } satisfies AgentEvent);\n }\n\n protected pushError(detail: AgentError, fatal = false): void {\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n fatal,\n } satisfies AgentEvent);\n }\n\n protected captureSession(id?: string, file?: string): void {\n if (!id || id === this._sessionId) return;\n this._sessionId = id;\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: id,\n ...(file ? { sessionFile: file } : {}),\n } satisfies AgentEvent);\n }\n\n /** Shared keyword classification + per-driver hint copy (mirrors omp/codex). */\n protected classifyMessage(message: string): AgentError {\n const generic = classifyGenericErrorMessage(message);\n if (!generic) {\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: `An unexpected ${this.productName} error occurred. Try the prompt again.`,\n };\n }\n const hint =\n generic.category === \"auth\"\n ? `Check the API key / login configured for ${this.productName}.`\n : generic.category === \"rate_limit\"\n ? `${this.productName} hit a provider rate limit. Wait a moment and try again.`\n : generic.category === \"model\"\n ? \"The selected model is unavailable or the context is too long. Change the model or start a new session.\"\n : `A network error occurred while talking to ${this.productName}.`;\n return { message, category: generic.category, retryable: generic.retryable, hint };\n }\n\n // ── Env allowlist ──────────────────────────────────────────────────────────\n\n /**\n * Explicit env whitelist forwarded to the child. Omits anything provisioned\n * by `provision_secrets` so user credentials stay out of the subprocess\n * environment. Always passes through the driver's test-seam vars and\n * `FAKE_CLI_*`.\n *\n * `config.env` is merged **over** the whitelist, not in place of it. It used\n * to replace it wholesale, which meant any caller that set a single variable\n * silently dropped `PATH` and `HOME` and the spawn failed with ENOENT —\n * unusable as the delivery channel for registry-derived endpoint variables\n * (plan §2.3, \"Delivery rule\"). Widening keeps both: the caller's variables\n * win per key, the process still has a `PATH`.\n */\n protected baseEnv(extraKeys: string[] = []): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\", ...extraKeys];\n for (const key of explicit) {\n const v = process.env[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(`${this.envPrefix}_BRIDGE_`) || key.startsWith(\"FAKE_CLI_\")) {\n out[key] = value;\n }\n }\n if (this.config.sshKeyPath) {\n out.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n if (this.config.env) Object.assign(out, this.config.env);\n return out;\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private onStdoutLine(line: string): void {\n if (!line.trim()) return;\n let json: unknown;\n try {\n json = JSON.parse(line);\n } catch {\n this.log.debug(\"non-JSON stdout line\", { line });\n return;\n }\n try {\n this.handleJson(json);\n } catch (err) {\n this.log.warn(\"handleJson threw\", { error: String(err) });\n }\n }\n\n private onExit(code: number | null, signal: NodeJS.Signals | null): void {\n this.cleanup();\n\n if (this.aborting) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n return;\n }\n\n if (this.mode === \"buffered\" && (code === 0 || code === null)) {\n try {\n this.handleBuffered(this.stdoutBuffer);\n } catch (err) {\n this.log.warn(\"handleBuffered threw\", { error: String(err) });\n }\n }\n\n const exitErr = this.classifyExit(code, signal);\n if (exitErr && !this.sawResult) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.pushError(exitErr);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(exitErr.message), { detail: exitErr }));\n return;\n }\n\n // Clean exit (or non-zero exit after a result already streamed): close any\n // open assistant message, synthesize a success result if none arrived, end.\n if (!this.sawResult) this.pushResult({ summary: \"Task completed\" });\n else {\n this.pushAssistantEnd();\n this.flushToolResults();\n }\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n }\n\n private settleResolve(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n private settleReject(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: `${this.defaultBin} command not found`,\n category: \"config\",\n retryable: false,\n hint: this.installHint(),\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: `Permission denied running ${this.defaultBin}`,\n category: \"config\",\n retryable: false,\n hint: `Check file permissions for the ${this.defaultBin} binary.`,\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: `An unexpected process error occurred running ${this.productName}. Try again.`,\n };\n }\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Tolerant JSON extractors — shared because the upstream stream-json schemas\n// are not fully pinned; read the common field-name variants defensively.\n// ───────────────────────────────────────────────────────────────────────────\n\nfunction asstMessage(text: string): AgentMessage {\n return { role: \"assistant\", content: [{ type: \"text\", text }] };\n}\n\n/** Pull assistant text out of a CLI event, trying the common field names. */\nexport function extractText(json: any): string {\n if (typeof json?.text === \"string\") return json.text;\n if (typeof json?.delta === \"string\") return json.delta;\n if (typeof json?.content === \"string\") return json.content;\n if (typeof json?.response === \"string\") return json.response;\n const msg = json?.message;\n if (typeof msg?.content === \"string\") return msg.content;\n if (Array.isArray(msg?.content)) {\n return msg.content\n .filter(\n (b: any) => (b?.type === \"text\" || b?.type === undefined) && typeof b?.text === \"string\",\n )\n .map((b: any) => b.text)\n .join(\"\");\n }\n if (Array.isArray(json?.parts)) {\n return json.parts\n .filter((p: any) => typeof p?.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\");\n }\n return \"\";\n}\n\n/** Map a CLI usage/stats object onto {@link TokenUsage}, trying common field names. */\nexport function extractTokens(json: any): TokenUsage | null {\n const u = json?.usage ?? json?.stats?.usage ?? json?.stats ?? json?.tokens ?? json;\n if (!u || typeof u !== \"object\") return null;\n const input = u.input_tokens ?? u.inputTokens ?? u.prompt_tokens ?? u.promptTokenCount ?? u.input;\n const output =\n u.output_tokens ?? u.outputTokens ?? u.completion_tokens ?? u.candidatesTokenCount ?? u.output;\n const cacheRead = u.cached_input_tokens ?? u.cacheReadTokens ?? u.cachedContentTokenCount;\n if (input === undefined && output === undefined) return null;\n const tokens: TokenUsage = {};\n if (typeof input === \"number\") tokens.inputTokens = input;\n if (typeof output === \"number\") tokens.outputTokens = output;\n if (typeof cacheRead === \"number\") tokens.cacheReadTokens = cacheRead;\n return tokens;\n}\n\n/** Pull a per-turn USD cost from a CLI result object, or `undefined`. */\nexport function extractCost(json: any): number | undefined {\n const c =\n json?.cost ?? json?.costUsd ?? json?.total_cost_usd ?? json?.stats?.cost ?? json?.usage?.cost;\n return typeof c === \"number\" ? c : undefined;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../core/src/provider-registry.ts"],"names":["ok","providerId","entry"],"mappings":"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","file":"chunk-ILG4BXYE.js","sourcesContent":["/**\n * The AI provider registry — one keyed definition of every LLM / voice endpoint\n * the runtime may talk to.\n *\n * This module is the **single canonical home** of the registry record: its\n * types, its validation, the layered merge (§1.5), the `base_url` derivation\n * (§1.3), the credential-reference grammar (§1.4) and the model-reference\n * parser. Nothing here is duplicated in `bridge`, `runner` or `platform` — the\n * structurally-identical-copy pattern that `CloudConfig` fell into is exactly\n * what this module exists to avoid.\n *\n * Vocabulary: this is the **AI provider** registry. It is unrelated to the\n * platform's connector `ProviderType` / `ProviderLink` (git, SharePoint,\n * Drive…). Types are named `AIProvider*` throughout, never bare `Provider*`.\n *\n * The `surface` enum is omp's `api` vocabulary verbatim, so the omp adapter is\n * a serializer rather than a translator.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1\n */\n\n// No runtime imports: this module is the schema, and it must stay loadable in a\n// browser bundle. Credential *resolution* (which spawns processes and reads\n// `process.env`) lives in `./provider-registry-credentials.ts`.\n\n// ── Enums ──────────────────────────────────────────────────────────────────\n\n/**\n * What an entry produces. `llm` and `embed` carry a wire `surface`; `stt` and\n * `tts` use the reduced voice record (§1.7).\n */\nexport const AI_PROVIDER_KINDS = [\"llm\", \"stt\", \"tts\", \"embed\"] as const;\n\n/** Union of {@link AI_PROVIDER_KINDS}. */\nexport type AIProviderKind = (typeof AI_PROVIDER_KINDS)[number];\n\n/** Kinds that use the voice subset of the record (§1.7). */\nexport const AI_PROVIDER_VOICE_KINDS = [\"stt\", \"tts\"] as const;\n\n/** Union of {@link AI_PROVIDER_VOICE_KINDS}. */\nexport type AIProviderVoiceKind = (typeof AI_PROVIDER_VOICE_KINDS)[number];\n\n/**\n * Wire protocol — the discriminator a driver adapter switches on. These are\n * omp's `api` values verbatim (Codex CLI calls the same concept `wire_api`).\n */\nexport const AI_PROVIDER_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;\n\n/** Union of {@link AI_PROVIDER_SURFACES}. */\nexport type AIProviderSurface = (typeof AI_PROVIDER_SURFACES)[number];\n\n/** How the request reaches the surface — selects the `params` shape (§1.3). */\nexport const AI_PROVIDER_TRANSPORTS = [\n \"direct\",\n \"bedrock\",\n \"vertex\",\n \"foundry\",\n \"azure-openai\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_TRANSPORTS}. */\nexport type AIProviderTransport = (typeof AI_PROVIDER_TRANSPORTS)[number];\n\n/**\n * How the credential is presented (§1.4). `command` is a reserved grammar slot:\n * the schema accepts it, no refresh loop ships yet.\n */\nexport const AI_PROVIDER_CREDENTIAL_KINDS = [\n \"api_key_header\",\n \"bearer\",\n \"sigv4\",\n \"google_adc\",\n \"azure_entra\",\n \"oauth\",\n \"none\",\n \"command\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_CREDENTIAL_KINDS}. */\nexport type AIProviderCredentialKind = (typeof AI_PROVIDER_CREDENTIAL_KINDS)[number];\n\n/**\n * Credential kinds that cannot work without a `ref`. The rest either sign from\n * an ambient chain (`sigv4`, `google_adc`, `azure_entra`) or need nothing\n * (`none`).\n */\nconst CREDENTIAL_REF_REQUIRED: Partial<Record<AIProviderCredentialKind, true>> = {\n api_key_header: true,\n bearer: true,\n oauth: true,\n command: true,\n};\n\n/** omp-compatible model-discovery probes. Unknown values are tolerated with a warning. */\nexport const AI_PROVIDER_DISCOVERY_TYPES = [\n \"openai-models-list\",\n \"anthropic-models-list\",\n \"google-models-list\",\n \"none\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_DISCOVERY_TYPES}. */\nexport type AIProviderDiscoveryType = (typeof AI_PROVIDER_DISCOVERY_TYPES)[number];\n\n/**\n * Configuration layers, **lowest precedence first** (§1.5). `runtime` is the\n * CLI/runtime override layer (`--model`, `--api-key`); `session` is the\n * control-plane layer the platform injects into `session_init`.\n */\nexport const AI_PROVIDER_LAYERS = [\"catalog\", \"user\", \"workspace\", \"runtime\", \"session\"] as const;\n\n/** Union of {@link AI_PROVIDER_LAYERS}. */\nexport type AIProviderLayerId = (typeof AI_PROVIDER_LAYERS)[number];\n\n// ── Record ─────────────────────────────────────────────────────────────────\n\n/** `transport: bedrock` routing parameters. */\nexport interface AIProviderBedrockParams {\n /** AWS region, e.g. `us-east-1`. */\n region: string;\n}\n\n/** `transport: vertex` routing parameters. */\nexport interface AIProviderVertexParams {\n /** GCP project id. */\n project: string;\n /** Vertex location, e.g. `europe-west4`. */\n location: string;\n /** Model publisher; defaults to `google` (use `anthropic` for Claude on Vertex). */\n publisher?: string;\n}\n\n/** `transport: foundry` routing parameters. */\nexport interface AIProviderFoundryParams {\n /** Azure AI Foundry resource name (the `{resource}` in the endpoint host). */\n resource: string;\n}\n\n/**\n * `transport: azure-openai` routing parameters. `resource` is required even\n * though the plan's §1.3 table lists only `deployment`/`api_version`: the\n * derived `base_url` in that same row interpolates `{resource}`.\n */\nexport interface AIProviderAzureOpenAIParams {\n /** Azure OpenAI resource name (the `{resource}` in the endpoint host). */\n resource: string;\n /** Deployment name the request is routed to. */\n deployment: string;\n /** `api-version` query value; mirrored into `query_params` by the adapter. */\n api_version: string;\n}\n\n/** Free-form voice parameters, typed per preset (Deepgram, ElevenLabs, …). */\nexport type AIProviderVoiceParams = Record<string, string | number | boolean>;\n\n/**\n * The `transport` → `params` discriminated union (§1.3, decision §9.9). An open\n * `Record<string, string>` would lose per-transport field rendering in the\n * admin UI, so the pairing is encoded in the type.\n */\nexport type AIProviderTransportSlice =\n | { transport?: \"direct\"; params?: Record<string, never> }\n | { transport: \"bedrock\"; params: AIProviderBedrockParams }\n | { transport: \"vertex\"; params: AIProviderVertexParams }\n | { transport: \"foundry\"; params: AIProviderFoundryParams }\n | { transport: \"azure-openai\"; params: AIProviderAzureOpenAIParams };\n\n/** Reference to a secret. Never the secret itself — see {@link parseCredentialRef}. */\nexport interface AIProviderCredential {\n kind: AIProviderCredentialKind;\n /**\n * `env:NAME` · `cmd:<shell>` · `platform:<configId>` · `keyring:<service>/<account>`.\n * A literal secret here is a validation error.\n */\n ref?: string;\n}\n\n/** Per-model capability facts; unknown ids otherwise truncate silently. */\nexport interface AIProviderCapabilities {\n context_window?: number;\n tools?: boolean;\n images?: boolean;\n thinking_max?: number;\n}\n\n/** omp-compatible discovery descriptor. */\nexport interface AIProviderDiscovery {\n type: AIProviderDiscoveryType | (string & {});\n /** Path appended to `base_url` when the surface default does not apply. */\n path?: string;\n}\n\n/** Fields every entry carries, whatever its `kind`. */\nexport interface AIProviderEntryCommon {\n /** Display name. Never load-bearing. */\n label?: string;\n /** Catalog preset this entry inherits from (`bridge/src/provider-catalog.ts`). */\n preset?: string;\n /** Literal endpoint; wins over the preset value and the transport derivation. */\n base_url?: string;\n /** Static, non-secret request headers. */\n headers?: Record<string, string>;\n credential?: AIProviderCredential;\n /** Default `true`; read it through {@link isEntryEnabled}. */\n enabled?: boolean;\n /** Set by the control plane: lower layers cannot override this entry (§1.5). */\n locked?: boolean;\n}\n\n/** An `llm`/`embed` entry — the full record. */\nexport type AIProviderLlmEntry = AIProviderEntryCommon &\n AIProviderTransportSlice & {\n kind: \"llm\" | \"embed\";\n /** Required unless a `preset` supplies it. */\n surface?: AIProviderSurface;\n /** Azure's `api-version` lives here. */\n query_params?: Record<string, string>;\n /** Logical id → provider-side id. */\n model_map?: Record<string, string>;\n /** Keyed by the *logical* id, i.e. the `model_map` key. */\n capabilities?: Record<string, AIProviderCapabilities>;\n discovery?: AIProviderDiscovery;\n };\n\n/**\n * An `stt`/`tts` entry — the reduced record (§1.7). `surface`, `transport`,\n * `model_map`, `capabilities` and `discovery` are `llm`-only and rejected here:\n * a TTS voice is not a wire protocol.\n */\nexport type AIProviderVoiceEntry = AIProviderEntryCommon & {\n kind: AIProviderVoiceKind;\n /** Preset-typed: Deepgram `{model, language}`, ElevenLabs `{voice_id, output_format}`. */\n params?: AIProviderVoiceParams;\n};\n\n/** One registry entry. */\nexport type AIProviderEntry = AIProviderLlmEntry | AIProviderVoiceEntry;\n\n/** Entry id → entry. Iteration order is registry order. */\nexport type AIProviderRegistry = Record<string, AIProviderEntry>;\n\n/**\n * Any entry's `params`: transport routing parameters (§1.3) or voice options\n * (§1.7). Which of them applies is decided by `transport` and `kind`, and a\n * layer may not carry either — so a patch holds the union and\n * {@link validateMergedRegistry} narrows it.\n */\nexport type AIProviderParams =\n | AIProviderBedrockParams\n | AIProviderVertexParams\n | AIProviderFoundryParams\n | AIProviderAzureOpenAIParams\n | AIProviderVoiceParams;\n\n/**\n * An entry as a single layer may write it (§1.5): any subset of the record,\n * `kind` included. A `<workspace>/.skaile/providers.yml` that names `base_url`\n * alone is an override of one field, not a redefinition — so a layer holds\n * patches, and completeness is gated on the merged entry\n * ({@link validateMergedRegistry}) rather than per layer.\n *\n * Every {@link AIProviderEntry} is a patch; the reverse needs the gate. The\n * `transport`/`params` pairing is deliberately un-discriminated here, because\n * the two halves may come from different layers.\n */\nexport type AIProviderEntryPatch = AIProviderEntryCommon & {\n kind?: AIProviderKind;\n surface?: AIProviderSurface;\n transport?: AIProviderTransport;\n params?: AIProviderParams;\n query_params?: Record<string, string>;\n model_map?: Record<string, string>;\n capabilities?: Record<string, AIProviderCapabilities>;\n discovery?: AIProviderDiscovery;\n};\n\n/** Entry id → partial entry: one layer's contribution to the registry. */\nexport type AIProviderRegistryPatch = Record<string, AIProviderEntryPatch>;\n\n/** A parsed `providers.yml` document — one layer, so entries may be partial. */\nexport interface AIProviderRegistryDocument {\n version: 1;\n providers: AIProviderRegistryPatch;\n}\n\n/** One input to {@link mergeRegistries}. */\nexport interface AIProviderRegistryLayer {\n layer: AIProviderLayerId;\n providers: AIProviderRegistryPatch;\n}\n\n/** The merged view every consumer reads. */\nexport interface MergedAIProviderRegistry {\n version: 1;\n providers: AIProviderRegistry;\n /**\n * Registry order: highest-precedence layer first, document order within a\n * layer. Bare model ids resolve down this list (§1.6).\n */\n order: string[];\n /** Highest-precedence layer that contributed to each entry. */\n origin: Record<string, AIProviderLayerId>;\n /** Entries frozen by `locked: true`; lower layers were ignored for these. */\n locked: string[];\n}\n\n// ── Diagnostics ────────────────────────────────────────────────────────────\n\n/** Severity of an {@link AIProviderDiagnostic}. */\nexport type AIProviderDiagnosticSeverity = \"error\" | \"warning\";\n\n/**\n * A structured note about a registry document. {@link validateRegistry} never\n * throws: every problem is reported here with the offending key in `path`, and\n * each caller (CLI, runner, platform) decides how loud to be.\n */\nexport interface AIProviderDiagnostic {\n /** Stable machine code, e.g. `\"literal_secret\"` / `\"unknown_surface\"`. */\n code: string;\n severity: AIProviderDiagnosticSeverity;\n /** Human-readable, actionable message. */\n message: string;\n /** Dotted path to the offending key, e.g. `providers.groq.headers.x-api-key`. */\n path: string;\n}\n\n/** Result of {@link validateRegistry}: the surviving document plus every note. */\nexport interface RegistryValidation {\n /** Entries that produced an error diagnostic are omitted. */\n document: AIProviderRegistryDocument;\n diagnostics: AIProviderDiagnostic[];\n}\n\n// ── Validation ─────────────────────────────────────────────────────────────\n\n/** Entry ids are file-safe, env-var-derivable keys. */\nconst SAFE_ID = /^[a-z0-9][a-z0-9_-]*$/;\n\n/** POSIX environment variable name. */\nconst ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** The four `credential.ref` forms (§1.4). */\nconst CREDENTIAL_REF = /^(env|cmd|platform|keyring):([\\s\\S]+)$/;\n\n/** Header/query keys whose value must be an indirection, never a literal. */\nconst SECRET_KEY =\n /(^|[-_])(api[-_]?key|apikey|authorization|auth|token|secret|password|passwd|credential|credentials|cookie)([-_]|$)|^key$/i;\n\n/** Value shapes that are a secret whatever the key is called. */\nconst SECRET_VALUE_PATTERNS: RegExp[] = [\n /^sk-/i,\n /^xai-/i,\n /^gsk_/,\n /^(ghp|gho|ghu|ghs)_/,\n /^github_pat_/,\n /^xox[baprs]-/,\n /^AIza[0-9A-Za-z_-]{10,}/,\n /^(Bearer|Token|Basic)\\s+\\S{8,}$/i,\n // Long opaque blob: no spaces, no dots, no scheme punctuation.\n /^[A-Za-z0-9+/_-]{40,}={0,2}$/,\n];\n\n/** `${...}` interpolation — the escape hatch for a templated, non-literal value. */\nconst INTERPOLATION = /\\$\\{[^}]+\\}/;\n\n/** Every key the `llm`/`embed` record accepts. */\nconst LLM_KEYS: Record<string, true> = {\n kind: true,\n label: true,\n preset: true,\n surface: true,\n transport: true,\n base_url: true,\n params: true,\n headers: true,\n query_params: true,\n credential: true,\n model_map: true,\n capabilities: true,\n discovery: true,\n enabled: true,\n locked: true,\n};\n\n/** Every key the `stt`/`tts` record accepts (§1.7). */\nconst VOICE_KEYS: Record<string, true> = {\n kind: true,\n label: true,\n preset: true,\n base_url: true,\n params: true,\n headers: true,\n credential: true,\n enabled: true,\n locked: true,\n};\n\n/**\n * Every key either record accepts. This is the allow-list a *layer* is read\n * against: which of the two records applies is only known once `kind` is, and\n * a layer may leave `kind` to a lower one (§1.5). The `llm`-only keys are\n * rejected on a voice entry by {@link checkEntry}, at merge time.\n */\nconst ENTRY_KEYS: Record<string, true> = { ...LLM_KEYS, ...VOICE_KEYS };\n\n/** Keys that exist only on `llm`/`embed` — named individually when rejected. */\nconst LLM_ONLY_KEYS = [\"surface\", \"transport\", \"model_map\", \"capabilities\", \"discovery\"] as const;\n\nconst CAPABILITY_KEYS: Record<string, true> = {\n context_window: true,\n tools: true,\n images: true,\n thinking_max: true,\n};\n\n/** Required `params` keys per transport (§1.3). */\nconst TRANSPORT_PARAMS: Record<\n Exclude<AIProviderTransport, \"direct\">,\n { required: string[]; optional: string[] }\n> = {\n bedrock: { required: [\"region\"], optional: [] },\n vertex: { required: [\"project\", \"location\"], optional: [\"publisher\"] },\n foundry: { required: [\"resource\"], optional: [] },\n \"azure-openai\": { required: [\"resource\", \"deployment\", \"api_version\"], optional: [] },\n};\n\n/**\n * `transport` → `base_url` template (§1.3). Placeholders are `params` keys.\n * `direct` has no template: it uses the preset literal or an explicit value.\n */\nexport const AI_PROVIDER_BASE_URL_TEMPLATES: Record<\n Exclude<AIProviderTransport, \"direct\">,\n string\n> = {\n bedrock: \"https://bedrock-runtime.{region}.amazonaws.com\",\n vertex:\n \"https://{location}-aiplatform.googleapis.com/v1/projects/{project}/locations/{location}/publishers/{publisher}\",\n foundry: \"https://{resource}.services.ai.azure.com/anthropic\",\n \"azure-openai\": \"https://{resource}.openai.azure.com/openai\",\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True when `id` is usable as a registry key (`[a-z0-9][a-z0-9_-]*`). */\nexport function isSafeProviderId(id: string): boolean {\n return SAFE_ID.test(id);\n}\n\n/**\n * True when `value` must not appear literally under `key`.\n *\n * A value is acceptable when it is an indirection — a `${...}` interpolation or\n * one of the four `credential.ref` forms. Otherwise a value is a literal secret\n * when the key names a credential-bearing header (`authorization`, `x-api-key`,\n * the bare `key` query param Google uses…) or when the value itself has the\n * shape of a token (`sk-…`, `AIza…`, a 40-char opaque blob…).\n *\n * Non-secret literals stay legal: `anthropic-version: 2023-06-01`,\n * `api-version: 2026-01-01`, `HTTP-Referer: https://skaile.ai`.\n */\nexport function looksLikeLiteralSecret(key: string, value: string): boolean {\n const trimmed = value.trim();\n if (trimmed === \"\") return false;\n if (INTERPOLATION.test(trimmed)) return false;\n if (CREDENTIAL_REF.test(trimmed)) return false;\n if (SECRET_KEY.test(key)) return true;\n return SECRET_VALUE_PATTERNS.some((re) => re.test(trimmed));\n}\n\ninterface Ctx {\n diagnostics: AIProviderDiagnostic[];\n}\n\nfunction err(ctx: Ctx, code: string, path: string, message: string): void {\n ctx.diagnostics.push({ code, severity: \"error\", message, path });\n}\n\nfunction warn(ctx: Ctx, code: string, path: string, message: string): void {\n ctx.diagnostics.push({ code, severity: \"warning\", message, path });\n}\n\n/** Validate a `Record<string, string>` field and reject literal secrets in it. */\nfunction readStringMap(\n ctx: Ctx,\n raw: unknown,\n path: string,\n opts: { secretScan: boolean },\n): Record<string, string> | undefined {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map of string values`);\n return undefined;\n }\n const out: Record<string, string> = {};\n let ok = true;\n for (const [key, value] of Object.entries(raw)) {\n const keyPath = `${path}.${key}`;\n if (typeof value !== \"string\") {\n err(ctx, \"invalid_type\", keyPath, `${keyPath} must be a string`);\n ok = false;\n continue;\n }\n if (opts.secretScan && looksLikeLiteralSecret(key, value)) {\n err(\n ctx,\n \"literal_secret\",\n keyPath,\n `${keyPath} holds a literal secret — use a reference instead ` +\n `(env:NAME, cmd:<shell>, platform:<configId>, keyring:<service>/<account>) ` +\n `or a \\${...} interpolation`,\n );\n ok = false;\n continue;\n }\n out[key] = value;\n }\n return ok ? out : undefined;\n}\n\nfunction readCredential(\n ctx: Ctx,\n raw: unknown,\n path: string,\n): { value?: AIProviderCredential; ok: boolean } {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map with a 'kind'`);\n return { ok: false };\n }\n let ok = true;\n for (const key of Object.keys(raw)) {\n if (key !== \"kind\" && key !== \"ref\") {\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a credential key`);\n ok = false;\n }\n }\n const kind = raw.kind;\n if (\n typeof kind !== \"string\" ||\n !(AI_PROVIDER_CREDENTIAL_KINDS as readonly string[]).includes(kind)\n ) {\n err(\n ctx,\n \"unknown_credential_kind\",\n `${path}.kind`,\n `${path}.kind must be one of ${AI_PROVIDER_CREDENTIAL_KINDS.join(\", \")}`,\n );\n return { ok: false };\n }\n const credentialKind = kind as AIProviderCredentialKind;\n\n const rawRef = raw.ref;\n let ref: string | undefined;\n if (rawRef !== undefined) {\n if (typeof rawRef !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.ref`, `${path}.ref must be a string`);\n ok = false;\n } else if (!parseCredentialRef(rawRef)) {\n err(\n ctx,\n \"literal_secret\",\n `${path}.ref`,\n `${path}.ref must be a reference, not a literal secret — ` +\n `use env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>`,\n );\n ok = false;\n } else {\n ref = rawRef;\n }\n } else if (CREDENTIAL_REF_REQUIRED[credentialKind]) {\n err(\n ctx,\n \"missing_credential_ref\",\n `${path}.ref`,\n `${path}.ref is required for credential kind '${credentialKind}'`,\n );\n ok = false;\n }\n\n if (!ok) return { ok: false };\n return {\n ok: true,\n value: ref === undefined ? { kind: credentialKind } : { kind: credentialKind, ref },\n };\n}\n\n/**\n * Validate `transport` + `params` against §1.3 and rebuild the discriminated\n * union from the merged values.\n *\n * This runs at merge time, not per layer: `params` and the `transport` that\n * types them may be written in different layers (§1.5), so a layer on its own\n * cannot tell a foreign parameter from an override of a legal one.\n *\n * @param present keys the source wrote — a `transport` or `params` that was\n * written and rejected is already reported, and must not also be reported as\n * missing.\n */\nfunction readTransportSlice(\n ctx: Ctx,\n transport: AIProviderTransport | undefined,\n params: Record<string, string | number | boolean> | undefined,\n path: string,\n present: ReadonlySet<string>,\n): { slice: AIProviderTransportSlice; ok: boolean } {\n // Re-deriving `params` against the default would bury the enum diagnostic.\n if (transport === undefined && present.has(\"transport\")) return { slice: {}, ok: false };\n const explicit = transport !== undefined;\n const effective = transport ?? \"direct\";\n const rejectedParams = params === undefined && present.has(\"params\");\n\n if (effective === \"direct\") {\n let ok = true;\n for (const key of Object.keys(params ?? {})) {\n err(\n ctx,\n \"unknown_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is not valid for transport 'direct' — it takes no parameters`,\n );\n ok = false;\n }\n return { slice: explicit ? { transport: \"direct\" } : {}, ok };\n }\n\n const spec = TRANSPORT_PARAMS[effective];\n if (params === undefined) {\n // Written and rejected by the per-layer read — its diagnostic already stands.\n if (!rejectedParams) {\n err(\n ctx,\n \"missing_params\",\n `${path}.params`,\n `${path}.params is required for transport '${effective}' (${spec.required.join(\", \")})`,\n );\n }\n return { slice: {}, ok: false };\n }\n\n let ok = true;\n const values: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (!spec.required.includes(key) && !spec.optional.includes(key)) {\n err(\n ctx,\n \"unknown_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is not valid for transport '${effective}' ` +\n `(accepted: ${[...spec.required, ...spec.optional].join(\", \")})`,\n );\n ok = false;\n continue;\n }\n if (typeof value !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.params.${key}`, `${path}.params.${key} must be a string`);\n ok = false;\n continue;\n }\n values[key] = value;\n }\n for (const key of spec.required) {\n if (values[key] === undefined) {\n err(\n ctx,\n \"missing_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is required for transport '${effective}'`,\n );\n ok = false;\n }\n }\n if (!ok) return { slice: {}, ok: false };\n // Rebuilt field by field so the discriminated union narrows without a cast;\n // every `required` key is present by the check above.\n switch (effective) {\n case \"bedrock\":\n return { slice: { transport: effective, params: { region: values.region } }, ok: true };\n case \"vertex\":\n return {\n slice: {\n transport: effective,\n params: {\n project: values.project,\n location: values.location,\n ...(values.publisher === undefined ? {} : { publisher: values.publisher }),\n },\n },\n ok: true,\n };\n case \"foundry\":\n return { slice: { transport: effective, params: { resource: values.resource } }, ok: true };\n case \"azure-openai\":\n return {\n slice: {\n transport: effective,\n params: {\n resource: values.resource,\n deployment: values.deployment,\n api_version: values.api_version,\n },\n },\n ok: true,\n };\n }\n}\n\n/**\n * `params` as a layer may write them: scalars, and no literal secret. Which\n * keys are legal depends on `transport` (§1.3) or on the voice preset (§1.7),\n * so that half waits for the merge — the secret scan does not, because its\n * diagnostic has to name the file the secret was written into.\n */\nfunction readParams(\n ctx: Ctx,\n raw: unknown,\n path: string,\n): { value?: Record<string, string | number | boolean>; ok: boolean } {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map`);\n return { ok: false };\n }\n const out: Record<string, string | number | boolean> = {};\n let ok = true;\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.${key}`,\n `${path}.${key} must be a string, number or boolean`,\n );\n ok = false;\n continue;\n }\n if (typeof value === \"string\" && looksLikeLiteralSecret(key, value)) {\n err(\n ctx,\n \"literal_secret\",\n `${path}.${key}`,\n `${path}.${key} holds a literal secret — put it in credential.ref as a reference`,\n );\n ok = false;\n continue;\n }\n out[key] = value;\n }\n return ok ? { ok: true, value: out } : { ok: false };\n}\n\nfunction readBaseUrl(ctx: Ctx, raw: unknown, path: string): { value?: string; ok: boolean } {\n if (typeof raw !== \"string\") {\n err(ctx, \"invalid_type\", path, `${path} must be a string`);\n return { ok: false };\n }\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n err(ctx, \"invalid_base_url\", path, `${path} is not a valid URL: ${raw}`);\n return { ok: false };\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n err(\n ctx,\n \"invalid_base_url\",\n path,\n `${path} must use http:// or https:// (got ${parsed.protocol}//)`,\n );\n return { ok: false };\n }\n if (parsed.username || parsed.password) {\n err(\n ctx,\n \"literal_secret\",\n path,\n `${path} embeds credentials in the URL — move them to credential.ref as a reference`,\n );\n return { ok: false };\n }\n return { ok: true, value: raw };\n}\n\nfunction readBoolean(ctx: Ctx, raw: unknown, path: string): { value?: boolean; ok: boolean } {\n if (typeof raw !== \"boolean\") {\n err(ctx, \"invalid_type\", path, `${path} must be true or false`);\n return { ok: false };\n }\n return { ok: true, value: raw };\n}\n\n/** What one layer wrote for an entry, before the kind-dependent half runs. */\ninterface ReadEntryResult {\n entry: AIProviderEntryPatch;\n /**\n * Keys this layer wrote, valid or not. A field that was written and rejected\n * here must not be reported a second time as missing.\n */\n present: ReadonlySet<string>;\n}\n\n/**\n * Read one entry as a **patch**: every check that does not depend on `kind` —\n * types, URLs, the credential grammar, literal secrets, unknown keys.\n *\n * A layer may hold a partial entry (§1.5), so `kind` is optional here and the\n * checks that need it are {@link checkEntry}'s, which runs on the merged\n * entry. A `kind` that *is* written still has to be one of\n * {@link AI_PROVIDER_KINDS}: a typo is malformed input, not an override.\n */\nfunction readEntry(ctx: Ctx, raw: unknown, path: string): ReadEntryResult | undefined {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map`);\n return undefined;\n }\n\n const present: ReadonlySet<string> = new Set(Object.keys(raw));\n const entry: AIProviderEntryPatch = {};\n let ok = true;\n\n if (raw.kind !== undefined) {\n if (\n typeof raw.kind !== \"string\" ||\n !(AI_PROVIDER_KINDS as readonly string[]).includes(raw.kind)\n ) {\n err(\n ctx,\n \"unknown_kind\",\n `${path}.kind`,\n `${path}.kind must be one of ${AI_PROVIDER_KINDS.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.kind = raw.kind as AIProviderKind;\n }\n }\n\n for (const key of present) {\n if (!ENTRY_KEYS[key]) {\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a registry key`);\n ok = false;\n }\n }\n\n if (raw.label !== undefined) {\n if (typeof raw.label !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.label`, `${path}.label must be a string`);\n ok = false;\n } else {\n entry.label = raw.label;\n }\n }\n if (raw.preset !== undefined) {\n if (typeof raw.preset !== \"string\" || !isSafeProviderId(raw.preset)) {\n err(\n ctx,\n \"invalid_preset\",\n `${path}.preset`,\n `${path}.preset must be a catalog preset id matching [a-z0-9][a-z0-9_-]*`,\n );\n ok = false;\n } else {\n entry.preset = raw.preset;\n }\n }\n if (raw.base_url !== undefined) {\n const res = readBaseUrl(ctx, raw.base_url, `${path}.base_url`);\n if (!res.ok) ok = false;\n else entry.base_url = res.value;\n }\n if (raw.headers !== undefined) {\n const headers = readStringMap(ctx, raw.headers, `${path}.headers`, { secretScan: true });\n if (!headers) ok = false;\n else entry.headers = headers;\n }\n if (raw.credential !== undefined) {\n const res = readCredential(ctx, raw.credential, `${path}.credential`);\n if (!res.ok) ok = false;\n else entry.credential = res.value;\n }\n if (raw.enabled !== undefined) {\n const res = readBoolean(ctx, raw.enabled, `${path}.enabled`);\n if (!res.ok) ok = false;\n else entry.enabled = res.value;\n }\n if (raw.locked !== undefined) {\n const res = readBoolean(ctx, raw.locked, `${path}.locked`);\n if (!res.ok) ok = false;\n else entry.locked = res.value;\n }\n if (raw.surface !== undefined) {\n if (\n typeof raw.surface !== \"string\" ||\n !(AI_PROVIDER_SURFACES as readonly string[]).includes(raw.surface)\n ) {\n err(\n ctx,\n \"unknown_surface\",\n `${path}.surface`,\n `${path}.surface must be one of ${AI_PROVIDER_SURFACES.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.surface = raw.surface as AIProviderSurface;\n }\n }\n if (raw.transport !== undefined) {\n if (\n typeof raw.transport !== \"string\" ||\n !(AI_PROVIDER_TRANSPORTS as readonly string[]).includes(raw.transport)\n ) {\n err(\n ctx,\n \"unknown_transport\",\n `${path}.transport`,\n `${path}.transport must be one of ${AI_PROVIDER_TRANSPORTS.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.transport = raw.transport as AIProviderTransport;\n }\n }\n if (raw.params !== undefined) {\n const res = readParams(ctx, raw.params, `${path}.params`);\n if (!res.ok) ok = false;\n else entry.params = res.value;\n }\n if (raw.query_params !== undefined) {\n const qp = readStringMap(ctx, raw.query_params, `${path}.query_params`, { secretScan: true });\n if (!qp) ok = false;\n else entry.query_params = qp;\n }\n if (raw.model_map !== undefined) {\n const map = readStringMap(ctx, raw.model_map, `${path}.model_map`, { secretScan: false });\n if (!map) ok = false;\n else entry.model_map = map;\n }\n if (raw.capabilities !== undefined) {\n if (!isPlainObject(raw.capabilities)) {\n err(ctx, \"invalid_type\", `${path}.capabilities`, `${path}.capabilities must be a map`);\n ok = false;\n } else {\n const caps: Record<string, AIProviderCapabilities> = {};\n for (const [modelId, value] of Object.entries(raw.capabilities)) {\n const capPath = `${path}.capabilities.${modelId}`;\n if (!isPlainObject(value)) {\n err(ctx, \"invalid_type\", capPath, `${capPath} must be a map`);\n ok = false;\n continue;\n }\n const cap: AIProviderCapabilities = {};\n for (const [capKey, capValue] of Object.entries(value)) {\n if (!CAPABILITY_KEYS[capKey]) {\n err(\n ctx,\n \"unknown_key\",\n `${capPath}.${capKey}`,\n `${capPath}.${capKey} is not a capability (${Object.keys(CAPABILITY_KEYS).join(\", \")})`,\n );\n ok = false;\n continue;\n }\n const expected = capKey === \"tools\" || capKey === \"images\" ? \"boolean\" : \"number\";\n if (typeof capValue !== expected) {\n err(\n ctx,\n \"invalid_type\",\n `${capPath}.${capKey}`,\n `${capPath}.${capKey} must be a ${expected}`,\n );\n ok = false;\n continue;\n }\n (cap as Record<string, unknown>)[capKey] = capValue;\n }\n caps[modelId] = cap;\n }\n entry.capabilities = caps;\n }\n }\n if (raw.discovery !== undefined) {\n if (!isPlainObject(raw.discovery)) {\n err(ctx, \"invalid_type\", `${path}.discovery`, `${path}.discovery must be a map`);\n ok = false;\n } else {\n const type = raw.discovery.type;\n if (typeof type !== \"string\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.discovery.type`,\n `${path}.discovery.type must be a string`,\n );\n ok = false;\n } else {\n if (!(AI_PROVIDER_DISCOVERY_TYPES as readonly string[]).includes(type)) {\n warn(\n ctx,\n \"unknown_discovery_type\",\n `${path}.discovery.type`,\n `${path}.discovery.type '${type}' is not a known probe ` +\n `(${AI_PROVIDER_DISCOVERY_TYPES.join(\", \")}) — it is kept verbatim`,\n );\n }\n const discovery: AIProviderDiscovery = { type };\n const discPath = raw.discovery.path;\n if (discPath !== undefined) {\n if (typeof discPath !== \"string\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.discovery.path`,\n `${path}.discovery.path must be a string`,\n );\n ok = false;\n } else {\n discovery.path = discPath;\n }\n }\n for (const key of Object.keys(raw.discovery)) {\n if (key !== \"type\" && key !== \"path\") {\n err(\n ctx,\n \"unknown_key\",\n `${path}.discovery.${key}`,\n `${path}.discovery.${key} is not a discovery key`,\n );\n ok = false;\n }\n }\n entry.discovery = discovery;\n }\n }\n }\n\n return ok ? { entry, present } : undefined;\n}\n\n/** The seven fields both records share, in document order. */\nfunction entryCommon(patch: AIProviderEntryPatch): AIProviderEntryCommon {\n const common: AIProviderEntryCommon = {};\n if (patch.label !== undefined) common.label = patch.label;\n if (patch.preset !== undefined) common.preset = patch.preset;\n if (patch.base_url !== undefined) common.base_url = patch.base_url;\n if (patch.headers !== undefined) common.headers = patch.headers;\n if (patch.credential !== undefined) common.credential = patch.credential;\n if (patch.enabled !== undefined) common.enabled = patch.enabled;\n if (patch.locked !== undefined) common.locked = patch.locked;\n return common;\n}\n\n/**\n * Complete a patch into an entry, or report why it cannot be one.\n *\n * This is the kind-dependent half of validation — the `stt`/`tts` record split\n * (§1.7), the `surface` requirement, the per-transport `params` union (§1.3) —\n * plus the completeness gate itself. It runs on the **merged** entry, because\n * `kind` decides which record applies and a layer is allowed to leave `kind`\n * to a lower one (§1.5).\n *\n * Diagnostics name the entry, not the layers that fed it: the caller that\n * knows the sources ({@link validateMergedRegistry}) attributes them.\n *\n * @param present keys the source wrote, valid or not.\n */\nfunction checkEntry(\n ctx: Ctx,\n patch: AIProviderEntryPatch,\n path: string,\n present: ReadonlySet<string>,\n): AIProviderEntry | undefined {\n const kind = patch.kind;\n if (kind === undefined) {\n // A written-but-rejected `kind` already has its `unknown_kind` diagnostic.\n if (!present.has(\"kind\")) {\n err(\n ctx,\n \"missing_kind\",\n `${path}.kind`,\n `${path}.kind is required and no layer supplies it — ` +\n `an entry needs one of ${AI_PROVIDER_KINDS.join(\", \")}`,\n );\n }\n return undefined;\n }\n\n let ok = true;\n const common = entryCommon(patch);\n // Re-read through the scalar/secret gate: a patch that came from a file has\n // already passed it, but a programmatically injected layer (the control\n // plane's `session`) has not — and the no-literal-secrets rule is one rule,\n // so every site the per-file read scans (`credential.ref`, `headers`,\n // `query_params`, `base_url` userinfo, `params`) is scanned here too.\n if (patch.base_url !== undefined && !readBaseUrl(ctx, patch.base_url, `${path}.base_url`).ok) {\n ok = false;\n }\n if (\n patch.headers !== undefined &&\n readStringMap(ctx, patch.headers, `${path}.headers`, { secretScan: true }) === undefined\n ) {\n ok = false;\n }\n if (\n patch.query_params !== undefined &&\n readStringMap(ctx, patch.query_params, `${path}.query_params`, { secretScan: true }) ===\n undefined\n ) {\n ok = false;\n }\n if (\n patch.credential !== undefined &&\n !readCredential(ctx, patch.credential, `${path}.credential`).ok\n ) {\n ok = false;\n }\n let params: Record<string, string | number | boolean> | undefined;\n if (patch.params !== undefined) {\n const res = readParams(ctx, patch.params, `${path}.params`);\n if (!res.ok) ok = false;\n else params = res.value;\n }\n\n if (kind === \"stt\" || kind === \"tts\") {\n // §1.7 is the whole point of the reduced record, so the message says which\n // key and why.\n for (const key of LLM_ONLY_KEYS) {\n if (!present.has(key)) continue;\n err(\n ctx,\n \"llm_only_key\",\n `${path}.${key}`,\n `${path}.${key} is llm-only and not accepted on kind '${kind}' ` +\n `(voice entries take kind, label, preset, base_url, headers, credential, params, enabled)`,\n );\n ok = false;\n }\n for (const key of present) {\n if (VOICE_KEYS[key] || (LLM_ONLY_KEYS as readonly string[]).includes(key)) continue;\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a registry key`);\n ok = false;\n }\n const voice: AIProviderVoiceEntry = { kind, ...common };\n if (params !== undefined) voice.params = params;\n return ok ? voice : undefined;\n }\n\n const llm: AIProviderLlmEntry = { kind, ...common };\n\n if (patch.surface !== undefined) {\n llm.surface = patch.surface;\n } else if (!present.has(\"surface\") && patch.preset === undefined) {\n err(\n ctx,\n \"missing_surface\",\n `${path}.surface`,\n `${path}.surface is required unless the entry inherits one from a preset`,\n );\n ok = false;\n }\n\n const transportResult = readTransportSlice(ctx, patch.transport, params, path, present);\n if (!transportResult.ok) ok = false;\n else Object.assign(llm, transportResult.slice);\n\n if (patch.query_params !== undefined) llm.query_params = patch.query_params;\n if (patch.model_map !== undefined) llm.model_map = patch.model_map;\n if (patch.capabilities !== undefined) llm.capabilities = patch.capabilities;\n if (patch.discovery !== undefined) llm.discovery = patch.discovery;\n\n return ok ? llm : undefined;\n}\n\n/** Options for {@link validateRegistry}. */\nexport interface ValidateRegistryOptions {\n /** Prefix for diagnostic paths — normally the file the document came from. */\n source?: string;\n /**\n * The layer this document feeds. Given — and not `catalog` — the document is\n * read as **one layer** of the §1.5 stack: an entry may be a partial\n * override, so a `kind`, `surface` or transport `params` that another layer\n * supplies is not an error here. {@link validateMergedRegistry} gates the\n * merged entry instead.\n *\n * Omitted, the document has to stand on its own: every entry must be\n * complete, which is what a writer (`skaile providers add`) checks the entry\n * it just built against.\n */\n layer?: AIProviderLayerId;\n}\n\n/**\n * Validate a parsed `providers.yml` document (§1.1–§1.7).\n *\n * Total: never throws. Entries that produce an error are omitted from\n * `document`, mirroring the resolver's per-entry skip semantics — one bad entry\n * must not take the whole registry down. Every diagnostic names the offending\n * key in `path`.\n *\n * Enforced here whatever the mode: safe entry ids, the `kind`/`surface`/\n * `transport`/`credential.kind` enums, the value types, and the\n * no-literal-secrets rule for `credential.ref`, `headers`, `query_params`,\n * `params` and `base_url` userinfo — a secret must be caught in the file it\n * was written into, not in an anonymous merged document.\n *\n * Enforced only when {@link ValidateRegistryOptions.layer} says this document\n * is complete on its own: that an entry has a `kind`, that an `llm` entry has a\n * `surface`, the voice subset (§1.7), and the per-transport `params` union\n * (§1.3). Those depend on `kind`, which a layer may leave to a lower one.\n *\n * Defaults are deliberately **not** materialized: writing `enabled: true` or\n * `transport: direct` into a layer would let that layer's implicit default\n * override a lower layer's explicit value during the merge. Read them through\n * {@link isEntryEnabled} / {@link entryTransport}.\n */\nexport function validateRegistry(\n raw: unknown,\n options: ValidateRegistryOptions = {},\n): RegistryValidation {\n const ctx: Ctx = { diagnostics: [] };\n const document: AIProviderRegistryDocument = { version: 1, providers: {} };\n const prefix = options.source ? `${options.source}: ` : \"\";\n // The catalog layer is generated from presets, never hand-written, so it is\n // held to the same completeness bar as a standalone document.\n const partial = options.layer !== undefined && options.layer !== \"catalog\";\n\n if (raw === undefined || raw === null) return { document, diagnostics: ctx.diagnostics };\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", \"\", `${prefix}registry document must be a map`);\n return { document, diagnostics: ctx.diagnostics };\n }\n\n if (raw.version !== undefined && raw.version !== 1) {\n err(ctx, \"unsupported_version\", \"version\", `version must be 1 (got ${String(raw.version)})`);\n return { document, diagnostics: ctx.diagnostics };\n }\n\n for (const key of Object.keys(raw)) {\n if (key === \"version\" || key === \"providers\") continue;\n if (key === \"roles\") {\n warn(\n ctx,\n \"roles_not_here\",\n \"roles\",\n \"roles are read from skaile.yaml, not from providers.yml — this block is ignored\",\n );\n continue;\n }\n warn(ctx, \"unknown_key\", key, `${key} is not a registry document key — ignored`);\n }\n\n if (raw.providers === undefined) return { document, diagnostics: ctx.diagnostics };\n if (!isPlainObject(raw.providers)) {\n err(ctx, \"invalid_type\", \"providers\", \"providers must be a map of entry id → entry\");\n return { document, diagnostics: ctx.diagnostics };\n }\n\n for (const [id, rawEntry] of Object.entries(raw.providers)) {\n const path = `providers.${id}`;\n if (!isSafeProviderId(id)) {\n err(\n ctx,\n \"invalid_id\",\n path,\n `'${id}' is not a valid entry id — use lowercase letters, digits, '-' and '_' ` +\n `starting with a letter or digit`,\n );\n continue;\n }\n const read = readEntry(ctx, rawEntry, path);\n if (!read) continue;\n if (partial) {\n document.providers[id] = read.entry;\n continue;\n }\n const entry = checkEntry(ctx, read.entry, path, read.present);\n if (entry) document.providers[id] = entry;\n }\n\n if (options.source) {\n for (const diagnostic of ctx.diagnostics) {\n diagnostic.message = `${prefix}${diagnostic.message}`;\n }\n }\n return { document, diagnostics: ctx.diagnostics };\n}\n\n// ── Reading defaults ───────────────────────────────────────────────────────\n\n/** `enabled` defaults to `true`. */\nexport function isEntryEnabled(entry: AIProviderEntry): boolean {\n return entry.enabled !== false;\n}\n\n/** `transport` defaults to `direct`; voice entries have none. */\nexport function entryTransport(entry: AIProviderEntry): AIProviderTransport | undefined {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") return undefined;\n return entry.transport ?? \"direct\";\n}\n\n/**\n * Resolve an entry's endpoint (§1.3).\n *\n * An explicit `base_url` always wins. Otherwise the transport's template is\n * interpolated from `params` (`publisher` defaults to `google` for Vertex).\n * `transport: direct` has no derivation — an entry that reaches here without a\n * `base_url` inherits one from its preset, which the catalog layer supplies\n * during the merge.\n */\nexport function resolveEntryBaseUrl(entry: AIProviderEntry): string | undefined {\n if (entry.base_url) return entry.base_url;\n const transport = entryTransport(entry);\n if (!transport || transport === \"direct\") return undefined;\n const template = AI_PROVIDER_BASE_URL_TEMPLATES[transport];\n const params = (entry as AIProviderLlmEntry).params as Record<string, string> | undefined;\n if (!params) return undefined;\n const filled: Record<string, string> = { ...params };\n if (transport === \"vertex\") filled.publisher ??= \"google\";\n let out = template;\n for (const [key, value] of Object.entries(filled)) {\n out = out.replaceAll(`{${key}}`, value);\n }\n return /\\{[a-z_]+\\}/.test(out) ? undefined : out;\n}\n\n// ── Merge ──────────────────────────────────────────────────────────────────\n\nconst LAYER_RANK: Record<AIProviderLayerId, number> = {\n catalog: 0,\n user: 1,\n workspace: 2,\n runtime: 3,\n session: 4,\n};\n\n/**\n * Per-key deep merge with `high` winning. Plain objects recurse; everything\n * else (scalars, arrays) is taken wholesale from whichever side defines it.\n */\nfunction deepMerge(high: unknown, low: unknown): unknown {\n if (high === undefined) return low;\n if (low === undefined) return high;\n if (!isPlainObject(high) || !isPlainObject(low)) return high;\n const out: Record<string, unknown> = { ...low };\n for (const [key, value] of Object.entries(high)) {\n out[key] = deepMerge(value, low[key]);\n }\n return out;\n}\n\n/**\n * Merge registry layers into one view (§1.5).\n *\n * Precedence is taken from each layer's `layer` id, not from array position:\n * `catalog` < `user` < `workspace` < `runtime` < `session`. Two layers with the\n * same id are applied in array order, earliest winning. The merge is per key\n * and deep — a workspace entry that sets only `base_url` keeps the user\n * entry's credential, headers and model map.\n *\n * `locked: true` freezes an entry: every **lower** layer's contribution to that\n * id is dropped silently, which is what makes a control-plane-pinned endpoint\n * un-overridable from a checkout. (`skaile providers set` refuses loudly\n * instead — silence is only correct for the merge.)\n *\n * This is a fold over layer *patches* and checks nothing: an entry no layer\n * completed comes out of here incomplete. {@link validateMergedRegistry} is\n * the gate — {@link loadProviderRegistry} runs it, and any other caller that\n * merges hand-written layers has to as well.\n */\nexport function mergeRegistries(layers: AIProviderRegistryLayer[]): MergedAIProviderRegistry {\n const ordered = layers\n .map((layer, index) => ({ layer, index }))\n .sort((a, b) => {\n const rank = LAYER_RANK[b.layer.layer] - LAYER_RANK[a.layer.layer];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map((x) => x.layer);\n\n const providers: AIProviderRegistryPatch = {};\n const origin: Record<string, AIProviderLayerId> = {};\n const order: string[] = [];\n const frozen = new Set<string>();\n\n for (const { layer, providers: entries } of ordered) {\n for (const [id, entry] of Object.entries(entries)) {\n if (frozen.has(id)) continue;\n if (providers[id] === undefined) {\n providers[id] = { ...entry };\n origin[id] = layer;\n order.push(id);\n } else {\n providers[id] = deepMerge(providers[id], entry) as AIProviderEntryPatch;\n }\n if (entry.locked) frozen.add(id);\n }\n }\n\n return {\n version: 1,\n // The fold cannot narrow a patch into an entry; `validateMergedRegistry`\n // is what turns this view into one every consumer can read as complete.\n providers: providers as AIProviderRegistry,\n order,\n origin,\n locked: [...frozen],\n };\n}\n\n/** One labelled input to {@link validateMergedRegistry}. */\nexport interface AIProviderRegistrySource {\n /** Where the layer came from — the file path, for the two on-disk layers. */\n label: string;\n providers: AIProviderRegistryPatch;\n}\n\n/** Options for {@link validateMergedRegistry}. */\nexport interface ValidateMergedRegistryOptions {\n /**\n * The layers that were merged, labelled. A merge-time diagnostic names the\n * files that contributed the entry, because those are what the operator has\n * to edit — collapsing the layers into one anonymous document would lose\n * exactly the information the error is about.\n */\n sources?: AIProviderRegistrySource[];\n}\n\n/** Result of {@link validateMergedRegistry}. */\nexport interface MergedRegistryValidation {\n /** The merged view, with every entry no layer completed removed. */\n registry: MergedAIProviderRegistry;\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Gate the **merged** registry (§1.5) — the completeness half of validation.\n *\n * {@link validateRegistry} in layer mode accepts a partial entry, because a\n * workspace file that names `base_url` alone is an override, not a\n * redefinition. This is where an entry has to be whole: only here has every\n * layer folded in, so only here is `kind` known and with it which record\n * applies (§1.7), whether a `surface` is missing, and which transport the\n * `params` belong to (§1.3).\n *\n * Entries that fail are dropped, so a consumer never sees a half-defined\n * endpoint. Every diagnostic names the entry id and — when `sources` are\n * given — the layers that fed the entry, whatever the check that raised it.\n */\nexport function validateMergedRegistry(\n merged: MergedAIProviderRegistry,\n options: ValidateMergedRegistryOptions = {},\n): MergedRegistryValidation {\n const ctx: Ctx = { diagnostics: [] };\n const providers: AIProviderRegistry = {};\n const origin: Record<string, AIProviderLayerId> = {};\n const order: string[] = [];\n\n for (const id of merged.order) {\n const patch: AIProviderEntryPatch | undefined = merged.providers[id];\n if (patch === undefined) continue;\n const present: ReadonlySet<string> = new Set(\n Object.entries(patch)\n .filter(([, value]) => value !== undefined)\n .map(([key]) => key),\n );\n const from = ctx.diagnostics.length;\n const entry = checkEntry(ctx, patch, `providers.${id}`, present);\n // Attributed once over everything this entry raised, so no message site\n // can forget to say which files the operator has to edit.\n const contributors = (options.sources ?? [])\n .filter((source) => source.providers[id] !== undefined)\n .map((source) => source.label);\n if (contributors.length > 0) {\n const where = ` (contributed by ${contributors.join(\", \")})`;\n for (const diagnostic of ctx.diagnostics.slice(from)) diagnostic.message += where;\n }\n if (entry === undefined) continue;\n providers[id] = entry;\n origin[id] = merged.origin[id];\n order.push(id);\n }\n\n return {\n registry: {\n version: 1,\n providers,\n order,\n origin,\n locked: merged.locked.filter((id) => providers[id] !== undefined),\n },\n diagnostics: ctx.diagnostics,\n };\n}\n\n/** Entries of a registry in registry order, as `[id, entry]` pairs. */\nexport function registryEntries(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderEntry]> {\n if (isMergedRegistry(registry)) {\n return registry.order.map((id) => [id, registry.providers[id]] as [string, AIProviderEntry]);\n }\n return Object.entries(registry);\n}\n\nfunction isMergedRegistry(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): registry is MergedAIProviderRegistry {\n return Array.isArray((registry as MergedAIProviderRegistry).order);\n}\n\n// ── Credential references ──────────────────────────────────────────────────\n\n/** A parsed `credential.ref` (§1.4). */\nexport type AIProviderCredentialRef =\n | { form: \"env\"; name: string }\n | { form: \"cmd\"; command: string }\n | { form: \"platform\"; configId: string }\n | { form: \"keyring\"; service: string; account: string };\n\n/**\n * Parse a `credential.ref`. Returns `undefined` for anything that is not one of\n * the four reference forms — which, in a registry file, means a literal secret.\n */\nexport function parseCredentialRef(ref: string): AIProviderCredentialRef | undefined {\n const match = CREDENTIAL_REF.exec(ref.trim());\n if (!match) return undefined;\n const [, form, rest] = match;\n const body = rest.trim();\n if (body === \"\") return undefined;\n switch (form) {\n case \"env\":\n return ENV_NAME.test(body) ? { form: \"env\", name: body } : undefined;\n case \"cmd\":\n return { form: \"cmd\", command: body };\n case \"platform\":\n return { form: \"platform\", configId: body };\n case \"keyring\": {\n const slash = body.indexOf(\"/\");\n if (slash <= 0 || slash === body.length - 1) return undefined;\n return { form: \"keyring\", service: body.slice(0, slash), account: body.slice(slash + 1) };\n }\n default:\n return undefined;\n }\n}\n\n/** Render a parsed reference back to its `<form>:<body>` string. */\nexport function formatCredentialRef(ref: AIProviderCredentialRef): string {\n switch (ref.form) {\n case \"env\":\n return `env:${ref.name}`;\n case \"cmd\":\n return `cmd:${ref.command}`;\n case \"platform\":\n return `platform:${ref.configId}`;\n case \"keyring\":\n return `keyring:${ref.service}/${ref.account}`;\n }\n}\n\n// ── Model references ───────────────────────────────────────────────────────\n\n/** A model selector resolved against a registry. */\nexport interface ResolvedModelRef {\n /** Entry the model routes to. */\n providerId: string;\n /**\n * Logical model id, after `@role` expansion and before `model_map`. Absent\n * only when a dangling role left the provider without a named model — the\n * driver then uses its own default.\n */\n modelId?: string;\n /** Provider-side id: `model_map[modelId] ?? modelId`. */\n providerModelId?: string;\n /** The role name, when the selector was `@role`. */\n role?: string;\n /** Non-fatal notes: a dangling role, a role pointing at an unknown provider. */\n warnings: string[];\n}\n\n/** Entries a model reference may resolve to: enabled, and not a voice endpoint. */\nfunction selectableEntries(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\nfunction resolveAgainstEntry(\n providerId: string,\n entry: AIProviderLlmEntry,\n modelId: string | undefined,\n extra: { role?: string; warnings: string[] },\n): ResolvedModelRef {\n return {\n providerId,\n modelId,\n providerModelId: modelId === undefined ? undefined : (entry.model_map?.[modelId] ?? modelId),\n role: extra.role,\n warnings: extra.warnings,\n };\n}\n\n/**\n * Resolve a model selector against a registry (§1.6, §9.8).\n *\n * Three forms:\n * - `\"<providerId>/<modelId>\"` — explicit. The leading segment is only treated\n * as a provider when the registry actually has that entry, so vendor-scoped\n * ids (`meta-llama/Llama-3.3-70B`, `openai/gpt-oss-120b`) still resolve as\n * bare model ids.\n * - `\"<modelId>\"` — bare; the first entry in registry order that maps the id\n * wins, else the first entry in registry order.\n * - `\"@role\"` — resolved through `roles` (which lives in `skaile.yaml`). A\n * dangling role is **not** fatal: it falls back to registry order and reports\n * a warning.\n *\n * Returns `undefined` when no entry can serve the reference at all (an empty or\n * fully-disabled registry).\n */\nexport function parseModelRef(\n ref: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n roles?: Record<string, string>,\n): ResolvedModelRef | undefined {\n const entries = selectableEntries(registry);\n if (entries.length === 0) return undefined;\n\n const warnings: string[] = [];\n let selector = ref.trim();\n let role: string | undefined;\n\n if (selector.startsWith(\"@\")) {\n role = selector.slice(1);\n const target = roles?.[role];\n if (!target) {\n warnings.push(`role '@${role}' is not defined in roles — falling back to registry order`);\n const [providerId, entry] = entries[0];\n return resolveAgainstEntry(providerId, entry, undefined, { role, warnings });\n }\n selector = target.trim();\n if (selector.startsWith(\"@\")) {\n warnings.push(`role '@${role}' points at another role ('${selector}') — roles do not chain`);\n const [providerId, entry] = entries[0];\n return resolveAgainstEntry(providerId, entry, undefined, { role, warnings });\n }\n }\n\n const slash = selector.indexOf(\"/\");\n if (slash > 0) {\n const head = selector.slice(0, slash);\n const tail = selector.slice(slash + 1);\n const match = entries.find(([id]) => id === head);\n if (match && tail !== \"\") {\n return resolveAgainstEntry(match[0], match[1], tail, { role, warnings });\n }\n if (!match && registryEntries(registry).some(([id]) => id === head)) {\n warnings.push(`provider '${head}' is disabled or not an llm entry — falling back`);\n }\n }\n\n const mapped = entries.find(\n ([, entry]) => entry.model_map?.[selector] !== undefined || entry.capabilities?.[selector],\n );\n const [providerId, entry] = mapped ?? entries[0];\n return resolveAgainstEntry(providerId, entry, selector, { role, warnings });\n}\n"]}