@skaile/workspaces 6.4.0 → 6.5.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 (384) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/README.md +4 -0
  3. package/dist/ai-sdk.js +54 -24
  4. package/dist/ai-sdk.js.map +1 -1
  5. package/dist/app-sdk/index.js +1 -1
  6. package/dist/{asset-feeds-UJSYGKCX.js → asset-feeds-4I6Z4OI3.js} +21 -21
  7. package/dist/{asset-feeds-UJSYGKCX.js.map → asset-feeds-4I6Z4OI3.js.map} +1 -1
  8. package/dist/asset-manager/catalog-deployer.js +7 -7
  9. package/dist/asset-manager/index.js +13 -13
  10. package/dist/asset-manager/installer.js +9 -9
  11. package/dist/asset-manager/renderers.js +8 -8
  12. package/dist/asset-manager/src/index.d.ts +114 -12
  13. package/dist/asset-manager/src/index.d.ts.map +1 -1
  14. package/dist/asset-manager/src/installer.d.ts +6 -0
  15. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  16. package/dist/bridge/harnesses/claude-sdk.js +23 -18
  17. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  18. package/dist/bridge/harnesses/codex.js +36 -34
  19. package/dist/bridge/harnesses/codex.js.map +1 -1
  20. package/dist/bridge/harnesses/continue.js +11 -12
  21. package/dist/bridge/harnesses/continue.js.map +1 -1
  22. package/dist/bridge/harnesses/echo.js +4 -5
  23. package/dist/bridge/harnesses/echo.js.map +1 -1
  24. package/dist/bridge/harnesses/gemini.js +8 -9
  25. package/dist/bridge/harnesses/goose.js +11 -12
  26. package/dist/bridge/harnesses/goose.js.map +1 -1
  27. package/dist/bridge/harnesses/omp.js +16 -11
  28. package/dist/bridge/harnesses/omp.js.map +1 -1
  29. package/dist/bridge/harnesses/opencode.js +11 -12
  30. package/dist/bridge/harnesses/opencode.js.map +1 -1
  31. package/dist/bridge/harnesses/qwen.js +8 -9
  32. package/dist/bridge/harnesses/qwen.js.map +1 -1
  33. package/dist/bridge/index.js +19 -20
  34. package/dist/bridge/src/ai-sdk.d.ts +0 -2
  35. package/dist/bridge/src/ai-sdk.d.ts.map +1 -1
  36. package/dist/bridge/src/codex/login-fallback.d.ts +39 -0
  37. package/dist/bridge/src/codex/login-fallback.d.ts.map +1 -0
  38. package/dist/bridge/src/error-classifier.d.ts +6 -0
  39. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  40. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  41. package/dist/bridge/src/harnesses/codex.d.ts +0 -6
  42. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
  43. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  44. package/dist/bridge/src/index.d.ts +1 -0
  45. package/dist/bridge/src/index.d.ts.map +1 -1
  46. package/dist/{chunk-WENTJ5KP.js → chunk-22ZX33H6.js} +6 -6
  47. package/dist/{chunk-WENTJ5KP.js.map → chunk-22ZX33H6.js.map} +1 -1
  48. package/dist/{chunk-U6S5CXKB.js → chunk-23SG4JRV.js} +4 -4
  49. package/dist/{chunk-U6S5CXKB.js.map → chunk-23SG4JRV.js.map} +1 -1
  50. package/dist/{chunk-YJNE4V2M.js → chunk-2HS357RA.js} +70 -37
  51. package/dist/chunk-2HS357RA.js.map +1 -0
  52. package/dist/{chunk-O7KAQQAI.js → chunk-2IAWVUW3.js} +4 -4
  53. package/dist/{chunk-O7KAQQAI.js.map → chunk-2IAWVUW3.js.map} +1 -1
  54. package/dist/{chunk-GTMANMBZ.js → chunk-2M3VLKT2.js} +3 -3
  55. package/dist/{chunk-GTMANMBZ.js.map → chunk-2M3VLKT2.js.map} +1 -1
  56. package/dist/{chunk-BUU2DLPC.js → chunk-3DA74PLW.js} +3 -3
  57. package/dist/{chunk-BUU2DLPC.js.map → chunk-3DA74PLW.js.map} +1 -1
  58. package/dist/{chunk-SISUT7VR.js → chunk-3KSLUVKB.js} +7 -7
  59. package/dist/{chunk-SISUT7VR.js.map → chunk-3KSLUVKB.js.map} +1 -1
  60. package/dist/{chunk-6OHZUUR7.js → chunk-5DE3DGVR.js} +11 -5
  61. package/dist/chunk-5DE3DGVR.js.map +1 -0
  62. package/dist/{chunk-45KLCFQB.js → chunk-6EKQENAP.js} +6 -6
  63. package/dist/{chunk-45KLCFQB.js.map → chunk-6EKQENAP.js.map} +1 -1
  64. package/dist/{chunk-E237FGGX.js → chunk-6Y3SC7O4.js} +4 -4
  65. package/dist/{chunk-E237FGGX.js.map → chunk-6Y3SC7O4.js.map} +1 -1
  66. package/dist/{chunk-IYZAJ2J2.js → chunk-7EMS2GZO.js} +36 -36
  67. package/dist/chunk-7EMS2GZO.js.map +1 -0
  68. package/dist/{chunk-UBLZALKP.js → chunk-7H4GTP7V.js} +3 -3
  69. package/dist/{chunk-UBLZALKP.js.map → chunk-7H4GTP7V.js.map} +1 -1
  70. package/dist/{chunk-RKI35EAN.js → chunk-AFTZNR2W.js} +3 -3
  71. package/dist/{chunk-RKI35EAN.js.map → chunk-AFTZNR2W.js.map} +1 -1
  72. package/dist/{chunk-VV2DJT4I.js → chunk-AVFRFGM2.js} +3 -3
  73. package/dist/{chunk-VV2DJT4I.js.map → chunk-AVFRFGM2.js.map} +1 -1
  74. package/dist/{chunk-5T3DTK7A.js → chunk-B436SG5P.js} +8 -9
  75. package/dist/chunk-B436SG5P.js.map +1 -0
  76. package/dist/{chunk-EXRQKOY6.js → chunk-B4BLJUYN.js} +69 -26
  77. package/dist/chunk-B4BLJUYN.js.map +1 -0
  78. package/dist/{chunk-HXZ3FQQN.js → chunk-DNXPXJ3X.js} +82 -50
  79. package/dist/chunk-DNXPXJ3X.js.map +1 -0
  80. package/dist/{chunk-QSIFEHSN.js → chunk-E6UWI3TP.js} +3 -3
  81. package/dist/{chunk-QSIFEHSN.js.map → chunk-E6UWI3TP.js.map} +1 -1
  82. package/dist/{chunk-PTBX55QF.js → chunk-EN5REMWV.js} +4 -4
  83. package/dist/{chunk-PTBX55QF.js.map → chunk-EN5REMWV.js.map} +1 -1
  84. package/dist/{chunk-G63KOHFS.js → chunk-EO7KGX6P.js} +4 -4
  85. package/dist/{chunk-G63KOHFS.js.map → chunk-EO7KGX6P.js.map} +1 -1
  86. package/dist/{chunk-TF5CWJQZ.js → chunk-ETF6Q3R3.js} +23 -80
  87. package/dist/chunk-ETF6Q3R3.js.map +1 -0
  88. package/dist/{chunk-3ENE6ZOF.js → chunk-G4NCSYWR.js} +9 -8
  89. package/dist/chunk-G4NCSYWR.js.map +1 -0
  90. package/dist/{chunk-VZU67OKK.js → chunk-G5SYFFMD.js} +2 -2
  91. package/dist/{chunk-VZU67OKK.js.map → chunk-G5SYFFMD.js.map} +1 -1
  92. package/dist/{chunk-L4OYPFLB.js → chunk-HPA3RP5E.js} +4 -4
  93. package/dist/{chunk-L4OYPFLB.js.map → chunk-HPA3RP5E.js.map} +1 -1
  94. package/dist/{chunk-TGB4E5Z6.js → chunk-IS3NIZBX.js} +414 -95
  95. package/dist/chunk-IS3NIZBX.js.map +1 -0
  96. package/dist/{chunk-6WQGJF65.js → chunk-IWKKTCXY.js} +85 -16
  97. package/dist/chunk-IWKKTCXY.js.map +1 -0
  98. package/dist/{chunk-2WOA3TKK.js → chunk-J5JWLKLB.js} +34 -19
  99. package/dist/chunk-J5JWLKLB.js.map +1 -0
  100. package/dist/chunk-J6YPKMMY.js +83 -0
  101. package/dist/chunk-J6YPKMMY.js.map +1 -0
  102. package/dist/{chunk-TDKZL5ZC.js → chunk-K4DHYTUM.js} +4 -4
  103. package/dist/{chunk-TDKZL5ZC.js.map → chunk-K4DHYTUM.js.map} +1 -1
  104. package/dist/{chunk-24D7IW5O.js → chunk-KA2GLAPS.js} +7 -8
  105. package/dist/chunk-KA2GLAPS.js.map +1 -0
  106. package/dist/{chunk-BOS7P2Y4.js → chunk-KSH5CFQS.js} +3 -3
  107. package/dist/{chunk-BOS7P2Y4.js.map → chunk-KSH5CFQS.js.map} +1 -1
  108. package/dist/{chunk-UUKCPPTQ.js → chunk-KSUT5KAE.js} +3 -3
  109. package/dist/{chunk-UUKCPPTQ.js.map → chunk-KSUT5KAE.js.map} +1 -1
  110. package/dist/{chunk-TPQKFX6X.js → chunk-KUADKMNX.js} +4 -4
  111. package/dist/{chunk-TPQKFX6X.js.map → chunk-KUADKMNX.js.map} +1 -1
  112. package/dist/{chunk-L45IHRDH.js → chunk-KYNCY3F3.js} +3 -3
  113. package/dist/{chunk-L45IHRDH.js.map → chunk-KYNCY3F3.js.map} +1 -1
  114. package/dist/{chunk-ACBL7X62.js → chunk-LE6QS4PG.js} +3 -3
  115. package/dist/{chunk-ACBL7X62.js.map → chunk-LE6QS4PG.js.map} +1 -1
  116. package/dist/{chunk-6UP2EDFN.js → chunk-NSIOBKDX.js} +313 -4
  117. package/dist/chunk-NSIOBKDX.js.map +1 -0
  118. package/dist/{chunk-YFGXYQW4.js → chunk-OBZ5WQ32.js} +3 -3
  119. package/dist/{chunk-YFGXYQW4.js.map → chunk-OBZ5WQ32.js.map} +1 -1
  120. package/dist/{chunk-JSWMRYLM.js → chunk-OLHHN3NO.js} +31 -7
  121. package/dist/chunk-OLHHN3NO.js.map +1 -0
  122. package/dist/{chunk-UAOHR6AL.js → chunk-S7DVT2BV.js} +4 -4
  123. package/dist/{chunk-UAOHR6AL.js.map → chunk-S7DVT2BV.js.map} +1 -1
  124. package/dist/{chunk-IZV3HDVG.js → chunk-SN663FCA.js} +5 -5
  125. package/dist/{chunk-IZV3HDVG.js.map → chunk-SN663FCA.js.map} +1 -1
  126. package/dist/{serve-preflight-NPWI4MV6.js → chunk-SRTWKZP2.js} +30 -61
  127. package/dist/chunk-SRTWKZP2.js.map +1 -0
  128. package/dist/{chunk-6X3GDPCB.js → chunk-SZTHSPRC.js} +3 -4
  129. package/dist/chunk-SZTHSPRC.js.map +1 -0
  130. package/dist/{chunk-V4OXHEWY.js → chunk-T7HGEMNB.js} +4 -4
  131. package/dist/{chunk-V4OXHEWY.js.map → chunk-T7HGEMNB.js.map} +1 -1
  132. package/dist/{chunk-DCJ4BION.js → chunk-TDPQOR3C.js} +2 -2
  133. package/dist/{chunk-DCJ4BION.js.map → chunk-TDPQOR3C.js.map} +1 -1
  134. package/dist/{chunk-GBXQFJ4G.js → chunk-TGUMN5G7.js} +310 -175
  135. package/dist/chunk-TGUMN5G7.js.map +1 -0
  136. package/dist/{chunk-UVTN4O7N.js → chunk-THX5EE3K.js} +33 -10
  137. package/dist/chunk-THX5EE3K.js.map +1 -0
  138. package/dist/{chunk-VSCLUPGZ.js → chunk-TNQLDEM6.js} +82 -32
  139. package/dist/chunk-TNQLDEM6.js.map +1 -0
  140. package/dist/{chunk-P7EL7QRD.js → chunk-TROEC2Z2.js} +34 -20
  141. package/dist/chunk-TROEC2Z2.js.map +1 -0
  142. package/dist/{chunk-CK3CJSRY.js → chunk-U6KRTCNA.js} +4 -4
  143. package/dist/{chunk-CK3CJSRY.js.map → chunk-U6KRTCNA.js.map} +1 -1
  144. package/dist/{chunk-ABVWUM2E.js → chunk-UMLCKKIA.js} +47 -25
  145. package/dist/chunk-UMLCKKIA.js.map +1 -0
  146. package/dist/{chunk-Q4XWCVFA.js → chunk-USVUS4DJ.js} +8 -8
  147. package/dist/{chunk-Q4XWCVFA.js.map → chunk-USVUS4DJ.js.map} +1 -1
  148. package/dist/{chunk-DF5WJC3Q.js → chunk-UZET67SO.js} +4 -4
  149. package/dist/{chunk-DF5WJC3Q.js.map → chunk-UZET67SO.js.map} +1 -1
  150. package/dist/{chunk-IZQOO6MN.js → chunk-V5KG6CCV.js} +2 -2
  151. package/dist/{chunk-IZQOO6MN.js.map → chunk-V5KG6CCV.js.map} +1 -1
  152. package/dist/{chunk-76FLBODK.js → chunk-VT6G5AJV.js} +10 -7
  153. package/dist/chunk-VT6G5AJV.js.map +1 -0
  154. package/dist/{chunk-C7TQARGC.js → chunk-W5KCAWGN.js} +3 -3
  155. package/dist/{chunk-C7TQARGC.js.map → chunk-W5KCAWGN.js.map} +1 -1
  156. package/dist/{chunk-HSF665NV.js → chunk-WFLQMAR5.js} +5 -5
  157. package/dist/{chunk-HSF665NV.js.map → chunk-WFLQMAR5.js.map} +1 -1
  158. package/dist/{chunk-ZWCGJYR7.js → chunk-X44XKBZX.js} +3 -3
  159. package/dist/{chunk-ZWCGJYR7.js.map → chunk-X44XKBZX.js.map} +1 -1
  160. package/dist/{chunk-5NHBLKKU.js → chunk-YBEJCQE5.js} +3 -3
  161. package/dist/{chunk-5NHBLKKU.js.map → chunk-YBEJCQE5.js.map} +1 -1
  162. package/dist/{chunk-BX7PSWJA.js → chunk-YRC2EFOU.js} +4 -4
  163. package/dist/{chunk-BX7PSWJA.js.map → chunk-YRC2EFOU.js.map} +1 -1
  164. package/dist/{chunk-76WSWPOB.js → chunk-Z2X7UZEZ.js} +15 -6
  165. package/dist/chunk-Z2X7UZEZ.js.map +1 -0
  166. package/dist/{chunk-U3SXCVR7.js → chunk-ZUU2PLA3.js} +4 -4
  167. package/dist/{chunk-U3SXCVR7.js.map → chunk-ZUU2PLA3.js.map} +1 -1
  168. package/dist/{claude-code-UBT4ZME7.js → claude-code-JY6CYEG7.js} +4 -4
  169. package/dist/{claude-code-UBT4ZME7.js.map → claude-code-JY6CYEG7.js.map} +1 -1
  170. package/dist/cli/index.js +306 -160
  171. package/dist/cli/index.js.map +1 -1
  172. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  173. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  174. package/dist/cli/src/commands/config.d.ts.map +1 -1
  175. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  176. package/dist/cli/src/commands/deploy.d.ts.map +1 -1
  177. package/dist/cli/src/commands/harness.d.ts +5 -4
  178. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  179. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  180. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  181. package/dist/cli/src/commands/library-index.d.ts +6 -0
  182. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  183. package/dist/cli/src/commands/migrate-files.d.ts +3 -6
  184. package/dist/cli/src/commands/migrate-files.d.ts.map +1 -1
  185. package/dist/cli/src/commands/migrate-harness.d.ts +4 -3
  186. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  187. package/dist/cli/src/commands/migrate.d.ts +2 -2
  188. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  189. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  190. package/dist/cli/src/commands/project.d.ts +7 -1
  191. package/dist/cli/src/commands/project.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 +21 -0
  194. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  195. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  196. package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
  197. package/dist/cli/src/commands/source.d.ts +8 -0
  198. package/dist/cli/src/commands/source.d.ts.map +1 -1
  199. package/dist/cli/src/commands/update.d.ts.map +1 -1
  200. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  201. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  202. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  203. package/dist/cli/src/commands/verify.d.ts.map +1 -1
  204. package/dist/cli/src/config-checks.d.ts +8 -0
  205. package/dist/cli/src/config-checks.d.ts.map +1 -1
  206. package/dist/cli/src/ensure-sources.d.ts.map +1 -1
  207. package/dist/cli/src/helpers.d.ts +3 -2
  208. package/dist/cli/src/helpers.d.ts.map +1 -1
  209. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  210. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  211. package/dist/cli/src/plugin-store/spec.d.ts +1 -0
  212. package/dist/cli/src/plugin-store/spec.d.ts.map +1 -1
  213. package/dist/cli/src/skill-checks.d.ts +2 -0
  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 +23 -24
  217. package/dist/connectors/src/index.d.ts +2 -2
  218. package/dist/connectors/src/index.d.ts.map +1 -1
  219. package/dist/connectors/src/managed-gitconfig.d.ts +22 -0
  220. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  221. package/dist/connectors/src/npm-installer.d.ts +11 -3
  222. package/dist/connectors/src/npm-installer.d.ts.map +1 -1
  223. package/dist/connectors-VLFOQNS6.js +49 -0
  224. package/dist/{connectors-4WH32NK2.js.map → connectors-VLFOQNS6.js.map} +1 -1
  225. package/dist/connectors-shared/index.js +2 -2
  226. package/dist/core/index.js +6 -6
  227. package/dist/core/manifest.js +2 -2
  228. package/dist/core/models.js +1 -1
  229. package/dist/core/publish-manifest.js +3 -3
  230. package/dist/core/ref.js +1 -1
  231. package/dist/core/runtime-assets.js +5 -5
  232. package/dist/core/src/agent-instances.d.ts +6 -0
  233. package/dist/core/src/agent-instances.d.ts.map +1 -1
  234. package/dist/core/src/config-key-diagnostics.d.ts +2 -1
  235. package/dist/core/src/config-key-diagnostics.d.ts.map +1 -1
  236. package/dist/core/src/index.d.ts +4 -4
  237. package/dist/core/src/index.d.ts.map +1 -1
  238. package/dist/core/src/lock.d.ts +20 -1
  239. package/dist/core/src/lock.d.ts.map +1 -1
  240. package/dist/core/src/manifest-yaml-editor.d.ts +4 -1
  241. package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -1
  242. package/dist/core/src/models.d.ts +10 -0
  243. package/dist/core/src/models.d.ts.map +1 -1
  244. package/dist/core/src/repo-manager.d.ts +11 -0
  245. package/dist/core/src/repo-manager.d.ts.map +1 -1
  246. package/dist/core/src/runtime-assets.d.ts +12 -1
  247. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  248. package/dist/core/src/walker.d.ts +3 -0
  249. package/dist/core/src/walker.d.ts.map +1 -1
  250. package/dist/core/src/workspace-config.d.ts +4 -2
  251. package/dist/core/src/workspace-config.d.ts.map +1 -1
  252. package/dist/core/workspace-config.js +4 -4
  253. package/dist/deploy/index.js +6 -6
  254. package/dist/discovery/index.js +5 -5
  255. package/dist/{ensure-sources-UC2RBYMP.js → ensure-sources-6O54DUQB.js} +31 -31
  256. package/dist/ensure-sources-6O54DUQB.js.map +1 -0
  257. package/dist/factory-assets/connectors/box.js +23 -24
  258. package/dist/factory-assets/connectors/deploy.js +23 -24
  259. package/dist/factory-assets/connectors/devserver.js +23 -24
  260. package/dist/factory-assets/connectors/flow/adapter.js +23 -24
  261. package/dist/factory-assets/connectors/flow/engine.js +7 -7
  262. package/dist/factory-assets/connectors/flow/run-flow.js +25 -26
  263. package/dist/factory-assets/connectors/flow.js +23 -24
  264. package/dist/factory-assets/connectors/git.js +23 -24
  265. package/dist/factory-assets/connectors/gmail.js +23 -24
  266. package/dist/factory-assets/connectors/googledrive.js +23 -24
  267. package/dist/factory-assets/connectors/local.js +23 -24
  268. package/dist/factory-assets/connectors/mattermost.js +23 -24
  269. package/dist/factory-assets/connectors/memory.js +23 -24
  270. package/dist/factory-assets/connectors/minio.js +23 -24
  271. package/dist/factory-assets/connectors/postgres.js +23 -24
  272. package/dist/factory-assets/connectors/s3.js +23 -24
  273. package/dist/factory-assets/connectors/sharepoint.js +23 -24
  274. package/dist/factory-assets/connectors/sqlite.js +23 -24
  275. package/dist/factory-assets/connectors/static-server.js +23 -24
  276. package/dist/factory-assets/connectors/tunnel.js +23 -24
  277. package/dist/factory-assets/connectors/webdav.js +23 -24
  278. package/dist/factory-assets/connectors/xstate-store.js +23 -24
  279. package/dist/factory-assets/connectors/xstate.js +23 -24
  280. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +2 -1
  281. package/dist/{flows-LYTKNGKE.js → flows-CIUPK7SB.js} +11 -11
  282. package/dist/{flows-LYTKNGKE.js.map → flows-CIUPK7SB.js.map} +1 -1
  283. package/dist/{helpers-SSSKT5XK.js → helpers-YHDQHQEQ.js} +28 -29
  284. package/dist/{helpers-SSSKT5XK.js.map → helpers-YHDQHQEQ.js.map} +1 -1
  285. package/dist/library/index.js +10 -10
  286. package/dist/library/install.js +4 -4
  287. package/dist/library/src/manifest-writer.d.ts +9 -0
  288. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  289. package/dist/library/src/remote/remote-catalog-source.d.ts +9 -0
  290. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  291. package/dist/library/src/remote/rest-catalog-source.d.ts +1 -0
  292. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  293. package/dist/{library-publish-GQMNTAKK.js → library-publish-MUGUST43.js} +53 -53
  294. package/dist/{library-publish-GQMNTAKK.js.map → library-publish-MUGUST43.js.map} +1 -1
  295. package/dist/model-endpoint/index.js +9 -10
  296. package/dist/open-library-BVQCB37E.js +57 -0
  297. package/dist/{open-library-XGUCUJYE.js.map → open-library-BVQCB37E.js.map} +1 -1
  298. package/dist/{open-registry-DIFEPDF6.js → open-registry-JCSIAKEC.js} +14 -14
  299. package/dist/{open-registry-DIFEPDF6.js.map → open-registry-JCSIAKEC.js.map} +1 -1
  300. package/dist/{paths-G4GFJLE2.js → paths-XLKCAFRZ.js} +9 -9
  301. package/dist/{paths-G4GFJLE2.js.map → paths-XLKCAFRZ.js.map} +1 -1
  302. package/dist/{plugin-store-BBLDFD3L.js → plugin-store-NGRUTCJI.js} +9 -9
  303. package/dist/{plugin-store-BBLDFD3L.js.map → plugin-store-NGRUTCJI.js.map} +1 -1
  304. package/dist/project-BGYMLAS6.js +88 -0
  305. package/dist/{project-LB745WVZ.js.map → project-BGYMLAS6.js.map} +1 -1
  306. package/dist/resolver/index.js +7 -7
  307. package/dist/runner/index.js +38 -39
  308. package/dist/runner/src/composition/resolve-instance.d.ts.map +1 -1
  309. package/dist/runner/src/composition/resolve.d.ts +6 -0
  310. package/dist/runner/src/composition/resolve.d.ts.map +1 -1
  311. package/dist/runner/src/credential-notice.d.ts +3 -2
  312. package/dist/runner/src/credential-notice.d.ts.map +1 -1
  313. package/dist/runner/src/resources.d.ts.map +1 -1
  314. package/dist/runner/src/serve.d.ts.map +1 -1
  315. package/dist/sdk/asset-manager.js +13 -13
  316. package/dist/sdk/bridge.js +19 -20
  317. package/dist/sdk/core.js +6 -6
  318. package/dist/sdk/flow.js +7 -7
  319. package/dist/sdk/index.js +38 -39
  320. package/dist/sdk/index.js.map +1 -1
  321. package/dist/sdk/resolver.js +7 -7
  322. package/dist/sdk/runner.js +38 -39
  323. package/dist/sdk/session.js +2 -2
  324. package/dist/sdk/transport/ws/server.js +7 -7
  325. package/dist/sdk/transport/ws.js +7 -7
  326. package/dist/sdk/transport.js +7 -7
  327. package/dist/sdk/types.js +1 -1
  328. package/dist/serve-preflight-GQY5DZX6.js +56 -0
  329. package/dist/serve-preflight-GQY5DZX6.js.map +1 -0
  330. package/dist/session/index.js +2 -2
  331. package/dist/{setup-X6ZYH2MW.js → setup-2NWSKSCO.js} +29 -30
  332. package/dist/setup-2NWSKSCO.js.map +1 -0
  333. package/dist/{skills-62PXDBPJ.js → skills-PXZOL2FZ.js} +12 -12
  334. package/dist/{skills-62PXDBPJ.js.map → skills-PXZOL2FZ.js.map} +1 -1
  335. package/dist/source-XA3L4H6I.js +86 -0
  336. package/dist/{source-LAYCTRHP.js.map → source-XA3L4H6I.js.map} +1 -1
  337. package/dist/{source-manifest-publish-3S6PJ25W.js → source-manifest-publish-QEGMTS33.js} +50 -51
  338. package/dist/source-manifest-publish-QEGMTS33.js.map +1 -0
  339. package/dist/transport/index.js +7 -7
  340. package/dist/transport/ws/server.js +7 -7
  341. package/dist/transport/ws.js +7 -7
  342. package/dist/tui/index.js +38 -39
  343. package/dist/tui/index.js.map +1 -1
  344. package/dist/types/index.js +1 -1
  345. package/dist/types/manifests.js +1 -1
  346. package/dist/types/src/manifests/agent.d.ts +2 -2
  347. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  348. package/dist/types/src/version.d.ts +8 -8
  349. package/dist/workspace-plugin/adapters/mcp.js +30 -31
  350. package/dist/workspace-plugin/adapters/omp.js +14 -14
  351. package/dist/workspace-plugin/index.js +1 -1
  352. package/package.json +1 -1
  353. package/dist/chunk-24D7IW5O.js.map +0 -1
  354. package/dist/chunk-2WOA3TKK.js.map +0 -1
  355. package/dist/chunk-3ENE6ZOF.js.map +0 -1
  356. package/dist/chunk-5T3DTK7A.js.map +0 -1
  357. package/dist/chunk-6OHZUUR7.js.map +0 -1
  358. package/dist/chunk-6UP2EDFN.js.map +0 -1
  359. package/dist/chunk-6WQGJF65.js.map +0 -1
  360. package/dist/chunk-6X3GDPCB.js.map +0 -1
  361. package/dist/chunk-76FLBODK.js.map +0 -1
  362. package/dist/chunk-76WSWPOB.js.map +0 -1
  363. package/dist/chunk-ABVWUM2E.js.map +0 -1
  364. package/dist/chunk-EXRQKOY6.js.map +0 -1
  365. package/dist/chunk-GBXQFJ4G.js.map +0 -1
  366. package/dist/chunk-HXZ3FQQN.js.map +0 -1
  367. package/dist/chunk-IYZAJ2J2.js.map +0 -1
  368. package/dist/chunk-JSWMRYLM.js.map +0 -1
  369. package/dist/chunk-P7EL7QRD.js.map +0 -1
  370. package/dist/chunk-QJQQNBVT.js +0 -315
  371. package/dist/chunk-QJQQNBVT.js.map +0 -1
  372. package/dist/chunk-TF5CWJQZ.js.map +0 -1
  373. package/dist/chunk-TGB4E5Z6.js.map +0 -1
  374. package/dist/chunk-UVTN4O7N.js.map +0 -1
  375. package/dist/chunk-VSCLUPGZ.js.map +0 -1
  376. package/dist/chunk-YJNE4V2M.js.map +0 -1
  377. package/dist/connectors-4WH32NK2.js +0 -50
  378. package/dist/ensure-sources-UC2RBYMP.js.map +0 -1
  379. package/dist/open-library-XGUCUJYE.js +0 -58
  380. package/dist/project-LB745WVZ.js +0 -88
  381. package/dist/serve-preflight-NPWI4MV6.js.map +0 -1
  382. package/dist/setup-X6ZYH2MW.js.map +0 -1
  383. package/dist/source-LAYCTRHP.js +0 -87
  384. package/dist/source-manifest-publish-3S6PJ25W.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"chunk-SISUT7VR.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport { loadHarnessSdk } from \"@skaile/workspaces/core\";\nimport { DEFAULT_HARNESS_ID } from \"@skaile/workspaces/core/framework\";\nimport { withActivityLabelDefs } from \"@skaile/workspaces/types\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 27 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 5 skill tools (`skill_list`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 27 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const harness = plugin.harness ?? DEFAULT_HARNESS_ID;\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get harness metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n inputSchema: {},\n handler: async () => skillList(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, harness binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, harness),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: harness, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, harness, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n plugin.projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n );\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: withActivityLabelDefs(buildWorkspaceToolDefs(plugin), zStatic),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 27 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
1
+ {"version":3,"sources":["../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"chunk-3KSLUVKB.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport { loadHarnessSdk } from \"@skaile/workspaces/core\";\nimport { DEFAULT_HARNESS_ID } from \"@skaile/workspaces/core/framework\";\nimport { withActivityLabelDefs } from \"@skaile/workspaces/types\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 27 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 5 skill tools (`skill_list`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 27 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const harness = plugin.harness ?? DEFAULT_HARNESS_ID;\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get harness metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n inputSchema: {},\n handler: async () => skillList(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, harness binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, harness),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: harness, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, harness, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n plugin.projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n );\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: withActivityLabelDefs(buildWorkspaceToolDefs(plugin), zStatic),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 27 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
@@ -116,7 +116,10 @@ function classifyByStructuredError(message, structured, opts) {
116
116
  category: "auth",
117
117
  statusCode: structured.statusCode ?? 401,
118
118
  retryable: false,
119
- hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : "Anthropic rejected the API key. Check it in Settings -> AI Providers."
119
+ hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : localAuthHint(
120
+ opts,
121
+ "Anthropic rejected the API key. Check it in Settings -> AI Providers."
122
+ )
120
123
  };
121
124
  }
122
125
  if (structured.errorType === "permission_error") {
@@ -171,7 +174,7 @@ function classifyByKeyword(message, lower, opts) {
171
174
  category: "auth",
172
175
  statusCode: 401,
173
176
  retryable: false,
174
- hint: opts.oauthCredential ? "The Claude Code OAuth credential expired and could not be auto-refreshed in-container. The runner will re-mint it \u2014 retry the prompt. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : "No Anthropic credential is configured for this provider. Add one in Settings -> AI Providers."
177
+ hint: opts.oauthCredential ? opts.local ? "The Claude Code login has expired. Log in again with `claude /login`, or set ANTHROPIC_API_KEY (or run `skaile providers add anthropic --credential env:ANTHROPIC_API_KEY`), then retry the prompt." : "The Claude Code OAuth credential expired and could not be auto-refreshed in-container. The runner will re-mint it \u2014 retry the prompt. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : opts.local ? "No Anthropic credential is configured. Set ANTHROPIC_API_KEY, or run `skaile providers add anthropic --credential env:ANTHROPIC_API_KEY`." : "No Anthropic credential is configured for this provider. Add one in Settings -> AI Providers."
175
178
  };
176
179
  }
177
180
  if (lower.includes("api key") || lower.includes("authentication") || lower.includes("invalid authentication") || lower.includes("unauthorized") || lower.includes("401") || lower.includes("403")) {
@@ -179,7 +182,7 @@ function classifyByKeyword(message, lower, opts) {
179
182
  message,
180
183
  category: "auth",
181
184
  retryable: false,
182
- hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file." : "Check the API key configured for this AI provider in Settings."
185
+ hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file." : localAuthHint(opts, "Check the API key configured for this AI provider in Settings.")
183
186
  };
184
187
  }
185
188
  if (lower.includes("model") && (lower.includes("not found") || lower.includes("not available") || lower.includes("does not exist"))) {
@@ -246,6 +249,9 @@ function classifyGenericErrorMessage(msg) {
246
249
  }
247
250
  return null;
248
251
  }
252
+ function localAuthHint(opts, provisioned) {
253
+ return opts.local ? "Check the API key with `skaile providers test <id>`, or set ANTHROPIC_API_KEY." : provisioned;
254
+ }
249
255
  function oauthQuotaHint(oauthCredential) {
250
256
  if (oauthCredential) {
251
257
  return "Quota exhausted on this Claude Code subscription. Wait for the rate-limit window to reset (typically a few minutes for short windows, longer for daily/weekly limits) before retrying. The credential itself is fine.";
@@ -517,5 +523,5 @@ function stripRunnerPrivateEnv(env) {
517
523
  var RUNNER_AGENT_ENV_KEYS = ["GIT_CONFIG_GLOBAL"];
518
524
 
519
525
  export { AccountUnavailableError, AuthError, LONG_CONTEXT_CREDITS_API_ERROR, RUNNER_AGENT_ENV_KEYS, RUNNER_PRIVATE_ENV_KEYS, ReconfigureLedger, classifyClaudeSdkError, classifyGenericErrorMessage, isLongContextEntitlementRejection, reclassifyAuthAsAccountUnavailable, scopeReconfigureModel, stripRunnerPrivateEnv };
520
- //# sourceMappingURL=chunk-6OHZUUR7.js.map
521
- //# sourceMappingURL=chunk-6OHZUUR7.js.map
526
+ //# sourceMappingURL=chunk-5DE3DGVR.js.map
527
+ //# sourceMappingURL=chunk-5DE3DGVR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/error-classifier.ts","../bridge/src/reconfigure-model-ref.ts","../bridge/src/reconfigure-ledger.ts","../bridge/src/runner-private-env.ts"],"names":[],"mappings":"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","file":"chunk-5DE3DGVR.js","sourcesContent":["/**\n * Error classification for the Claude Agent SDK harness.\n *\n * Wraps the Anthropic API error patterns surfaced through the bundled\n * `claude-cli.js`. The CLI flattens upstream HTTP errors into terse strings\n * like:\n *\n * `Claude Code returned an error result: Failed to authenticate. API Error:\n * 401 {\"type\":\"error\",\"error\":{\"type\":\"authentication_error\",\"message\":\n * \"Invalid authentication credentials\"}}`\n *\n * Word-for-word that reads as an auth failure, but in practice it also\n * fires when a Claude Max OAuth subscription has exhausted its current\n * quota window — Anthropic returns a non-200 that the CLI relabels as\n * \"Failed to authenticate\" without preserving the original error type.\n *\n * The classifier here:\n * 1. Parses an embedded JSON body when the upstream included one\n * (e.g. `{\"type\":\"error\",\"error\":{\"type\":\"rate_limit_error\",...}}`)\n * so we believe the structured `error.type` over the surrounding\n * free-text wrapper.\n * 2. Honours the SDK's `terminal_reason` when it explicitly indicates\n * a blocking-limit / rapid-refill / model-error condition — those\n * are authoritative even if the textual error reads as auth.\n * 3. Falls back to keyword heuristics on the message text.\n * 4. For OAuth-style credentials (Claude Code subscriptions), adds a\n * hint that bounces user attention to quota rather than credentials,\n * because that's overwhelmingly the cause when a CredentialsFile\n * provider that worked yesterday now returns \"Invalid authentication\n * credentials\" without anyone touching the file.\n */\n\nimport type { AgentError } from \"./types.js\";\n\n/**\n * Error thrown by harnesses when the upstream provider rejects the credential\n * with an authentication-shaped failure (HTTP 401 / `authentication_error`\n * structured body). Carries the structured {@link AgentError} produced by\n * {@link classifyClaudeSdkError} so the runner can mediate without\n * re-classifying string text.\n *\n * The runner's 401-mediation handler `instanceof`-discriminates on this\n * subclass so the auth-vs-rate_limit fork stays in one place.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`\n * § \"Runner-side handling on 401\".\n *\n * @category Errors\n * @since 3.3.0\n */\nexport class AuthError extends Error {\n readonly detail: AgentError;\n constructor(detail: AgentError) {\n super(detail.message);\n this.name = \"AuthError\";\n this.detail = detail;\n }\n}\n\n/**\n * Error thrown when an auth-shaped failure persists *after* a successful\n * credential self-heal — the refresh worked, yet the immediate retry still\n * returned 401. That combination rules out the credential and points at the\n * account itself: a hidden-tier rate limit, a billing block, or anti-abuse\n * throttling on OAuth tokens used at scale (Anthropic mislabels all three as\n * `authentication_error`). It deliberately does **not** extend {@link AuthError}\n * so the harness's auth self-heal does not fire again on it.\n *\n * @category Errors\n */\nexport class AccountUnavailableError extends Error {\n readonly detail: AgentError;\n constructor(detail: AgentError) {\n super(detail.message);\n this.name = \"AccountUnavailableError\";\n this.detail = detail;\n }\n}\n\n/**\n * Re-label an auth-shaped {@link AgentError} as an `account` failure. Called\n * when a 401 recurs after a successful credential refresh: the credential is\n * fine, so the user needs an account-state hint, not \"check your API key\".\n * Pure function.\n */\nexport function reclassifyAuthAsAccountUnavailable(detail: AgentError): AgentError {\n return {\n ...detail,\n category: \"account\",\n statusCode: detail.statusCode ?? 401,\n retryable: false,\n hint: \"The credential was refreshed successfully but Anthropic still rejected the request. This is an account-state issue, not an invalid credential — usually a rate limit at a hidden tier, a billing block, or anti-abuse throttling. Wait a few minutes and retry; if it persists, check the account's billing and usage limits at https://console.anthropic.com/.\",\n };\n}\n\n/**\n * `terminal_reason` values from the Claude Agent SDK that imply the failure\n * is a rate / quota / blocking condition rather than a credential problem.\n */\nconst RATE_LIMIT_TERMINAL_REASONS = new Set<string>([\"blocking_limit\", \"rapid_refill_breaker\"]);\n\n/**\n * `terminal_reason` values that indicate a generic, retryable model failure.\n * `prompt_too_long` is handled separately (not retryable, different hint).\n */\nconst MODEL_TERMINAL_REASONS = new Set<string>([\"model_error\", \"image_error\"]);\n\n/**\n * Input shape for {@link classifyClaudeSdkError} when decoding an `SDKResultError`.\n *\n * All fields are optional; `classifyClaudeSdkError` also accepts a plain `string`\n * (a thrown exception message) for the common non-SDK code paths.\n *\n * @docLink packages/bridge/api-reference#error-classifier\n */\nexport interface ClaudeSdkResultErrorInput {\n /** `errors` array from `SDKResultError`. Empty when not provided. */\n errors?: string[];\n /**\n * `terminal_reason` from `SDKResultError`. Authoritative when set to a\n * blocking/rapid-refill value, regardless of message text.\n */\n terminalReason?: string;\n /** `subtype` from `SDKResultError` — `error_max_turns` etc. */\n subtype?: string;\n /**\n * `true` when the configured Anthropic credential is a Claude Code\n * subscription (`CredentialsFile` provider) rather than a raw API key.\n * Changes the hint copy because `Invalid authentication credentials`\n * on an OAuth subscription almost always means quota.\n */\n oauthCredential?: boolean;\n /**\n * `true` when the harness runs on a developer machine (`skaile run`, `repl`, or a local\n * `serve`) and not in a provisioned runner. The hints then name CLI commands instead of the\n * platform's Settings screen, and do not promise a re-mint that nothing will do (p1943).\n */\n local?: boolean;\n}\n\n/**\n * The `apiError` tag the Claude Agent SDK (0.3.289) puts on the assistant\n * message it renders for a long-context entitlement 429.\n */\nexport const LONG_CONTEXT_CREDITS_API_ERROR = \"long_context_credits_required\";\n\n/**\n * Upstream and SDK-rendered wordings of the long-context entitlement 429:\n * \"Extra usage is required for long context\", \"Usage credits are required for\n * long context requests\", and the CLI's \"Usage credits required for 1M context\".\n */\nconst LONG_CONTEXT_ENTITLEMENT_PATTERN =\n /\\b(?:extra usage is|usage credits(?: are)?) required for (?:long|1m) context\\b/i;\n\n/**\n * Whether any of `texts` is the 429 Anthropic returns when the account may not\n * use a long (1M) context window: the seat is not out of quota, it cannot serve\n * a context over 200k. Matches only that wording, never a usage-limit 429.\n *\n * @docLink packages/bridge/api-reference#error-classifier\n */\nexport function isLongContextEntitlementRejection(\n texts: ReadonlyArray<string | null | undefined>,\n): boolean {\n return texts.some(\n (text) => typeof text === \"string\" && LONG_CONTEXT_ENTITLEMENT_PATTERN.test(text),\n );\n}\n\n/**\n * Classify a Claude SDK result-error or thrown error into a structured\n * {@link AgentError}. Pure function — safe to call from any layer.\n *\n * @param input - Either a free-text error message (from a thrown exception)\n * or a partially-decoded `SDKResultError` shape with `errors[]`,\n * `terminal_reason`, and `subtype`.\n * @returns A category, retryable flag, and human-readable hint.\n * @docLink packages/bridge/api-reference#error-classifier\n */\nexport function classifyClaudeSdkError(input: string | ClaudeSdkResultErrorInput): AgentError {\n const opts: ClaudeSdkResultErrorInput = typeof input === \"string\" ? { errors: [input] } : input;\n\n const message = (opts.errors ?? []).join(\"; \") || \"Unknown agent error\";\n\n // ── 1. Honour authoritative `terminal_reason` ──────────────────────────\n const byTerminalReason = classifyByTerminalReason(message, opts);\n if (byTerminalReason) {\n return byTerminalReason;\n }\n\n // ── 2. Inspect embedded JSON body for a structured error.type ──────────\n const structured = tryParseEmbeddedAnthropicError(message);\n if (structured) {\n const byStructured = classifyByStructuredError(message, structured, opts);\n if (byStructured) {\n return byStructured;\n }\n }\n\n // ── 3. Heuristic keyword classification on the wrapper text ────────────\n const lower = message.toLowerCase();\n\n const byKeyword = classifyByKeyword(message, lower, opts);\n if (byKeyword) {\n return byKeyword;\n }\n\n // ── 4. SDK result subtypes ─────────────────────────────────────────────\n const bySubtype = classifyBySubtype(message, opts);\n if (bySubtype) {\n return bySubtype;\n }\n\n return {\n message,\n category: \"unknown\",\n retryable: true,\n };\n}\n\n/**\n * Phase 1: classify on the SDK's authoritative `terminal_reason`. Returns\n * `null` when the reason is unset or not one of the recognised values.\n */\nfunction classifyByTerminalReason(\n message: string,\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (opts.terminalReason && RATE_LIMIT_TERMINAL_REASONS.has(opts.terminalReason)) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n if (opts.terminalReason === \"prompt_too_long\") {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long for the configured model. Start a new session or compact the existing one.\",\n };\n }\n if (opts.terminalReason && MODEL_TERMINAL_REASONS.has(opts.terminalReason)) {\n return {\n message,\n category: \"model\",\n retryable: true,\n hint: \"The model rejected this turn. Try again or switch models.\",\n };\n }\n return null;\n}\n\n/**\n * Phase 2: classify on the structured `error.type` parsed from an embedded\n * Anthropic JSON body. Returns `null` for an unrecognised `errorType`.\n */\nfunction classifyByStructuredError(\n message: string,\n structured: { errorType: string; statusCode?: number },\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (structured.errorType === \"rate_limit_error\") {\n return {\n message,\n category: \"rate_limit\",\n statusCode: structured.statusCode ?? 429,\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n if (structured.errorType === \"overloaded_error\") {\n return {\n message,\n category: \"rate_limit\",\n statusCode: structured.statusCode ?? 529,\n retryable: true,\n hint: \"Anthropic is overloaded. Try again in a moment.\",\n };\n }\n if (structured.errorType === \"authentication_error\") {\n // Anthropic genuinely says it's an auth failure. But for OAuth\n // credentials with the `oauth-2025-04-20` beta flow, this still\n // overwhelmingly correlates with quota. Surface both possibilities\n // in the hint so the user does not first re-upload a perfectly\n // good credentials file.\n return {\n message,\n category: \"auth\",\n statusCode: structured.statusCode ?? 401,\n retryable: false,\n hint: opts.oauthCredential\n ? \"Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token — wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install.\"\n : localAuthHint(\n opts,\n \"Anthropic rejected the API key. Check it in Settings -> AI Providers.\",\n ),\n };\n }\n if (structured.errorType === \"permission_error\") {\n return {\n message,\n category: \"auth\",\n statusCode: structured.statusCode ?? 403,\n retryable: false,\n hint: \"The configured credential does not have access to the requested model.\",\n };\n }\n if (structured.errorType === \"invalid_request_error\") {\n return {\n message,\n category: \"validation\",\n statusCode: structured.statusCode ?? 400,\n retryable: false,\n hint: \"Anthropic rejected the request shape. This is likely a bug — please report it.\",\n };\n }\n return null;\n}\n\n/**\n * Phase 3: heuristic keyword classification on the lowercased wrapper text.\n * `lower` is the pre-lowercased `message`. Returns `null` when no bucket hits.\n */\nfunction classifyByKeyword(\n message: string,\n lower: string,\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"rate_limit\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"429\") ||\n lower.includes(\"quota\") ||\n lower.includes(\"blocking_limit\") ||\n lower.includes(\"rapid_refill\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n\n if (\n lower.includes(\"credit balance\") ||\n lower.includes(\"insufficient credit\") ||\n lower.includes(\"out of credits\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: false,\n hint: \"The configured Anthropic account is out of credits. Top up at https://console.anthropic.com/ or switch providers.\",\n };\n }\n\n if (lower.includes(\"oauth authentication is currently not supported\")) {\n return {\n message,\n category: \"auth\",\n statusCode: 401,\n retryable: false,\n hint: \"The Claude Code CLI did not send the OAuth beta header. The bundled CLI in this image is too old — rebuild the agent image.\",\n };\n }\n\n // The Claude Code CLI emits this terse, JSON-less string when it finds no\n // usable credential — most commonly because the OAuth access token in\n // `~/.claude/.credentials.json` expired and the file carries no refresh token\n // (the platform provisions access-token-only files by design). It MUST be\n // classified as `auth` so the harness promotes it to `AuthError` and the\n // `onAuthError` self-heal re-mints the credential. Without this branch the\n // message falls through to `unknown`, the self-heal never fires, and every\n // subsequent turn dead-ends on \"please /login\". The check sits ahead of the\n // generic auth keywords because the string contains none of them.\n if (lower.includes(\"not logged in\") || lower.includes(\"please run /login\")) {\n return {\n message,\n category: \"auth\",\n statusCode: 401,\n retryable: false,\n hint: opts.oauthCredential\n ? opts.local\n ? \"The Claude Code login has expired. Log in again with `claude /login`, or set ANTHROPIC_API_KEY (or run `skaile providers add anthropic --credential env:ANTHROPIC_API_KEY`), then retry the prompt.\"\n : \"The Claude Code OAuth credential expired and could not be auto-refreshed in-container. The runner will re-mint it — retry the prompt. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install.\"\n : opts.local\n ? \"No Anthropic credential is configured. Set ANTHROPIC_API_KEY, or run `skaile providers add anthropic --credential env:ANTHROPIC_API_KEY`.\"\n : \"No Anthropic credential is configured for this provider. Add one in Settings -> AI Providers.\",\n };\n }\n\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"invalid authentication\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"401\") ||\n lower.includes(\"403\")\n ) {\n return {\n message,\n category: \"auth\",\n retryable: false,\n hint: opts.oauthCredential\n ? \"Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token — wait a few minutes before re-uploading the credentials file.\"\n : localAuthHint(opts, \"Check the API key configured for this AI provider in Settings.\"),\n };\n }\n\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The selected model is not available for this credential. Change the model in the AI provider config.\",\n };\n }\n\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\") ||\n lower.includes(\"prompt is too long\") ||\n lower.includes(\"prompt_too_long\")\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long for the model. Start a new session or compact this one.\",\n };\n }\n\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"fetch failed\") ||\n lower.includes(\"network\")\n ) {\n return {\n message,\n category: \"network\",\n retryable: true,\n hint: \"Network error reaching Anthropic. The runner will retry — try again if it persists.\",\n };\n }\n\n return null;\n}\n\n/**\n * Phase 4: classify on the SDK result `subtype` (`error_max_turns` etc).\n * Returns `null` when the subtype is unset or unrecognised.\n */\nfunction classifyBySubtype(message: string, opts: ClaudeSdkResultErrorInput): AgentError | null {\n if (opts.subtype === \"error_max_turns\") {\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"The agent stopped after reaching `max_turns`. Resume the session or raise `max_turns` in the agent config.\",\n };\n }\n if (opts.subtype === \"error_max_budget_usd\") {\n return {\n message,\n category: \"rate_limit\",\n retryable: false,\n hint: \"The agent stopped because it hit the configured per-turn budget. Raise the budget or split the work.\",\n };\n }\n return null;\n}\n\n/**\n * The shared keyword buckets matched by {@link classifyGenericErrorMessage}.\n * Harnesses layer a provider-specific `hint` on top of the returned category.\n */\nexport type GenericErrorCategory = \"auth\" | \"rate_limit\" | \"model\" | \"network\";\n\n/**\n * Classify a free-text harness error against the keyword buckets common to the\n * subprocess/SDK harnesses (omp, codex). Returns the matched `category` +\n * `retryable` flag, or `null` when no shared bucket matches so the caller can\n * fall through to its own provider-specific buckets (e.g. codex sandbox) and\n * `unknown` default. The harness supplies the user-facing `hint` — only the\n * bucketing logic is shared, not the copy.\n */\nexport function classifyGenericErrorMessage(\n msg: string,\n): { category: GenericErrorCategory; retryable: boolean } | null {\n const lower = msg.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return { category: \"auth\", retryable: false };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return { category: \"rate_limit\", retryable: true };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return { category: \"model\", retryable: false };\n }\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"too long\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\")\n ) {\n return { category: \"model\", retryable: false };\n }\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"network\") ||\n lower.includes(\"fetch failed\") ||\n lower.includes(\"fetch\") ||\n lower.includes(\"connection\")\n ) {\n return { category: \"network\", retryable: true };\n }\n return null;\n}\n\n/**\n * The hint for a rejected API key: the platform's Settings wording in a provisioned runner, the\n * CLI command on a developer machine, which has no Settings screen (p1943).\n */\nfunction localAuthHint(opts: ClaudeSdkResultErrorInput, provisioned: string): string {\n return opts.local\n ? \"Check the API key with `skaile providers test <id>`, or set ANTHROPIC_API_KEY.\"\n : provisioned;\n}\n\n/**\n * Returns the rate-limit hint copy, branched on whether the active\n * credential is a Claude Code OAuth subscription.\n */\nfunction oauthQuotaHint(oauthCredential?: boolean): string {\n if (oauthCredential) {\n return \"Quota exhausted on this Claude Code subscription. Wait for the rate-limit window to reset (typically a few minutes for short windows, longer for daily/weekly limits) before retrying. The credential itself is fine.\";\n }\n return \"The Anthropic account hit a rate limit. Wait a moment and try again.\";\n}\n\n/**\n * Try to extract a structured Anthropic error body from a free-text wrapper.\n * The bundled `claude-cli.js` typically formats failures as\n * `... API Error: <status> {\"type\":\"error\",\"error\":{\"type\":\"<errorType>\",...}}`\n * with optional trailing garbage after the JSON.\n *\n * Strategy: find the first `{`, then forward-scan tracking brace depth (with\n * string-literal awareness so braces inside quoted values do not throw the\n * count). The substring from `braceStart` to the matching `}` is the JSON\n * candidate; one `JSON.parse` does the rest. O(n) in the input length.\n *\n * Returns `null` when nothing parseable is found.\n */\nfunction tryParseEmbeddedAnthropicError(\n text: string,\n): { errorType: string; statusCode?: number } | null {\n const braceStart = text.indexOf(\"{\");\n if (braceStart < 0) {\n return null;\n }\n\n const braceEnd = findMatchingCloseBrace(text, braceStart);\n if (braceEnd < 0) {\n return null;\n }\n\n let parsed: { type?: string; error?: { type?: string; message?: string } };\n try {\n parsed = JSON.parse(text.slice(braceStart, braceEnd));\n } catch {\n return null;\n }\n const errorType = parsed?.error?.type;\n if (typeof errorType !== \"string\") {\n return null;\n }\n const statusMatch = text.match(/API Error:\\s*(\\d{3})/i);\n const statusCode = statusMatch ? Number(statusMatch[1]) : undefined;\n return { errorType, statusCode };\n}\n\n/**\n * Forward-scan `text` from `braceStart` (a `{`) with brace counting, returning\n * the index just past the matching close brace, or `-1` if unbalanced.\n * String-literal awareness: skip braces between unescaped double quotes.\n */\nfunction findMatchingCloseBrace(text: string, braceStart: number): number {\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = braceStart; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (ch === 92 /* \\ */) {\n escaped = true;\n } else if (ch === 34 /* \" */) {\n inString = false;\n }\n continue;\n }\n if (ch === 34 /* \" */) {\n inString = true;\n } else if (ch === 123 /* { */) {\n depth++;\n } else if (ch === 125 /* } */) {\n depth--;\n if (depth === 0) {\n return i + 1;\n }\n }\n }\n return -1;\n}\n","// The registry selector a live model change (`reconfigure({ model })`) leaves a\n// session on. Shared by the runner's `runner.reconfigure` handler and every\n// harness whose `reconfigure()` rewrites `modelRef`, so both pick the same entry.\nimport {\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\n\n/** What a model-only reconfigure does to the session's registry selector. */\nexport type ReconfigureModelScope =\n | {\n ok: true;\n /** The selector to run from now on; `undefined` leaves `modelRef` unset. */\n modelRef: string | undefined;\n }\n | {\n ok: false;\n code: \"model_not_on_provider\";\n /** The entry the session runs on, or the one the patch named. */\n providerId: string;\n message: string;\n };\n\nexport interface ReconfigureModelScopeInput {\n /** The model the patch names: bare, `<providerId>/<modelId>` or `@role`. */\n model: string;\n /** The session's current selector (`AgentConfig.modelRef`). */\n modelRef: string | undefined;\n registry: AIProviderRegistry | MergedAIProviderRegistry | undefined;\n roles?: Record<string, string>;\n}\n\nfunction selectable(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\n/**\n * Whether an entry serves a model id. An entry that declares no model at all\n * (no `model_map`, no `capabilities`) passes any id through, as the wake does.\n * Otherwise the id must be a declared logical id or a `model_map` target: the\n * platform sends the provider-side id the wake translated to.\n */\nfunction entryServes(entry: AIProviderLlmEntry, modelId: string): boolean {\n const map = entry.model_map ?? {};\n const caps = entry.capabilities ?? {};\n if (Object.keys(map).length === 0 && Object.keys(caps).length === 0) return true;\n return modelId in map || modelId in caps || Object.values(map).includes(modelId);\n}\n\n/** The entry a selector runs on, resolved the way the harnesses resolve it. */\nfunction currentProviderId(\n modelRef: string | undefined,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n entries: Array<[string, AIProviderLlmEntry]>,\n roles: Record<string, string> | undefined,\n): string | undefined {\n const named = modelRef?.trim();\n if (!named) return entries[0]?.[0];\n // A selector that is exactly an entry id names the endpoint and no model.\n if (entries.some(([id]) => id === named)) return named;\n return parseModelRef(named, registry, roles)?.providerId;\n}\n\n/**\n * Decide the selector a live model change leaves the session on.\n *\n * A bare model id keeps the provider the session already runs on\n * (`<currentProvider>/<model>`): re-resolving it by id alone could move the\n * session to another entry that lists the same id, which changes billing and\n * data residency without a sign. Only a patch that names a provider\n * (`<providerId>/<model>` or `@role`) moves it. When the target entry declares\n * its models and this one is not among them, the patch is refused so the host\n * applies it at the next wake instead.\n *\n * A registry with at most one usable entry has nowhere to move to and keeps the\n * old behaviour: the selector becomes the patch's model when one was set.\n */\nexport function scopeReconfigureModel(input: ReconfigureModelScopeInput): ReconfigureModelScope {\n const { model, modelRef, registry, roles } = input;\n const legacy: ReconfigureModelScope = {\n ok: true,\n modelRef: modelRef === undefined ? undefined : model,\n };\n if (!registry) return legacy;\n const entries = selectable(registry);\n if (entries.length <= 1) return legacy;\n\n const selector = model.trim();\n if (selector.startsWith(\"@\")) return { ok: true, modelRef: selector };\n\n const slash = selector.indexOf(\"/\");\n if (slash > 0) {\n const head = selector.slice(0, slash);\n const tail = selector.slice(slash + 1);\n const named = entries.find(([id]) => id === head);\n if (named && tail !== \"\") {\n if (entryServes(named[1], tail)) return { ok: true, modelRef: selector };\n return refuse(head, tail);\n }\n }\n\n const providerId = currentProviderId(modelRef, registry, entries, roles);\n const current = entries.find(([id]) => id === providerId);\n if (!current) return legacy;\n if (!entryServes(current[1], selector)) return refuse(current[0], selector);\n return { ok: true, modelRef: `${current[0]}/${selector}` };\n}\n\nfunction refuse(providerId: string, modelId: string): ReconfigureModelScope {\n return {\n ok: false,\n code: \"model_not_on_provider\",\n providerId,\n message: `AI provider entry \"${providerId}\" does not list model \"${modelId}\"; the change applies when the session next starts.`,\n };\n}\n","// One owner for a live reconfigure (`AgentHarness.reconfigure()`): the desired\n// config, the snapshot the running process was last given, drift between them,\n// serial ordering of patches, the provider-entry scope rule, rollback on a\n// refusal and the typed outcome. A harness supplies one `applyLive` hook that\n// pushes a delta into its process; everything else lives here.\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { scopeReconfigureModel } from \"./reconfigure-model-ref.js\";\nimport type {\n AgentConfig,\n ReconfigureApplied,\n ReconfigureOutcome,\n ReconfigurePatch,\n ReconfigureRollback,\n} from \"./types.js\";\n\n/** The config fields a live reconfigure reads and writes (the harness's own config object). */\nexport type ReconfigureConfig = Pick<\n AgentConfig,\n \"model\" | \"modelRef\" | \"thinking\" | \"effort\" | \"registry\" | \"roles\"\n>;\n\n/** What the running process holds: the settings it spawned with or was last switched to. */\nexport interface ReconfigureSnapshot {\n model?: string;\n modelRef?: string;\n thinking?: AgentConfig[\"thinking\"];\n effort?: AgentConfig[\"effort\"];\n}\n\n/**\n * What an {@link ReconfigureLedgerOptions.applyLive} hook answers:\n *\n * - `\"applied\"`: the process now runs the delta.\n * - `\"respawn\"`: the process cannot take it live; the harness replaces it before\n * the next turn and the new process reads the desired config.\n * - `{ rejected }`: the process refuses it; the ledger rolls the config back to\n * the snapshot.\n */\nexport type ReconfigureApplyResult = \"applied\" | \"respawn\" | { rejected: string };\n\n/**\n * What an {@link ReconfigureLedgerOptions.applyLive} hook is told about a push.\n * `late` is true when the whole delta was answered `ok` earlier (it landed\n * mid-turn): a refusal then reaches the host only through\n * {@link ReconfigureLedgerOptions.onLateRejection}, so the hook must not also\n * report it on another channel (an `error` event).\n */\nexport interface ReconfigurePushContext {\n late: boolean;\n}\n\nconst FIELDS = [\"model\", \"modelRef\", \"thinking\", \"effort\"] as const;\n\nexport interface ReconfigureLedgerOptions<S extends ReconfigureSnapshot> {\n /**\n * The desired config. A getter, because a harness may replace its config object;\n * the ledger writes accepted patches into whatever it returns.\n */\n config: () => ReconfigureConfig;\n /**\n * Push a delta (the fields whose desired value differs from the snapshot) into\n * the running process. Called with the process up and idle, or at a turn\n * boundary through {@link ReconfigureLedger.flushBeforeTurn}. The hook receives\n * the live snapshot and may refine it (a harness that keeps extra fields on `S`\n * updates them here); on `\"applied\"` the ledger copies the delta into it.\n * A hook that throws counts as a rejection. Its `context.late` says whether a\n * refusal is reported elsewhere (see {@link ReconfigurePushContext}). Absent: the process reads the\n * desired config at its next spawn and there is nothing to push.\n */\n applyLive?: (\n delta: ReconfigureApplied,\n snapshot: S,\n context: ReconfigurePushContext,\n ) => ReconfigureApplyResult | Promise<ReconfigureApplyResult>;\n /** Whether the process is up and can take a push. Default: true. */\n isLive?: () => boolean;\n /** Whether no turn is in flight. Default: true. */\n isIdle?: () => boolean;\n /**\n * Called synchronously once a patch is written to the desired config, before\n * any live push. For harnesses that must refresh a derived cache on a change.\n */\n onDesired?: (applied: ReconfigureApplied) => void;\n /**\n * A refusal that arrives after the patch was already answered `ok` (it landed\n * mid-turn and flushed at the turn boundary). The config is already rolled back\n * when this runs, and an idle-time refusal never calls it (the capability call\n * answers that one). A harness emits the harness event `reconfigure-rollback`.\n */\n onLateRejection?: (rollback: ReconfigureRollback) => void;\n log?: Pick<Logger, \"warn\" | \"info\">;\n}\n\n/**\n * Serialised live reconfigure for one harness.\n *\n * `ok: true` means effective from the next turn: the next turn runs on the new\n * settings by live switch, query recycle or respawn. A patch that lands while a\n * turn is in flight (or before the process is ready) stays desired, is answered\n * `ok`, and is pushed by {@link flushBeforeTurn}.\n *\n * @category Bridge\n */\nexport class ReconfigureLedger<S extends ReconfigureSnapshot = ReconfigureSnapshot> {\n private snapshot: S | null = null;\n private respawn = false;\n private tail: Promise<unknown> | null = null;\n\n constructor(private readonly options: ReconfigureLedgerOptions<S>) {}\n\n /**\n * Record what a freshly spawned process runs. Call at every spawn: the\n * desired config is what that spawn read, so drift is computed against this.\n * `null` forgets the process (nothing left to push to).\n */\n setSnapshot(snapshot: S | null): void {\n this.snapshot = snapshot;\n this.respawn = false;\n }\n\n /**\n * The process cannot take the desired config live and the harness must replace\n * it before the next turn. Cleared by the next {@link setSnapshot}.\n */\n get needsRespawn(): boolean {\n return this.respawn;\n }\n\n /**\n * Apply a patch: scope the model to the session's provider entry, write it to\n * the desired config, and push it when the process is up and idle. Patches run\n * one at a time in arrival order.\n */\n reconfigure(patch: ReconfigurePatch): Promise<ReconfigureOutcome> {\n return this.enqueue(() => this.runPatch(patch));\n }\n\n /**\n * Push any drift to the process at a turn boundary. Await it before the turn\n * is sent, so the turn runs on the desired settings. Never rejects.\n */\n flushBeforeTurn(): Promise<void> {\n return this.enqueue(async () => {\n const snapshot = this.snapshot;\n if (!snapshot || this.respawn || !(this.options.isLive?.() ?? true)) return;\n await this.flush(snapshot, new Set());\n });\n }\n\n private enqueue<T>(job: () => Promise<T>): Promise<T> {\n // With nothing in flight the job's synchronous prefix (scope + write) runs now.\n const run = this.tail ? this.tail.then(job) : job();\n const settled = run.then(\n () => undefined,\n () => undefined,\n );\n this.tail = settled;\n void settled.then(() => {\n if (this.tail === settled) this.tail = null;\n });\n return run;\n }\n\n private async runPatch(patch: ReconfigurePatch): Promise<ReconfigureOutcome> {\n const config = this.options.config();\n const applied: ReconfigureApplied = {};\n if (patch.model !== undefined) {\n // In registry mode the spawned model derives from `modelRef`, so it moves\n // too: scoped to the current entry unless the patch names another one.\n const scope = scopeReconfigureModel({\n model: patch.model,\n modelRef: config.modelRef,\n registry: config.registry,\n roles: config.roles,\n });\n if (!scope.ok) {\n this.options.log?.warn(\"model change refused; keeping the current model\", {\n model: patch.model,\n providerId: scope.providerId,\n });\n return {\n ok: false,\n code: scope.code,\n message: scope.message,\n providerId: scope.providerId,\n };\n }\n config.model = applied.model = patch.model;\n if (scope.modelRef !== undefined) config.modelRef = applied.modelRef = scope.modelRef;\n }\n if (patch.thinking !== undefined) config.thinking = applied.thinking = patch.thinking;\n if (patch.effort !== undefined) config.effort = applied.effort = patch.effort;\n this.options.onDesired?.(applied);\n\n const snapshot = this.snapshot;\n // No process: the next spawn reads the desired config.\n if (!snapshot || this.respawn) return { ok: true, applied };\n const live = this.options.isLive?.() ?? true;\n const idle = this.options.isIdle?.() ?? true;\n // Mid-turn or before ready: stays desired, flushed at the turn boundary.\n if (!live || !idle) return { ok: true, applied };\n\n const own = new Set(Object.keys(applied) as Array<keyof ReconfigureApplied>);\n const rejected = await this.flush(snapshot, own);\n return rejected === null\n ? { ok: true, applied }\n : { ok: false, code: \"rejected\", message: rejected };\n }\n\n /**\n * Push the drift to the process. Returns the refusal message, or `null` when\n * the process took it (or will, by respawn). On a refusal the config rolls back\n * to the snapshot; fields outside `own` were answered `ok` earlier, so they are\n * reported through `onLateRejection`.\n */\n private async flush(\n snapshot: S,\n own: ReadonlySet<keyof ReconfigureApplied>,\n ): Promise<string | null> {\n const hook = this.options.applyLive;\n if (!hook) return null;\n const config = this.options.config();\n const delta: ReconfigureApplied = {};\n for (const key of FIELDS) {\n const value = config[key];\n if (value !== undefined && value !== snapshot[key]) Object.assign(delta, { [key]: value });\n }\n if (Object.keys(delta).length === 0) return null;\n\n // Nothing in the delta was answered to a caller of this push: it is all late.\n const context: ReconfigurePushContext = { late: own.size === 0 };\n let result: ReconfigureApplyResult;\n try {\n result = await hook(delta, snapshot, context);\n } catch (err) {\n result = { rejected: err instanceof Error ? err.message : String(err) };\n }\n // The process was replaced meanwhile; the new one read the desired config.\n if (this.snapshot !== snapshot) return null;\n\n if (result === \"applied\") {\n Object.assign(snapshot, delta);\n return null;\n }\n if (result === \"respawn\") {\n this.respawn = true;\n return null;\n }\n\n const requested: ReconfigureApplied = {};\n const restored: ReconfigureApplied = {};\n for (const key of Object.keys(delta) as (keyof ReconfigureApplied)[]) {\n // The hook may have applied part of the delta and refined the snapshot.\n Object.assign(config, { [key]: snapshot[key] });\n if (!own.has(key)) {\n Object.assign(requested, { [key]: delta[key] });\n Object.assign(restored, { [key]: snapshot[key] });\n }\n }\n this.options.log?.warn(\"live reconfigure refused; config rolled back\", {\n reason: result.rejected,\n fields: Object.keys(delta),\n });\n if (Object.keys(requested).length > 0) {\n this.options.onLateRejection?.({ message: result.rejected, requested, restored });\n }\n return result.rejected;\n }\n}\n","/**\n * Environment variables that belong to the runner process and must never reach\n * an agent child (the CLI, its tools, MCP servers, hooks).\n *\n * `SKAILE_WS_AUTH_TOKEN` authenticates the host on the runner's own WebSocket.\n * An agent that can read it can connect to the runner as the host and send host\n * commands (prompts, connector mutations such as flow-gate approvals). The\n * runner removes it from `process.env` at startup; every harness strips it again\n * from the env it hands its child, so a value that slips back in through\n * `AgentConfig.env` or an embedder that skipped the startup scrub still stops\n * at the harness.\n */\nexport const RUNNER_PRIVATE_ENV_KEYS: readonly string[] = [\n \"SKAILE_WS_AUTH_TOKEN\",\n \"SKAILE_WS_AUTH_TOKEN_FILE\",\n];\n\n/**\n * Remove every {@link RUNNER_PRIVATE_ENV_KEYS} entry from `env`, in place, and\n * return it. Call it on the final child env, after every merge.\n */\nexport function stripRunnerPrivateEnv<T extends Record<string, string | undefined>>(env: T): T {\n for (const key of RUNNER_PRIVATE_ENV_KEYS) delete env[key];\n return env;\n}\n\n/**\n * Variables the runner sets for the agent's shell on purpose, which every harness passes to its\n * child next to its own allowlist (p1738). `GIT_CONFIG_GLOBAL` points `git` at the runner's managed\n * gitconfig (`<project>/.skaile/managed-gitconfig`); a harness that dropped it left the agent\n * with no path to the managed credentials.\n */\nexport const RUNNER_AGENT_ENV_KEYS: readonly string[] = [\"GIT_CONFIG_GLOBAL\"];\n"]}
@@ -1,7 +1,7 @@
1
- import { logErr, logWarn, S, logOk, logInfo } from './chunk-76WSWPOB.js';
2
- import { loadMergedProviderRegistry } from './chunk-G63KOHFS.js';
3
- import { getProviderPreset, expandPreset, listProviderPresets, presetBaseUrl, probeProviderEntry } from './chunk-6UP2EDFN.js';
4
- import { saveProviderRegistryFile, workspaceProviderRegistryPath, userProviderRegistryPath } from './chunk-ABVWUM2E.js';
1
+ import { logErr, logWarn, S, logOk, logInfo } from './chunk-Z2X7UZEZ.js';
2
+ import { loadMergedProviderRegistry } from './chunk-EO7KGX6P.js';
3
+ import { getProviderPreset, expandPreset, listProviderPresets, presetBaseUrl, probeProviderEntry } from './chunk-NSIOBKDX.js';
4
+ import { saveProviderRegistryFile, workspaceProviderRegistryPath, userProviderRegistryPath } from './chunk-UMLCKKIA.js';
5
5
  import { resolveCredential } from './chunk-VSX2G7LA.js';
6
6
  import { isSafeProviderId, parseCredentialRef, validateRegistry, resolveEntryBaseUrl, AI_PROVIDER_SURFACES, entryTransport, isEntryEnabled, AI_PROVIDER_LAYERS } from './chunk-RXGPFAMN.js';
7
7
  import path from 'path';
@@ -496,5 +496,5 @@ function makeProvidersCommand() {
496
496
  }
497
497
 
498
498
  export { ProviderRegistryWriteError, addProviderEntry, credentialEnvVarName, loadRegistryView, makeProvidersCommand, removeProviderEntry };
499
- //# sourceMappingURL=chunk-45KLCFQB.js.map
500
- //# sourceMappingURL=chunk-45KLCFQB.js.map
499
+ //# sourceMappingURL=chunk-6EKQENAP.js.map
500
+ //# sourceMappingURL=chunk-6EKQENAP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/commands/providers.ts"],"names":[],"mappings":"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","file":"chunk-45KLCFQB.js","sourcesContent":["/**\n * `skaile providers` — manage the AI provider registry.\n *\n * Endpoints are defined once, in `~/.skaile/providers.yml`, optionally\n * overridden per project in `<workspace>/.skaile/providers.yml` (gitignored by\n * `skaile init`). Every subcommand writes exactly one of those two files and\n * validates the result before it lands — a literal secret never reaches disk.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1, §2.5\n */\n\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n expandPreset,\n getProviderPreset,\n listProviderPresets,\n loadMergedProviderRegistry,\n presetBaseUrl,\n probeProviderEntry,\n} from \"@skaile/workspaces/bridge\";\nimport {\n AI_PROVIDER_LAYERS,\n AI_PROVIDER_SURFACES,\n type AIProviderDiagnostic,\n type AIProviderEntry,\n type AIProviderLayerId,\n type AIProviderLlmEntry,\n type AIProviderRegistryDocument,\n type AIProviderSurface,\n entryTransport,\n isEntryEnabled,\n isSafeProviderId,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n type ProviderRegistryFile,\n resolveCredential,\n resolveEntryBaseUrl,\n saveProviderRegistryFile,\n userProviderRegistryPath,\n validateRegistry,\n workspaceProviderRegistryPath,\n} from \"@skaile/workspaces/core\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\n\n/** Preset id that means \"no preset — I will supply the three literals\". */\nconst CUSTOM_PRESET = \"custom\";\n\n/** Which of the two registry files a command reads or writes. */\nexport interface ScopeOptions {\n projectDir?: string;\n workspace?: boolean;\n}\n\n/** The file a mutating subcommand writes: the workspace layer or the user one. */\nfunction targetFile(opts: ScopeOptions): { layer: \"user\" | \"workspace\"; path: string } {\n if (opts.workspace) {\n return { layer: \"workspace\", path: workspaceProviderRegistryPath(resolveProjectDir(opts)) };\n }\n return { layer: \"user\", path: userProviderRegistryPath() };\n}\n\n/** Project directory a subcommand operates on — `--project-dir` or the cwd. */\nfunction resolveProjectDir(opts: ScopeOptions): string {\n return opts.projectDir ? path.resolve(opts.projectDir) : process.cwd();\n}\n\n/** Both file layers plus the catalog, merged — what every reader sees. */\nexport interface RegistryView {\n merged: MergedAIProviderRegistry;\n files: ProviderRegistryFile[];\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load both file layers and merge them with the catalog layer the configured\n * `preset:` keys pull in, then gate the result. Read once, merged twice — the\n * catalog layer can only be built after the configured entries are known,\n * and it is built from the **pre-gate** merge: an entry that leaves `kind` or\n * its transport `params` to the preset fails the first gate by design.\n *\n * The gate is on the merged view, not per file: a workspace entry that sets\n * one field of an entry the user file defines is an override (§1.5), so it is\n * only here that an entry can be judged complete.\n */\nexport function loadRegistryView(opts: ScopeOptions): RegistryView {\n return loadMergedProviderRegistry({ projectDir: resolveProjectDir(opts) });\n}\n\n/** Print diagnostics; returns how many were errors. */\nfunction reportDiagnostics(diagnostics: AIProviderDiagnostic[]): number {\n let errors = 0;\n for (const diagnostic of diagnostics) {\n const where = diagnostic.path ? `${diagnostic.path}: ` : \"\";\n if (diagnostic.severity === \"error\") {\n errors++;\n logErr(`${where}${diagnostic.message}`);\n } else {\n logWarn(`${where}${diagnostic.message}`);\n }\n }\n return errors;\n}\n\n/** Highest layer that pins an entry with `locked: true`. */\nfunction lockOwner(id: string, files: ProviderRegistryFile[]): AIProviderLayerId | undefined {\n let owner: AIProviderLayerId | undefined;\n for (const file of files) {\n if (file.document.providers[id]?.locked) {\n const layer = file.layer as AIProviderLayerId;\n if (!owner || AI_PROVIDER_LAYERS.indexOf(layer) > AI_PROVIDER_LAYERS.indexOf(owner)) {\n owner = layer;\n }\n }\n }\n return owner;\n}\n\n/**\n * The message for an edit a lock forbids, or `undefined` when it is allowed.\n * The merge ignores a lower layer silently; the CLI must not, or the operator\n * would watch an accepted edit have no effect.\n *\n * `set <id> locked <value>` stays legal at the locking layer itself —\n * otherwise a lock could never be lifted without hand-editing the file.\n */\nfunction lockConflict(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): string | undefined {\n const owner = lockOwner(id, files);\n if (!owner) return undefined;\n const ownerRank = AI_PROVIDER_LAYERS.indexOf(owner);\n const targetRank = AI_PROVIDER_LAYERS.indexOf(target.layer);\n if (ownerRank === targetRank && key === \"locked\") return undefined;\n if (ownerRank < targetRank) return undefined;\n return (\n `'${id}' is locked by the ${owner} layer and cannot be changed from ${target.layer}.\\n` +\n (ownerRank === targetRank\n ? ` Unlock it first: skaile providers set ${id} locked false`\n : ` A higher layer owns this entry — change it there.`)\n );\n}\n\n/** Refuse loudly when a locked entry would be edited. */\nfunction exitIfLocked(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): void {\n const message = lockConflict(id, target, files, key);\n if (!message) return;\n logErr(message);\n process.exit(1);\n}\n\n/** Read the target file, or an empty document when it does not exist yet. */\nfunction readTargetDocument(\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n): AIProviderRegistryDocument {\n const file = files.find((f) => f.path === target.path);\n return file?.document ?? { version: 1, providers: {} };\n}\n\n/**\n * Validate the file that is about to be written; exits non-zero on errors.\n *\n * Validated as the layer it is, so `set` may leave a one-field override in the\n * workspace file (§1.5). Completeness is the merged registry's business, and\n * `loadRegistryView` reports it on the next read.\n */\nfunction validateOrExit(\n document: AIProviderRegistryDocument,\n target: { layer: \"user\" | \"workspace\"; path: string },\n): void {\n const { diagnostics } = validateRegistry(\n { version: 1, providers: document.providers },\n { source: target.path, layer: target.layer },\n );\n if (reportDiagnostics(diagnostics) > 0) process.exit(1);\n}\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n\nfunction credentialSummary(entry: AIProviderEntry): string {\n const credential = entry.credential;\n if (!credential || credential.kind === \"none\") return \"none\";\n return credential.ref ? `${credential.kind} ${credential.ref}` : credential.kind;\n}\n\nfunction printPresets(): void {\n const presets = listProviderPresets();\n console.log();\n console.log(` ${S.heading(\"Catalog presets\")}`);\n const idWidth = Math.max(...presets.map((x) => x.id.length)) + 2;\n const surfaceWidth = Math.max(...AI_PROVIDER_SURFACES.map((s) => s.length)) + 2;\n const header = `${pad(\"preset\", idWidth)}${pad(\"kind\", 7)}${pad(\"surface\", surfaceWidth)}${pad(\"transport\", 14)}default base URL`;\n console.log(` ${S.dim(header)}`);\n for (const preset of presets) {\n const row =\n pad(preset.id, idWidth) +\n pad(preset.kind, 7) +\n pad(preset.surface ?? \"—\", surfaceWidth) +\n pad(\n preset.kind === \"llm\" || preset.kind === \"embed\" ? (preset.transport ?? \"direct\") : \"—\",\n 14,\n ) +\n (presetBaseUrl(preset) ?? \"—\");\n console.log(` ${row}`);\n }\n}\n\nfunction printConfigured(view: RegistryView): void {\n const ids = view.merged.order;\n console.log();\n console.log(` ${S.heading(\"Configured providers\")}`);\n if (ids.length === 0) {\n console.log(\n ` ${S.dim(\"none — add one with\")} ${S.cmd(\"skaile providers add --preset <preset>\")}`,\n );\n console.log();\n return;\n }\n const idWidth = Math.max(...ids.map((id) => id.length)) + 2;\n const header = `${pad(\"id\", idWidth)}${pad(\"layer\", 11)}${pad(\"surface\", 26)}${pad(\"transport\", 14)}endpoint`;\n console.log(` ${S.dim(header)}`);\n for (const id of ids) {\n const entry = view.merged.providers[id];\n const surface = (entry as AIProviderLlmEntry).surface ?? \"—\";\n const transport = entryTransport(entry) ?? \"—\";\n const url = resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\");\n const flags = [\n isEntryEnabled(entry) ? \"\" : S.warn(\"disabled\"),\n entry.locked ? S.warn(\"locked\") : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n console.log(\n ` ${pad(id, idWidth)}${pad(view.merged.origin[id], 11)}${pad(surface, 26)}${pad(transport, 14)}${url} ${flags}`.trimEnd(),\n );\n console.log(` ${S.dim(`${pad(\"\", idWidth)}${credentialSummary(entry)}`)}`);\n }\n console.log();\n}\n\n// ── add ────────────────────────────────────────────────────────────────────\n\ninterface AddOptions extends ScopeOptions {\n preset?: string;\n credential?: string;\n baseUrl?: string;\n surface?: string;\n label?: string;\n kind?: string;\n param: string[];\n force?: boolean;\n}\n\nfunction parseParams(pairs: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) {\n logErr(`--param expects <key>=<value> (got '${pair}')`);\n process.exit(1);\n }\n out[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return out;\n}\n\n/** Ask for the three literals a custom endpoint needs. Nothing else. */\nasync function promptCustomEntry(\n id: string,\n opts: AddOptions,\n): Promise<{ surface: AIProviderSurface; baseUrl: string; credentialRef: string }> {\n const interactive = process.stdin.isTTY === true;\n let surface = opts.surface as AIProviderSurface | undefined;\n let baseUrl = opts.baseUrl;\n let credentialRef = opts.credential;\n\n if (!interactive && (!surface || !baseUrl || !credentialRef)) {\n logErr(\n \"--preset custom needs --surface, --base-url and --credential when there is no terminal to prompt on\",\n );\n process.exit(1);\n }\n\n if (!surface) {\n const answer = await p.select({\n message: \"Wire surface:\",\n options: AI_PROVIDER_SURFACES.map((value) => ({ value, label: value })),\n initialValue: \"openai-completions\" as AIProviderSurface,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n surface = answer as AIProviderSurface;\n }\n if (!baseUrl) {\n const answer = await p.text({\n message: \"Base URL:\",\n placeholder: \"https://api.example.com/v1\",\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n baseUrl = answer as string;\n }\n if (!credentialRef) {\n const answer = await p.text({\n message: \"Credential reference (env:NAME, cmd:<shell>, platform:<id>, keyring:<svc>/<acct>):\",\n initialValue: `env:${id.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_API_KEY`,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n credentialRef = answer as string;\n }\n return { surface, baseUrl, credentialRef };\n}\n\n/** A rejected registry write. The message is already CLI-ready. */\nexport class ProviderRegistryWriteError extends Error {}\n\n/** What {@link addProviderEntry} writes. */\nexport interface AddProviderEntryInput extends ScopeOptions {\n /** Registry entry id — `[a-z0-9][a-z0-9_-]*`. */\n id: string;\n /** Catalog preset to expand. Mutually exclusive with `entry`. */\n presetId?: string;\n /** A fully-built entry (the `--preset custom` path, which needs prompts). */\n entry?: AIProviderEntry;\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…` — never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n params?: Record<string, string>;\n /** Overwrite an entry that already exists in the target file. */\n force?: boolean;\n}\n\n/** Result of {@link addProviderEntry}. */\nexport interface AddedProviderEntry {\n id: string;\n layer: \"user\" | \"workspace\";\n path: string;\n entry: AIProviderEntry;\n /** True when an existing entry in the target file was overwritten. */\n replaced: boolean;\n}\n\n/**\n * Write one entry into a registry file — the single write path behind\n * `skaile providers add` and the `skaile setup` wizard.\n *\n * Throws {@link ProviderRegistryWriteError} instead of exiting, so a wizard\n * can report the failure in its own idiom. Every rejection a caller can\n * provoke (bad id, unknown preset, missing transport parameter, locked entry,\n * a literal secret) lands here, and the document is validated before it is\n * written — a secret cannot reach disk through this function.\n */\nexport function addProviderEntry(input: AddProviderEntryInput): AddedProviderEntry {\n const { id } = input;\n if (!isSafeProviderId(id)) {\n throw new ProviderRegistryWriteError(\n `'${id}' is not a valid entry id — use [a-z0-9][a-z0-9_-]*`,\n );\n }\n if (input.credentialRef && !parseCredentialRef(input.credentialRef)) {\n throw new ProviderRegistryWriteError(\n \"the credential must be a reference, not a secret: \" +\n \"env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>\",\n );\n }\n\n const view = loadRegistryView(input);\n const target = targetFile(input);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n const replaced = document.providers[id] !== undefined;\n if (replaced && !input.force) {\n throw new ProviderRegistryWriteError(\n `'${id}' already exists in ${target.path} — pass --force to overwrite it.`,\n );\n }\n\n let entry: AIProviderEntry;\n if (input.entry) {\n entry = input.entry;\n } else {\n const preset = input.presetId ? getProviderPreset(input.presetId) : undefined;\n if (!preset) {\n throw new ProviderRegistryWriteError(\n `Unknown preset '${input.presetId}'. Run \\`skaile providers list\\` to see the catalog, ` +\n \"or use `--preset custom`.\",\n );\n }\n entry = expandPreset(preset, {\n credentialRef: input.credentialRef,\n baseUrl: input.baseUrl,\n surface: input.surface,\n label: input.label,\n params: input.params,\n });\n const missing = (preset.required_params ?? []).filter(\n (key) => !(key in ((entry as AIProviderLlmEntry).params ?? {})),\n );\n if (missing.length > 0) {\n throw new ProviderRegistryWriteError(\n `Preset '${preset.id}' needs ${missing.map((m) => `--param ${m}=<value>`).join(\" \")}`,\n );\n }\n }\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: entry },\n };\n const { diagnostics } = validateRegistry(\n { version: 1, providers: next.providers },\n { source: target.path },\n );\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n if (errors.length > 0) {\n throw new ProviderRegistryWriteError(\n errors.map((d) => (d.path ? `${d.path}: ${d.message}` : d.message)).join(\"\\n\"),\n );\n }\n saveProviderRegistryFile(target.path, next);\n\n return { id, layer: target.layer, path: target.path, entry, replaced };\n}\n\n/** The env var an `env:` credential reference points at, if it is one. */\nexport function credentialEnvVarName(entry: AIProviderEntry): string | undefined {\n const ref = entry.credential?.ref;\n return ref?.startsWith(\"env:\") ? ref.slice(4) : undefined;\n}\n\n/** Build the `--preset custom` entry from the three literals the user gave. */\nfunction customEntry(\n answers: { surface: AIProviderSurface; baseUrl: string; credentialRef: string },\n opts: AddOptions,\n): AIProviderEntry {\n const kind = (opts.kind ?? \"llm\") as AIProviderEntry[\"kind\"];\n // Anthropic- and Google-shaped surfaces read a dedicated API-key header;\n // everything else is a bearer token. `set <id> credential.kind …` adjusts.\n const credentialKind =\n kind === \"stt\" ||\n kind === \"tts\" ||\n answers.surface === \"anthropic-messages\" ||\n answers.surface === \"google-generative-ai\" ||\n answers.surface === \"azure-openai-responses\"\n ? \"api_key_header\"\n : \"bearer\";\n if (kind === \"stt\" || kind === \"tts\") {\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n };\n }\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n surface: answers.surface,\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n } as AIProviderLlmEntry;\n}\n\nasync function runAdd(idArg: string | undefined, opts: AddOptions): Promise<void> {\n const presetId = opts.preset;\n if (!presetId) {\n logErr(\n `--preset is required. Run ${S.cmd(\"skaile providers list\")} for the catalog, ` +\n `or use ${S.cmd(\"--preset custom\")}.`,\n );\n process.exit(1);\n }\n const id = idArg ?? presetId;\n if (id === CUSTOM_PRESET && !idArg) {\n logErr(\"--preset custom needs an entry id: skaile providers add <id> --preset custom\");\n process.exit(1);\n }\n\n const entry =\n presetId === CUSTOM_PRESET ? customEntry(await promptCustomEntry(id, opts), opts) : undefined;\n\n let added: AddedProviderEntry;\n try {\n added = addProviderEntry({\n id,\n ...(entry ? { entry } : { presetId }),\n credentialRef: opts.credential,\n baseUrl: opts.baseUrl,\n surface: opts.surface as AIProviderSurface | undefined,\n label: opts.label,\n params: parseParams(opts.param),\n projectDir: opts.projectDir,\n workspace: opts.workspace,\n force: opts.force,\n });\n } catch (error) {\n logErr(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n logOk(`Added ${S.bold(id)} (${presetId}) to the ${added.layer} registry`);\n console.log(S.dim(` → ${added.path}`));\n const name = credentialEnvVarName(added.entry);\n if (name) {\n console.log(\n ` ${S.dim(\"The secret itself never goes in this file — export it:\")} ${S.cmd(`export ${name}=…`)}`,\n );\n }\n console.log(` ${S.dim(\"Verify with:\")} ${S.cmd(`skaile providers test ${id}`)}`);\n}\n\n// ── set / rm ───────────────────────────────────────────────────────────────\n\n/** Coerce a CLI string into the type the schema expects at `key`. */\nfunction coerceValue(key: string, value: string): unknown {\n const leaf = key.split(\".\").pop() ?? key;\n if (leaf === \"enabled\" || leaf === \"locked\" || leaf === \"tools\" || leaf === \"images\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n logErr(`'${key}' takes true or false (got '${value}')`);\n process.exit(1);\n }\n if (leaf === \"context_window\" || leaf === \"thinking_max\") {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n logErr(`'${key}' takes a number (got '${value}')`);\n process.exit(1);\n }\n return parsed;\n }\n return value;\n}\n\n/** Write `value` at a dotted path, creating intermediate maps. */\nfunction setDotted(entry: Record<string, unknown>, key: string, value: unknown): void {\n const segments = key.split(\".\");\n let cursor = entry;\n for (const segment of segments.slice(0, -1)) {\n const next = cursor[segment];\n if (typeof next !== \"object\" || next === null || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = value;\n}\n\nfunction runSet(id: string, key: string, value: string, opts: ScopeOptions): void {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n exitIfLocked(id, target, view.files, key);\n\n const document = readTargetDocument(target, view.files);\n const existing = document.providers[id];\n const inherited = view.merged.providers[id];\n if (!existing && !inherited) {\n logErr(\n `No provider '${id}'. Add it with ${S.cmd(`skaile providers add ${id} --preset <preset>`)}`,\n );\n process.exit(1);\n }\n\n // Writing a field into a layer that has no entry yet leaves a one-field\n // override: the layers below keep supplying the rest (§1.5), so copying\n // their `kind` down here would pin a value this layer does not own.\n const base = (existing ? structuredClone(existing) : {}) as unknown as Record<string, unknown>;\n setDotted(base, key, coerceValue(key, value));\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: base as unknown as AIProviderEntry },\n };\n validateOrExit(next, target);\n saveProviderRegistryFile(target.path, next);\n\n logOk(`Set ${S.bold(`${id}.${key}`)} = ${value} in the ${target.layer} registry`);\n console.log(S.dim(` → ${target.path}`));\n}\n\n/** Result of {@link removeProviderEntry}. */\nexport interface RemovedProviderEntry {\n layer: \"user\" | \"workspace\";\n path: string;\n /** True when another layer still defines the same id. */\n stillDefinedElsewhere: boolean;\n}\n\n/**\n * Delete one entry from a registry file: the write path behind `skaile providers rm` and\n * `skaile config unset apiKey.<provider>`. Returns `undefined` when the target file has no such\n * entry; throws {@link ProviderRegistryWriteError} for a locked one.\n */\nexport function removeProviderEntry(\n id: string,\n opts: ScopeOptions,\n): RemovedProviderEntry | undefined {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n if (!document.providers[id]) return undefined;\n const providers = { ...document.providers };\n delete providers[id];\n saveProviderRegistryFile(target.path, { version: 1, providers });\n return {\n layer: target.layer,\n path: target.path,\n stillDefinedElsewhere: Boolean(\n view.merged.providers[id] &&\n view.files.some((f) => f.path !== target.path && f.document.providers[id]),\n ),\n };\n}\n\nfunction runRemove(id: string, opts: ScopeOptions): void {\n let removed: RemovedProviderEntry | undefined;\n try {\n removed = removeProviderEntry(id, opts);\n } catch (error) {\n if (!(error instanceof ProviderRegistryWriteError)) throw error;\n logErr(error.message);\n process.exit(1);\n }\n if (!removed) {\n logErr(`No provider '${id}' in ${targetFile(opts).path}`);\n process.exit(1);\n }\n\n logOk(`Removed ${S.bold(id)} from the ${removed.layer} registry`);\n console.log(S.dim(` → ${removed.path}`));\n if (removed.stillDefinedElsewhere) {\n logInfo(`'${id}' is still defined in another layer — run 'skaile providers list' to see it.`);\n }\n}\n\n// ── test ───────────────────────────────────────────────────────────────────\n\nasync function runTest(id: string, opts: ScopeOptions): Promise<void> {\n const view = loadRegistryView(opts);\n const entry = view.merged.providers[id];\n if (!entry) {\n logErr(`No provider '${id}'. Run ${S.cmd(\"skaile providers list\")} to see what is configured.`);\n process.exit(1);\n }\n\n const credential = resolveCredential(entry);\n console.log();\n console.log(` ${S.heading(id)} ${S.dim(`(${view.merged.origin[id]} layer)`)}`);\n console.log(` ${S.label(\"endpoint \")} ${resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\")}`);\n console.log(\n ` ${S.label(\"credential\")} ${credentialSummary(entry)} ${\n credential.error\n ? S.err(`— ${credential.error}`)\n : S.dim(`— resolved from ${credential.source}`)\n }`,\n );\n\n if (credential.error) {\n console.log();\n logErr(`${id} is not usable yet: ${credential.error}`);\n process.exit(1);\n }\n\n const result = await probeProviderEntry(entry, { secret: credential.value });\n if (result.url) console.log(` ${S.label(\"probe \")} GET ${result.url}`);\n console.log();\n if (result.ok) {\n logOk(`${id}: ${result.detail}${result.status ? ` (HTTP ${result.status})` : \"\"}`);\n return;\n }\n if (!result.probed) {\n logWarn(`${id}: ${result.detail}`);\n return;\n }\n logErr(`${id}: ${result.detail}`);\n process.exit(1);\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\n/**\n * Create the `skaile providers` command group.\n *\n * `list` shows the catalog and what is configured; `add` writes an entry from\n * a preset (or from three literals with `--preset custom`); `set` and `rm`\n * edit one layer; `test` sends one read-only request and reports what came\n * back, never the credential.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n */\nexport function makeProvidersCommand(): Command {\n const cmd = new Command(\"providers\").description(\n \"Manage AI provider endpoints (~/.skaile/providers.yml)\",\n );\n\n cmd\n .command(\"list\")\n .description(\"List catalog presets and configured providers\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--json\", \"Machine-readable output\")\n .action((opts) => {\n const view = loadRegistryView(opts);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n presets: listProviderPresets().map((preset) => ({\n id: preset.id,\n kind: preset.kind,\n surface: preset.surface,\n transport: preset.transport ?? (preset.surface ? \"direct\" : undefined),\n base_url: presetBaseUrl(preset),\n credential: preset.credential,\n required_params: preset.required_params,\n })),\n providers: view.merged.order.map((id) => ({\n id,\n layer: view.merged.origin[id],\n entry: view.merged.providers[id],\n base_url: resolveEntryBaseUrl(view.merged.providers[id]),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n reportDiagnostics(view.diagnostics);\n printPresets();\n printConfigured(view);\n });\n\n cmd\n .command(\"add [id]\")\n .description(\"Add a provider from a catalog preset (id defaults to the preset name)\")\n .requiredOption(\"--preset <preset>\", `Catalog preset, or '${CUSTOM_PRESET}'`)\n .option(\"--credential <ref>\", \"Credential reference (env:NAME, cmd:…, platform:…, keyring:…)\")\n .option(\"--base-url <url>\", \"Override the preset endpoint\")\n .option(\"--surface <surface>\", `Wire surface (${AI_PROVIDER_SURFACES.join(\", \")})`)\n .option(\"--kind <kind>\", \"Entry kind for --preset custom (llm, embed, stt, tts)\", \"llm\")\n .option(\"--label <text>\", \"Display label\")\n .option(\n \"--param <key=value>\",\n \"Transport parameter (repeatable): region, project, location, resource, deployment, api_version\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--force\", \"Overwrite an existing entry in the target file\")\n .action((id: string | undefined, opts: AddOptions) => runAdd(id, opts));\n\n cmd\n .command(\"set <id> <key> <value>\")\n .description(\n \"Set one field (base_url, enabled, credential.ref, headers.<name>, model_map.<id>…)\",\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, key: string, value: string, opts: ScopeOptions) =>\n runSet(id, key, value, opts),\n );\n\n cmd\n .command(\"rm <id>\")\n .description(\"Remove a provider from one layer\")\n .option(\"--workspace\", \"Edit <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runRemove(id, opts));\n\n cmd\n .command(\"test <id>\")\n .description(\"Send one read-only request to a provider and report the result\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runTest(id, opts));\n\n return cmd;\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/commands/providers.ts"],"names":[],"mappings":"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","file":"chunk-6EKQENAP.js","sourcesContent":["/**\n * `skaile providers` — manage the AI provider registry.\n *\n * Endpoints are defined once, in `~/.skaile/providers.yml`, optionally\n * overridden per project in `<workspace>/.skaile/providers.yml` (gitignored by\n * `skaile init`). Every subcommand writes exactly one of those two files and\n * validates the result before it lands — a literal secret never reaches disk.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1, §2.5\n */\n\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n expandPreset,\n getProviderPreset,\n listProviderPresets,\n loadMergedProviderRegistry,\n presetBaseUrl,\n probeProviderEntry,\n} from \"@skaile/workspaces/bridge\";\nimport {\n AI_PROVIDER_LAYERS,\n AI_PROVIDER_SURFACES,\n type AIProviderDiagnostic,\n type AIProviderEntry,\n type AIProviderLayerId,\n type AIProviderLlmEntry,\n type AIProviderRegistryDocument,\n type AIProviderSurface,\n entryTransport,\n isEntryEnabled,\n isSafeProviderId,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n type ProviderRegistryFile,\n resolveCredential,\n resolveEntryBaseUrl,\n saveProviderRegistryFile,\n userProviderRegistryPath,\n validateRegistry,\n workspaceProviderRegistryPath,\n} from \"@skaile/workspaces/core\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\n\n/** Preset id that means \"no preset — I will supply the three literals\". */\nconst CUSTOM_PRESET = \"custom\";\n\n/** Which of the two registry files a command reads or writes. */\nexport interface ScopeOptions {\n projectDir?: string;\n workspace?: boolean;\n}\n\n/** The file a mutating subcommand writes: the workspace layer or the user one. */\nfunction targetFile(opts: ScopeOptions): { layer: \"user\" | \"workspace\"; path: string } {\n if (opts.workspace) {\n return { layer: \"workspace\", path: workspaceProviderRegistryPath(resolveProjectDir(opts)) };\n }\n return { layer: \"user\", path: userProviderRegistryPath() };\n}\n\n/** Project directory a subcommand operates on — `--project-dir` or the cwd. */\nfunction resolveProjectDir(opts: ScopeOptions): string {\n return opts.projectDir ? path.resolve(opts.projectDir) : process.cwd();\n}\n\n/** Both file layers plus the catalog, merged — what every reader sees. */\nexport interface RegistryView {\n merged: MergedAIProviderRegistry;\n files: ProviderRegistryFile[];\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load both file layers and merge them with the catalog layer the configured\n * `preset:` keys pull in, then gate the result. Read once, merged twice — the\n * catalog layer can only be built after the configured entries are known,\n * and it is built from the **pre-gate** merge: an entry that leaves `kind` or\n * its transport `params` to the preset fails the first gate by design.\n *\n * The gate is on the merged view, not per file: a workspace entry that sets\n * one field of an entry the user file defines is an override (§1.5), so it is\n * only here that an entry can be judged complete.\n */\nexport function loadRegistryView(opts: ScopeOptions): RegistryView {\n return loadMergedProviderRegistry({ projectDir: resolveProjectDir(opts) });\n}\n\n/** Print diagnostics; returns how many were errors. */\nfunction reportDiagnostics(diagnostics: AIProviderDiagnostic[]): number {\n let errors = 0;\n for (const diagnostic of diagnostics) {\n const where = diagnostic.path ? `${diagnostic.path}: ` : \"\";\n if (diagnostic.severity === \"error\") {\n errors++;\n logErr(`${where}${diagnostic.message}`);\n } else {\n logWarn(`${where}${diagnostic.message}`);\n }\n }\n return errors;\n}\n\n/** Highest layer that pins an entry with `locked: true`. */\nfunction lockOwner(id: string, files: ProviderRegistryFile[]): AIProviderLayerId | undefined {\n let owner: AIProviderLayerId | undefined;\n for (const file of files) {\n if (file.document.providers[id]?.locked) {\n const layer = file.layer as AIProviderLayerId;\n if (!owner || AI_PROVIDER_LAYERS.indexOf(layer) > AI_PROVIDER_LAYERS.indexOf(owner)) {\n owner = layer;\n }\n }\n }\n return owner;\n}\n\n/**\n * The message for an edit a lock forbids, or `undefined` when it is allowed.\n * The merge ignores a lower layer silently; the CLI must not, or the operator\n * would watch an accepted edit have no effect.\n *\n * `set <id> locked <value>` stays legal at the locking layer itself —\n * otherwise a lock could never be lifted without hand-editing the file.\n */\nfunction lockConflict(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): string | undefined {\n const owner = lockOwner(id, files);\n if (!owner) return undefined;\n const ownerRank = AI_PROVIDER_LAYERS.indexOf(owner);\n const targetRank = AI_PROVIDER_LAYERS.indexOf(target.layer);\n if (ownerRank === targetRank && key === \"locked\") return undefined;\n if (ownerRank < targetRank) return undefined;\n return (\n `'${id}' is locked by the ${owner} layer and cannot be changed from ${target.layer}.\\n` +\n (ownerRank === targetRank\n ? ` Unlock it first: skaile providers set ${id} locked false`\n : ` A higher layer owns this entry — change it there.`)\n );\n}\n\n/** Refuse loudly when a locked entry would be edited. */\nfunction exitIfLocked(\n id: string,\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n key?: string,\n): void {\n const message = lockConflict(id, target, files, key);\n if (!message) return;\n logErr(message);\n process.exit(1);\n}\n\n/** Read the target file, or an empty document when it does not exist yet. */\nfunction readTargetDocument(\n target: { layer: \"user\" | \"workspace\"; path: string },\n files: ProviderRegistryFile[],\n): AIProviderRegistryDocument {\n const file = files.find((f) => f.path === target.path);\n return file?.document ?? { version: 1, providers: {} };\n}\n\n/**\n * Validate the file that is about to be written; exits non-zero on errors.\n *\n * Validated as the layer it is, so `set` may leave a one-field override in the\n * workspace file (§1.5). Completeness is the merged registry's business, and\n * `loadRegistryView` reports it on the next read.\n */\nfunction validateOrExit(\n document: AIProviderRegistryDocument,\n target: { layer: \"user\" | \"workspace\"; path: string },\n): void {\n const { diagnostics } = validateRegistry(\n { version: 1, providers: document.providers },\n { source: target.path, layer: target.layer },\n );\n if (reportDiagnostics(diagnostics) > 0) process.exit(1);\n}\n\n// ── list ───────────────────────────────────────────────────────────────────\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value : value + \" \".repeat(width - value.length);\n}\n\nfunction credentialSummary(entry: AIProviderEntry): string {\n const credential = entry.credential;\n if (!credential || credential.kind === \"none\") return \"none\";\n return credential.ref ? `${credential.kind} ${credential.ref}` : credential.kind;\n}\n\nfunction printPresets(): void {\n const presets = listProviderPresets();\n console.log();\n console.log(` ${S.heading(\"Catalog presets\")}`);\n const idWidth = Math.max(...presets.map((x) => x.id.length)) + 2;\n const surfaceWidth = Math.max(...AI_PROVIDER_SURFACES.map((s) => s.length)) + 2;\n const header = `${pad(\"preset\", idWidth)}${pad(\"kind\", 7)}${pad(\"surface\", surfaceWidth)}${pad(\"transport\", 14)}default base URL`;\n console.log(` ${S.dim(header)}`);\n for (const preset of presets) {\n const row =\n pad(preset.id, idWidth) +\n pad(preset.kind, 7) +\n pad(preset.surface ?? \"—\", surfaceWidth) +\n pad(\n preset.kind === \"llm\" || preset.kind === \"embed\" ? (preset.transport ?? \"direct\") : \"—\",\n 14,\n ) +\n (presetBaseUrl(preset) ?? \"—\");\n console.log(` ${row}`);\n }\n}\n\nfunction printConfigured(view: RegistryView): void {\n const ids = view.merged.order;\n console.log();\n console.log(` ${S.heading(\"Configured providers\")}`);\n if (ids.length === 0) {\n console.log(\n ` ${S.dim(\"none — add one with\")} ${S.cmd(\"skaile providers add --preset <preset>\")}`,\n );\n console.log();\n return;\n }\n const idWidth = Math.max(...ids.map((id) => id.length)) + 2;\n const header = `${pad(\"id\", idWidth)}${pad(\"layer\", 11)}${pad(\"surface\", 26)}${pad(\"transport\", 14)}endpoint`;\n console.log(` ${S.dim(header)}`);\n for (const id of ids) {\n const entry = view.merged.providers[id];\n const surface = (entry as AIProviderLlmEntry).surface ?? \"—\";\n const transport = entryTransport(entry) ?? \"—\";\n const url = resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\");\n const flags = [\n isEntryEnabled(entry) ? \"\" : S.warn(\"disabled\"),\n entry.locked ? S.warn(\"locked\") : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n console.log(\n ` ${pad(id, idWidth)}${pad(view.merged.origin[id], 11)}${pad(surface, 26)}${pad(transport, 14)}${url} ${flags}`.trimEnd(),\n );\n console.log(` ${S.dim(`${pad(\"\", idWidth)}${credentialSummary(entry)}`)}`);\n }\n console.log();\n}\n\n// ── add ────────────────────────────────────────────────────────────────────\n\ninterface AddOptions extends ScopeOptions {\n preset?: string;\n credential?: string;\n baseUrl?: string;\n surface?: string;\n label?: string;\n kind?: string;\n param: string[];\n force?: boolean;\n}\n\nfunction parseParams(pairs: string[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) {\n logErr(`--param expects <key>=<value> (got '${pair}')`);\n process.exit(1);\n }\n out[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return out;\n}\n\n/** Ask for the three literals a custom endpoint needs. Nothing else. */\nasync function promptCustomEntry(\n id: string,\n opts: AddOptions,\n): Promise<{ surface: AIProviderSurface; baseUrl: string; credentialRef: string }> {\n const interactive = process.stdin.isTTY === true;\n let surface = opts.surface as AIProviderSurface | undefined;\n let baseUrl = opts.baseUrl;\n let credentialRef = opts.credential;\n\n if (!interactive && (!surface || !baseUrl || !credentialRef)) {\n logErr(\n \"--preset custom needs --surface, --base-url and --credential when there is no terminal to prompt on\",\n );\n process.exit(1);\n }\n\n if (!surface) {\n const answer = await p.select({\n message: \"Wire surface:\",\n options: AI_PROVIDER_SURFACES.map((value) => ({ value, label: value })),\n initialValue: \"openai-completions\" as AIProviderSurface,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n surface = answer as AIProviderSurface;\n }\n if (!baseUrl) {\n const answer = await p.text({\n message: \"Base URL:\",\n placeholder: \"https://api.example.com/v1\",\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n baseUrl = answer as string;\n }\n if (!credentialRef) {\n const answer = await p.text({\n message: \"Credential reference (env:NAME, cmd:<shell>, platform:<id>, keyring:<svc>/<acct>):\",\n initialValue: `env:${id.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_API_KEY`,\n });\n if (p.isCancel(answer)) {\n p.cancel(\"Cancelled.\");\n process.exit(1);\n }\n credentialRef = answer as string;\n }\n return { surface, baseUrl, credentialRef };\n}\n\n/** A rejected registry write. The message is already CLI-ready. */\nexport class ProviderRegistryWriteError extends Error {}\n\n/** What {@link addProviderEntry} writes. */\nexport interface AddProviderEntryInput extends ScopeOptions {\n /** Registry entry id — `[a-z0-9][a-z0-9_-]*`. */\n id: string;\n /** Catalog preset to expand. Mutually exclusive with `entry`. */\n presetId?: string;\n /** A fully-built entry (the `--preset custom` path, which needs prompts). */\n entry?: AIProviderEntry;\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…` — never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n params?: Record<string, string>;\n /** Overwrite an entry that already exists in the target file. */\n force?: boolean;\n}\n\n/** Result of {@link addProviderEntry}. */\nexport interface AddedProviderEntry {\n id: string;\n layer: \"user\" | \"workspace\";\n path: string;\n entry: AIProviderEntry;\n /** True when an existing entry in the target file was overwritten. */\n replaced: boolean;\n}\n\n/**\n * Write one entry into a registry file — the single write path behind\n * `skaile providers add` and the `skaile setup` wizard.\n *\n * Throws {@link ProviderRegistryWriteError} instead of exiting, so a wizard\n * can report the failure in its own idiom. Every rejection a caller can\n * provoke (bad id, unknown preset, missing transport parameter, locked entry,\n * a literal secret) lands here, and the document is validated before it is\n * written — a secret cannot reach disk through this function.\n */\nexport function addProviderEntry(input: AddProviderEntryInput): AddedProviderEntry {\n const { id } = input;\n if (!isSafeProviderId(id)) {\n throw new ProviderRegistryWriteError(\n `'${id}' is not a valid entry id — use [a-z0-9][a-z0-9_-]*`,\n );\n }\n if (input.credentialRef && !parseCredentialRef(input.credentialRef)) {\n throw new ProviderRegistryWriteError(\n \"the credential must be a reference, not a secret: \" +\n \"env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>\",\n );\n }\n\n const view = loadRegistryView(input);\n const target = targetFile(input);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n const replaced = document.providers[id] !== undefined;\n if (replaced && !input.force) {\n throw new ProviderRegistryWriteError(\n `'${id}' already exists in ${target.path} — pass --force to overwrite it.`,\n );\n }\n\n let entry: AIProviderEntry;\n if (input.entry) {\n entry = input.entry;\n } else {\n const preset = input.presetId ? getProviderPreset(input.presetId) : undefined;\n if (!preset) {\n throw new ProviderRegistryWriteError(\n `Unknown preset '${input.presetId}'. Run \\`skaile providers list\\` to see the catalog, ` +\n \"or use `--preset custom`.\",\n );\n }\n entry = expandPreset(preset, {\n credentialRef: input.credentialRef,\n baseUrl: input.baseUrl,\n surface: input.surface,\n label: input.label,\n params: input.params,\n });\n const missing = (preset.required_params ?? []).filter(\n (key) => !(key in ((entry as AIProviderLlmEntry).params ?? {})),\n );\n if (missing.length > 0) {\n throw new ProviderRegistryWriteError(\n `Preset '${preset.id}' needs ${missing.map((m) => `--param ${m}=<value>`).join(\" \")}`,\n );\n }\n }\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: entry },\n };\n const { diagnostics } = validateRegistry(\n { version: 1, providers: next.providers },\n { source: target.path },\n );\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n if (errors.length > 0) {\n throw new ProviderRegistryWriteError(\n errors.map((d) => (d.path ? `${d.path}: ${d.message}` : d.message)).join(\"\\n\"),\n );\n }\n saveProviderRegistryFile(target.path, next);\n\n return { id, layer: target.layer, path: target.path, entry, replaced };\n}\n\n/** The env var an `env:` credential reference points at, if it is one. */\nexport function credentialEnvVarName(entry: AIProviderEntry): string | undefined {\n const ref = entry.credential?.ref;\n return ref?.startsWith(\"env:\") ? ref.slice(4) : undefined;\n}\n\n/** Build the `--preset custom` entry from the three literals the user gave. */\nfunction customEntry(\n answers: { surface: AIProviderSurface; baseUrl: string; credentialRef: string },\n opts: AddOptions,\n): AIProviderEntry {\n const kind = (opts.kind ?? \"llm\") as AIProviderEntry[\"kind\"];\n // Anthropic- and Google-shaped surfaces read a dedicated API-key header;\n // everything else is a bearer token. `set <id> credential.kind …` adjusts.\n const credentialKind =\n kind === \"stt\" ||\n kind === \"tts\" ||\n answers.surface === \"anthropic-messages\" ||\n answers.surface === \"google-generative-ai\" ||\n answers.surface === \"azure-openai-responses\"\n ? \"api_key_header\"\n : \"bearer\";\n if (kind === \"stt\" || kind === \"tts\") {\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n };\n }\n return {\n kind,\n ...(opts.label ? { label: opts.label } : {}),\n surface: answers.surface,\n base_url: answers.baseUrl,\n credential: { kind: credentialKind, ref: answers.credentialRef },\n } as AIProviderLlmEntry;\n}\n\nasync function runAdd(idArg: string | undefined, opts: AddOptions): Promise<void> {\n const presetId = opts.preset;\n if (!presetId) {\n logErr(\n `--preset is required. Run ${S.cmd(\"skaile providers list\")} for the catalog, ` +\n `or use ${S.cmd(\"--preset custom\")}.`,\n );\n process.exit(1);\n }\n const id = idArg ?? presetId;\n if (id === CUSTOM_PRESET && !idArg) {\n logErr(\"--preset custom needs an entry id: skaile providers add <id> --preset custom\");\n process.exit(1);\n }\n\n const entry =\n presetId === CUSTOM_PRESET ? customEntry(await promptCustomEntry(id, opts), opts) : undefined;\n\n let added: AddedProviderEntry;\n try {\n added = addProviderEntry({\n id,\n ...(entry ? { entry } : { presetId }),\n credentialRef: opts.credential,\n baseUrl: opts.baseUrl,\n surface: opts.surface as AIProviderSurface | undefined,\n label: opts.label,\n params: parseParams(opts.param),\n projectDir: opts.projectDir,\n workspace: opts.workspace,\n force: opts.force,\n });\n } catch (error) {\n logErr(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n logOk(`Added ${S.bold(id)} (${presetId}) to the ${added.layer} registry`);\n console.log(S.dim(` → ${added.path}`));\n const name = credentialEnvVarName(added.entry);\n if (name) {\n console.log(\n ` ${S.dim(\"The secret itself never goes in this file — export it:\")} ${S.cmd(`export ${name}=…`)}`,\n );\n }\n console.log(` ${S.dim(\"Verify with:\")} ${S.cmd(`skaile providers test ${id}`)}`);\n}\n\n// ── set / rm ───────────────────────────────────────────────────────────────\n\n/** Coerce a CLI string into the type the schema expects at `key`. */\nfunction coerceValue(key: string, value: string): unknown {\n const leaf = key.split(\".\").pop() ?? key;\n if (leaf === \"enabled\" || leaf === \"locked\" || leaf === \"tools\" || leaf === \"images\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n logErr(`'${key}' takes true or false (got '${value}')`);\n process.exit(1);\n }\n if (leaf === \"context_window\" || leaf === \"thinking_max\") {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n logErr(`'${key}' takes a number (got '${value}')`);\n process.exit(1);\n }\n return parsed;\n }\n return value;\n}\n\n/** Write `value` at a dotted path, creating intermediate maps. */\nfunction setDotted(entry: Record<string, unknown>, key: string, value: unknown): void {\n const segments = key.split(\".\");\n let cursor = entry;\n for (const segment of segments.slice(0, -1)) {\n const next = cursor[segment];\n if (typeof next !== \"object\" || next === null || Array.isArray(next)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = value;\n}\n\nfunction runSet(id: string, key: string, value: string, opts: ScopeOptions): void {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n exitIfLocked(id, target, view.files, key);\n\n const document = readTargetDocument(target, view.files);\n const existing = document.providers[id];\n const inherited = view.merged.providers[id];\n if (!existing && !inherited) {\n logErr(\n `No provider '${id}'. Add it with ${S.cmd(`skaile providers add ${id} --preset <preset>`)}`,\n );\n process.exit(1);\n }\n\n // Writing a field into a layer that has no entry yet leaves a one-field\n // override: the layers below keep supplying the rest (§1.5), so copying\n // their `kind` down here would pin a value this layer does not own.\n const base = (existing ? structuredClone(existing) : {}) as unknown as Record<string, unknown>;\n setDotted(base, key, coerceValue(key, value));\n\n const next: AIProviderRegistryDocument = {\n version: 1,\n providers: { ...document.providers, [id]: base as unknown as AIProviderEntry },\n };\n validateOrExit(next, target);\n saveProviderRegistryFile(target.path, next);\n\n logOk(`Set ${S.bold(`${id}.${key}`)} = ${value} in the ${target.layer} registry`);\n console.log(S.dim(` → ${target.path}`));\n}\n\n/** Result of {@link removeProviderEntry}. */\nexport interface RemovedProviderEntry {\n layer: \"user\" | \"workspace\";\n path: string;\n /** True when another layer still defines the same id. */\n stillDefinedElsewhere: boolean;\n}\n\n/**\n * Delete one entry from a registry file: the write path behind `skaile providers rm` and\n * `skaile config unset apiKey.<provider>`. Returns `undefined` when the target file has no such\n * entry; throws {@link ProviderRegistryWriteError} for a locked one.\n */\nexport function removeProviderEntry(\n id: string,\n opts: ScopeOptions,\n): RemovedProviderEntry | undefined {\n const view = loadRegistryView(opts);\n const target = targetFile(opts);\n const locked = lockConflict(id, target, view.files);\n if (locked) throw new ProviderRegistryWriteError(locked);\n\n const document = readTargetDocument(target, view.files);\n if (!document.providers[id]) return undefined;\n const providers = { ...document.providers };\n delete providers[id];\n saveProviderRegistryFile(target.path, { version: 1, providers });\n return {\n layer: target.layer,\n path: target.path,\n stillDefinedElsewhere: Boolean(\n view.merged.providers[id] &&\n view.files.some((f) => f.path !== target.path && f.document.providers[id]),\n ),\n };\n}\n\nfunction runRemove(id: string, opts: ScopeOptions): void {\n let removed: RemovedProviderEntry | undefined;\n try {\n removed = removeProviderEntry(id, opts);\n } catch (error) {\n if (!(error instanceof ProviderRegistryWriteError)) throw error;\n logErr(error.message);\n process.exit(1);\n }\n if (!removed) {\n logErr(`No provider '${id}' in ${targetFile(opts).path}`);\n process.exit(1);\n }\n\n logOk(`Removed ${S.bold(id)} from the ${removed.layer} registry`);\n console.log(S.dim(` → ${removed.path}`));\n if (removed.stillDefinedElsewhere) {\n logInfo(`'${id}' is still defined in another layer — run 'skaile providers list' to see it.`);\n }\n}\n\n// ── test ───────────────────────────────────────────────────────────────────\n\nasync function runTest(id: string, opts: ScopeOptions): Promise<void> {\n const view = loadRegistryView(opts);\n const entry = view.merged.providers[id];\n if (!entry) {\n logErr(`No provider '${id}'. Run ${S.cmd(\"skaile providers list\")} to see what is configured.`);\n process.exit(1);\n }\n\n const credential = resolveCredential(entry);\n console.log();\n console.log(` ${S.heading(id)} ${S.dim(`(${view.merged.origin[id]} layer)`)}`);\n console.log(` ${S.label(\"endpoint \")} ${resolveEntryBaseUrl(entry) ?? S.dim(\"(unresolved)\")}`);\n console.log(\n ` ${S.label(\"credential\")} ${credentialSummary(entry)} ${\n credential.error\n ? S.err(`— ${credential.error}`)\n : S.dim(`— resolved from ${credential.source}`)\n }`,\n );\n\n if (credential.error) {\n console.log();\n logErr(`${id} is not usable yet: ${credential.error}`);\n process.exit(1);\n }\n\n const result = await probeProviderEntry(entry, { secret: credential.value });\n if (result.url) console.log(` ${S.label(\"probe \")} GET ${result.url}`);\n console.log();\n if (result.ok) {\n logOk(`${id}: ${result.detail}${result.status ? ` (HTTP ${result.status})` : \"\"}`);\n return;\n }\n if (!result.probed) {\n logWarn(`${id}: ${result.detail}`);\n return;\n }\n logErr(`${id}: ${result.detail}`);\n process.exit(1);\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\n/**\n * Create the `skaile providers` command group.\n *\n * `list` shows the catalog and what is configured; `add` writes an entry from\n * a preset (or from three literals with `--preset custom`); `set` and `rm`\n * edit one layer; `test` sends one read-only request and reports what came\n * back, never the credential.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n */\nexport function makeProvidersCommand(): Command {\n const cmd = new Command(\"providers\").description(\n \"Manage AI provider endpoints (~/.skaile/providers.yml)\",\n );\n\n cmd\n .command(\"list\")\n .description(\"List catalog presets and configured providers\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--json\", \"Machine-readable output\")\n .action((opts) => {\n const view = loadRegistryView(opts);\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n presets: listProviderPresets().map((preset) => ({\n id: preset.id,\n kind: preset.kind,\n surface: preset.surface,\n transport: preset.transport ?? (preset.surface ? \"direct\" : undefined),\n base_url: presetBaseUrl(preset),\n credential: preset.credential,\n required_params: preset.required_params,\n })),\n providers: view.merged.order.map((id) => ({\n id,\n layer: view.merged.origin[id],\n entry: view.merged.providers[id],\n base_url: resolveEntryBaseUrl(view.merged.providers[id]),\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n reportDiagnostics(view.diagnostics);\n printPresets();\n printConfigured(view);\n });\n\n cmd\n .command(\"add [id]\")\n .description(\"Add a provider from a catalog preset (id defaults to the preset name)\")\n .requiredOption(\"--preset <preset>\", `Catalog preset, or '${CUSTOM_PRESET}'`)\n .option(\"--credential <ref>\", \"Credential reference (env:NAME, cmd:…, platform:…, keyring:…)\")\n .option(\"--base-url <url>\", \"Override the preset endpoint\")\n .option(\"--surface <surface>\", `Wire surface (${AI_PROVIDER_SURFACES.join(\", \")})`)\n .option(\"--kind <kind>\", \"Entry kind for --preset custom (llm, embed, stt, tts)\", \"llm\")\n .option(\"--label <text>\", \"Display label\")\n .option(\n \"--param <key=value>\",\n \"Transport parameter (repeatable): region, project, location, resource, deployment, api_version\",\n (value: string, previous: string[]) => [...previous, value],\n [] as string[],\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .option(\"--force\", \"Overwrite an existing entry in the target file\")\n .action((id: string | undefined, opts: AddOptions) => runAdd(id, opts));\n\n cmd\n .command(\"set <id> <key> <value>\")\n .description(\n \"Set one field (base_url, enabled, credential.ref, headers.<name>, model_map.<id>…)\",\n )\n .option(\"--workspace\", \"Write <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, key: string, value: string, opts: ScopeOptions) =>\n runSet(id, key, value, opts),\n );\n\n cmd\n .command(\"rm <id>\")\n .description(\"Remove a provider from one layer\")\n .option(\"--workspace\", \"Edit <workspace>/.skaile/providers.yml instead of the user file\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runRemove(id, opts));\n\n cmd\n .command(\"test <id>\")\n .description(\"Send one read-only request to a provider and report the result\")\n .option(\"--project-dir <path>\", \"Project directory\")\n .action((id: string, opts: ScopeOptions) => runTest(id, opts));\n\n return cmd;\n}\n"]}