@skaile/workspaces 6.1.0 → 6.3.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 (406) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/ai-sdk.d.ts +2 -0
  3. package/dist/ai-sdk.js +111 -0
  4. package/dist/ai-sdk.js.map +1 -0
  5. package/dist/{asset-feeds-HJFV7UPW.js → asset-feeds-3YO2352Y.js} +26 -26
  6. package/dist/{asset-feeds-HJFV7UPW.js.map → asset-feeds-3YO2352Y.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +10 -10
  8. package/dist/asset-manager/fragments.js +1 -1
  9. package/dist/asset-manager/index.js +18 -18
  10. package/dist/asset-manager/installer.js +13 -13
  11. package/dist/asset-manager/renderers.js +11 -11
  12. package/dist/asset-manager/src/index.d.ts +149 -16
  13. package/dist/asset-manager/src/index.d.ts.map +1 -1
  14. package/dist/asset-manager/src/installer.d.ts +9 -0
  15. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  16. package/dist/asset-manager/src/renderers.d.ts +7 -0
  17. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  18. package/dist/bridge/harnesses/claude-sdk.js +16 -15
  19. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  20. package/dist/bridge/harnesses/codex.js +25 -17
  21. package/dist/bridge/harnesses/codex.js.map +1 -1
  22. package/dist/bridge/harnesses/continue.js +15 -14
  23. package/dist/bridge/harnesses/continue.js.map +1 -1
  24. package/dist/bridge/harnesses/echo.js +5 -4
  25. package/dist/bridge/harnesses/echo.js.map +1 -1
  26. package/dist/bridge/harnesses/gemini.js +11 -10
  27. package/dist/bridge/harnesses/goose.js +15 -14
  28. package/dist/bridge/harnesses/goose.js.map +1 -1
  29. package/dist/bridge/harnesses/omp.js +16 -8
  30. package/dist/bridge/harnesses/omp.js.map +1 -1
  31. package/dist/bridge/harnesses/opencode.js +15 -14
  32. package/dist/bridge/harnesses/opencode.js.map +1 -1
  33. package/dist/bridge/harnesses/qwen.js +11 -10
  34. package/dist/bridge/harnesses/qwen.js.map +1 -1
  35. package/dist/bridge/index.js +21 -19
  36. package/dist/bridge/src/ai-sdk.d.ts +46 -0
  37. package/dist/bridge/src/ai-sdk.d.ts.map +1 -0
  38. package/dist/bridge/src/harness-model-check.d.ts +15 -0
  39. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  40. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
  41. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
  42. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  43. package/dist/bridge/src/index.d.ts +2 -1
  44. package/dist/bridge/src/index.d.ts.map +1 -1
  45. package/dist/bridge/src/provider-registry-load.d.ts +30 -0
  46. package/dist/bridge/src/provider-registry-load.d.ts.map +1 -0
  47. package/dist/bridge/src/runner-private-env.d.ts +7 -0
  48. package/dist/bridge/src/runner-private-env.d.ts.map +1 -1
  49. package/dist/{chunk-SVTMNSPI.js → chunk-2TFKXSB5.js} +5 -5
  50. package/dist/{chunk-SVTMNSPI.js.map → chunk-2TFKXSB5.js.map} +1 -1
  51. package/dist/{chunk-NB7SYQYP.js → chunk-32FYVSSW.js} +9 -28
  52. package/dist/chunk-32FYVSSW.js.map +1 -0
  53. package/dist/{chunk-QAKUD6QN.js → chunk-4QRJBY2P.js} +3 -3
  54. package/dist/{chunk-QAKUD6QN.js.map → chunk-4QRJBY2P.js.map} +1 -1
  55. package/dist/{chunk-XFIEVEU7.js → chunk-6OHZUUR7.js} +5 -4
  56. package/dist/chunk-6OHZUUR7.js.map +1 -0
  57. package/dist/{chunk-ILLTBKDJ.js → chunk-6UP2EDFN.js} +4 -313
  58. package/dist/chunk-6UP2EDFN.js.map +1 -0
  59. package/dist/{chunk-ZDLUQLI6.js → chunk-6WH2WE4B.js} +15 -5
  60. package/dist/chunk-6WH2WE4B.js.map +1 -0
  61. package/dist/{chunk-HPMQRAIF.js → chunk-72NT2TJU.js} +8 -7
  62. package/dist/chunk-72NT2TJU.js.map +1 -0
  63. package/dist/{chunk-E572OHGY.js → chunk-76FLBODK.js} +4 -3
  64. package/dist/chunk-76FLBODK.js.map +1 -0
  65. package/dist/{chunk-5Y2KGB4H.js → chunk-7MV3NHPT.js} +35 -9
  66. package/dist/chunk-7MV3NHPT.js.map +1 -0
  67. package/dist/{chunk-QEULL4Q3.js → chunk-7QG2WRSN.js} +77 -18
  68. package/dist/chunk-7QG2WRSN.js.map +1 -0
  69. package/dist/{chunk-6YR4ALVX.js → chunk-7RH6E332.js} +7 -7
  70. package/dist/{chunk-6YR4ALVX.js.map → chunk-7RH6E332.js.map} +1 -1
  71. package/dist/{chunk-BBBCJSSU.js → chunk-7TSNR5H5.js} +4 -4
  72. package/dist/{chunk-BBBCJSSU.js.map → chunk-7TSNR5H5.js.map} +1 -1
  73. package/dist/{chunk-3GMOPFWH.js → chunk-AMJ6KEV7.js} +4 -4
  74. package/dist/{chunk-3GMOPFWH.js.map → chunk-AMJ6KEV7.js.map} +1 -1
  75. package/dist/{chunk-X3YGUKCG.js → chunk-BPTWWKGF.js} +3 -3
  76. package/dist/{chunk-X3YGUKCG.js.map → chunk-BPTWWKGF.js.map} +1 -1
  77. package/dist/{chunk-Z7ZEZZB6.js → chunk-C5HFK34M.js} +3 -3
  78. package/dist/chunk-C5HFK34M.js.map +1 -0
  79. package/dist/{chunk-EJPMNDTP.js → chunk-COUJOTAJ.js} +3 -3
  80. package/dist/{chunk-EJPMNDTP.js.map → chunk-COUJOTAJ.js.map} +1 -1
  81. package/dist/{chunk-J72MO2WA.js → chunk-DU26AVK2.js} +10 -9
  82. package/dist/chunk-DU26AVK2.js.map +1 -0
  83. package/dist/{chunk-YLLVSR2U.js → chunk-E5NQRHEB.js} +30 -7
  84. package/dist/chunk-E5NQRHEB.js.map +1 -0
  85. package/dist/{chunk-XGULGQA3.js → chunk-ELSGFI3I.js} +5 -4
  86. package/dist/chunk-ELSGFI3I.js.map +1 -0
  87. package/dist/{chunk-IHFGPHCT.js → chunk-EQNIBBB6.js} +49 -25
  88. package/dist/chunk-EQNIBBB6.js.map +1 -0
  89. package/dist/{chunk-BFMYYNDT.js → chunk-F3D25RGM.js} +11 -3
  90. package/dist/chunk-F3D25RGM.js.map +1 -0
  91. package/dist/{chunk-GNZBFSRB.js → chunk-H622YULS.js} +5 -4
  92. package/dist/chunk-H622YULS.js.map +1 -0
  93. package/dist/{chunk-FKQNBCDW.js → chunk-HDVLBEEX.js} +4 -4
  94. package/dist/{chunk-FKQNBCDW.js.map → chunk-HDVLBEEX.js.map} +1 -1
  95. package/dist/{chunk-AATHJRKL.js → chunk-HGOJEVHY.js} +4 -4
  96. package/dist/{chunk-AATHJRKL.js.map → chunk-HGOJEVHY.js.map} +1 -1
  97. package/dist/{chunk-CEKW3KXP.js → chunk-HH2H2ZV7.js} +18 -15
  98. package/dist/chunk-HH2H2ZV7.js.map +1 -0
  99. package/dist/{chunk-ZFUZ5AKM.js → chunk-HTGTNN2B.js} +3 -3
  100. package/dist/{chunk-ZFUZ5AKM.js.map → chunk-HTGTNN2B.js.map} +1 -1
  101. package/dist/{chunk-LSSYC5IC.js → chunk-IZQOO6MN.js} +2 -2
  102. package/dist/{chunk-LSSYC5IC.js.map → chunk-IZQOO6MN.js.map} +1 -1
  103. package/dist/{chunk-VMVDAZLA.js → chunk-J5JRGBKK.js} +108 -19
  104. package/dist/chunk-J5JRGBKK.js.map +1 -0
  105. package/dist/{chunk-7LP7RCZI.js → chunk-JGH7NB47.js} +5 -5
  106. package/dist/{chunk-7LP7RCZI.js.map → chunk-JGH7NB47.js.map} +1 -1
  107. package/dist/{chunk-RHN5MRQO.js → chunk-JMIKGAUA.js} +27 -5
  108. package/dist/chunk-JMIKGAUA.js.map +1 -0
  109. package/dist/{chunk-HWNK3F3X.js → chunk-KGHYXXXV.js} +588 -76
  110. package/dist/chunk-KGHYXXXV.js.map +1 -0
  111. package/dist/{chunk-7HX6FNKL.js → chunk-KIPCBIFJ.js} +41 -56
  112. package/dist/chunk-KIPCBIFJ.js.map +1 -0
  113. package/dist/{chunk-ZBHZLWV3.js → chunk-KPKGWXUJ.js} +4 -4
  114. package/dist/{chunk-ZBHZLWV3.js.map → chunk-KPKGWXUJ.js.map} +1 -1
  115. package/dist/{chunk-ABFPSVIS.js → chunk-LD6O6QKU.js} +31 -7
  116. package/dist/chunk-LD6O6QKU.js.map +1 -0
  117. package/dist/{chunk-AZ2H6R5I.js → chunk-LEJQAX7G.js} +74 -39
  118. package/dist/chunk-LEJQAX7G.js.map +1 -0
  119. package/dist/{chunk-ZAELRYKS.js → chunk-MD3FUZS3.js} +3 -3
  120. package/dist/{chunk-ZAELRYKS.js.map → chunk-MD3FUZS3.js.map} +1 -1
  121. package/dist/{chunk-NUA33BYO.js → chunk-MYXFR27L.js} +42 -15
  122. package/dist/chunk-MYXFR27L.js.map +1 -0
  123. package/dist/{chunk-KUQAJVYT.js → chunk-PHAMYCZH.js} +142 -28
  124. package/dist/chunk-PHAMYCZH.js.map +1 -0
  125. package/dist/{chunk-NOA6EJXE.js → chunk-PKE3PXOK.js} +3 -3
  126. package/dist/{chunk-NOA6EJXE.js.map → chunk-PKE3PXOK.js.map} +1 -1
  127. package/dist/{chunk-RDTLPOPD.js → chunk-PL52CI4U.js} +4 -4
  128. package/dist/{chunk-RDTLPOPD.js.map → chunk-PL52CI4U.js.map} +1 -1
  129. package/dist/{chunk-VYVTEMAW.js → chunk-PNUM7GUY.js} +3 -3
  130. package/dist/{chunk-VYVTEMAW.js.map → chunk-PNUM7GUY.js.map} +1 -1
  131. package/dist/{chunk-DIGFA7Z5.js → chunk-Q7CU5GQO.js} +13 -5
  132. package/dist/chunk-Q7CU5GQO.js.map +1 -0
  133. package/dist/chunk-QFFMFZIR.js +32 -0
  134. package/dist/chunk-QFFMFZIR.js.map +1 -0
  135. package/dist/{chunk-HMISULVD.js → chunk-QK7AG5AV.js} +4 -4
  136. package/dist/{chunk-HMISULVD.js.map → chunk-QK7AG5AV.js.map} +1 -1
  137. package/dist/{chunk-2LAPHLDH.js → chunk-QTLUZUF2.js} +45 -35
  138. package/dist/chunk-QTLUZUF2.js.map +1 -0
  139. package/dist/{chunk-4MUDQCBP.js → chunk-RFQONXET.js} +3 -3
  140. package/dist/{chunk-4MUDQCBP.js.map → chunk-RFQONXET.js.map} +1 -1
  141. package/dist/{chunk-AITJ7ELM.js → chunk-ROVZCGTN.js} +59 -23
  142. package/dist/chunk-ROVZCGTN.js.map +1 -0
  143. package/dist/{chunk-LSI2IVFT.js → chunk-RXGPFAMN.js} +4 -3
  144. package/dist/chunk-RXGPFAMN.js.map +1 -0
  145. package/dist/chunk-S6KZHPR4.js +315 -0
  146. package/dist/chunk-S6KZHPR4.js.map +1 -0
  147. package/dist/{chunk-EX3GLAL6.js → chunk-TGV2EWGL.js} +5 -5
  148. package/dist/{chunk-EX3GLAL6.js.map → chunk-TGV2EWGL.js.map} +1 -1
  149. package/dist/{chunk-QSYQOTWN.js → chunk-TO5SSMRI.js} +58 -5
  150. package/dist/chunk-TO5SSMRI.js.map +1 -0
  151. package/dist/{chunk-Z3VKUWAX.js → chunk-TSTRH4SM.js} +3 -3
  152. package/dist/{chunk-Z3VKUWAX.js.map → chunk-TSTRH4SM.js.map} +1 -1
  153. package/dist/{chunk-5J4NPGFM.js → chunk-U3SXCVR7.js} +5 -5
  154. package/dist/{chunk-5J4NPGFM.js.map → chunk-U3SXCVR7.js.map} +1 -1
  155. package/dist/{chunk-IRYKRKVQ.js → chunk-URCJIV7T.js} +3 -3
  156. package/dist/{chunk-IRYKRKVQ.js.map → chunk-URCJIV7T.js.map} +1 -1
  157. package/dist/{chunk-ASWTQQ7E.js → chunk-V5BPDB4J.js} +3 -3
  158. package/dist/{chunk-ASWTQQ7E.js.map → chunk-V5BPDB4J.js.map} +1 -1
  159. package/dist/{chunk-ADPM6AYF.js → chunk-VSX2G7LA.js} +3 -3
  160. package/dist/{chunk-ADPM6AYF.js.map → chunk-VSX2G7LA.js.map} +1 -1
  161. package/dist/{chunk-4FVIT5DI.js → chunk-VUWRGMT6.js} +3 -3
  162. package/dist/{chunk-4FVIT5DI.js.map → chunk-VUWRGMT6.js.map} +1 -1
  163. package/dist/{chunk-ZHGKAZJ7.js → chunk-XBQTXGY4.js} +56 -8
  164. package/dist/chunk-XBQTXGY4.js.map +1 -0
  165. package/dist/{chunk-UI745XC3.js → chunk-XEVFSDIF.js} +13 -7
  166. package/dist/chunk-XEVFSDIF.js.map +1 -0
  167. package/dist/{chunk-S2XHGWQC.js → chunk-Y3I4KGLX.js} +44 -15
  168. package/dist/chunk-Y3I4KGLX.js.map +1 -0
  169. package/dist/{chunk-COYF6IG2.js → chunk-YW4ASEUP.js} +5 -5
  170. package/dist/{chunk-COYF6IG2.js.map → chunk-YW4ASEUP.js.map} +1 -1
  171. package/dist/{chunk-DGTI65OC.js → chunk-ZEH4WFEG.js} +17 -11
  172. package/dist/chunk-ZEH4WFEG.js.map +1 -0
  173. package/dist/{claude-code-RE46FJXI.js → claude-code-EUKDGOOO.js} +5 -5
  174. package/dist/{claude-code-RE46FJXI.js.map → claude-code-EUKDGOOO.js.map} +1 -1
  175. package/dist/cli/index.js +350 -141
  176. package/dist/cli/index.js.map +1 -1
  177. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  178. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  179. package/dist/cli/src/commands/config.d.ts.map +1 -1
  180. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  181. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  182. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  183. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  184. package/dist/cli/src/commands/library-index.d.ts +8 -1
  185. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  186. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  187. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  188. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  189. package/dist/cli/src/commands/project.d.ts.map +1 -1
  190. package/dist/cli/src/commands/providers.d.ts.map +1 -1
  191. package/dist/cli/src/commands/rebuild.d.ts.map +1 -1
  192. package/dist/cli/src/commands/run.d.ts.map +1 -1
  193. package/dist/cli/src/commands/serve-preflight.d.ts +31 -1
  194. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  195. package/dist/cli/src/commands/serve.d.ts +10 -0
  196. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  197. package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
  198. package/dist/cli/src/commands/source-manifest.d.ts +19 -7
  199. package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
  200. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  201. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  202. package/dist/cli/src/commands/why.d.ts.map +1 -1
  203. package/dist/cli/src/config-checks.d.ts +23 -5
  204. package/dist/cli/src/config-checks.d.ts.map +1 -1
  205. package/dist/cli/src/harness-error.d.ts +12 -1
  206. package/dist/cli/src/harness-error.d.ts.map +1 -1
  207. package/dist/cli/src/helpers.d.ts +18 -8
  208. package/dist/cli/src/helpers.d.ts.map +1 -1
  209. package/dist/cli/src/plugin-store/index.d.ts +10 -1
  210. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  211. package/dist/cli/src/plugin-store/spec.d.ts +8 -0
  212. package/dist/cli/src/plugin-store/spec.d.ts.map +1 -1
  213. package/dist/cli/src/skill-checks.d.ts +2 -2
  214. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  215. package/dist/connectors/config.js +5 -5
  216. package/dist/connectors/index.js +24 -22
  217. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  218. package/dist/connectors-XYPE2DCQ.js +50 -0
  219. package/dist/{connectors-7THEF7YA.js.map → connectors-XYPE2DCQ.js.map} +1 -1
  220. package/dist/core/framework.js +1 -1
  221. package/dist/core/index.js +9 -9
  222. package/dist/core/manifest.js +2 -2
  223. package/dist/core/models.js +1 -1
  224. package/dist/core/provider-registry-credentials.js +2 -2
  225. package/dist/core/provider-registry.js +1 -1
  226. package/dist/core/publish-manifest.js +3 -3
  227. package/dist/core/ref.js +1 -1
  228. package/dist/core/runtime-assets.js +5 -5
  229. package/dist/core/src/framework.d.ts +5 -3
  230. package/dist/core/src/framework.d.ts.map +1 -1
  231. package/dist/core/src/index.d.ts +2 -1
  232. package/dist/core/src/index.d.ts.map +1 -1
  233. package/dist/core/src/lock.d.ts +12 -0
  234. package/dist/core/src/lock.d.ts.map +1 -1
  235. package/dist/core/src/manifest.d.ts +15 -0
  236. package/dist/core/src/manifest.d.ts.map +1 -1
  237. package/dist/core/src/models.d.ts +7 -0
  238. package/dist/core/src/models.d.ts.map +1 -1
  239. package/dist/core/src/provider-registry.d.ts +6 -0
  240. package/dist/core/src/provider-registry.d.ts.map +1 -1
  241. package/dist/core/src/workspace-config.d.ts +10 -1
  242. package/dist/core/src/workspace-config.d.ts.map +1 -1
  243. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  244. package/dist/core/workspace-config.js +4 -4
  245. package/dist/deploy/index.js +9 -9
  246. package/dist/discovery/index.js +5 -5
  247. package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
  248. package/dist/{ensure-sources-IH7CHSJF.js → ensure-sources-IN3VKHUA.js} +37 -21
  249. package/dist/ensure-sources-IN3VKHUA.js.map +1 -0
  250. package/dist/factory-assets/connectors/box.js +24 -22
  251. package/dist/factory-assets/connectors/deploy.js +24 -22
  252. package/dist/factory-assets/connectors/devserver.js +24 -22
  253. package/dist/factory-assets/connectors/flow/adapter.js +24 -22
  254. package/dist/factory-assets/connectors/flow/engine.js +10 -10
  255. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  256. package/dist/factory-assets/connectors/flow/run-flow.js +26 -24
  257. package/dist/factory-assets/connectors/flow.js +24 -22
  258. package/dist/factory-assets/connectors/git.js +24 -22
  259. package/dist/factory-assets/connectors/gmail.js +24 -22
  260. package/dist/factory-assets/connectors/googledrive.js +24 -22
  261. package/dist/factory-assets/connectors/local.js +24 -22
  262. package/dist/factory-assets/connectors/mattermost.js +24 -22
  263. package/dist/factory-assets/connectors/memory.js +24 -22
  264. package/dist/factory-assets/connectors/minio.js +24 -22
  265. package/dist/factory-assets/connectors/postgres.js +24 -22
  266. package/dist/factory-assets/connectors/s3.js +24 -22
  267. package/dist/factory-assets/connectors/sharepoint.js +24 -22
  268. package/dist/factory-assets/connectors/sqlite.js +24 -22
  269. package/dist/factory-assets/connectors/static-server.js +24 -22
  270. package/dist/factory-assets/connectors/tunnel.js +24 -22
  271. package/dist/factory-assets/connectors/webdav.js +24 -22
  272. package/dist/factory-assets/connectors/xstate-store.js +24 -22
  273. package/dist/factory-assets/connectors/xstate.js +24 -22
  274. package/dist/flows-QAO63TDV.js +26 -0
  275. package/dist/{flows-4JZQ3XFK.js.map → flows-QAO63TDV.js.map} +1 -1
  276. package/dist/helpers-HDVGCF3M.js +54 -0
  277. package/dist/{helpers-JNMK3FC2.js.map → helpers-HDVGCF3M.js.map} +1 -1
  278. package/dist/library/index.js +14 -14
  279. package/dist/library/install.js +5 -5
  280. package/dist/library/src/index.d.ts +1 -1
  281. package/dist/library/src/index.d.ts.map +1 -1
  282. package/dist/library/src/install/index.d.ts +1 -1
  283. package/dist/library/src/install/index.d.ts.map +1 -1
  284. package/dist/library/src/install/install-from-manifest.d.ts +13 -0
  285. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  286. package/dist/library/src/install/source-fetch-github.d.ts.map +1 -1
  287. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  288. package/dist/library/src/remote/remote-catalog-source.d.ts +3 -1
  289. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  290. package/dist/library/src/remote/rest-catalog-source.d.ts +3 -2
  291. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  292. package/dist/{library-publish-I3UWXAHI.js → library-publish-62OWCNB5.js} +56 -55
  293. package/dist/library-publish-62OWCNB5.js.map +1 -0
  294. package/dist/model-endpoint/index.js +13 -12
  295. package/dist/model-endpoint/src/openai-chat.d.ts +7 -2
  296. package/dist/model-endpoint/src/openai-chat.d.ts.map +1 -1
  297. package/dist/model-endpoint/src/openai-shared.d.ts +8 -0
  298. package/dist/model-endpoint/src/openai-shared.d.ts.map +1 -1
  299. package/dist/model-endpoint/src/server.d.ts.map +1 -1
  300. package/dist/model-endpoint/src/types.d.ts +1 -1
  301. package/dist/model-endpoint/src/types.d.ts.map +1 -1
  302. package/dist/model-endpoint/src/usage-cost.d.ts +23 -0
  303. package/dist/model-endpoint/src/usage-cost.d.ts.map +1 -0
  304. package/dist/open-library-TZ7OSDEJ.js +58 -0
  305. package/dist/{open-library-NKKUJLWA.js.map → open-library-TZ7OSDEJ.js.map} +1 -1
  306. package/dist/open-registry-RLZKTJG3.js +32 -0
  307. package/dist/{open-registry-BYAXSHUI.js.map → open-registry-RLZKTJG3.js.map} +1 -1
  308. package/dist/paths-D6LBQETQ.js +22 -0
  309. package/dist/{paths-UKWE35XS.js.map → paths-D6LBQETQ.js.map} +1 -1
  310. package/dist/plugin-store-A5J4TLCH.js +23 -0
  311. package/dist/{plugin-store-ABE35NRX.js.map → plugin-store-A5J4TLCH.js.map} +1 -1
  312. package/dist/project-4AVRES3M.js +88 -0
  313. package/dist/{project-BIPK47JK.js.map → project-4AVRES3M.js.map} +1 -1
  314. package/dist/resolver/index.js +10 -10
  315. package/dist/runner/index.js +41 -39
  316. package/dist/runner/src/capability-roundtrip.d.ts +7 -6
  317. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  318. package/dist/runner/src/serve.d.ts +6 -5
  319. package/dist/runner/src/serve.d.ts.map +1 -1
  320. package/dist/sdk/asset-manager.js +18 -18
  321. package/dist/sdk/bridge.js +21 -19
  322. package/dist/sdk/core.js +9 -9
  323. package/dist/sdk/flow.js +10 -10
  324. package/dist/sdk/index.js +41 -39
  325. package/dist/sdk/index.js.map +1 -1
  326. package/dist/sdk/resolver.js +10 -10
  327. package/dist/sdk/runner.js +41 -39
  328. package/dist/sdk/transport/ws/server.js +10 -10
  329. package/dist/sdk/transport/ws.js +10 -10
  330. package/dist/sdk/transport.js +10 -10
  331. package/dist/{serve-preflight-FLTIBTEX.js → serve-preflight-H2AYMGJ6.js} +65 -35
  332. package/dist/serve-preflight-H2AYMGJ6.js.map +1 -0
  333. package/dist/{setup-AG6NFHSN.js → setup-NSPQD4V4.js} +33 -31
  334. package/dist/setup-NSPQD4V4.js.map +1 -0
  335. package/dist/skills-B533SRVZ.js +26 -0
  336. package/dist/{skills-UQYUHVKO.js.map → skills-B533SRVZ.js.map} +1 -1
  337. package/dist/source-VTECABUO.js +87 -0
  338. package/dist/{source-ASEHI2XS.js.map → source-VTECABUO.js.map} +1 -1
  339. package/dist/source-fetch-github-RWHV4I5Z.js +4 -0
  340. package/dist/{source-fetch-github-ST4MFL3D.js.map → source-fetch-github-RWHV4I5Z.js.map} +1 -1
  341. package/dist/{source-manifest-publish-IEVV3W6J.js → source-manifest-publish-YORI42MN.js} +56 -56
  342. package/dist/source-manifest-publish-YORI42MN.js.map +1 -0
  343. package/dist/transport/index.js +10 -10
  344. package/dist/transport/ws/server.js +10 -10
  345. package/dist/transport/ws.js +10 -10
  346. package/dist/tui/index.js +49 -40
  347. package/dist/tui/index.js.map +1 -1
  348. package/dist/tui/src/repl.d.ts.map +1 -1
  349. package/dist/types/manifests.js +1 -1
  350. package/dist/types/src/manifests/index.d.ts +1 -1
  351. package/dist/types/src/manifests/index.d.ts.map +1 -1
  352. package/dist/types/src/manifests/scaffold-body.d.ts +2 -0
  353. package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
  354. package/dist/workspace-plugin/adapters/mcp.js +31 -29
  355. package/dist/workspace-plugin/adapters/omp.js +15 -15
  356. package/dist/workspace-plugin/index.js +2 -2
  357. package/package.json +27 -1
  358. package/dist/chunk-2LAPHLDH.js.map +0 -1
  359. package/dist/chunk-5Y2KGB4H.js.map +0 -1
  360. package/dist/chunk-7HX6FNKL.js.map +0 -1
  361. package/dist/chunk-ABFPSVIS.js.map +0 -1
  362. package/dist/chunk-AITJ7ELM.js.map +0 -1
  363. package/dist/chunk-AZ2H6R5I.js.map +0 -1
  364. package/dist/chunk-BFMYYNDT.js.map +0 -1
  365. package/dist/chunk-CEKW3KXP.js.map +0 -1
  366. package/dist/chunk-DGTI65OC.js.map +0 -1
  367. package/dist/chunk-DIGFA7Z5.js.map +0 -1
  368. package/dist/chunk-E572OHGY.js.map +0 -1
  369. package/dist/chunk-GNZBFSRB.js.map +0 -1
  370. package/dist/chunk-HPMQRAIF.js.map +0 -1
  371. package/dist/chunk-HWNK3F3X.js.map +0 -1
  372. package/dist/chunk-IHFGPHCT.js.map +0 -1
  373. package/dist/chunk-ILLTBKDJ.js.map +0 -1
  374. package/dist/chunk-J72MO2WA.js.map +0 -1
  375. package/dist/chunk-KUQAJVYT.js.map +0 -1
  376. package/dist/chunk-LSI2IVFT.js.map +0 -1
  377. package/dist/chunk-NB7SYQYP.js.map +0 -1
  378. package/dist/chunk-NUA33BYO.js.map +0 -1
  379. package/dist/chunk-QEULL4Q3.js.map +0 -1
  380. package/dist/chunk-QSYQOTWN.js.map +0 -1
  381. package/dist/chunk-RHN5MRQO.js.map +0 -1
  382. package/dist/chunk-S2XHGWQC.js.map +0 -1
  383. package/dist/chunk-UI745XC3.js.map +0 -1
  384. package/dist/chunk-VMVDAZLA.js.map +0 -1
  385. package/dist/chunk-XFIEVEU7.js.map +0 -1
  386. package/dist/chunk-XGULGQA3.js.map +0 -1
  387. package/dist/chunk-YLLVSR2U.js.map +0 -1
  388. package/dist/chunk-Z7ZEZZB6.js.map +0 -1
  389. package/dist/chunk-ZDLUQLI6.js.map +0 -1
  390. package/dist/chunk-ZHGKAZJ7.js.map +0 -1
  391. package/dist/connectors-7THEF7YA.js +0 -48
  392. package/dist/ensure-sources-IH7CHSJF.js.map +0 -1
  393. package/dist/flows-4JZQ3XFK.js +0 -26
  394. package/dist/helpers-JNMK3FC2.js +0 -38
  395. package/dist/library-publish-I3UWXAHI.js.map +0 -1
  396. package/dist/open-library-NKKUJLWA.js +0 -42
  397. package/dist/open-registry-BYAXSHUI.js +0 -32
  398. package/dist/paths-UKWE35XS.js +0 -22
  399. package/dist/plugin-store-ABE35NRX.js +0 -23
  400. package/dist/project-BIPK47JK.js +0 -86
  401. package/dist/serve-preflight-FLTIBTEX.js.map +0 -1
  402. package/dist/setup-AG6NFHSN.js.map +0 -1
  403. package/dist/skills-UQYUHVKO.js +0 -26
  404. package/dist/source-ASEHI2XS.js +0 -85
  405. package/dist/source-fetch-github-ST4MFL3D.js +0 -4
  406. package/dist/source-manifest-publish-IEVV3W6J.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/harness-capabilities.ts","../bridge/src/provider-materialize/credential-env.ts","../bridge/src/registry.ts"],"names":[],"mappings":"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","file":"chunk-S6KZHPR4.js","sourcesContent":["/**\n * What the runner may ask of a harness, by harness id.\n *\n * Deliberately light: this module imports no harness, no SDK and no `zod`, so a\n * runner file that only needs a capability can import it without loading the\n * harness graph. The plugin-registry singleton is read through its `internal`\n * module (the same file `@skaile/workspaces/plugin-registry` re-exports, so one\n * instance under the bundler's shared chunks), not through the package index,\n * which pulls in the deploy helpers and their `zod` schemas.\n *\n * @docLink packages/bridge/api-reference#registry\n */\n\nimport { pluginRegistry } from \"../../plugin-registry/src/internal.js\";\nimport type { HarnessCapabilities } from \"@skaile/workspaces/types\";\n\n/**\n * Capabilities of a harness that declares none: it recomposes its tools per\n * turn like every bridge harness that is not an in-process SDK, and has no\n * managed session, credentials file or transcript-file resume.\n */\nconst GENERIC_HARNESS_CAPABILITIES: HarnessCapabilities = {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n};\n\n/**\n * Declared capabilities of the built-in harnesses that differ from nothing.\n * `BUILTIN_HARNESS_CATALOG` rows point at these entries, so `listHarnesses()` and\n * {@link harnessCapabilities} read one table. A built-in absent here (echo,\n * gemini, qwen, opencode, goose, continue) takes the generic defaults.\n */\nexport const BUILTIN_HARNESS_CAPABILITIES = {\n // Recomposes its tools per turn, so a hot-plugged MCP server is live.\n omp: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n // The SDK takes in-process server instances and bakes its tool set at\n // creation; it reads Claude's `~/.claude` credentials and JSONL transcripts.\n \"claude-sdk\": {\n inProcessMcpServers: true,\n liveToolUpdates: false,\n managedSession: false,\n claudeCodeCredentials: true,\n resumeNeedsTranscript: true,\n },\n // Standalone SDK recomposes its tools per turn. A host-managed session\n // (native app-server) refreshes its own native tool snapshot instead.\n codex: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: true,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n} as const satisfies Record<string, HarnessCapabilities>;\n\n/**\n * Resolve what the runner may ask of a harness, by harness id, without loading\n * its module. Built-ins read {@link BUILTIN_HARNESS_CAPABILITIES}; a third-party\n * harness reads its registered `HarnessTarget`; an unknown or absent id gets the\n * generic defaults. Fields a harness omits take the generic default too.\n *\n * This is the one place the runner learns harness facts — it never compares an\n * id against `\"claude-sdk\"`, `\"codex\"` or `\"omp\"`.\n *\n * @param id - Harness id (e.g. a session's `harnessType`); `undefined` resolves to the defaults.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function harnessCapabilities(id: string | undefined): HarnessCapabilities {\n const declared = id\n ? Object.hasOwn(BUILTIN_HARNESS_CAPABILITIES, id)\n ? BUILTIN_HARNESS_CAPABILITIES[id as keyof typeof BUILTIN_HARNESS_CAPABILITIES]\n : pluginRegistry.get(\"harness\", id)?.capabilities\n : undefined;\n return { ...GENERIC_HARNESS_CAPABILITIES, ...declared };\n}\n\n/**\n * Whether a hot-plugged MCP server reaches the agent's next turn without a\n * harness restart. A host-managed session refreshes its native tool snapshot\n * itself, so it never takes live updates, whatever the standalone harness does.\n *\n * @param id - Harness id of the live session.\n * @param managed - Whether the session is host-managed (`managedCodex`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport function supportsLiveToolUpdates(id: string | undefined, managed = false): boolean {\n const caps = harnessCapabilities(id);\n return caps.liveToolUpdates && !(managed && caps.managedSession);\n}\n","/**\n * Credential delivery for harness adapters — the one naming rule (§2.3).\n *\n * Every adapter that hands a registry entry's secret to a child process, and\n * every renderer that has to *name* that secret in a config file it writes\n * (omp's `models.yml` `apiKey:`, Codex's `env_key`, OpenCode's `{env:…}`),\n * agrees on one env-var name per entry: `SKAILE_AIP_<UPPER_ID>_KEY`. The name\n * goes in the file, the value goes in the child environment — a rendered\n * config never contains a secret.\n *\n * The platform's secret-env allowlist is a prefix rule on exactly that name,\n * and forge-common delivers the same names when it spawns `skaile serve`, so\n * the transform below is a cross-repo contract: uppercase, every character\n * outside `[A-Za-z0-9]` mapped to `_` (registry ids are `[a-z0-9][a-z0-9_-]*`,\n * so in practice only `-`).\n *\n * Alongside the canonical name, {@link registryCredentialEnv} also sets the\n * *conventional* carrier a CLI already reads (`ANTHROPIC_API_KEY`,\n * `GEMINI_API_KEY`, `GROQ_API_KEY`, …) so a catalog-preset entry works in a\n * harness that has no per-endpoint config file yet.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.4, §2.3\n */\n\nimport {\n type AIProviderEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { resolveCredential } from \"@skaile/workspaces/core/provider-registry-credentials\";\nimport { AI_PROVIDER_PRESETS } from \"../provider-catalog.js\";\n\n/** Options shared by every registry-shaped credential resolution. */\nexport interface RegistryCredentialOptions {\n /** Restrict resolution to one entry — the provider half of a `modelRef`. */\n providerId?: string;\n /** Environment `env:` refs resolve against. Defaults to `process.env`. */\n env?: Record<string, string | undefined>;\n /** Control-plane secrets keyed by config id, for `platform:` refs. */\n secrets?: Record<string, string>;\n /** Run `cmd:` references. Default `true`. */\n allowCommand?: boolean;\n}\n\n/** Prefix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_PREFIX = \"SKAILE_AIP_\";\n\n/** Suffix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_SUFFIX = \"_KEY\";\n\n/**\n * The env-var name that carries a registry entry's credential:\n * `anthropic` → `SKAILE_AIP_ANTHROPIC_KEY`, `my-gw.eu` → `SKAILE_AIP_MY_GW_EU_KEY`.\n *\n * Pure: no environment, no registry, no I/O. Renderers call it per entry while\n * emitting a config file, adapters call it while assembling a child env, and\n * the platform allowlist matches the prefix.\n */\nexport function providerCredentialEnvName(providerId: string): string {\n const slug = providerId.replace(/[^A-Za-z0-9]/g, \"_\").toUpperCase();\n return `${PROVIDER_CREDENTIAL_ENV_PREFIX}${slug}${PROVIDER_CREDENTIAL_ENV_SUFFIX}`;\n}\n\n/**\n * The env var a harness already looks for on its own, when the entry names one.\n *\n * The catalog preset's conventional carrier wins (`GEMINI_API_KEY` for\n * `google`), because that is the name the vendor's own CLI reads; otherwise an\n * `env:NAME` credential reference is taken at face value — the operator named\n * that variable, so the child gets it under the same name. `cmd:`, `platform:`\n * and `keyring:` refs have no conventional carrier and return `undefined`.\n */\nexport function conventionalCredentialEnvName(entry: AIProviderEntry): string | undefined {\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.credential.env) return preset.credential.env;\n const ref = entry.credential?.ref ? parseCredentialRef(entry.credential.ref) : undefined;\n return ref?.form === \"env\" ? ref.name : undefined;\n}\n\n/**\n * Resolve one entry's credential to its value, or `undefined` when there is\n * none to hand over (`kind: none`, an ambient `sigv4`/`google_adc` chain, an\n * unset variable, a reserved `keyring:` ref).\n */\nexport function resolveEntryCredential(\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n }).value;\n}\n\n/**\n * One entry's credential value, including the one the session boundary\n * already resolved for it.\n *\n * A `platform:<configId>` reference is resolved by the runner — it holds the\n * `session_init` secrets map, the harness does not — and materialized into the\n * child environment under {@link providerCredentialEnvName}. So when the\n * reference itself yields nothing, that carrier is consulted: it is the same\n * secret, delivered one step earlier.\n */\nexport function entryCredentialValue(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return (\n resolveEntryCredential(entry, options) ?? options.env?.[providerCredentialEnvName(providerId)]\n );\n}\n\n/** One enabled entry whose credential is declared but cannot be resolved. */\nexport interface UnresolvedProviderCredential {\n providerId: string;\n /** Why it does not resolve, e.g. `environment variable ANTHROPIC_API_KEY is not set`. */\n reason: string;\n}\n\n/**\n * The enabled LLM/embed entries that name a credential this process cannot\n * resolve (the variable is unset, the command fails). A harness must not be\n * handed such an entry: the child would send an empty key and fail with a 401\n * instead of using its own login. Entries with no credential, an ambient\n * signing chain, or a value the session boundary already delivered under\n * {@link providerCredentialEnvName} are fine.\n */\nexport function unresolvedProviderCredentials(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialOptions = {},\n): UnresolvedProviderCredential[] {\n const out: UnresolvedProviderCredential[] = [];\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n if (options.providerId && id !== options.providerId) continue;\n const resolved = resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n });\n if (!resolved.error) continue;\n if (options.env?.[providerCredentialEnvName(id)]) continue;\n out.push({ providerId: id, reason: resolved.error });\n }\n return out;\n}\n\n/** Options for {@link entryCredentialEnv} / {@link registryCredentialEnv}. */\nexport interface RegistryCredentialEnvOptions extends RegistryCredentialOptions {\n /**\n * Also set the harness-conventional carrier\n * ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a\n * harness that reads every endpoint out of a rendered config file and must\n * not inherit a vendor default from a neighbouring entry.\n */\n aliases?: boolean;\n}\n\n/**\n * The credential variables one entry contributes: always\n * `SKAILE_AIP_<ID>_KEY`, plus the conventional carrier unless `aliases` is\n * `false`. Empty when the entry has no resolvable secret.\n */\nexport function entryCredentialEnv(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const value = resolveEntryCredential(entry, options);\n if (!value) return {};\n const out: Record<string, string> = { [providerCredentialEnvName(providerId)]: value };\n if (options.aliases !== false) {\n const alias = conventionalCredentialEnvName(entry);\n if (alias) out[alias] = value;\n }\n return out;\n}\n\n/**\n * Every enabled entry's credential, as a child-process environment fragment.\n *\n * One canonical `SKAILE_AIP_<ID>_KEY` per entry whose credential resolves; the\n * conventional carriers are added underneath, first entry in registry order\n * winning a collision (registry order is highest-precedence layer first, so\n * the alias follows the same precedence the selector does). Entries whose\n * credential cannot be resolved contribute nothing.\n */\nexport function registryCredentialEnv(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const canonical: Record<string, string> = {};\n const aliases: Record<string, string> = {};\n for (const [id, entry] of registryEntries(registry)) {\n if (options.providerId && id !== options.providerId) continue;\n if (!isEntryEnabled(entry)) continue;\n const value = resolveEntryCredential(entry, options);\n if (!value) continue;\n canonical[providerCredentialEnvName(id)] = value;\n if (options.aliases === false) continue;\n const alias = conventionalCredentialEnvName(entry);\n if (alias && aliases[alias] === undefined) aliases[alias] = value;\n }\n return { ...aliases, ...canonical };\n}\n","import type {\n AIProviderRegistry,\n AIProviderSurface,\n MergedAIProviderRegistry,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { HarnessContext } from \"@skaile/workspaces/plugin-registry\";\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport { BUILTIN_HARNESS_CAPABILITIES } from \"./harness-capabilities.js\";\nimport type { AgentConfig, AgentHarness, HarnessInfo } from \"./types.js\";\n\n// Build-time harness gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded harness module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every harness is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\n/**\n * Every wire surface omp can speak — it is the harness the `surface` enum was\n * lifted from, so its list is the enum.\n */\nconst OMP_SURFACES = [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"openai-codex-responses\",\n \"azure-openai-responses\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n] as const satisfies readonly AIProviderSurface[];\n\n/**\n * Static capability metadata for every built-in harness.\n *\n * Pure data — this object imports no harness module and references no harness\n * SDK. {@link listHarnesses} returns it (merged with any third-party harnesses)\n * so selection UIs can enumerate every harness without loading a single\n * harness module. The matching harness module's `HarnessTarget` is registered\n * into the plugin registry by {@link registerBuiltinHarnesses}.\n *\n * `surfaces` and `providerPlurality` are the harness-capability declaration\n * the AI provider registry resolves against (plan §2.3): which wire protocols\n * a harness can be pointed at, and how many registry entries it can use at\n * once. The platform's resolver filters candidate entries on `surfaces`\n * instead of matching vendor names.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const BUILTIN_HARNESS_CATALOG: Record<string, HarnessInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n surfaces: OMP_SURFACES,\n // omp renders the whole registry as its own `models.yml`, so every entry\n // stays selectable and roles / per-subagent models resolve across them.\n providerPlurality: \"registry\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES.omp,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Anthropic's own API, plus the two clouds the SDK addresses natively.\n // Foundry is `anthropic-messages` at a different host, not a surface.\n surfaces: [\"anthropic-messages\", \"bedrock-converse-stream\", \"google-vertex\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES[\"claude-sdk\"],\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Codex's `wire_api` is `responses` or `chat`; its subscription transport\n // is the codex-specific responses flavour.\n surfaces: [\"openai-codex-responses\", \"openai-responses\", \"openai-completions\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES.codex,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Deterministic mock: it never opens a connection, so it speaks no wire\n // surface and no registry entry can be dispatched to it.\n surfaces: [],\n providerPlurality: \"single\",\n },\n gemini: {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n surfaces: [\"google-generative-ai\"],\n providerPlurality: \"single\",\n },\n qwen: {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Driven entirely through OPENAI_BASE_URL / OPENAI_API_KEY.\n surfaces: [\"openai-completions\"],\n providerPlurality: \"single\",\n },\n opencode: {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"google-generative-ai\",\n ],\n providerPlurality: \"credentials-n\",\n },\n goose: {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"bedrock-converse-stream\",\n ],\n providerPlurality: \"credentials-n\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\"anthropic-messages\", \"openai-completions\", \"google-generative-ai\"],\n providerPlurality: \"credentials-n\",\n },\n};\n\nlet _harnessesRegistered = false;\n\n/**\n * Register every built-in harness's `HarnessTarget` into the plugin registry.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the harness module\n * (and, transitively, its SDK). The in-process-SDK harnesses (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded harness's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * **Static import discipline.** Every `import()` specifier below must be a\n * string literal — never aliased through a variable. Indirection defeats\n * `bun --compile`'s static analysis and silently drops the module from the\n * binary.\n *\n * Idempotent: guarded by a module flag so a second call is a no-op (a duplicate\n * `register` would otherwise throw `RegistrationError`).\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function registerBuiltinHarnesses(\n registry: PluginRegistry = pluginRegistry,\n): Promise<void> {\n if (registry === pluginRegistry && _harnessesRegistered) return;\n\n if (!registry.get(\"harness\", \"omp\")) {\n const m = await import(\"@skaile/workspaces/harnesses/omp\");\n registry.register(\"harness\", m.ompHarnessTarget);\n }\n if (!registry.get(\"harness\", \"echo\")) {\n const m = await import(\"@skaile/workspaces/harnesses/echo\");\n registry.register(\"harness\", m.echoHarnessTarget);\n }\n if (INCLUDE_CLAUDE_SDK && !registry.get(\"harness\", \"claude-sdk\")) {\n const m = await import(\"@skaile/workspaces/harnesses/claude-sdk\");\n registry.register(\"harness\", m.claudeSdkHarnessTarget);\n }\n if (INCLUDE_CODEX && !registry.get(\"harness\", \"codex\")) {\n const m = await import(\"@skaile/workspaces/harnesses/codex\");\n registry.register(\"harness\", m.codexHarnessTarget);\n }\n // Subprocess CLI harnesses spawn an external binary the user installs\n // separately — no bundled SDK to dead-code-strip, so (like omp/echo) they\n // carry no build constant and are always registered.\n if (!registry.get(\"harness\", \"gemini\")) {\n const m = await import(\"@skaile/workspaces/harnesses/gemini\");\n registry.register(\"harness\", m.geminiHarnessTarget);\n }\n if (!registry.get(\"harness\", \"qwen\")) {\n const m = await import(\"@skaile/workspaces/harnesses/qwen\");\n registry.register(\"harness\", m.qwenHarnessTarget);\n }\n if (!registry.get(\"harness\", \"opencode\")) {\n const m = await import(\"@skaile/workspaces/harnesses/opencode\");\n registry.register(\"harness\", m.opencodeHarnessTarget);\n }\n if (!registry.get(\"harness\", \"goose\")) {\n const m = await import(\"@skaile/workspaces/harnesses/goose\");\n registry.register(\"harness\", m.gooseHarnessTarget);\n }\n if (!registry.get(\"harness\", \"continue\")) {\n const m = await import(\"@skaile/workspaces/harnesses/continue\");\n registry.register(\"harness\", m.continueHarnessTarget);\n }\n\n if (registry === pluginRegistry) _harnessesRegistered = true;\n}\n\n/**\n * Creates a new harness instance for the given harness id.\n *\n * Ensures the built-in harness targets are registered (idempotent), then looks\n * up the target in the plugin registry and calls its `create()`. The returned\n * harness has not been started yet — call `harness.start()` before sending\n * prompts.\n *\n * @param id - Registered harness identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the harness constructor.\n * @param ctx - Optional harness context (logger / abort signal). Defaults to `{}`.\n * @returns A freshly constructed (not yet started) {@link AgentHarness}.\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered harness at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createHarness(\n id: string,\n config: AgentConfig,\n ctx?: HarnessContext,\n): Promise<AgentHarness> {\n const target = await resolveHarnessTarget(id);\n return target.create(config, ctx ?? {});\n}\n\n/**\n * Resolve a registered harness target by id, ensuring the built-ins are\n * registered first. Throws the canonical \"not bundled\" / \"unknown harness\"\n * errors so every caller (`createHarness`, `listModelsForHarness`) reports an\n * unrecognized id the same way instead of silently degrading.\n *\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered harness at all.\n */\nasync function resolveHarnessTarget(id: string) {\n await registerBuiltinHarnesses();\n const target = pluginRegistry.get(\"harness\", id);\n if (!target) {\n if (id in BUILTIN_HARNESS_CATALOG) {\n throw new Error(`Agent harness \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent harness: \"${id}\". Available: ${listHarnesses()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return target;\n}\n\n/**\n * Returns the capability metadata for every available harness.\n *\n * Enumerates every built-in harness from {@link BUILTIN_HARNESS_CATALOG} without\n * loading a single harness module or harness SDK, then merges in any third-party\n * harness targets registered into the plugin registry that are not already in\n * the catalog. Use this to populate harness selection UIs.\n *\n * @returns Array of {@link HarnessInfo} objects, one per available harness.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listHarnesses(): HarnessInfo[] {\n const merged = new Map<string, HarnessInfo>();\n for (const info of Object.values(BUILTIN_HARNESS_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const meta of pluginRegistry.list(\"harness\")) {\n if (!merged.has(meta.id)) {\n // Third-party harnesses carry no HarnessInfo row; read the capability flags\n // off the registered target (defaulting to conservative false) so a\n // model-agnostic / in-band-abort harness can still advertise them.\n const target = pluginRegistry.get(\"harness\", meta.id);\n merged.set(meta.id, {\n id: meta.id,\n name: meta.displayName,\n modelAgnostic: target?.modelAgnostic ?? false,\n supportsInBandAbort: target?.supportsInBandAbort ?? false,\n // Left absent when the target declares nothing: \"speaks no surface\" and\n // \"did not say\" are different claims, and the platform resolver must be\n // able to tell them apart before it filters a harness out.\n ...(target?.surfaces ? { surfaces: target.surfaces } : {}),\n ...(target?.providerPlurality ? { providerPlurality: target.providerPlurality } : {}),\n ...(target?.capabilities ? { capabilities: target.capabilities } : {}),\n });\n }\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific harness without starting a full agent session.\n *\n * Ensures the built-in harness targets are registered (idempotent), then\n * delegates to the target's optional `listModels()`. Throws on an unknown /\n * not-bundled id (same contract as {@link createHarness}); returns `[]` only\n * when the target exists but exposes no `listModels`.\n *\n * @param harnessId - Registered harness id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param registry - The AI provider registry to discover against — either the\n * bare `id → entry` map or a merged view. Each entry names its credential by\n * reference, resolved through `options` and delivered to the throwaway\n * harness as `SKAILE_AIP_<ID>_KEY` environment entries.\n * @param options - Which entry to restrict to, and where `env:` / `platform:`\n * references resolve from. Defaults to the whole registry against\n * `process.env`.\n * @throws {Error} When `harnessId` is unknown or excluded from this build.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForHarness(\n harnessId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options?: RegistryCredentialOptions,\n): Promise<ModelEntry[]> {\n const target = await resolveHarnessTarget(harnessId);\n return (await target.listModels?.(registry, options)) ?? [];\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { mcpNotRunnableReason } from './chunk-HWNK3F3X.js';
2
- import { fetchAssetFilesFromGitHub } from './chunk-BFMYYNDT.js';
3
- import { isValidAssetName } from './chunk-LSSYC5IC.js';
1
+ import { mcpNotRunnableReason } from './chunk-KGHYXXXV.js';
2
+ import { fetchAssetFilesFromGitHub } from './chunk-F3D25RGM.js';
3
+ import { isValidAssetName } from './chunk-IZQOO6MN.js';
4
4
  import { createHash } from 'crypto';
5
5
 
6
6
  function storeNotInstallableReason(a) {
@@ -27,5 +27,5 @@ async function mcpNotRunnableHere(manifest, name, fetcher = fetchAssetFilesFromG
27
27
  }
28
28
 
29
29
  export { mcpNotRunnableHere, storeNotInstallableReason };
30
- //# sourceMappingURL=chunk-EX3GLAL6.js.map
31
- //# sourceMappingURL=chunk-EX3GLAL6.js.map
30
+ //# sourceMappingURL=chunk-TGV2EWGL.js.map
31
+ //# sourceMappingURL=chunk-TGV2EWGL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/store-addable.ts"],"names":[],"mappings":";;;;;AAsBO,SAAS,0BACd,CAAA,EACoB;AACpB,EAAA,IAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,mDAAA,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,kBAAA,CACpB,QAAA,EACA,IAAA,EACA,OAAA,GAAwB,yBAAA,EACK;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ;AAAA,MAC1B,GAAA,EAAK,SAAS,MAAA,CAAO,GAAA;AAAA,MACrB,SAAA,EAAW,SAAS,MAAA,CAAO,SAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,IAAA,CAAK,IAAI;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,KAAM,IAAA,CAAK,QAAQ,OAAO,KAAA,CAAA;AACnF,IAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-EX3GLAL6.js","sourcesContent":["/**\n * Which store entries `skaile add` can take. The store lists only what `add` can install\n * (owner decision, RCV p385): one rule for `search`, `store search`, `store show` and the\n * `manage` store feed, so a listing never offers a ref that then fails.\n *\n * Every store kind is installable (owner decision, RCW p610): `add` stages the pointer's files\n * into the store cache and deploys them (skills, agents, contracts) or composes them at session\n * start (mcp-server). Only a name that is no canonical asset name cannot be added.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mcpNotRunnableReason } from \"@skaile/workspaces/asset-manager\";\nimport { isValidAssetName } from \"@skaile/workspaces/core\";\nimport { type AssetFetcher, fetchAssetFilesFromGitHub } from \"@skaile/workspaces/library\";\nimport type { CatalogAsset } from \"@skaile/workspaces/plugins\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\n\n/**\n * Why `skaile add` cannot take a store row as printed, or `undefined` when it can: a name that\n * is not a canonical asset name (`UI Rendering` copied from a listing is two shell arguments\n * and no ref).\n */\nexport function storeNotInstallableReason(\n a: Pick<CatalogAsset, \"kind\" | \"name\">,\n): string | undefined {\n if (!isValidAssetName(a.name)) {\n return `the name \"${a.name}\" is not a canonical asset name, so no ref names it`;\n }\n return undefined;\n}\n\n/**\n * Why the `mcp-server` of `manifest` gets no `.mcp.json` entry from this CLI (a Nix-recipe\n * server, a placeholder url), read from its pinned `MCP.md`: the catalog row carries no manifest\n * fields. `undefined` when it would get one, or when the file cannot be fetched or does not match\n * the recorded sha256: nothing is claimed then (p1491).\n *\n * @param fetcher - Fetches the file at the pinned commit; GitHub's raw host by default.\n */\nexport async function mcpNotRunnableHere(\n manifest: Pick<InstallManifest, \"files\" | \"source\">,\n name: string,\n fetcher: AssetFetcher = fetchAssetFilesFromGitHub,\n): Promise<string | undefined> {\n const file = manifest.files.find((f) => f.path === \"MCP.md\" || f.path.endsWith(\"/MCP.md\"));\n if (!file) return undefined;\n try {\n const bytes = await fetcher({\n url: manifest.source.url,\n commitSha: manifest.source.commitSha,\n paths: [file.path],\n });\n const buf = bytes[file.path];\n if (!buf || createHash(\"sha256\").update(buf).digest(\"hex\") !== file.sha256) return undefined;\n return mcpNotRunnableReason(buf.toString(\"utf8\"), name);\n } catch {\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/store-addable.ts"],"names":[],"mappings":";;;;;AAsBO,SAAS,0BACd,CAAA,EACoB;AACpB,EAAA,IAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,mDAAA,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,kBAAA,CACpB,QAAA,EACA,IAAA,EACA,OAAA,GAAwB,yBAAA,EACK;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ;AAAA,MAC1B,GAAA,EAAK,SAAS,MAAA,CAAO,GAAA;AAAA,MACrB,SAAA,EAAW,SAAS,MAAA,CAAO,SAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,IAAA,CAAK,IAAI;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,KAAM,IAAA,CAAK,QAAQ,OAAO,KAAA,CAAA;AACnF,IAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-TGV2EWGL.js","sourcesContent":["/**\n * Which store entries `skaile add` can take. The store lists only what `add` can install\n * (owner decision, RCV p385): one rule for `search`, `store search`, `store show` and the\n * `manage` store feed, so a listing never offers a ref that then fails.\n *\n * Every store kind is installable (owner decision, RCW p610): `add` stages the pointer's files\n * into the store cache and deploys them (skills, agents, contracts) or composes them at session\n * start (mcp-server). Only a name that is no canonical asset name cannot be added.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mcpNotRunnableReason } from \"@skaile/workspaces/asset-manager\";\nimport { isValidAssetName } from \"@skaile/workspaces/core\";\nimport { type AssetFetcher, fetchAssetFilesFromGitHub } from \"@skaile/workspaces/library\";\nimport type { CatalogAsset } from \"@skaile/workspaces/plugins\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\n\n/**\n * Why `skaile add` cannot take a store row as printed, or `undefined` when it can: a name that\n * is not a canonical asset name (`UI Rendering` copied from a listing is two shell arguments\n * and no ref).\n */\nexport function storeNotInstallableReason(\n a: Pick<CatalogAsset, \"kind\" | \"name\">,\n): string | undefined {\n if (!isValidAssetName(a.name)) {\n return `the name \"${a.name}\" is not a canonical asset name, so no ref names it`;\n }\n return undefined;\n}\n\n/**\n * Why the `mcp-server` of `manifest` gets no `.mcp.json` entry from this CLI (a Nix-recipe\n * server, a placeholder url), read from its pinned `MCP.md`: the catalog row carries no manifest\n * fields. `undefined` when it would get one, or when the file cannot be fetched or does not match\n * the recorded sha256: nothing is claimed then (p1491).\n *\n * @param fetcher - Fetches the file at the pinned commit; GitHub's raw host by default.\n */\nexport async function mcpNotRunnableHere(\n manifest: Pick<InstallManifest, \"files\" | \"source\">,\n name: string,\n fetcher: AssetFetcher = fetchAssetFilesFromGitHub,\n): Promise<string | undefined> {\n const file = manifest.files.find((f) => f.path === \"MCP.md\" || f.path.endsWith(\"/MCP.md\"));\n if (!file) return undefined;\n try {\n const bytes = await fetcher({\n url: manifest.source.url,\n commitSha: manifest.source.commitSha,\n paths: [file.path],\n });\n const buf = bytes[file.path];\n if (!buf || createHash(\"sha256\").update(buf).digest(\"hex\") !== file.sha256) return undefined;\n return mcpNotRunnableReason(buf.toString(\"utf8\"), name);\n } catch {\n return undefined;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { pluginRegistry } from './chunk-G5SUWZEU.js';
2
- import { readPluginsLockSlice } from './chunk-VMVDAZLA.js';
2
+ import { readPluginsLockSlice } from './chunk-J5JRGBKK.js';
3
3
  import pc from 'picocolors';
4
4
  import { pathToFileURL } from 'url';
5
5
  import { existsSync, readFileSync, rmSync, writeFileSync, mkdirSync } from 'fs';
@@ -73,6 +73,17 @@ function parseSpec(spec) {
73
73
  function specName(spec) {
74
74
  return parseSpec(spec).name;
75
75
  }
76
+ var NPM_NAME = /^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/;
77
+ function npmSpecError(spec) {
78
+ const trimmed = spec.trim();
79
+ if (trimmed !== "") {
80
+ const { name, range } = parseSpec(trimmed);
81
+ if (NPM_NAME.test(name) && (range.startsWith("file:") || !/[\s/\\]/.test(range))) {
82
+ return void 0;
83
+ }
84
+ }
85
+ return `plugin spec '${spec}' is not an npm package name. Give an npm name with an optional version range, for example @scope/name@1.2.0. To try a local plugin folder, give its package name: name@file:/path/to/dir.`;
86
+ }
76
87
 
77
88
  // cli/src/plugin-store/load.ts
78
89
  async function loadPlugins(projectDir, plugins, registry = pluginRegistry, opts = {}) {
@@ -225,6 +236,47 @@ function condensePluginFailure(reason) {
225
236
  const cause = causes.at(-1) ?? rest.filter((l) => !/A complete log of this run\b/i.test(l)).at(-1);
226
237
  return `${head}: ${cause ?? rest.at(-1)}`;
227
238
  }
239
+ function escapeRegExp(s) {
240
+ return s.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
241
+ }
242
+ function pluginFailureReasons(reason, specs) {
243
+ const out = /* @__PURE__ */ new Map();
244
+ const condensed = condensePluginFailure(reason);
245
+ if (specs.length < 2 || !reason.startsWith("plugin install failed")) return out;
246
+ const lines = reason.split("\n").map((l) => l.trim()).filter((l) => l !== "" && !/A complete log of this run\b/i.test(l));
247
+ const names = specs.map((spec) => {
248
+ try {
249
+ return specName(spec);
250
+ } catch {
251
+ return spec;
252
+ }
253
+ });
254
+ const mentions = (text, name) => {
255
+ const forms = [name, name.replace("/", "%2f"), name.replace("/", "%2F")];
256
+ return forms.some(
257
+ (f) => new RegExp(`(?<![\\w@.-])(?<!@[\\w.~-]+/)${escapeRegExp(f)}(?![\\w-]|\\.\\w)`).test(text)
258
+ );
259
+ };
260
+ const cause = /\berror\b|\bE[A-Z0-9]{3,}\b|\b404\b|notarget|failed to resolve/i;
261
+ const named = [];
262
+ specs.forEach((spec, i) => {
263
+ const name = names[i];
264
+ const line = mentions(condensed, name) ? condensed.replace(/^plugin install failed:\s*/, "") : lines.filter((l) => mentions(l, name) && cause.test(l)).at(-1);
265
+ if (line === void 0) return;
266
+ named.push(name);
267
+ out.set(spec, `plugin install failed: ${line.replace(/^(npm\s+)?(ERR!|error:?)\s*/i, "")}`);
268
+ });
269
+ if (named.length === 0) return /* @__PURE__ */ new Map();
270
+ specs.forEach((spec, i) => {
271
+ if (!out.has(spec)) {
272
+ out.set(
273
+ spec,
274
+ `plugin install failed: ${names[i]} was not installed, the install stopped at ${named.join(", ")}`
275
+ );
276
+ }
277
+ });
278
+ return out;
279
+ }
228
280
  function warnPluginFailed(spec, reason) {
229
281
  let name = spec;
230
282
  try {
@@ -250,10 +302,11 @@ async function loadDeclaredPlugins(projectDir) {
250
302
  for (const f of result.failed) warnPluginFailed(f.spec, f.reason);
251
303
  } catch (err) {
252
304
  const reason = err instanceof Error ? err.message : String(err);
253
- for (const spec of plugins) warnPluginFailed(spec, reason);
305
+ const reasons = pluginFailureReasons(reason, plugins);
306
+ for (const spec of plugins) warnPluginFailed(spec, reasons.get(spec) ?? reason);
254
307
  }
255
308
  }
256
309
 
257
- export { condensePluginFailure, ensurePluginsLoaded, loadDeclaredPlugins, loadPlugins, reconcilePlugins, rollbackPluginStore, specName };
258
- //# sourceMappingURL=chunk-QSYQOTWN.js.map
259
- //# sourceMappingURL=chunk-QSYQOTWN.js.map
310
+ export { condensePluginFailure, ensurePluginsLoaded, loadDeclaredPlugins, loadPlugins, npmSpecError, pluginFailureReasons, reconcilePlugins, rollbackPluginStore, specName };
311
+ //# sourceMappingURL=chunk-TO5SSMRI.js.map
312
+ //# sourceMappingURL=chunk-TO5SSMRI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/src/plugin-store/paths.ts","../cli/src/plugin-store/spec.ts","../cli/src/plugin-store/load.ts","../cli/src/plugin-store/reconcile.ts","../cli/src/plugin-store/index.ts"],"names":["existsSync","readFileSync","join"],"mappings":"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","file":"chunk-TO5SSMRI.js","sourcesContent":["/**\n * Pure path helpers for the project-local plugin store.\n *\n * The store is a self-contained npm workspace owned by the CLI under\n * `<projectDir>/.skaile/plugins/`. Only `resolvePluginEntry` reads the filesystem.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\n/** `<projectDir>/.skaile/plugins` — the store root. */\nexport function pluginsDir(projectDir: string): string {\n return join(projectDir, \".skaile\", \"plugins\");\n}\n\n/** `<store>/package.json` — generated, never user-edited. */\nexport function pluginsPkgJson(projectDir: string): string {\n return join(pluginsDir(projectDir), \"package.json\");\n}\n\n/** `<store>/node_modules` — where reconciled plugin packages land. */\nexport function nodeModulesDir(projectDir: string): string {\n return join(pluginsDir(projectDir), \"node_modules\");\n}\n\n/** `<store>/.reconcile-hash` — SHA of plugins-list + lock slice; skip reinstall when unchanged. */\nexport function reconcileHashFile(projectDir: string): string {\n return join(pluginsDir(projectDir), \".reconcile-hash\");\n}\n\n/** Pick the file an `exports` target points at, preferring the ESM-friendly conditions. */\nfunction exportsTarget(target: unknown): string | undefined {\n if (typeof target === \"string\") return target;\n if (Array.isArray(target)) {\n for (const t of target) {\n const hit = exportsTarget(t);\n if (hit) return hit;\n }\n return undefined;\n }\n if (target && typeof target === \"object\") {\n const map = target as Record<string, unknown>;\n for (const cond of [\"import\", \"node\", \"default\", \"require\"]) {\n if (cond in map) {\n const hit = exportsTarget(map[cond]);\n if (hit) return hit;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Absolute path to a plugin package's entry file under the store's\n * `node_modules`, resolved from its `package.json` (`exports[\".\"]`, then\n * `module`, then `main`, then `index.js`). Node's ESM loader rejects directory\n * imports, so the entry must be a file; `import()` of the result works inside\n * compiled binaries via `pathToFileURL`.\n *\n * @throws When the package is not installed or declares no resolvable entry.\n */\nexport function resolvePluginEntry(projectDir: string, pkgName: string): string {\n const pkgDir = join(nodeModulesDir(projectDir), pkgName);\n const pkgJsonPath = join(pkgDir, \"package.json\");\n if (!existsSync(pkgJsonPath)) {\n throw new Error(`package \"${pkgName}\" is not installed in ${nodeModulesDir(projectDir)}`);\n }\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n exports?: unknown;\n module?: string;\n main?: string;\n };\n let rel: string | undefined;\n if (pkg.exports !== undefined) {\n const root =\n typeof pkg.exports === \"object\" && pkg.exports !== null && !Array.isArray(pkg.exports)\n ? ((pkg.exports as Record<string, unknown>)[\".\"] ?? pkg.exports)\n : pkg.exports;\n rel = exportsTarget(root);\n }\n rel ??= pkg.module ?? pkg.main ?? \"index.js\";\n const entry = resolve(pkgDir, rel);\n if (!existsSync(entry)) {\n throw new Error(`package \"${pkgName}\" entry ${rel} does not exist`);\n }\n return entry;\n}\n","/**\n * Parse npm package specifiers from the `plugins:` list into name + range.\n *\n * The leading `@` of a scope is NOT a separator: only the last `@` at a\n * non-zero index splits the package name from its semver range.\n * \"@skaile/provider-fly@^0.1.0\" → { name: \"@skaile/provider-fly\", range: \"^0.1.0\" }\n * \"@skaile/connector-redis\" → { name: \"@skaile/connector-redis\", range: \"*\" }\n * \"lodash@^4\" → { name: \"lodash\", range: \"^4\" }\n */\n\n/** A parsed plugin specifier: package name plus a semver range (`\"*\"` when omitted). */\nexport interface PluginSpec {\n name: string;\n range: string;\n}\n\n/**\n * Parse a single plugin specifier into `{ name, range }`.\n *\n * @param spec - An npm specifier, e.g. `\"@skaile/provider-fly@^0.1.0\"` or `\"lodash\"`.\n * @returns The package name and semver range (range defaults to `\"*\"`).\n * @throws Error when the specifier is empty.\n */\nexport function parseSpec(spec: string): PluginSpec {\n const trimmed = spec.trim();\n if (!trimmed) throw new Error(\"parseSpec: empty specifier\");\n\n // Find the version-separating `@` — the last one that is not the scope `@`\n // at index 0. A bare `@scope/name` has its only `@` at index 0 (no range).\n const at = trimmed.lastIndexOf(\"@\");\n if (at <= 0) {\n return { name: trimmed, range: \"*\" };\n }\n const name = trimmed.slice(0, at);\n const range = trimmed.slice(at + 1);\n return { name, range: range.length > 0 ? range : \"*\" };\n}\n\n/** Convenience: just the package name of a specifier. */\nexport function specName(spec: string): string {\n return parseSpec(spec).name;\n}\n\n/** An npm package name: optional `@scope/`, then lowercase letters, digits and `. _ ~ -`. */\nconst NPM_NAME = /^(?:@[a-z0-9][a-z0-9._~-]*\\/)?[a-z0-9][a-z0-9._~-]*$/;\n\n/**\n * The refusal for a specifier that is not an npm package name with an optional version range\n * (`./dir`, `../dir`, `/abs/dir`, `file:../dir`, `git+https://…`), or `undefined` when it is\n * one. A bare path or `file:` URL has no package name: the package manager would send it to the\n * registry and fail with its registry error (p1737). A local folder is installed under its\n * package name, `name@file:/path/to/dir`, which this accepts.\n */\nexport function npmSpecError(spec: string): string | undefined {\n const trimmed = spec.trim();\n if (trimmed !== \"\") {\n const { name, range } = parseSpec(trimmed);\n if (NPM_NAME.test(name) && (range.startsWith(\"file:\") || !/[\\s/\\\\]/.test(range))) {\n return undefined;\n }\n }\n return (\n `plugin spec '${spec}' is not an npm package name. Give an npm name with an optional version ` +\n \"range, for example @scope/name@1.2.0. To try a local plugin folder, give its package name: \" +\n \"name@file:/path/to/dir.\"\n );\n}\n","/**\n * Runtime plugin loader: dynamic-import each reconciled plugin and let it\n * self-register into the `pluginRegistry`.\n *\n * Each plugin specifier resolves to an absolute path under the store's\n * `node_modules`; we import it via a `file://` URL so the import works inside\n * `bun --compile` binaries (which bundle only the literal-string switches, but\n * can still execute a `file://` import against the unpacked store on disk).\n * Failures are caught per-plugin so one broken plugin never aborts the rest.\n */\n\nimport { pathToFileURL } from \"node:url\";\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { resolvePluginEntry } from \"./paths.js\";\nimport { parseSpec } from \"./spec.js\";\n\n/** Options for {@link loadPlugins}. */\nexport interface LoadOptions {\n log?: Logger;\n}\n\n/** Result of a load pass: which specs registered and which failed. */\nexport interface LoadResult {\n loaded: string[];\n failed: { spec: string; error: string; reason: string }[];\n}\n\n/** The self-registration entrypoint a plugin module is expected to export. */\ntype PluginModule = { register?: (registry: PluginRegistry) => void };\n\n/**\n * Load and register each plugin in `plugins` into `registry`.\n *\n * @param projectDir - Project root holding `.skaile/plugins/node_modules`.\n * @param plugins - The `skaile.yaml` `plugins:` list (npm specifiers).\n * @param registry - Registry to register into. Defaults to the process-wide `pluginRegistry`.\n * @param opts - Optional logger.\n * @returns Loaded specs + per-plugin failures (never throws).\n */\nexport async function loadPlugins(\n projectDir: string,\n plugins: string[],\n registry: PluginRegistry = pluginRegistry,\n opts: LoadOptions = {},\n): Promise<LoadResult> {\n const loaded: string[] = [];\n const failed: { spec: string; error: string; reason: string }[] = [];\n\n for (const spec of plugins) {\n try {\n const { name } = parseSpec(spec);\n const entry = resolvePluginEntry(projectDir, name);\n const mod = (await import(pathToFileURL(entry).href)) as PluginModule;\n if (typeof mod.register !== \"function\") {\n throw new Error(`plugin \"${name}\" does not export a register() function`);\n }\n mod.register(registry);\n loaded.push(spec);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failed.push({ spec, error: `failed to load plugin \"${spec}\": ${message}`, reason: message });\n opts.log?.warn(`plugin load failed: ${spec}`, { error: message });\n }\n }\n\n return { loaded, failed };\n}\n","/**\n * Reconcile the project-local plugin store (`<projectDir>/.skaile/plugins/`).\n *\n * The reconciler is hash-skipped: it computes a SHA-256 over the sorted plugin\n * list plus the lock file's `plugins` slice and compares it to the stored\n * `.reconcile-hash`. On a match it returns with zero further I/O; otherwise it\n * regenerates the store's `package.json` and runs `bun install` against it.\n *\n * The install step is injectable (`InstallFn`) so tests stay hermetic — they\n * pass a fake installer that records calls and writes a stub `node_modules`.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readPluginsLockSlice } from \"@skaile/workspaces/core\";\nimport { nodeModulesDir, pluginsDir, pluginsPkgJson, reconcileHashFile } from \"./paths.js\";\nimport { parseSpec } from \"./spec.js\";\n\n/** How `InstallFn` may treat the store's lock: `frozen` forbids lock changes. */\nexport interface InstallOptions {\n /**\n * `false` when the spec list changed since the last `package.json`, so the\n * lock has to change too. Defaults to `true` (frozen when a lock exists).\n */\n frozen?: boolean;\n}\n\n/**\n * Installs the store's dependencies. Returns `ok: false` (never throws) on a\n * failed install so the reconciler can surface the captured `output`.\n */\nexport type InstallFn = (\n pluginsDir: string,\n opts?: InstallOptions,\n) => Promise<{ ok: boolean; output: string }>;\n\n/** Options for {@link reconcilePlugins}. */\nexport interface ReconcileOptions {\n /** Injectable installer. Defaults to a real `bun install` of the store. */\n runInstall?: InstallFn;\n /**\n * Lock slice to fold into the reconcile-hash. Defaults to\n * `readPluginsLockSlice(projectDir)` so a lock edit invalidates the hash.\n */\n lockSlice?: unknown;\n}\n\n/** Result of a reconcile pass. */\nexport interface ReconcileResult {\n changed: boolean;\n reason: \"no-plugins\" | \"up-to-date\" | \"reconciled\";\n}\n\n/** Run a command to completion, capturing stdout+stderr. `started: false` when it cannot spawn. */\nasync function runCapture(\n args: string[],\n cwd: string,\n): Promise<{ started: boolean; code: number; output: string }> {\n const { portableSpawn } = await import(\"@skaile/workspaces/core\");\n const proc = portableSpawn(args, { cwd });\n const chunks: string[] = [];\n const decoder = new TextDecoder();\n const pump = async (stream: ReadableStream<Uint8Array>) => {\n const reader = stream.getReader();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(decoder.decode(value, { stream: true }));\n }\n };\n await Promise.all([pump(proc.stdout), pump(proc.stderr)]);\n const code = await proc.exited;\n // `portableSpawn` reports a spawn error (ENOENT) as exit -1 with no pid.\n return { started: proc.pid !== -1, code, output: chunks.join(\"\") };\n}\n\n/**\n * The default real installer: `bun install` inside the store directory, or\n * `npm install` when `bun` is not on PATH. Frozen only when a lock exists and\n * the spec list did not change (`opts.frozen !== false`): a changed list has to\n * rewrite the lock, which a frozen install refuses.\n */\nexport const defaultInstall: InstallFn = async (dir, opts = {}) => {\n const hasBunLock = existsSync(`${dir}/bun.lock`) || existsSync(`${dir}/bun.lockb`);\n const hasNpmLock = existsSync(`${dir}/package-lock.json`);\n const frozen = opts.frozen !== false;\n\n const bunArgs =\n frozen && (hasBunLock || hasNpmLock)\n ? [\"bun\", \"install\", \"--frozen-lockfile\"]\n : [\"bun\", \"install\"];\n const withBun = await runCapture(bunArgs, dir);\n if (withBun.started) return { ok: withBun.code === 0, output: withBun.output };\n\n const npmArgs =\n frozen && hasNpmLock\n ? [\"npm\", \"ci\", \"--ignore-scripts\", \"--no-audit\", \"--no-fund\"]\n : [\"npm\", \"install\", \"--ignore-scripts\", \"--no-audit\", \"--no-fund\"];\n const withNpm = await runCapture(npmArgs, dir);\n if (withNpm.started) return { ok: withNpm.code === 0, output: withNpm.output };\n return {\n ok: false,\n output:\n \"neither bun nor npm found on PATH; plugin install needs one of them (https://bun.sh or https://nodejs.org)\",\n };\n};\n\n/**\n * Generate the store's `package.json` from the plugin specs. Returns the\n * previous file content (`undefined` when there was none) and whether the\n * dependency set changed.\n */\nfunction writePackageJson(\n projectDir: string,\n plugins: string[],\n): { previous: string | undefined; depsChanged: boolean } {\n const dependencies: Record<string, string> = {};\n for (const spec of plugins) {\n const { name, range } = parseSpec(spec);\n dependencies[name] = range;\n }\n const pkg = {\n name: \"skaile-project-plugins\",\n private: true,\n dependencies,\n };\n const file = pluginsPkgJson(projectDir);\n const previous = existsSync(file) ? readFileSync(file, \"utf8\") : undefined;\n let before: Record<string, string> | undefined;\n try {\n before = previous === undefined ? undefined : JSON.parse(previous).dependencies;\n } catch {\n before = undefined;\n }\n const sortedJson = (d: Record<string, string> | undefined) =>\n JSON.stringify(Object.entries(d ?? {}).sort(([a], [b]) => a.localeCompare(b)));\n const depsChanged = before === undefined || sortedJson(before) !== sortedJson(dependencies);\n mkdirSync(pluginsDir(projectDir), { recursive: true });\n writeFileSync(file, `${JSON.stringify(pkg, null, 2)}\\n`);\n return { previous, depsChanged };\n}\n\n/**\n * Reconcile the plugin store for a project.\n *\n * @param projectDir - Project root containing `skaile.yaml` / `skaile.lock.yaml`.\n * @param plugins - The `skaile.yaml` `plugins:` list (npm specifiers).\n * @param opts - Optional injectable installer + lock slice override.\n * @returns Whether the store changed and why.\n */\nexport async function reconcilePlugins(\n projectDir: string,\n plugins: string[],\n opts: ReconcileOptions = {},\n): Promise<ReconcileResult> {\n if (plugins.length === 0) {\n return { changed: false, reason: \"no-plugins\" };\n }\n\n const lockSlice = opts.lockSlice ?? readPluginsLockSlice(projectDir);\n const wantHash = createHash(\"sha256\")\n .update(JSON.stringify({ plugins: [...plugins].sort(), lock: lockSlice }))\n .digest(\"hex\");\n\n const hashFile = reconcileHashFile(projectDir);\n if (existsSync(hashFile)) {\n const have = readFileSync(hashFile, \"utf8\").trim();\n if (have === wantHash) {\n return { changed: false, reason: \"up-to-date\" };\n }\n }\n\n const { previous, depsChanged } = writePackageJson(projectDir, plugins);\n\n const install = opts.runInstall ?? defaultInstall;\n const result = await install(pluginsDir(projectDir), { frozen: !depsChanged });\n if (!result.ok) {\n // A failed install must not leave the spec behind: the next reconcile\n // would compare against it and treat the store as already changed.\n if (previous === undefined) rmSync(pluginsPkgJson(projectDir), { force: true });\n else writeFileSync(pluginsPkgJson(projectDir), previous);\n throw new Error(`plugin install failed:\\n${result.output}`);\n }\n\n writeFileSync(hashFile, wantHash);\n return { changed: true, reason: \"reconciled\" };\n}\n\n/**\n * Put the store back to `previousPlugins` after `plugin install` failed past\n * the reconcile (the plugin installed but does not load). Best effort: a\n * failing reinstall is swallowed, the store is then rebuilt by the next\n * reconcile because the hash no longer matches the declared list.\n *\n * With no previous plugins every generated file of the store goes away\n * (`package.json`, hash, lock file and `node_modules`), so the store keeps\n * neither the rejected spec nor its installed package.\n */\nexport async function rollbackPluginStore(\n projectDir: string,\n previousPlugins: string[],\n opts: ReconcileOptions = {},\n): Promise<void> {\n if (previousPlugins.length === 0) {\n const dir = pluginsDir(projectDir);\n rmSync(pluginsPkgJson(projectDir), { force: true });\n rmSync(reconcileHashFile(projectDir), { force: true });\n rmSync(nodeModulesDir(projectDir), { recursive: true, force: true });\n for (const lock of [\"bun.lock\", \"bun.lockb\", \"package-lock.json\"]) {\n rmSync(join(dir, lock), { force: true });\n }\n return;\n }\n try {\n await reconcilePlugins(projectDir, previousPlugins, opts);\n } catch {\n // the next reconcile retries\n }\n}\n","/**\n * The project-local plugin store: reconcile (`<projectDir>/.skaile/plugins/`)\n * then load the reconciled plugins into the `pluginRegistry`.\n *\n * `ensurePluginsLoaded` is the single entrypoint commands wire in. It is a\n * guarded no-op when `plugins` is empty/undefined — zero overhead for the\n * common case where no project declares `plugins:` in `skaile.yaml`.\n */\n\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport pc from \"picocolors\";\nimport { type LoadResult, loadPlugins } from \"./load.js\";\nimport { type ReconcileOptions, reconcilePlugins } from \"./reconcile.js\";\nimport { specName } from \"./spec.js\";\n\nexport type { LoadResult } from \"./load.js\";\nexport { loadPlugins } from \"./load.js\";\nexport type { ReconcileOptions } from \"./reconcile.js\";\nexport { reconcilePlugins, rollbackPluginStore } from \"./reconcile.js\";\nexport { npmSpecError, specName } from \"./spec.js\";\n\n/** Options for {@link ensurePluginsLoaded}. */\nexport interface EnsurePluginsOptions extends ReconcileOptions {\n log?: Logger;\n}\n\n/**\n * Reconcile the plugin store then load each plugin into `registry`.\n *\n * No-op (returns immediately) when `plugins` is empty/undefined, so the common\n * no-plugins path costs nothing.\n *\n * @param projectDir - Project root.\n * @param plugins - The `skaile.yaml` `plugins:` list (may be undefined).\n * @param registry - Registry to register into. Defaults to `pluginRegistry`.\n * @param opts - Injectable installer / lock slice + optional logger.\n * @returns The load result, or an empty result when there are no plugins.\n */\nexport async function ensurePluginsLoaded(\n projectDir: string,\n plugins: string[] | undefined,\n registry: PluginRegistry = pluginRegistry,\n opts: EnsurePluginsOptions = {},\n): Promise<LoadResult> {\n if (!plugins || plugins.length === 0) {\n return { loaded: [], failed: [] };\n }\n await reconcilePlugins(projectDir, plugins, opts);\n return loadPlugins(projectDir, plugins, registry, { log: opts.log });\n}\n\n/**\n * The installer's output of a failed `plugin install` is a dump (bun's banner, resolver\n * progress, then the `error:` lines). A load warning keeps the first line and the cause of it\n * (p1113); `skaile plugin install <spec>` prints the whole output.\n *\n * bun: the last `error:` line. npm: its `code` line and the first detail line after it\n * (`E404: 404 Not Found - GET …`), never the trailing `A complete log of this run can be found\n * in: …` pointer (p1272).\n */\nexport function condensePluginFailure(reason: string): string {\n const lines = reason\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l !== \"\");\n const [first, ...rest] = lines;\n if (!reason.startsWith(\"plugin install failed\") || first === undefined || rest.length === 0) {\n return reason;\n }\n const head = first.replace(/:$/, \"\");\n const npmPrefix = /^npm (ERR!|error)\\s*/i;\n const npmLines = rest\n .filter((l) => npmPrefix.test(l) && !/^npm \\S+\\s+A complete log of this run\\b/i.test(l))\n .map((l) => l.replace(npmPrefix, \"\"))\n .filter((l) => l !== \"\");\n const codeLine = npmLines.find((l) => /^code\\s+\\S+/i.test(l));\n if (codeLine) {\n const code = codeLine.replace(/^code\\s+/i, \"\");\n const detail = npmLines.find((l) => l !== codeLine && !/^code\\s/i.test(l));\n return `${head}: npm ${code}${detail ? `: ${detail}` : \"\"}`;\n }\n const causes = rest.filter(\n (l) => /^error\\b/i.test(l) || (npmPrefix.test(l) && !/A complete log of this run\\b/i.test(l)),\n );\n const cause =\n causes.at(-1) ?? rest.filter((l) => !/A complete log of this run\\b/i.test(l)).at(-1);\n return `${head}: ${cause ?? rest.at(-1)}`;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\/]/g, \"\\\\$&\");\n}\n\n/**\n * Split the output of one failed install of the whole plugin store into one reason per plugin\n * (p1272): the package manager runs once for every spec, so its output names the plugins that\n * failed. A plugin gets the line that names it (also its URL-encoded form `@scope%2fname`); a\n * plugin the output never names says it was not installed and which plugin the install stopped\n * at. With one plugin, or when the output names none (no `bun` and no `npm`), every plugin keeps\n * the whole condensed reason.\n */\nexport function pluginFailureReasons(\n reason: string,\n specs: readonly string[],\n): Map<string, string> {\n const out = new Map<string, string>();\n const condensed = condensePluginFailure(reason);\n if (specs.length < 2 || !reason.startsWith(\"plugin install failed\")) return out;\n const lines = reason\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l !== \"\" && !/A complete log of this run\\b/i.test(l));\n const names = specs.map((spec) => {\n try {\n return specName(spec);\n } catch {\n return spec;\n }\n });\n const mentions = (text: string, name: string): boolean => {\n const forms = [name, name.replace(\"/\", \"%2f\"), name.replace(\"/\", \"%2F\")];\n return forms.some((f) =>\n new RegExp(`(?<![\\\\w@.-])(?<!@[\\\\w.~-]+/)${escapeRegExp(f)}(?![\\\\w-]|\\\\.\\\\w)`).test(text),\n );\n };\n const cause = /\\berror\\b|\\bE[A-Z0-9]{3,}\\b|\\b404\\b|notarget|failed to resolve/i;\n const named: string[] = [];\n specs.forEach((spec, i) => {\n const name = names[i] as string;\n const line = mentions(condensed, name)\n ? condensed.replace(/^plugin install failed:\\s*/, \"\")\n : lines.filter((l) => mentions(l, name) && cause.test(l)).at(-1);\n if (line === undefined) return;\n named.push(name);\n out.set(spec, `plugin install failed: ${line.replace(/^(npm\\s+)?(ERR!|error:?)\\s*/i, \"\")}`);\n });\n if (named.length === 0) return new Map();\n specs.forEach((spec, i) => {\n if (!out.has(spec)) {\n out.set(\n spec,\n `plugin install failed: ${names[i]} was not installed, the install stopped at ${named.join(\", \")}`,\n );\n }\n });\n return out;\n}\n\n/** One `! plugin <name> failed to load: <reason>` line on stderr (stdout carries a run's answer). */\nfunction warnPluginFailed(spec: string, reason: string): void {\n let name = spec;\n try {\n name = specName(spec);\n } catch {\n /* a spec that does not parse is named as written */\n }\n process.stderr.write(\n ` ${pc.yellow(\"!\")} plugin ${name} failed to load: ${condensePluginFailure(reason)}\\n`,\n );\n}\n\n/**\n * Reconcile + load the `plugins:` of the project's `skaile.yaml` into the process registry, so a\n * plugin's harness is known to `run`, `repl` and `config set harness`. A plugin that fails to\n * reconcile or load is skipped (its harness stays unknown, the command goes on) and named in one\n * `! plugin <name> failed to load: <reason>` line on stderr. An unreadable config is not this\n * function's to report: the command reads it again and says so.\n */\nexport async function loadDeclaredPlugins(projectDir: string): Promise<void> {\n let plugins: string[] | undefined;\n try {\n const { resolveSkWorkspaceConfig } = await import(\"@skaile/workspaces/core\");\n plugins = resolveSkWorkspaceConfig(projectDir).plugins;\n } catch {\n return;\n }\n if (!plugins || plugins.length === 0) return;\n try {\n const result = await ensurePluginsLoaded(projectDir, plugins, pluginRegistry);\n for (const f of result.failed) warnPluginFailed(f.spec, f.reason);\n } catch (err) {\n // The store could not be reconciled: no plugin was loaded.\n const reason = err instanceof Error ? err.message : String(err);\n const reasons = pluginFailureReasons(reason, plugins);\n for (const spec of plugins) warnPluginFailed(spec, reasons.get(spec) ?? reason);\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { findAiAssetsRoot } from './chunk-VYVTEMAW.js';
1
+ import { findAiAssetsRoot } from './chunk-PNUM7GUY.js';
2
2
 
3
3
  // workspace-plugin/src/utils/ai-assets.ts
4
4
  function findAiAssetsRoot2(startDir) {
@@ -6,5 +6,5 @@ function findAiAssetsRoot2(startDir) {
6
6
  }
7
7
 
8
8
  export { findAiAssetsRoot2 as findAiAssetsRoot };
9
- //# sourceMappingURL=chunk-Z3VKUWAX.js.map
10
- //# sourceMappingURL=chunk-Z3VKUWAX.js.map
9
+ //# sourceMappingURL=chunk-TSTRH4SM.js.map
10
+ //# sourceMappingURL=chunk-TSTRH4SM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../workspace-plugin/src/utils/ai-assets.ts"],"names":["findAiAssetsRoot"],"mappings":";;;AA+BO,SAASA,kBAAiB,QAAA,EAA0C;AACzE,EAAA,OAAO,iBAAuB,QAAQ,CAAA;AACxC","file":"chunk-Z3VKUWAX.js","sourcesContent":["// utils/ai-assets.ts\n// Shared utility for locating the ai-assets root directory.\n//\n// This is NOT a startup path (an earlier comment here claimed it was). Every\n// caller is an agent-invokable tool in `tools/flows.ts` / `tools/skills.ts`, so\n// the walk runs on a request path inside the long-lived `skaile serve` process,\n// once per tool invocation. With `projectDir = /skaile` the upward walk passes\n// directly beside the rclone FUSE workspace mount, so a synchronous `statSync`\n// here parks the whole event loop when that mount wedges — the failure mode\n// behind the 2026-08-07 outages. See issue #454.\nimport { findAiAssetsRoot as findAiAssetsRootShared } from \"@skaile/workspaces/asset-manager/catalog-deployer\";\n\n/**\n * Walk up from `startDir` looking for an `ai-assets/` directory.\n *\n * Delegates to the shared implementation in `asset-manager/catalog-deployer`,\n * which is async, deadline-bounded, level-capped, and refuses a candidate that\n * resolves at or under a workspace mount (continuing upward so a legitimate\n * parent still wins).\n *\n * @param startDir - Absolute path to begin the upward search from (typically\n * the skaile `projectDir`).\n * Note the upward walk is now level-capped rather than running to the\n * filesystem root. Six levels covers every real layout and stops an\n * unbounded climb across mount boundaries.\n *\n * @returns Absolute path to the first usable `ai-assets/` directory found, or\n * `null` if no match exists within the cap.\n *\n * @docLink packages/workspace-plugin/concepts#workspaceplugin-lifecycle\n */\nexport function findAiAssetsRoot(startDir: string): Promise<string | null> {\n return findAiAssetsRootShared(startDir);\n}\n"]}
1
+ {"version":3,"sources":["../workspace-plugin/src/utils/ai-assets.ts"],"names":["findAiAssetsRoot"],"mappings":";;;AA+BO,SAASA,kBAAiB,QAAA,EAA0C;AACzE,EAAA,OAAO,iBAAuB,QAAQ,CAAA;AACxC","file":"chunk-TSTRH4SM.js","sourcesContent":["// utils/ai-assets.ts\n// Shared utility for locating the ai-assets root directory.\n//\n// This is NOT a startup path (an earlier comment here claimed it was). Every\n// caller is an agent-invokable tool in `tools/flows.ts` / `tools/skills.ts`, so\n// the walk runs on a request path inside the long-lived `skaile serve` process,\n// once per tool invocation. With `projectDir = /skaile` the upward walk passes\n// directly beside the rclone FUSE workspace mount, so a synchronous `statSync`\n// here parks the whole event loop when that mount wedges — the failure mode\n// behind the 2026-08-07 outages. See issue #454.\nimport { findAiAssetsRoot as findAiAssetsRootShared } from \"@skaile/workspaces/asset-manager/catalog-deployer\";\n\n/**\n * Walk up from `startDir` looking for an `ai-assets/` directory.\n *\n * Delegates to the shared implementation in `asset-manager/catalog-deployer`,\n * which is async, deadline-bounded, level-capped, and refuses a candidate that\n * resolves at or under a workspace mount (continuing upward so a legitimate\n * parent still wins).\n *\n * @param startDir - Absolute path to begin the upward search from (typically\n * the skaile `projectDir`).\n * Note the upward walk is now level-capped rather than running to the\n * filesystem root. Six levels covers every real layout and stops an\n * unbounded climb across mount boundaries.\n *\n * @returns Absolute path to the first usable `ai-assets/` directory found, or\n * `null` if no match exists within the cap.\n *\n * @docLink packages/workspace-plugin/concepts#workspaceplugin-lifecycle\n */\nexport function findAiAssetsRoot(startDir: string): Promise<string | null> {\n return findAiAssetsRootShared(startDir);\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { getProviderPreset, resolvePresetBaseUrl, expandPreset, resolveProbeUrl, buildCredentialHeaders, presetBaseUrl } from './chunk-ILLTBKDJ.js';
2
- import { modelIdSchemaForTarget } from './chunk-E572OHGY.js';
3
- import { resolveEntryBaseUrl, entryTransport, parseModelRef, registryEntries } from './chunk-LSI2IVFT.js';
1
+ import { getProviderPreset, resolvePresetBaseUrl, expandPreset, resolveProbeUrl, buildCredentialHeaders, presetBaseUrl } from './chunk-6UP2EDFN.js';
2
+ import { modelIdSchemaForTarget } from './chunk-76FLBODK.js';
3
+ import { resolveEntryBaseUrl, entryTransport, parseModelRef, registryEntries } from './chunk-RXGPFAMN.js';
4
4
 
5
5
  // bridge/src/models.ts
6
6
  function humanize(id) {
@@ -323,5 +323,5 @@ function resolveModelTier(tier, sessionModel, options = {}) {
323
323
  }
324
324
 
325
325
  export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, modelIdTargetForEntry, resolveManifestModel, resolveModelCapabilities, resolveModelTier };
326
- //# sourceMappingURL=chunk-5J4NPGFM.js.map
327
- //# sourceMappingURL=chunk-5J4NPGFM.js.map
326
+ //# sourceMappingURL=chunk-U3SXCVR7.js.map
327
+ //# sourceMappingURL=chunk-U3SXCVR7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/models.ts"],"names":[],"mappings":"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","file":"chunk-5J4NPGFM.js","sourcesContent":["/**\n * Model catalog — static fallback + live provider API fetching.\n *\n * Provides `fetchProviderModels(provider, apiKey)` for live model lists and\n * `getStaticModels(provider)` as an offline fallback.\n * OMP model listing is handled by `OmpHarness.listModels()` in the bridge harness.\n */\n\nimport {\n type AIProviderCapabilities,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n entryTransport,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { type ModelIdTarget, modelIdSchemaForTarget } from \"@skaile/workspaces/types/manifests\";\nimport {\n buildCredentialHeaders,\n expandPreset,\n getProviderPreset,\n presetBaseUrl,\n resolvePresetBaseUrl,\n resolveProbeUrl,\n} from \"./provider-catalog.js\";\n\n/**\n * A single LLM model entry returned by the model catalog.\n *\n * Used by `getModels`, `getStaticModels`, and `fetchProviderModels` to represent\n * an available model for a provider.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport interface ModelEntry {\n /** Provider-specific model identifier used in API calls (e.g. `\"claude-sonnet-4-5\"`). */\n id: string;\n /** Human-readable display name for UIs and logs (e.g. `\"Claude Sonnet 4.5\"`). */\n name: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider API configs (for fetching model lists)\n// ---------------------------------------------------------------------------\n\n/** Extract ModelEntry[] from a provider's parsed models-list JSON response. */\ntype ParseModels = (body: any) => ModelEntry[];\n\n/** Humanize a model ID into a display name (e.g. \"claude-sonnet-4-6\" → \"Claude Sonnet 4 6\") */\nfunction humanize(id: string): string {\n return id\n .replace(/^accounts\\/[^/]+\\/models\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Filter function used by providers that return the OpenAI-style /v1/models list.\n * Keeps only chat/completion models, skips embeddings, moderation, tts, whisper, dall-e, etc.\n */\nfunction isLikelyChatModel(id: string): boolean {\n const skip = /embed|moderat|tts|whisper|dall-e|davinci|babbage|ada-00|text-/i;\n return !skip.test(id);\n}\n\n// Per-provider response parsers. The endpoint URL and the credential header\n// come from the catalog preset (provider-catalog.ts), joined in\n// fetchProviderModels.\nconst PROVIDER_PARSERS: Record<string, ParseModels> = {\n anthropic: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && !m.id.includes(\"embed\"))\n .map((m: any) => ({\n id: m.id,\n name: m.display_name ?? humanize(m.id),\n }));\n },\n openai: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n openrouter: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id)\n .map((m: any) => ({ id: m.id, name: m.name ?? humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n mistral: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n groq: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n deepseek: (body) => {\n const models = body?.data ?? [];\n return models\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n xai: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n together: (body) => {\n const models = body?.data ?? body ?? [];\n const arr = Array.isArray(models) ? models : [];\n return arr\n .filter((m: any) => m.id && m.type === \"chat\")\n .map((m: any) => ({ id: m.id, name: m.display_name ?? humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n fireworks: (body) => {\n const models = body?.data ?? [];\n return models\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n google: (body) => {\n const models = body?.models ?? [];\n return models\n .filter((m: any) => m.supportedGenerationMethods?.includes(\"generateContent\"))\n .map((m: any) => ({\n id: (m.name ?? \"\").replace(/^models\\//, \"\"),\n name: m.displayName ?? humanize(m.name ?? \"\"),\n }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n};\n\n// ---------------------------------------------------------------------------\n// Live fetch\n// ---------------------------------------------------------------------------\n\n/**\n * Result of a model-list fetch operation, with source attribution.\n *\n * Returned by {@link fetchProviderModels} and {@link getModels}. When `ok` is `false`,\n * `models` is empty and `error` describes the failure. The `source` field indicates\n * whether the list came from a live API call or the offline static catalog.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport interface FetchModelsResult {\n /** `true` when the fetch succeeded and `models` is populated. */\n ok: boolean;\n /** Fetched model list; empty on failure. */\n models: ModelEntry[];\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n /** Whether the result came from a live API call or the static fallback. */\n source: \"api\" | \"static\";\n}\n\n/**\n * Options controlling where a model-list fetch is addressed.\n *\n * @since 1.5.0\n */\nexport interface FetchModelsOptions {\n /**\n * Base URL to resolve the provider's models endpoint against — e.g. the\n * gateway a session already routes completions through. Overrides the\n * provider's `baseUrlEnv` value.\n */\n baseUrl?: string;\n /**\n * Environment consulted for the provider's base-URL env var\n * (`ANTHROPIC_BASE_URL` for `anthropic`). Defaults to `process.env`; pass an\n * explicit record to keep a call hermetic.\n */\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Fetch the model list from a provider's REST API.\n *\n * Returns `{ ok: true, models, source: 'api' }` on success, or\n * `{ ok: false, models: [], error }` on any HTTP or network failure — the\n * caller should fall back to {@link getStaticModels} in that case.\n *\n * The endpoint, the credential header and the response path all come from the\n * catalog preset named by `provider` ({@link resolvePresetBaseUrl},\n * {@link resolveProbeUrl}, {@link buildCredentialHeaders}), so discovery hits\n * the same host dispatch does — including a gateway named by `baseUrl` or by\n * the vendor's own `*_BASE_URL` variable.\n *\n * @param provider - Catalog preset id (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param apiKey - API key presented in the preset's credential header.\n * @param options - Optional base-URL / environment overrides.\n * @returns Resolved model list with source attribution.\n * @docLink packages/bridge/api-reference#models\n */\nexport async function fetchProviderModels(\n provider: string,\n apiKey: string,\n options: FetchModelsOptions = {},\n): Promise<FetchModelsResult> {\n const preset = getProviderPreset(provider);\n const parse = PROVIDER_PARSERS[provider];\n if (!preset || !parse) {\n return {\n ok: false,\n models: [],\n error: `No API config for provider: ${provider}`,\n source: \"static\",\n };\n }\n\n const baseUrl = resolvePresetBaseUrl(preset, {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n env: options.env ?? process.env,\n });\n const entry = expandPreset(preset, baseUrl ? { baseUrl } : {});\n const url = resolveProbeUrl(entry);\n if (!url) {\n return {\n ok: false,\n models: [],\n error: `Provider ${provider} exposes no models endpoint`,\n source: \"static\",\n };\n }\n // Static non-secret headers (Anthropic's `anthropic-version`) plus the\n // credential carrier the preset's `auth_header` names.\n const headers = { ...entry.headers, ...buildCredentialHeaders(entry, apiKey) };\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return {\n ok: false,\n models: [],\n error: `API returned HTTP ${response.status}`,\n source: \"static\",\n };\n }\n\n const body = await response.json();\n const models = parse(body);\n\n return { ok: true, models, source: \"api\" };\n } catch (err: any) {\n const msg =\n err.name === \"AbortError\" ? \"Request timed out (10s)\" : (err.message ?? \"Network error\");\n return { ok: false, models: [], error: msg, source: \"static\" };\n }\n}\n\n/**\n * Get models for a provider, trying the live API first and falling back to the static catalog.\n *\n * When no `apiKey` is provided the static catalog is returned immediately without\n * a network call. When the live API fails or returns an empty list, the static\n * catalog is used as a fallback — the result's `source` field indicates which was used.\n *\n * @param provider - Provider name (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param apiKey - Optional API key; omit to skip the live fetch and use the static catalog.\n * @param options - Optional base-URL / environment overrides (see {@link FetchModelsOptions}).\n * @returns Resolved model list with source attribution.\n * @docLink packages/bridge/api-reference#models\n */\nexport async function getModels(\n provider: string,\n apiKey?: string,\n options: FetchModelsOptions = {},\n): Promise<FetchModelsResult> {\n if (!apiKey) {\n const models = getStaticModels(provider);\n return { ok: true, models, source: \"static\" };\n }\n\n const result = await fetchProviderModels(provider, apiKey, options);\n if (result.ok && result.models.length > 0) {\n return result;\n }\n\n // Fall back to static\n const staticModels = getStaticModels(provider);\n if (staticModels.length > 0) {\n return { ok: true, models: staticModels, source: \"static\", error: result.error };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Static catalog (offline fallback)\n// ---------------------------------------------------------------------------\n\n/**\n * Offline model catalog keyed by provider name.\n *\n * Used as a fallback by {@link getModels} when the live provider API is unreachable or\n * returns an empty list. Covers Anthropic, OpenAI, Google, Mistral, Groq, DeepSeek,\n * xAI, Together, Fireworks, and OpenRouter. Update this list when providers add new\n * models and a live fetch is not available.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport const STATIC_MODELS: Record<string, ModelEntry[]> = {\n anthropic: [\n { id: \"claude-opus-4-6\", name: \"Claude Opus 4.6\" },\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet 4.6\" },\n { id: \"claude-haiku-4-5-20251001\", name: \"Claude Haiku 4.5\" },\n { id: \"claude-opus-4-5\", name: \"Claude Opus 4.5\" },\n { id: \"claude-sonnet-4-5\", name: \"Claude Sonnet 4.5\" },\n ],\n openai: [\n { id: \"gpt-4o\", name: \"GPT-4o\" },\n { id: \"gpt-4o-mini\", name: \"GPT-4o Mini\" },\n { id: \"gpt-4.1\", name: \"GPT-4.1\" },\n { id: \"gpt-4.1-mini\", name: \"GPT-4.1 Mini\" },\n { id: \"o3\", name: \"o3\" },\n { id: \"o4-mini\", name: \"o4-mini\" },\n ],\n google: [\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"gemini-2.0-flash\", name: \"Gemini 2.0 Flash\" },\n ],\n mistral: [\n { id: \"mistral-large-latest\", name: \"Mistral Large\" },\n { id: \"mistral-small-latest\", name: \"Mistral Small\" },\n { id: \"codestral-latest\", name: \"Codestral\" },\n ],\n groq: [\n { id: \"llama-3.3-70b-versatile\", name: \"Llama 3.3 70B\" },\n { id: \"llama-3.1-8b-instant\", name: \"Llama 3.1 8B\" },\n { id: \"mixtral-8x7b-32768\", name: \"Mixtral 8x7B\" },\n ],\n deepseek: [\n { id: \"deepseek-chat\", name: \"DeepSeek Chat\" },\n { id: \"deepseek-reasoner\", name: \"DeepSeek Reasoner\" },\n ],\n xai: [\n { id: \"grok-3\", name: \"Grok 3\" },\n { id: \"grok-3-mini\", name: \"Grok 3 Mini\" },\n ],\n together: [\n { id: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\", name: \"Llama 3.3 70B Turbo\" },\n { id: \"mistralai/Mixtral-8x7B-Instruct-v0.1\", name: \"Mixtral 8x7B\" },\n ],\n fireworks: [\n { id: \"accounts/fireworks/models/llama-v3p3-70b-instruct\", name: \"Llama 3.3 70B\" },\n { id: \"accounts/fireworks/models/deepseek-v3\", name: \"DeepSeek v3\" },\n ],\n openrouter: [\n { id: \"anthropic/claude-sonnet-4.6\", name: \"Claude Sonnet 4.6\" },\n { id: \"anthropic/claude-opus-4.6\", name: \"Claude Opus 4.6\" },\n { id: \"anthropic/claude-haiku-4.5\", name: \"Claude Haiku 4.5\" },\n { id: \"anthropic/claude-sonnet-4.5\", name: \"Claude Sonnet 4.5\" },\n { id: \"anthropic/claude-3.7-sonnet\", name: \"Claude 3.7 Sonnet\" },\n { id: \"openai/gpt-4o\", name: \"GPT-4o\" },\n { id: \"openai/gpt-4.1\", name: \"GPT-4.1\" },\n { id: \"openai/gpt-4.1-mini\", name: \"GPT-4.1 Mini\" },\n { id: \"google/gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"google/gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"meta-llama/llama-4-maverick\", name: \"Llama 4 Maverick\" },\n { id: \"meta-llama/llama-3.3-70b-instruct\", name: \"Llama 3.3 70B\" },\n { id: \"deepseek/deepseek-chat-v3-0324\", name: \"DeepSeek v3\" },\n { id: \"deepseek/deepseek-r1\", name: \"DeepSeek R1\" },\n { id: \"mistralai/mistral-large-2411\", name: \"Mistral Large 2\" },\n ],\n};\n\n/**\n * Get models for a specific provider from the static catalog, or empty array if unknown.\n *\n * Pure synchronous lookup — no network call. Use when the provider API is unavailable\n * or when a fast offline fallback is needed (e.g. in the UI before credentials are configured).\n *\n * @param provider - Provider name matching a key in {@link STATIC_MODELS}.\n * @returns Offline model list, or `[]` for unknown providers.\n * @docLink packages/bridge/api-reference#models\n */\nexport function getStaticModels(provider: string): ModelEntry[] {\n return STATIC_MODELS[provider] ?? [];\n}\n\n// ---------------------------------------------------------------------------\n// Registry-backed model identity (§2.4)\n// ---------------------------------------------------------------------------\n\n/** A registry in either of the two shapes consumers hold. */\nexport type ProviderRegistryView = AIProviderRegistry | MergedAIProviderRegistry;\n\n/**\n * Where a model selector is resolved. `registry` absent means no registry is\n * configured at all — every resolver here then returns `undefined` and the\n * caller keeps its pre-registry behaviour.\n */\nexport interface ModelRegistryContext {\n /** The merged registry (`mergeRegistries`), or a single layer. */\n registry?: ProviderRegistryView;\n /** `skaile.yaml` `roles`: role name → model selector (`smol` → `groq/llama-3.1-8b`). */\n roles?: Record<string, string>;\n /**\n * Entry the session already runs on. Scopes `model_map` lookups to it;\n * absent lets the selector pick in registry order.\n */\n providerId?: string;\n}\n\n/** The `llm`/`embed` entry registered under `id`, if any. */\nfunction llmEntry(registry: ProviderRegistryView, id: string): AIProviderLlmEntry | undefined {\n const entry = registryEntries(registry).find(([entryId]) => entryId === id)?.[1];\n if (!entry || (entry.kind !== \"llm\" && entry.kind !== \"embed\")) return undefined;\n return entry;\n}\n\n/**\n * The wire facts that decide which model-id vocabulary an entry enforces\n * (`modelIdSchemaForTarget`).\n *\n * `surface` and `base_url` fall back to the entry's preset: an entry written as\n * `{kind: llm, preset: anthropic}` carries neither of its own until the catalog\n * merge layer expands it, and validation must not depend on having been handed\n * a merged registry.\n */\nexport function modelIdTargetForEntry(entry: AIProviderLlmEntry): ModelIdTarget {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n const surface = entry.surface ?? preset?.surface;\n const base_url = resolveEntryBaseUrl(entry) ?? (preset ? presetBaseUrl(preset) : undefined);\n return {\n ...(surface ? { surface } : {}),\n ...(entryTransport(entry) ? { transport: entryTransport(entry) } : {}),\n ...(base_url ? { base_url } : {}),\n };\n}\n\n/** A manifest model preference resolved against the registry. */\nexport interface ResolvedManifestModel {\n /** Entry the preference routes to. */\n providerId: string;\n /** Logical id, after `@role` expansion and before `model_map`. */\n modelId?: string;\n /** Provider-side id — what goes on the wire: `model_map[modelId] ?? modelId`. */\n providerModelId?: string;\n /** Role name, when the preference was `@role`. */\n role?: string;\n /** The wire target `providerModelId` was checked against. */\n target: ModelIdTarget;\n /** Non-fatal notes: a dangling role, a disabled provider, a stale preset. */\n warnings: string[];\n /**\n * Set when `providerModelId` is not a legal id for `target` — in practice,\n * a non-Anthropic id on the first-party Anthropic Messages API. Never\n * thrown: the caller decides whether a manifest that names a model its\n * endpoint cannot serve is a warning or a failure.\n */\n error?: string;\n}\n\n/**\n * Resolve an agent manifest's `model.preferred` (or any single entry of\n * `model.fallback`) against the provider registry, then check the id it\n * produces against the selected entry's own vocabulary.\n *\n * The three selector forms — `@role`, `<providerId>/<modelId>`, bare id — are\n * resolved by `parseModelRef` (`@skaile/workspaces/core/provider-registry`),\n * which owns that grammar; this adds the per-surface id check on top.\n *\n * Returns `undefined` when there is nothing to resolve: no preference, or no\n * registry that can serve one.\n */\nexport function resolveManifestModel(\n preference: string | undefined,\n context: ModelRegistryContext = {},\n): ResolvedManifestModel | undefined {\n if (!preference || !context.registry) return undefined;\n const ref = parseModelRef(preference, context.registry, context.roles);\n if (!ref) return undefined;\n\n const entry = llmEntry(context.registry, ref.providerId);\n const target = entry ? modelIdTargetForEntry(entry) : {};\n const resolved: ResolvedManifestModel = {\n providerId: ref.providerId,\n ...(ref.modelId !== undefined ? { modelId: ref.modelId } : {}),\n ...(ref.providerModelId !== undefined ? { providerModelId: ref.providerModelId } : {}),\n ...(ref.role !== undefined ? { role: ref.role } : {}),\n target,\n warnings: [...ref.warnings],\n };\n if (ref.providerModelId === undefined) return resolved;\n\n const check = modelIdSchemaForTarget(target).safeParse(ref.providerModelId);\n if (!check.success) {\n resolved.error =\n `model \"${ref.providerModelId}\" is not valid for provider \"${ref.providerId}\" ` +\n `(surface ${target.surface ?? \"unknown\"}, transport ${target.transport ?? \"direct\"}` +\n `${target.base_url ? `, ${target.base_url}` : \"\"}): ` +\n (check.error.issues[0]?.message ?? \"invalid model id\");\n }\n return resolved;\n}\n\n/**\n * Resolve a model's capability facts — context window, thinking ceiling, tool\n * and image support — from the registry entry that serves it.\n *\n * `capabilities` is keyed by the *logical* id (the `model_map` key), so a\n * selector is resolved first and the record is read under both the logical and\n * the provider-side id. `fallback` is the caller's own per-model table (the\n * compaction window defaults, the platform's thinking limits); the entry wins\n * field by field, and a field the entry does not state falls through.\n *\n * Returns `undefined` when neither source knows anything about the model.\n */\nexport function resolveModelCapabilities(\n selector: string | undefined,\n context: ModelRegistryContext & {\n /** Per-model-id capability table consulted for fields the entry omits. */\n fallback?: Record<string, AIProviderCapabilities>;\n } = {},\n): AIProviderCapabilities | undefined {\n if (!selector) return undefined;\n const ref = context.registry\n ? parseModelRef(selector, context.registry, context.roles)\n : undefined;\n const entry = ref && context.registry ? llmEntry(context.registry, ref.providerId) : undefined;\n const ids = [ref?.modelId, ref?.providerModelId, selector].filter(\n (id): id is string => id !== undefined,\n );\n const entryCaps = ids.map((id) => entry?.capabilities?.[id]).find((caps) => caps !== undefined);\n const fallbackCaps = ids.map((id) => context.fallback?.[id]).find((caps) => caps !== undefined);\n\n const context_window = entryCaps?.context_window ?? fallbackCaps?.context_window;\n const thinking_max = entryCaps?.thinking_max ?? fallbackCaps?.thinking_max;\n const tools = entryCaps?.tools ?? fallbackCaps?.tools;\n const images = entryCaps?.images ?? fallbackCaps?.images;\n if (\n context_window === undefined &&\n thinking_max === undefined &&\n tools === undefined &&\n images === undefined\n ) {\n return undefined;\n }\n return {\n ...(context_window !== undefined ? { context_window } : {}),\n ...(thinking_max !== undefined ? { thinking_max } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(images !== undefined ? { images } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Model tier resolution (Flow v2 `run.model`)\n// ---------------------------------------------------------------------------\n\n/** Per-tier concrete model ids for one provider. */\nexport interface ModelTierOverrides {\n small?: string;\n default?: string;\n deep?: string;\n}\n\n/**\n * Tier→model mapping per provider, for deployments with **no provider\n * registry**. This is the point of the closed `small | default | deep`\n * vocabulary: an authored flow names an intent and the runtime owns which\n * concrete model serves it, so flows stay portable across model-lineup changes.\n *\n * It is no longer the source of truth for what a tier means. Where a registry\n * exists, a tier resolves through `roles` and the selected entry's `model_map`\n * (see {@link resolveModelTier}) — which works for every provider, names the\n * ids that deployment actually serves, and is editable without a release. This\n * table survives only for the pre-registry path, where nothing else can answer\n * the question; a vendor missing from it there is a `ModelTierResolutionError`,\n * not a guess.\n *\n * These are **direct provider-API ids**. A gateway transport (Bedrock, Vertex,\n * Azure) addresses the same models by different ids — Bedrock prefixes\n * `us.anthropic.`, for instance — and that translation belongs to whoever owns\n * the deployment, not here. {@link resolveModelTier} therefore consults this\n * table only on the direct API and demands an explicit override otherwise,\n * rather than handing a gateway an id it cannot serve.\n *\n * Every id here must also appear in {@link STATIC_MODELS} — a test asserts it,\n * so the two cannot drift into naming a model the catalog disowns. That check\n * proves internal consistency only; it cannot tell you an id is still current\n * with a provider's live lineup.\n *\n * Where a provider's lineup has no genuinely distinct model for a tier, the\n * entry deliberately repeats the neighbouring one. That is a reviewable\n * property of that lineup, unlike inheriting whatever model the session\n * happened to start with — which is how `small` could silently mean Opus.\n */\nexport const PROVIDER_MODEL_TIERS: Record<string, Required<ModelTierOverrides>> = {\n anthropic: {\n small: \"claude-haiku-4-5-20251001\",\n default: \"claude-sonnet-4-6\",\n deep: \"claude-opus-4-6\",\n },\n openai: { small: \"gpt-4o-mini\", default: \"gpt-4.1\", deep: \"o3\" },\n google: { small: \"gemini-2.0-flash\", default: \"gemini-2.5-flash\", deep: \"gemini-2.5-pro\" },\n mistral: {\n small: \"mistral-small-latest\",\n default: \"mistral-large-latest\",\n deep: \"mistral-large-latest\",\n },\n groq: {\n small: \"llama-3.1-8b-instant\",\n default: \"llama-3.3-70b-versatile\",\n deep: \"llama-3.3-70b-versatile\",\n },\n deepseek: { small: \"deepseek-chat\", default: \"deepseek-chat\", deep: \"deepseek-reasoner\" },\n xai: { small: \"grok-3-mini\", default: \"grok-3\", deep: \"grok-3\" },\n together: {\n small: \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n default: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n deep: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n },\n fireworks: {\n small: \"accounts/fireworks/models/llama-v3p3-70b-instruct\",\n default: \"accounts/fireworks/models/llama-v3p3-70b-instruct\",\n deep: \"accounts/fireworks/models/deepseek-v3\",\n },\n openrouter: {\n small: \"anthropic/claude-haiku-4.5\",\n default: \"anthropic/claude-sonnet-4.6\",\n deep: \"anthropic/claude-opus-4.6\",\n },\n};\n\n/** Raised when a tier names an intent this provider cannot serve. */\nexport class ModelTierResolutionError extends Error {\n constructor(\n readonly tier: \"small\" | \"deep\",\n readonly provider: string | undefined,\n ) {\n super(\n `cannot resolve model tier \"${tier}\" for provider \"${provider ?? \"(none)\"}\": no built-in mapping and no configured override. ` +\n `Configure a \"${tier}\" model override for this provider, or author the node as model: \"default\" to inherit the session model.`,\n );\n this.name = \"ModelTierResolutionError\";\n }\n}\n\n/**\n * Resolve a tier for a deployment that has a registry: through `roles[tier]`\n * first, then the selected entry's `model_map[tier]`.\n *\n * A `model_map` **miss is a miss**. `parseModelRef` falls back to the literal\n * selector when nothing maps it, and no provider serves a model called\n * `\"small\"` — so only a genuine mapping counts, and an unmapped tier is left\n * for the caller to fail on.\n */\nfunction resolveTierThroughRegistry(\n tier: keyof ModelTierOverrides,\n options: ModelRegistryContext,\n): string | undefined {\n const { registry, roles, providerId } = options;\n if (!registry) return undefined;\n if (roles?.[tier] !== undefined) {\n const viaRole = parseModelRef(`@${tier}`, registry, roles);\n if (viaRole?.providerModelId) return viaRole.providerModelId;\n }\n const ref = parseModelRef(providerId ? `${providerId}/${tier}` : tier, registry, roles);\n if (!ref?.modelId) return undefined;\n return llmEntry(registry, ref.providerId)?.model_map?.[ref.modelId];\n}\n\n/** Options {@link resolveModelTier} reads. */\nexport interface ResolveModelTierOptions extends ModelRegistryContext {\n /** Legacy provider id, keying {@link PROVIDER_MODEL_TIERS}. */\n provider?: string;\n /** Legacy cloud transport; anything but `default` disables the built-in table. */\n cloud?: string;\n /** Per-tier ids configured for this deployment. Wins over everything. */\n overrides?: ModelTierOverrides;\n}\n\n/**\n * Resolve a Flow v2 `run.model` tier to a concrete model id.\n *\n * Precedence, highest first: a configured `overrides` entry; the registry —\n * `roles[tier]`, then the selected entry's `model_map[tier]`, which is how a\n * tier is defined for *any* provider; and finally, **only when no registry is\n * configured**, {@link PROVIDER_MODEL_TIERS} on the direct provider API.\n *\n * `\"default\"` and an absent tier **inherit `sessionModel` first**. The session\n * model is the one id known to work for this deployment — it already carries\n * whatever provider, lineup and gateway translation the host configured — so\n * preferring any table over it would silently downgrade a configured model\n * and, on a gateway transport, substitute an id that provider cannot serve.\n *\n * `\"small\"` and `\"deep\"` never fall back to `sessionModel`; when nothing above\n * resolves them they throw {@link ModelTierResolutionError}. Inheriting there\n * would run an arbitrary model behind an author's explicit request for a cheap\n * or a strong one — a cost or quality surprise that shows up only in the bill\n * or the output. Failing names it at the node instead.\n *\n * Pure: no I/O, no environment reads.\n */\nexport function resolveModelTier(\n tier: \"small\" | \"default\" | \"deep\" | undefined,\n sessionModel: string | undefined,\n options: ResolveModelTierOptions = {},\n): string | undefined {\n // Built-in ids address the provider's own API; a gateway renames them. And a\n // registry answers the question properly, so the table is its fallback only.\n const directApi = !options.cloud || options.cloud === \"default\";\n const builtIn =\n !options.registry && directApi && options.provider\n ? PROVIDER_MODEL_TIERS[options.provider]\n : undefined;\n if (tier === \"small\" || tier === \"deep\") {\n const resolved =\n options.overrides?.[tier] ?? resolveTierThroughRegistry(tier, options) ?? builtIn?.[tier];\n if (!resolved) throw new ModelTierResolutionError(tier, options.provider);\n return resolved;\n }\n return (\n options.overrides?.default ??\n sessionModel ??\n resolveTierThroughRegistry(\"default\", options) ??\n builtIn?.default\n );\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/models.ts"],"names":[],"mappings":"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","file":"chunk-U3SXCVR7.js","sourcesContent":["/**\n * Model catalog — static fallback + live provider API fetching.\n *\n * Provides `fetchProviderModels(provider, apiKey)` for live model lists and\n * `getStaticModels(provider)` as an offline fallback.\n * OMP model listing is handled by `OmpHarness.listModels()` in the bridge harness.\n */\n\nimport {\n type AIProviderCapabilities,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n entryTransport,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { type ModelIdTarget, modelIdSchemaForTarget } from \"@skaile/workspaces/types/manifests\";\nimport {\n buildCredentialHeaders,\n expandPreset,\n getProviderPreset,\n presetBaseUrl,\n resolvePresetBaseUrl,\n resolveProbeUrl,\n} from \"./provider-catalog.js\";\n\n/**\n * A single LLM model entry returned by the model catalog.\n *\n * Used by `getModels`, `getStaticModels`, and `fetchProviderModels` to represent\n * an available model for a provider.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport interface ModelEntry {\n /** Provider-specific model identifier used in API calls (e.g. `\"claude-sonnet-4-5\"`). */\n id: string;\n /** Human-readable display name for UIs and logs (e.g. `\"Claude Sonnet 4.5\"`). */\n name: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider API configs (for fetching model lists)\n// ---------------------------------------------------------------------------\n\n/** Extract ModelEntry[] from a provider's parsed models-list JSON response. */\ntype ParseModels = (body: any) => ModelEntry[];\n\n/** Humanize a model ID into a display name (e.g. \"claude-sonnet-4-6\" → \"Claude Sonnet 4 6\") */\nfunction humanize(id: string): string {\n return id\n .replace(/^accounts\\/[^/]+\\/models\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Filter function used by providers that return the OpenAI-style /v1/models list.\n * Keeps only chat/completion models, skips embeddings, moderation, tts, whisper, dall-e, etc.\n */\nfunction isLikelyChatModel(id: string): boolean {\n const skip = /embed|moderat|tts|whisper|dall-e|davinci|babbage|ada-00|text-/i;\n return !skip.test(id);\n}\n\n// Per-provider response parsers. The endpoint URL and the credential header\n// come from the catalog preset (provider-catalog.ts), joined in\n// fetchProviderModels.\nconst PROVIDER_PARSERS: Record<string, ParseModels> = {\n anthropic: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && !m.id.includes(\"embed\"))\n .map((m: any) => ({\n id: m.id,\n name: m.display_name ?? humanize(m.id),\n }));\n },\n openai: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n openrouter: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id)\n .map((m: any) => ({ id: m.id, name: m.name ?? humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n mistral: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n groq: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n deepseek: (body) => {\n const models = body?.data ?? [];\n return models\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n xai: (body) => {\n const models = body?.data ?? [];\n return models\n .filter((m: any) => m.id && isLikelyChatModel(m.id))\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n together: (body) => {\n const models = body?.data ?? body ?? [];\n const arr = Array.isArray(models) ? models : [];\n return arr\n .filter((m: any) => m.id && m.type === \"chat\")\n .map((m: any) => ({ id: m.id, name: m.display_name ?? humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n fireworks: (body) => {\n const models = body?.data ?? [];\n return models\n .map((m: any) => ({ id: m.id, name: humanize(m.id) }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n google: (body) => {\n const models = body?.models ?? [];\n return models\n .filter((m: any) => m.supportedGenerationMethods?.includes(\"generateContent\"))\n .map((m: any) => ({\n id: (m.name ?? \"\").replace(/^models\\//, \"\"),\n name: m.displayName ?? humanize(m.name ?? \"\"),\n }))\n .sort((a: ModelEntry, b: ModelEntry) => a.id.localeCompare(b.id));\n },\n};\n\n// ---------------------------------------------------------------------------\n// Live fetch\n// ---------------------------------------------------------------------------\n\n/**\n * Result of a model-list fetch operation, with source attribution.\n *\n * Returned by {@link fetchProviderModels} and {@link getModels}. When `ok` is `false`,\n * `models` is empty and `error` describes the failure. The `source` field indicates\n * whether the list came from a live API call or the offline static catalog.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport interface FetchModelsResult {\n /** `true` when the fetch succeeded and `models` is populated. */\n ok: boolean;\n /** Fetched model list; empty on failure. */\n models: ModelEntry[];\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n /** Whether the result came from a live API call or the static fallback. */\n source: \"api\" | \"static\";\n}\n\n/**\n * Options controlling where a model-list fetch is addressed.\n *\n * @since 1.5.0\n */\nexport interface FetchModelsOptions {\n /**\n * Base URL to resolve the provider's models endpoint against — e.g. the\n * gateway a session already routes completions through. Overrides the\n * provider's `baseUrlEnv` value.\n */\n baseUrl?: string;\n /**\n * Environment consulted for the provider's base-URL env var\n * (`ANTHROPIC_BASE_URL` for `anthropic`). Defaults to `process.env`; pass an\n * explicit record to keep a call hermetic.\n */\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Fetch the model list from a provider's REST API.\n *\n * Returns `{ ok: true, models, source: 'api' }` on success, or\n * `{ ok: false, models: [], error }` on any HTTP or network failure — the\n * caller should fall back to {@link getStaticModels} in that case.\n *\n * The endpoint, the credential header and the response path all come from the\n * catalog preset named by `provider` ({@link resolvePresetBaseUrl},\n * {@link resolveProbeUrl}, {@link buildCredentialHeaders}), so discovery hits\n * the same host dispatch does — including a gateway named by `baseUrl` or by\n * the vendor's own `*_BASE_URL` variable.\n *\n * @param provider - Catalog preset id (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param apiKey - API key presented in the preset's credential header.\n * @param options - Optional base-URL / environment overrides.\n * @returns Resolved model list with source attribution.\n * @docLink packages/bridge/api-reference#models\n */\nexport async function fetchProviderModels(\n provider: string,\n apiKey: string,\n options: FetchModelsOptions = {},\n): Promise<FetchModelsResult> {\n const preset = getProviderPreset(provider);\n const parse = PROVIDER_PARSERS[provider];\n if (!preset || !parse) {\n return {\n ok: false,\n models: [],\n error: `No API config for provider: ${provider}`,\n source: \"static\",\n };\n }\n\n const baseUrl = resolvePresetBaseUrl(preset, {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n env: options.env ?? process.env,\n });\n const entry = expandPreset(preset, baseUrl ? { baseUrl } : {});\n const url = resolveProbeUrl(entry);\n if (!url) {\n return {\n ok: false,\n models: [],\n error: `Provider ${provider} exposes no models endpoint`,\n source: \"static\",\n };\n }\n // Static non-secret headers (Anthropic's `anthropic-version`) plus the\n // credential carrier the preset's `auth_header` names.\n const headers = { ...entry.headers, ...buildCredentialHeaders(entry, apiKey) };\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return {\n ok: false,\n models: [],\n error: `API returned HTTP ${response.status}`,\n source: \"static\",\n };\n }\n\n const body = await response.json();\n const models = parse(body);\n\n return { ok: true, models, source: \"api\" };\n } catch (err: any) {\n const msg =\n err.name === \"AbortError\" ? \"Request timed out (10s)\" : (err.message ?? \"Network error\");\n return { ok: false, models: [], error: msg, source: \"static\" };\n }\n}\n\n/**\n * Get models for a provider, trying the live API first and falling back to the static catalog.\n *\n * When no `apiKey` is provided the static catalog is returned immediately without\n * a network call. When the live API fails or returns an empty list, the static\n * catalog is used as a fallback — the result's `source` field indicates which was used.\n *\n * @param provider - Provider name (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param apiKey - Optional API key; omit to skip the live fetch and use the static catalog.\n * @param options - Optional base-URL / environment overrides (see {@link FetchModelsOptions}).\n * @returns Resolved model list with source attribution.\n * @docLink packages/bridge/api-reference#models\n */\nexport async function getModels(\n provider: string,\n apiKey?: string,\n options: FetchModelsOptions = {},\n): Promise<FetchModelsResult> {\n if (!apiKey) {\n const models = getStaticModels(provider);\n return { ok: true, models, source: \"static\" };\n }\n\n const result = await fetchProviderModels(provider, apiKey, options);\n if (result.ok && result.models.length > 0) {\n return result;\n }\n\n // Fall back to static\n const staticModels = getStaticModels(provider);\n if (staticModels.length > 0) {\n return { ok: true, models: staticModels, source: \"static\", error: result.error };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Static catalog (offline fallback)\n// ---------------------------------------------------------------------------\n\n/**\n * Offline model catalog keyed by provider name.\n *\n * Used as a fallback by {@link getModels} when the live provider API is unreachable or\n * returns an empty list. Covers Anthropic, OpenAI, Google, Mistral, Groq, DeepSeek,\n * xAI, Together, Fireworks, and OpenRouter. Update this list when providers add new\n * models and a live fetch is not available.\n *\n * @docLink packages/bridge/api-reference#models\n */\nexport const STATIC_MODELS: Record<string, ModelEntry[]> = {\n anthropic: [\n { id: \"claude-opus-4-6\", name: \"Claude Opus 4.6\" },\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet 4.6\" },\n { id: \"claude-haiku-4-5-20251001\", name: \"Claude Haiku 4.5\" },\n { id: \"claude-opus-4-5\", name: \"Claude Opus 4.5\" },\n { id: \"claude-sonnet-4-5\", name: \"Claude Sonnet 4.5\" },\n ],\n openai: [\n { id: \"gpt-4o\", name: \"GPT-4o\" },\n { id: \"gpt-4o-mini\", name: \"GPT-4o Mini\" },\n { id: \"gpt-4.1\", name: \"GPT-4.1\" },\n { id: \"gpt-4.1-mini\", name: \"GPT-4.1 Mini\" },\n { id: \"o3\", name: \"o3\" },\n { id: \"o4-mini\", name: \"o4-mini\" },\n ],\n google: [\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"gemini-2.0-flash\", name: \"Gemini 2.0 Flash\" },\n ],\n mistral: [\n { id: \"mistral-large-latest\", name: \"Mistral Large\" },\n { id: \"mistral-small-latest\", name: \"Mistral Small\" },\n { id: \"codestral-latest\", name: \"Codestral\" },\n ],\n groq: [\n { id: \"llama-3.3-70b-versatile\", name: \"Llama 3.3 70B\" },\n { id: \"llama-3.1-8b-instant\", name: \"Llama 3.1 8B\" },\n { id: \"mixtral-8x7b-32768\", name: \"Mixtral 8x7B\" },\n ],\n deepseek: [\n { id: \"deepseek-chat\", name: \"DeepSeek Chat\" },\n { id: \"deepseek-reasoner\", name: \"DeepSeek Reasoner\" },\n ],\n xai: [\n { id: \"grok-3\", name: \"Grok 3\" },\n { id: \"grok-3-mini\", name: \"Grok 3 Mini\" },\n ],\n together: [\n { id: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\", name: \"Llama 3.3 70B Turbo\" },\n { id: \"mistralai/Mixtral-8x7B-Instruct-v0.1\", name: \"Mixtral 8x7B\" },\n ],\n fireworks: [\n { id: \"accounts/fireworks/models/llama-v3p3-70b-instruct\", name: \"Llama 3.3 70B\" },\n { id: \"accounts/fireworks/models/deepseek-v3\", name: \"DeepSeek v3\" },\n ],\n openrouter: [\n { id: \"anthropic/claude-sonnet-4.6\", name: \"Claude Sonnet 4.6\" },\n { id: \"anthropic/claude-opus-4.6\", name: \"Claude Opus 4.6\" },\n { id: \"anthropic/claude-haiku-4.5\", name: \"Claude Haiku 4.5\" },\n { id: \"anthropic/claude-sonnet-4.5\", name: \"Claude Sonnet 4.5\" },\n { id: \"anthropic/claude-3.7-sonnet\", name: \"Claude 3.7 Sonnet\" },\n { id: \"openai/gpt-4o\", name: \"GPT-4o\" },\n { id: \"openai/gpt-4.1\", name: \"GPT-4.1\" },\n { id: \"openai/gpt-4.1-mini\", name: \"GPT-4.1 Mini\" },\n { id: \"google/gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"google/gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"meta-llama/llama-4-maverick\", name: \"Llama 4 Maverick\" },\n { id: \"meta-llama/llama-3.3-70b-instruct\", name: \"Llama 3.3 70B\" },\n { id: \"deepseek/deepseek-chat-v3-0324\", name: \"DeepSeek v3\" },\n { id: \"deepseek/deepseek-r1\", name: \"DeepSeek R1\" },\n { id: \"mistralai/mistral-large-2411\", name: \"Mistral Large 2\" },\n ],\n};\n\n/**\n * Get models for a specific provider from the static catalog, or empty array if unknown.\n *\n * Pure synchronous lookup — no network call. Use when the provider API is unavailable\n * or when a fast offline fallback is needed (e.g. in the UI before credentials are configured).\n *\n * @param provider - Provider name matching a key in {@link STATIC_MODELS}.\n * @returns Offline model list, or `[]` for unknown providers.\n * @docLink packages/bridge/api-reference#models\n */\nexport function getStaticModels(provider: string): ModelEntry[] {\n return STATIC_MODELS[provider] ?? [];\n}\n\n// ---------------------------------------------------------------------------\n// Registry-backed model identity (§2.4)\n// ---------------------------------------------------------------------------\n\n/** A registry in either of the two shapes consumers hold. */\nexport type ProviderRegistryView = AIProviderRegistry | MergedAIProviderRegistry;\n\n/**\n * Where a model selector is resolved. `registry` absent means no registry is\n * configured at all — every resolver here then returns `undefined` and the\n * caller keeps its pre-registry behaviour.\n */\nexport interface ModelRegistryContext {\n /** The merged registry (`mergeRegistries`), or a single layer. */\n registry?: ProviderRegistryView;\n /** `skaile.yaml` `roles`: role name → model selector (`smol` → `groq/llama-3.1-8b`). */\n roles?: Record<string, string>;\n /**\n * Entry the session already runs on. Scopes `model_map` lookups to it;\n * absent lets the selector pick in registry order.\n */\n providerId?: string;\n}\n\n/** The `llm`/`embed` entry registered under `id`, if any. */\nfunction llmEntry(registry: ProviderRegistryView, id: string): AIProviderLlmEntry | undefined {\n const entry = registryEntries(registry).find(([entryId]) => entryId === id)?.[1];\n if (!entry || (entry.kind !== \"llm\" && entry.kind !== \"embed\")) return undefined;\n return entry;\n}\n\n/**\n * The wire facts that decide which model-id vocabulary an entry enforces\n * (`modelIdSchemaForTarget`).\n *\n * `surface` and `base_url` fall back to the entry's preset: an entry written as\n * `{kind: llm, preset: anthropic}` carries neither of its own until the catalog\n * merge layer expands it, and validation must not depend on having been handed\n * a merged registry.\n */\nexport function modelIdTargetForEntry(entry: AIProviderLlmEntry): ModelIdTarget {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n const surface = entry.surface ?? preset?.surface;\n const base_url = resolveEntryBaseUrl(entry) ?? (preset ? presetBaseUrl(preset) : undefined);\n return {\n ...(surface ? { surface } : {}),\n ...(entryTransport(entry) ? { transport: entryTransport(entry) } : {}),\n ...(base_url ? { base_url } : {}),\n };\n}\n\n/** A manifest model preference resolved against the registry. */\nexport interface ResolvedManifestModel {\n /** Entry the preference routes to. */\n providerId: string;\n /** Logical id, after `@role` expansion and before `model_map`. */\n modelId?: string;\n /** Provider-side id — what goes on the wire: `model_map[modelId] ?? modelId`. */\n providerModelId?: string;\n /** Role name, when the preference was `@role`. */\n role?: string;\n /** The wire target `providerModelId` was checked against. */\n target: ModelIdTarget;\n /** Non-fatal notes: a dangling role, a disabled provider, a stale preset. */\n warnings: string[];\n /**\n * Set when `providerModelId` is not a legal id for `target` — in practice,\n * a non-Anthropic id on the first-party Anthropic Messages API. Never\n * thrown: the caller decides whether a manifest that names a model its\n * endpoint cannot serve is a warning or a failure.\n */\n error?: string;\n}\n\n/**\n * Resolve an agent manifest's `model.preferred` (or any single entry of\n * `model.fallback`) against the provider registry, then check the id it\n * produces against the selected entry's own vocabulary.\n *\n * The three selector forms — `@role`, `<providerId>/<modelId>`, bare id — are\n * resolved by `parseModelRef` (`@skaile/workspaces/core/provider-registry`),\n * which owns that grammar; this adds the per-surface id check on top.\n *\n * Returns `undefined` when there is nothing to resolve: no preference, or no\n * registry that can serve one.\n */\nexport function resolveManifestModel(\n preference: string | undefined,\n context: ModelRegistryContext = {},\n): ResolvedManifestModel | undefined {\n if (!preference || !context.registry) return undefined;\n const ref = parseModelRef(preference, context.registry, context.roles);\n if (!ref) return undefined;\n\n const entry = llmEntry(context.registry, ref.providerId);\n const target = entry ? modelIdTargetForEntry(entry) : {};\n const resolved: ResolvedManifestModel = {\n providerId: ref.providerId,\n ...(ref.modelId !== undefined ? { modelId: ref.modelId } : {}),\n ...(ref.providerModelId !== undefined ? { providerModelId: ref.providerModelId } : {}),\n ...(ref.role !== undefined ? { role: ref.role } : {}),\n target,\n warnings: [...ref.warnings],\n };\n if (ref.providerModelId === undefined) return resolved;\n\n const check = modelIdSchemaForTarget(target).safeParse(ref.providerModelId);\n if (!check.success) {\n resolved.error =\n `model \"${ref.providerModelId}\" is not valid for provider \"${ref.providerId}\" ` +\n `(surface ${target.surface ?? \"unknown\"}, transport ${target.transport ?? \"direct\"}` +\n `${target.base_url ? `, ${target.base_url}` : \"\"}): ` +\n (check.error.issues[0]?.message ?? \"invalid model id\");\n }\n return resolved;\n}\n\n/**\n * Resolve a model's capability facts — context window, thinking ceiling, tool\n * and image support — from the registry entry that serves it.\n *\n * `capabilities` is keyed by the *logical* id (the `model_map` key), so a\n * selector is resolved first and the record is read under both the logical and\n * the provider-side id. `fallback` is the caller's own per-model table (the\n * compaction window defaults, the platform's thinking limits); the entry wins\n * field by field, and a field the entry does not state falls through.\n *\n * Returns `undefined` when neither source knows anything about the model.\n */\nexport function resolveModelCapabilities(\n selector: string | undefined,\n context: ModelRegistryContext & {\n /** Per-model-id capability table consulted for fields the entry omits. */\n fallback?: Record<string, AIProviderCapabilities>;\n } = {},\n): AIProviderCapabilities | undefined {\n if (!selector) return undefined;\n const ref = context.registry\n ? parseModelRef(selector, context.registry, context.roles)\n : undefined;\n const entry = ref && context.registry ? llmEntry(context.registry, ref.providerId) : undefined;\n const ids = [ref?.modelId, ref?.providerModelId, selector].filter(\n (id): id is string => id !== undefined,\n );\n const entryCaps = ids.map((id) => entry?.capabilities?.[id]).find((caps) => caps !== undefined);\n const fallbackCaps = ids.map((id) => context.fallback?.[id]).find((caps) => caps !== undefined);\n\n const context_window = entryCaps?.context_window ?? fallbackCaps?.context_window;\n const thinking_max = entryCaps?.thinking_max ?? fallbackCaps?.thinking_max;\n const tools = entryCaps?.tools ?? fallbackCaps?.tools;\n const images = entryCaps?.images ?? fallbackCaps?.images;\n if (\n context_window === undefined &&\n thinking_max === undefined &&\n tools === undefined &&\n images === undefined\n ) {\n return undefined;\n }\n return {\n ...(context_window !== undefined ? { context_window } : {}),\n ...(thinking_max !== undefined ? { thinking_max } : {}),\n ...(tools !== undefined ? { tools } : {}),\n ...(images !== undefined ? { images } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Model tier resolution (Flow v2 `run.model`)\n// ---------------------------------------------------------------------------\n\n/** Per-tier concrete model ids for one provider. */\nexport interface ModelTierOverrides {\n small?: string;\n default?: string;\n deep?: string;\n}\n\n/**\n * Tier→model mapping per provider, for deployments with **no provider\n * registry**. This is the point of the closed `small | default | deep`\n * vocabulary: an authored flow names an intent and the runtime owns which\n * concrete model serves it, so flows stay portable across model-lineup changes.\n *\n * It is no longer the source of truth for what a tier means. Where a registry\n * exists, a tier resolves through `roles` and the selected entry's `model_map`\n * (see {@link resolveModelTier}) — which works for every provider, names the\n * ids that deployment actually serves, and is editable without a release. This\n * table survives only for the pre-registry path, where nothing else can answer\n * the question; a vendor missing from it there is a `ModelTierResolutionError`,\n * not a guess.\n *\n * These are **direct provider-API ids**. A gateway transport (Bedrock, Vertex,\n * Azure) addresses the same models by different ids — Bedrock prefixes\n * `us.anthropic.`, for instance — and that translation belongs to whoever owns\n * the deployment, not here. {@link resolveModelTier} therefore consults this\n * table only on the direct API and demands an explicit override otherwise,\n * rather than handing a gateway an id it cannot serve.\n *\n * Every id here must also appear in {@link STATIC_MODELS} — a test asserts it,\n * so the two cannot drift into naming a model the catalog disowns. That check\n * proves internal consistency only; it cannot tell you an id is still current\n * with a provider's live lineup.\n *\n * Where a provider's lineup has no genuinely distinct model for a tier, the\n * entry deliberately repeats the neighbouring one. That is a reviewable\n * property of that lineup, unlike inheriting whatever model the session\n * happened to start with — which is how `small` could silently mean Opus.\n */\nexport const PROVIDER_MODEL_TIERS: Record<string, Required<ModelTierOverrides>> = {\n anthropic: {\n small: \"claude-haiku-4-5-20251001\",\n default: \"claude-sonnet-4-6\",\n deep: \"claude-opus-4-6\",\n },\n openai: { small: \"gpt-4o-mini\", default: \"gpt-4.1\", deep: \"o3\" },\n google: { small: \"gemini-2.0-flash\", default: \"gemini-2.5-flash\", deep: \"gemini-2.5-pro\" },\n mistral: {\n small: \"mistral-small-latest\",\n default: \"mistral-large-latest\",\n deep: \"mistral-large-latest\",\n },\n groq: {\n small: \"llama-3.1-8b-instant\",\n default: \"llama-3.3-70b-versatile\",\n deep: \"llama-3.3-70b-versatile\",\n },\n deepseek: { small: \"deepseek-chat\", default: \"deepseek-chat\", deep: \"deepseek-reasoner\" },\n xai: { small: \"grok-3-mini\", default: \"grok-3\", deep: \"grok-3\" },\n together: {\n small: \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n default: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n deep: \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n },\n fireworks: {\n small: \"accounts/fireworks/models/llama-v3p3-70b-instruct\",\n default: \"accounts/fireworks/models/llama-v3p3-70b-instruct\",\n deep: \"accounts/fireworks/models/deepseek-v3\",\n },\n openrouter: {\n small: \"anthropic/claude-haiku-4.5\",\n default: \"anthropic/claude-sonnet-4.6\",\n deep: \"anthropic/claude-opus-4.6\",\n },\n};\n\n/** Raised when a tier names an intent this provider cannot serve. */\nexport class ModelTierResolutionError extends Error {\n constructor(\n readonly tier: \"small\" | \"deep\",\n readonly provider: string | undefined,\n ) {\n super(\n `cannot resolve model tier \"${tier}\" for provider \"${provider ?? \"(none)\"}\": no built-in mapping and no configured override. ` +\n `Configure a \"${tier}\" model override for this provider, or author the node as model: \"default\" to inherit the session model.`,\n );\n this.name = \"ModelTierResolutionError\";\n }\n}\n\n/**\n * Resolve a tier for a deployment that has a registry: through `roles[tier]`\n * first, then the selected entry's `model_map[tier]`.\n *\n * A `model_map` **miss is a miss**. `parseModelRef` falls back to the literal\n * selector when nothing maps it, and no provider serves a model called\n * `\"small\"` — so only a genuine mapping counts, and an unmapped tier is left\n * for the caller to fail on.\n */\nfunction resolveTierThroughRegistry(\n tier: keyof ModelTierOverrides,\n options: ModelRegistryContext,\n): string | undefined {\n const { registry, roles, providerId } = options;\n if (!registry) return undefined;\n if (roles?.[tier] !== undefined) {\n const viaRole = parseModelRef(`@${tier}`, registry, roles);\n if (viaRole?.providerModelId) return viaRole.providerModelId;\n }\n const ref = parseModelRef(providerId ? `${providerId}/${tier}` : tier, registry, roles);\n if (!ref?.modelId) return undefined;\n return llmEntry(registry, ref.providerId)?.model_map?.[ref.modelId];\n}\n\n/** Options {@link resolveModelTier} reads. */\nexport interface ResolveModelTierOptions extends ModelRegistryContext {\n /** Legacy provider id, keying {@link PROVIDER_MODEL_TIERS}. */\n provider?: string;\n /** Legacy cloud transport; anything but `default` disables the built-in table. */\n cloud?: string;\n /** Per-tier ids configured for this deployment. Wins over everything. */\n overrides?: ModelTierOverrides;\n}\n\n/**\n * Resolve a Flow v2 `run.model` tier to a concrete model id.\n *\n * Precedence, highest first: a configured `overrides` entry; the registry —\n * `roles[tier]`, then the selected entry's `model_map[tier]`, which is how a\n * tier is defined for *any* provider; and finally, **only when no registry is\n * configured**, {@link PROVIDER_MODEL_TIERS} on the direct provider API.\n *\n * `\"default\"` and an absent tier **inherit `sessionModel` first**. The session\n * model is the one id known to work for this deployment — it already carries\n * whatever provider, lineup and gateway translation the host configured — so\n * preferring any table over it would silently downgrade a configured model\n * and, on a gateway transport, substitute an id that provider cannot serve.\n *\n * `\"small\"` and `\"deep\"` never fall back to `sessionModel`; when nothing above\n * resolves them they throw {@link ModelTierResolutionError}. Inheriting there\n * would run an arbitrary model behind an author's explicit request for a cheap\n * or a strong one — a cost or quality surprise that shows up only in the bill\n * or the output. Failing names it at the node instead.\n *\n * Pure: no I/O, no environment reads.\n */\nexport function resolveModelTier(\n tier: \"small\" | \"default\" | \"deep\" | undefined,\n sessionModel: string | undefined,\n options: ResolveModelTierOptions = {},\n): string | undefined {\n // Built-in ids address the provider's own API; a gateway renames them. And a\n // registry answers the question properly, so the table is its fallback only.\n const directApi = !options.cloud || options.cloud === \"default\";\n const builtIn =\n !options.registry && directApi && options.provider\n ? PROVIDER_MODEL_TIERS[options.provider]\n : undefined;\n if (tier === \"small\" || tier === \"deep\") {\n const resolved =\n options.overrides?.[tier] ?? resolveTierThroughRegistry(tier, options) ?? builtIn?.[tier];\n if (!resolved) throw new ModelTierResolutionError(tier, options.provider);\n return resolved;\n }\n return (\n options.overrides?.default ??\n sessionModel ??\n resolveTierThroughRegistry(\"default\", options) ??\n builtIn?.default\n );\n}\n"]}