@skaile/workspaces 6.6.0 → 6.8.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 (381) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/ai-sdk.js +10 -17
  3. package/dist/ai-sdk.js.map +1 -1
  4. package/dist/app-sdk/index.js +1 -1
  5. package/dist/{asset-feeds-WQ6YQPHV.js → asset-feeds-NU5UOO5F.js} +18 -18
  6. package/dist/{asset-feeds-WQ6YQPHV.js.map → asset-feeds-NU5UOO5F.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +4 -4
  8. package/dist/asset-manager/index.js +10 -10
  9. package/dist/asset-manager/installer.js +6 -6
  10. package/dist/asset-manager/renderers.js +5 -5
  11. package/dist/asset-manager/src/index.d.ts +89 -15
  12. package/dist/asset-manager/src/index.d.ts.map +1 -1
  13. package/dist/asset-manager/src/install-agent.d.ts +22 -1
  14. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  15. package/dist/asset-manager/src/install-instances.d.ts +30 -1
  16. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  17. package/dist/asset-manager/src/installer.d.ts +12 -0
  18. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  19. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  20. package/dist/bridge/harnesses/claude-sdk.js +34 -20
  21. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  22. package/dist/bridge/harnesses/codex.js +9 -8
  23. package/dist/bridge/harnesses/codex.js.map +1 -1
  24. package/dist/bridge/harnesses/continue.js +11 -9
  25. package/dist/bridge/harnesses/continue.js.map +1 -1
  26. package/dist/bridge/harnesses/echo.js +5 -4
  27. package/dist/bridge/harnesses/echo.js.map +1 -1
  28. package/dist/bridge/harnesses/gemini.js +8 -6
  29. package/dist/bridge/harnesses/goose.js +11 -9
  30. package/dist/bridge/harnesses/goose.js.map +1 -1
  31. package/dist/bridge/harnesses/omp.js +9 -7
  32. package/dist/bridge/harnesses/omp.js.map +1 -1
  33. package/dist/bridge/harnesses/opencode.js +11 -9
  34. package/dist/bridge/harnesses/opencode.js.map +1 -1
  35. package/dist/bridge/harnesses/qwen.js +9 -7
  36. package/dist/bridge/harnesses/qwen.js.map +1 -1
  37. package/dist/bridge/index.js +17 -15
  38. package/dist/bridge/src/ai-sdk.d.ts.map +1 -1
  39. package/dist/bridge/src/claude-sdk-surface.d.ts +2 -1
  40. package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -1
  41. package/dist/bridge/src/harness-binaries.d.ts +21 -0
  42. package/dist/bridge/src/harness-binaries.d.ts.map +1 -0
  43. package/dist/bridge/src/harness-model-check.d.ts +22 -6
  44. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  45. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  46. package/dist/bridge/src/harnesses/claude-self-turns.d.ts.map +1 -1
  47. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  48. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  49. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  50. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -1
  51. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  52. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  53. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  54. package/dist/bridge/src/index.d.ts +2 -1
  55. package/dist/bridge/src/index.d.ts.map +1 -1
  56. package/dist/bridge/src/types.d.ts +11 -0
  57. package/dist/bridge/src/types.d.ts.map +1 -1
  58. package/dist/{chunk-LBJ4M5J2.js → chunk-237BMOZW.js} +4 -4
  59. package/dist/{chunk-LBJ4M5J2.js.map → chunk-237BMOZW.js.map} +1 -1
  60. package/dist/{chunk-XYCYGN3Q.js → chunk-2I5HNM7K.js} +79 -20
  61. package/dist/chunk-2I5HNM7K.js.map +1 -0
  62. package/dist/{chunk-MXI3XWV6.js → chunk-3HSLJAMJ.js} +4 -4
  63. package/dist/{chunk-MXI3XWV6.js.map → chunk-3HSLJAMJ.js.map} +1 -1
  64. package/dist/{chunk-SCRYXAHH.js → chunk-3NJFPGEB.js} +6 -6
  65. package/dist/{chunk-SCRYXAHH.js.map → chunk-3NJFPGEB.js.map} +1 -1
  66. package/dist/{chunk-RHCEX2EV.js → chunk-3QX2X77G.js} +3 -3
  67. package/dist/{chunk-RHCEX2EV.js.map → chunk-3QX2X77G.js.map} +1 -1
  68. package/dist/{chunk-DS6UUCFG.js → chunk-4CD2R4MJ.js} +5 -4
  69. package/dist/chunk-4CD2R4MJ.js.map +1 -0
  70. package/dist/{chunk-7I5PNB2G.js → chunk-5TLMHB2U.js} +3 -3
  71. package/dist/{chunk-7I5PNB2G.js.map → chunk-5TLMHB2U.js.map} +1 -1
  72. package/dist/{chunk-KSH5CFQS.js → chunk-6PVRP3LW.js} +36 -5
  73. package/dist/chunk-6PVRP3LW.js.map +1 -0
  74. package/dist/{chunk-BSMW3PX2.js → chunk-6UP2EDFN.js} +4 -313
  75. package/dist/chunk-6UP2EDFN.js.map +1 -0
  76. package/dist/{chunk-U3UDOX6I.js → chunk-6ZM5X2XW.js} +6 -4
  77. package/dist/chunk-6ZM5X2XW.js.map +1 -0
  78. package/dist/{chunk-JRVQV7WC.js → chunk-757G6TTZ.js} +595 -126
  79. package/dist/chunk-757G6TTZ.js.map +1 -0
  80. package/dist/{chunk-G5SYFFMD.js → chunk-7NN3P6VF.js} +22 -5
  81. package/dist/chunk-7NN3P6VF.js.map +1 -0
  82. package/dist/{chunk-7PVGND4J.js → chunk-7YOHUX2M.js} +21 -14
  83. package/dist/chunk-7YOHUX2M.js.map +1 -0
  84. package/dist/{chunk-O7QZI6MQ.js → chunk-BB5EJLKZ.js} +2 -2
  85. package/dist/{chunk-O7QZI6MQ.js.map → chunk-BB5EJLKZ.js.map} +1 -1
  86. package/dist/{chunk-2M3VLKT2.js → chunk-BRPEW3UL.js} +3 -3
  87. package/dist/{chunk-2M3VLKT2.js.map → chunk-BRPEW3UL.js.map} +1 -1
  88. package/dist/{chunk-EPXZQIC6.js → chunk-DFP476EU.js} +8 -4
  89. package/dist/chunk-DFP476EU.js.map +1 -0
  90. package/dist/{chunk-B6N653ZG.js → chunk-DRHJRTAS.js} +6 -6
  91. package/dist/{chunk-B6N653ZG.js.map → chunk-DRHJRTAS.js.map} +1 -1
  92. package/dist/{chunk-4J7JQX4G.js → chunk-E3KABQS3.js} +4 -4
  93. package/dist/{chunk-4J7JQX4G.js.map → chunk-E3KABQS3.js.map} +1 -1
  94. package/dist/{chunk-MMOWIRHP.js → chunk-G44FFUMA.js} +12 -10
  95. package/dist/chunk-G44FFUMA.js.map +1 -0
  96. package/dist/{chunk-JIQUF3X2.js → chunk-G7NMF5WQ.js} +3 -3
  97. package/dist/{chunk-JIQUF3X2.js.map → chunk-G7NMF5WQ.js.map} +1 -1
  98. package/dist/{chunk-HGZN6JLP.js → chunk-HKRME377.js} +4 -4
  99. package/dist/{chunk-HGZN6JLP.js.map → chunk-HKRME377.js.map} +1 -1
  100. package/dist/{chunk-6A6HE5LW.js → chunk-HLAEYFUN.js} +3 -3
  101. package/dist/{chunk-6A6HE5LW.js.map → chunk-HLAEYFUN.js.map} +1 -1
  102. package/dist/{chunk-F4CZQD3T.js → chunk-I6XH46Q6.js} +4 -3
  103. package/dist/chunk-I6XH46Q6.js.map +1 -0
  104. package/dist/{chunk-7SJHSGUV.js → chunk-K6HCOTOZ.js} +16 -15
  105. package/dist/chunk-K6HCOTOZ.js.map +1 -0
  106. package/dist/{chunk-AQNW2FET.js → chunk-K7ZGY2BY.js} +351 -51
  107. package/dist/chunk-K7ZGY2BY.js.map +1 -0
  108. package/dist/{chunk-GTGWRKMJ.js → chunk-KHWGUXSF.js} +6 -6
  109. package/dist/{chunk-GTGWRKMJ.js.map → chunk-KHWGUXSF.js.map} +1 -1
  110. package/dist/{chunk-DI6J2PJB.js → chunk-KO3VSZQP.js} +47 -18
  111. package/dist/chunk-KO3VSZQP.js.map +1 -0
  112. package/dist/{chunk-VXYZ5M7Z.js → chunk-LJ6PLEDU.js} +64 -27
  113. package/dist/chunk-LJ6PLEDU.js.map +1 -0
  114. package/dist/{chunk-SHTXMERQ.js → chunk-LL5GMUQG.js} +10 -8
  115. package/dist/chunk-LL5GMUQG.js.map +1 -0
  116. package/dist/{chunk-TCH5UDKT.js → chunk-NW7Y5SNK.js} +10 -8
  117. package/dist/chunk-NW7Y5SNK.js.map +1 -0
  118. package/dist/{chunk-J4WKNJHO.js → chunk-O5Y7VMVQ.js} +15 -14
  119. package/dist/chunk-O5Y7VMVQ.js.map +1 -0
  120. package/dist/{chunk-6SXSVKQY.js → chunk-O7ADRMCR.js} +63 -14
  121. package/dist/chunk-O7ADRMCR.js.map +1 -0
  122. package/dist/{chunk-WW5NAU6N.js → chunk-ORXV3UB6.js} +3 -3
  123. package/dist/{chunk-WW5NAU6N.js.map → chunk-ORXV3UB6.js.map} +1 -1
  124. package/dist/{chunk-VJRL6ZK6.js → chunk-OSABUEWA.js} +3 -3
  125. package/dist/{chunk-VJRL6ZK6.js.map → chunk-OSABUEWA.js.map} +1 -1
  126. package/dist/{chunk-XD3RYAMR.js → chunk-PMZMG3HC.js} +6 -6
  127. package/dist/{chunk-XD3RYAMR.js.map → chunk-PMZMG3HC.js.map} +1 -1
  128. package/dist/{chunk-J262X4JU.js → chunk-Q6FKWPRO.js} +69 -16
  129. package/dist/chunk-Q6FKWPRO.js.map +1 -0
  130. package/dist/{chunk-E2EC6SAX.js → chunk-QC5BYUED.js} +51 -15
  131. package/dist/chunk-QC5BYUED.js.map +1 -0
  132. package/dist/{chunk-RAU5QPI6.js → chunk-QCR5AE5E.js} +5 -5
  133. package/dist/{chunk-RAU5QPI6.js.map → chunk-QCR5AE5E.js.map} +1 -1
  134. package/dist/{chunk-I5IF3JCG.js → chunk-QGA2OBUJ.js} +3 -3
  135. package/dist/{chunk-I5IF3JCG.js.map → chunk-QGA2OBUJ.js.map} +1 -1
  136. package/dist/{chunk-TUFNY6OD.js → chunk-QW5B3TEO.js} +10 -4
  137. package/dist/chunk-QW5B3TEO.js.map +1 -0
  138. package/dist/{chunk-Z4FERR4U.js → chunk-RDIGVPXX.js} +2 -2
  139. package/dist/{chunk-Z4FERR4U.js.map → chunk-RDIGVPXX.js.map} +1 -1
  140. package/dist/{chunk-SZKCE7EC.js → chunk-REAF7ZFA.js} +5 -5
  141. package/dist/{chunk-SZKCE7EC.js.map → chunk-REAF7ZFA.js.map} +1 -1
  142. package/dist/{chunk-OY22B7E2.js → chunk-SBNUXJ6E.js} +3 -3
  143. package/dist/{chunk-OY22B7E2.js.map → chunk-SBNUXJ6E.js.map} +1 -1
  144. package/dist/chunk-SILFO5RY.js +315 -0
  145. package/dist/chunk-SILFO5RY.js.map +1 -0
  146. package/dist/{chunk-6ARPZHOV.js → chunk-TMJBEGS4.js} +35 -6
  147. package/dist/chunk-TMJBEGS4.js.map +1 -0
  148. package/dist/{chunk-5XHQBCB5.js → chunk-WFK4MUBL.js} +21 -7
  149. package/dist/chunk-WFK4MUBL.js.map +1 -0
  150. package/dist/chunk-WWSRIT3J.js +59 -0
  151. package/dist/chunk-WWSRIT3J.js.map +1 -0
  152. package/dist/{chunk-N2PBAXAA.js → chunk-XCGDRLMH.js} +3 -3
  153. package/dist/{chunk-N2PBAXAA.js.map → chunk-XCGDRLMH.js.map} +1 -1
  154. package/dist/{chunk-YN6N3RBM.js → chunk-XIIIGLSL.js} +47 -11
  155. package/dist/chunk-XIIIGLSL.js.map +1 -0
  156. package/dist/{chunk-65UAC3ZR.js → chunk-Y6LC5PEZ.js} +4 -3
  157. package/dist/chunk-Y6LC5PEZ.js.map +1 -0
  158. package/dist/{chunk-KSUT5KAE.js → chunk-YEOG7CWQ.js} +3 -3
  159. package/dist/{chunk-KSUT5KAE.js.map → chunk-YEOG7CWQ.js.map} +1 -1
  160. package/dist/{chunk-5ETYBC2X.js → chunk-YGP6XEPA.js} +6 -6
  161. package/dist/{chunk-5ETYBC2X.js.map → chunk-YGP6XEPA.js.map} +1 -1
  162. package/dist/{chunk-2TLPC6TQ.js → chunk-YHNPWSSH.js} +41 -19
  163. package/dist/chunk-YHNPWSSH.js.map +1 -0
  164. package/dist/{chunk-6RHWTZPT.js → chunk-YZD7DUEF.js} +3 -3
  165. package/dist/{chunk-6RHWTZPT.js.map → chunk-YZD7DUEF.js.map} +1 -1
  166. package/dist/{chunk-4BFEPZ6J.js → chunk-ZBA4P5TD.js} +3 -3
  167. package/dist/{chunk-4BFEPZ6J.js.map → chunk-ZBA4P5TD.js.map} +1 -1
  168. package/dist/{claude-code-LZH7Y4Y5.js → claude-code-AESK7XO4.js} +4 -4
  169. package/dist/{claude-code-LZH7Y4Y5.js.map → claude-code-AESK7XO4.js.map} +1 -1
  170. package/dist/cli/index.js +474 -198
  171. package/dist/cli/index.js.map +1 -1
  172. package/dist/cli/src/agent-pins.d.ts +9 -3
  173. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  174. package/dist/cli/src/commands/asset-cmd.d.ts +1 -1
  175. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  176. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  177. package/dist/cli/src/commands/catalog.d.ts +2 -0
  178. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  179. package/dist/cli/src/commands/config.d.ts.map +1 -1
  180. package/dist/cli/src/commands/harness-preflight.d.ts +38 -0
  181. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -0
  182. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  183. package/dist/cli/src/commands/library-index.d.ts +16 -0
  184. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  185. package/dist/cli/src/commands/migrate-assets.d.ts +5 -0
  186. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  187. package/dist/cli/src/commands/migrate-harness.d.ts +15 -7
  188. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  189. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  190. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  191. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  192. package/dist/cli/src/commands/project.d.ts +14 -0
  193. package/dist/cli/src/commands/project.d.ts.map +1 -1
  194. package/dist/cli/src/commands/run.d.ts.map +1 -1
  195. package/dist/cli/src/commands/serve-preflight.d.ts +6 -5
  196. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  197. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  198. package/dist/cli/src/commands/session.d.ts.map +1 -1
  199. package/dist/cli/src/commands/source.d.ts +11 -0
  200. package/dist/cli/src/commands/source.d.ts.map +1 -1
  201. package/dist/cli/src/commands/update.d.ts.map +1 -1
  202. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  203. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  204. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  205. package/dist/cli/src/commands/why.d.ts.map +1 -1
  206. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  207. package/dist/cli/src/session-hint.d.ts +7 -0
  208. package/dist/cli/src/session-hint.d.ts.map +1 -0
  209. package/dist/connectors/config.js +3 -3
  210. package/dist/connectors/index.js +21 -19
  211. package/dist/connectors/src/managed-gitconfig.d.ts +6 -4
  212. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  213. package/dist/{connectors-HU5MHSUJ.js → connectors-5ZZRVAPD.js} +24 -22
  214. package/dist/{connectors-HU5MHSUJ.js.map → connectors-5ZZRVAPD.js.map} +1 -1
  215. package/dist/connectors-shared/index.js +2 -2
  216. package/dist/core/index.js +4 -4
  217. package/dist/core/publish-manifest.js +1 -1
  218. package/dist/core/runtime-assets.js +3 -3
  219. package/dist/core/src/agent-instances.d.ts +11 -0
  220. package/dist/core/src/agent-instances.d.ts.map +1 -1
  221. package/dist/core/src/index.d.ts +3 -2
  222. package/dist/core/src/index.d.ts.map +1 -1
  223. package/dist/core/src/publish-manifest.d.ts +20 -6
  224. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  225. package/dist/core/src/repo-manager.d.ts +9 -0
  226. package/dist/core/src/repo-manager.d.ts.map +1 -1
  227. package/dist/core/src/run-state-ignore.d.ts +17 -0
  228. package/dist/core/src/run-state-ignore.d.ts.map +1 -0
  229. package/dist/core/src/workspace-config.d.ts.map +1 -1
  230. package/dist/core/workspace-config.js +2 -2
  231. package/dist/deploy/index.js +4 -4
  232. package/dist/discovery/index.js +2 -2
  233. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  234. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  235. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  236. package/dist/{ensure-sources-CAMWJTMR.js → ensure-sources-VLJ7AUUK.js} +26 -24
  237. package/dist/ensure-sources-VLJ7AUUK.js.map +1 -0
  238. package/dist/factory-assets/connectors/box.js +21 -19
  239. package/dist/factory-assets/connectors/deploy.js +21 -19
  240. package/dist/factory-assets/connectors/devserver.js +21 -19
  241. package/dist/factory-assets/connectors/flow/adapter.js +21 -19
  242. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +3 -3
  243. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +2 -0
  244. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -1
  245. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  246. package/dist/factory-assets/connectors/flow/run-flow.js +22 -20
  247. package/dist/factory-assets/connectors/flow.js +21 -19
  248. package/dist/factory-assets/connectors/git/CONNECTOR.md +4 -1
  249. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  250. package/dist/factory-assets/connectors/git.js +21 -19
  251. package/dist/factory-assets/connectors/gmail.js +21 -19
  252. package/dist/factory-assets/connectors/googledrive.js +21 -19
  253. package/dist/factory-assets/connectors/local.js +21 -19
  254. package/dist/factory-assets/connectors/mattermost.js +21 -19
  255. package/dist/factory-assets/connectors/memory.js +21 -19
  256. package/dist/factory-assets/connectors/minio.js +21 -19
  257. package/dist/factory-assets/connectors/postgres.js +21 -19
  258. package/dist/factory-assets/connectors/s3.js +21 -19
  259. package/dist/factory-assets/connectors/sharepoint.js +21 -19
  260. package/dist/factory-assets/connectors/sqlite.js +21 -19
  261. package/dist/factory-assets/connectors/static-server.js +21 -19
  262. package/dist/factory-assets/connectors/tunnel.js +21 -19
  263. package/dist/factory-assets/connectors/webdav.js +21 -19
  264. package/dist/factory-assets/connectors/xstate-store.js +21 -19
  265. package/dist/factory-assets/connectors/xstate.js +21 -19
  266. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +14 -1
  267. package/dist/{flows-GVOVQGQW.js → flows-I6ODIPZZ.js} +7 -7
  268. package/dist/{flows-GVOVQGQW.js.map → flows-I6ODIPZZ.js.map} +1 -1
  269. package/dist/{helpers-WMCCODAV.js → helpers-APXGTZ5A.js} +26 -24
  270. package/dist/{helpers-WMCCODAV.js.map → helpers-APXGTZ5A.js.map} +1 -1
  271. package/dist/library/index.js +7 -7
  272. package/dist/library/install.js +2 -2
  273. package/dist/library/src/manifest-writer.d.ts +5 -0
  274. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  275. package/dist/{library-publish-UQQMHTND.js → library-publish-B5HL4OBE.js} +47 -45
  276. package/dist/library-publish-B5HL4OBE.js.map +1 -0
  277. package/dist/model-endpoint/index.js +8 -7
  278. package/dist/{open-library-OJ4HT2X4.js → open-library-F56D46K7.js} +29 -27
  279. package/dist/{open-library-OJ4HT2X4.js.map → open-library-F56D46K7.js.map} +1 -1
  280. package/dist/{open-registry-LWGIOJDK.js → open-registry-RZW2AFD6.js} +11 -11
  281. package/dist/{open-registry-LWGIOJDK.js.map → open-registry-RZW2AFD6.js.map} +1 -1
  282. package/dist/{paths-FR2752HV.js → paths-RPK5PNZQ.js} +7 -7
  283. package/dist/{paths-FR2752HV.js.map → paths-RPK5PNZQ.js.map} +1 -1
  284. package/dist/{plugin-store-IALJUBN2.js → plugin-store-OJTERUEZ.js} +7 -7
  285. package/dist/{plugin-store-IALJUBN2.js.map → plugin-store-OJTERUEZ.js.map} +1 -1
  286. package/dist/{project-UQFCYHYS.js → project-GLTP6VFV.js} +43 -41
  287. package/dist/{project-UQFCYHYS.js.map → project-GLTP6VFV.js.map} +1 -1
  288. package/dist/resolver/index.js +4 -4
  289. package/dist/runner/index.js +32 -30
  290. package/dist/runner/src/capability-roundtrip.d.ts +8 -7
  291. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  292. package/dist/runner/src/composition/run-snapshot.d.ts +7 -1
  293. package/dist/runner/src/composition/run-snapshot.d.ts.map +1 -1
  294. package/dist/runner/src/serve.d.ts.map +1 -1
  295. package/dist/runner/src/turn-scheduler.d.ts +8 -0
  296. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  297. package/dist/runner/src/turn-visibility.d.ts +97 -0
  298. package/dist/runner/src/turn-visibility.d.ts.map +1 -0
  299. package/dist/sdk/asset-manager.js +10 -10
  300. package/dist/sdk/bridge.js +17 -15
  301. package/dist/sdk/core.js +4 -4
  302. package/dist/sdk/flow.js +5 -5
  303. package/dist/sdk/index.js +32 -30
  304. package/dist/sdk/index.js.map +1 -1
  305. package/dist/sdk/resolver.js +4 -4
  306. package/dist/sdk/runner.js +32 -30
  307. package/dist/sdk/session.js +2 -2
  308. package/dist/sdk/transport/ws/server.js +5 -5
  309. package/dist/sdk/transport/ws.js +5 -5
  310. package/dist/sdk/transport.js +5 -5
  311. package/dist/sdk/types.js +1 -1
  312. package/dist/serve-preflight-EHLBSNUE.js +58 -0
  313. package/dist/{serve-preflight-TYEKHC32.js.map → serve-preflight-EHLBSNUE.js.map} +1 -1
  314. package/dist/session/index.js +2 -2
  315. package/dist/session/src/dispatcher.d.ts.map +1 -1
  316. package/dist/{setup-4JV2IMCB.js → setup-PMZLMFCD.js} +27 -25
  317. package/dist/setup-PMZLMFCD.js.map +1 -0
  318. package/dist/{skills-6QTKFMLW.js → skills-KHHW3RZ3.js} +6 -6
  319. package/dist/{skills-6QTKFMLW.js.map → skills-KHHW3RZ3.js.map} +1 -1
  320. package/dist/source-QNSGAM3S.js +88 -0
  321. package/dist/{source-XYMMJVKR.js.map → source-QNSGAM3S.js.map} +1 -1
  322. package/dist/{source-manifest-publish-SZFGGKB4.js → source-manifest-publish-AI725AVE.js} +44 -42
  323. package/dist/source-manifest-publish-AI725AVE.js.map +1 -0
  324. package/dist/transport/index.js +5 -5
  325. package/dist/transport/ws/server.js +5 -5
  326. package/dist/transport/ws.js +5 -5
  327. package/dist/tui/index.js +56 -37
  328. package/dist/tui/index.js.map +1 -1
  329. package/dist/tui/src/repl.d.ts +10 -0
  330. package/dist/tui/src/repl.d.ts.map +1 -1
  331. package/dist/types/index.js +1 -1
  332. package/dist/types/src/capabilities.d.ts +3 -2
  333. package/dist/types/src/capabilities.d.ts.map +1 -1
  334. package/dist/types/src/events.d.ts +11 -10
  335. package/dist/types/src/events.d.ts.map +1 -1
  336. package/dist/types/src/index.d.ts +2 -0
  337. package/dist/types/src/index.d.ts.map +1 -1
  338. package/dist/types/src/manifests/preset.d.ts +5 -5
  339. package/dist/types/src/protocol.d.ts +3 -0
  340. package/dist/types/src/protocol.d.ts.map +1 -1
  341. package/dist/types/src/turn-visibility.d.ts +50 -0
  342. package/dist/types/src/turn-visibility.d.ts.map +1 -0
  343. package/dist/types/src/version.d.ts +18 -5
  344. package/dist/types/src/version.d.ts.map +1 -1
  345. package/dist/workspace-plugin/adapters/mcp.js +24 -22
  346. package/dist/workspace-plugin/adapters/omp.js +14 -14
  347. package/dist/workspace-plugin/index.js +1 -1
  348. package/package.json +1 -1
  349. package/dist/chunk-2TLPC6TQ.js.map +0 -1
  350. package/dist/chunk-5XHQBCB5.js.map +0 -1
  351. package/dist/chunk-65UAC3ZR.js.map +0 -1
  352. package/dist/chunk-6ARPZHOV.js.map +0 -1
  353. package/dist/chunk-6SXSVKQY.js.map +0 -1
  354. package/dist/chunk-7PVGND4J.js.map +0 -1
  355. package/dist/chunk-7SJHSGUV.js.map +0 -1
  356. package/dist/chunk-AQNW2FET.js.map +0 -1
  357. package/dist/chunk-BSMW3PX2.js.map +0 -1
  358. package/dist/chunk-DI6J2PJB.js.map +0 -1
  359. package/dist/chunk-DS6UUCFG.js.map +0 -1
  360. package/dist/chunk-E2EC6SAX.js.map +0 -1
  361. package/dist/chunk-EPXZQIC6.js.map +0 -1
  362. package/dist/chunk-F4CZQD3T.js.map +0 -1
  363. package/dist/chunk-G5SYFFMD.js.map +0 -1
  364. package/dist/chunk-J262X4JU.js.map +0 -1
  365. package/dist/chunk-J4WKNJHO.js.map +0 -1
  366. package/dist/chunk-JRVQV7WC.js.map +0 -1
  367. package/dist/chunk-KSH5CFQS.js.map +0 -1
  368. package/dist/chunk-MMOWIRHP.js.map +0 -1
  369. package/dist/chunk-SHTXMERQ.js.map +0 -1
  370. package/dist/chunk-TCH5UDKT.js.map +0 -1
  371. package/dist/chunk-TUFNY6OD.js.map +0 -1
  372. package/dist/chunk-U3UDOX6I.js.map +0 -1
  373. package/dist/chunk-VXYZ5M7Z.js.map +0 -1
  374. package/dist/chunk-XYCYGN3Q.js.map +0 -1
  375. package/dist/chunk-YN6N3RBM.js.map +0 -1
  376. package/dist/ensure-sources-CAMWJTMR.js.map +0 -1
  377. package/dist/library-publish-UQQMHTND.js.map +0 -1
  378. package/dist/serve-preflight-TYEKHC32.js +0 -56
  379. package/dist/setup-4JV2IMCB.js.map +0 -1
  380. package/dist/source-XYMMJVKR.js +0 -86
  381. package/dist/source-manifest-publish-SZFGGKB4.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1124](https://github.com/skaile-ai/workspaces/pull/1124) [`32f138b`](https://github.com/skaile-ai/workspaces/commit/32f138b22f66c9d16af5dd1b799b01a33b51012f) Thanks [@peteralbert](https://github.com/peteralbert)! - A private `@agent_` prompt's answer now stays private (protocol 5.1.0). The `prompt` command gains optional `visibilityMode` and `privateRecipientIds`: `SessionDispatcher.sendCommand` sets them for a private prompt the agent receives (the sender plus the prompt's human recipients, never the `__agent__` sentinel alone), and the runner stamps both on every content event of that turn (`TURN_VISIBILITY_EVENT_TYPES`: text, tool calls and results, questions, errors, `finished`, …), from dispatch to `finished`. Work the turn starts keeps its readers after the turn ends: a background subagent's tool calls and results (by `parentToolUseId`) and a self-started turn that reads a task the private turn launched. A capability call carries no parent id, so while background tasks run, its events (`capability_invoked`, `render_invoked`, `custom_message`, a render's fallback text; a `question` is credited to the tool use it comes from instead) go only to the readers the running turn and every running task's launching turn share; when they share none, the events are withheld and the call is refused to the agent. Once a private turn has run, output whose readers cannot be established is withheld (dropped, or for `finished` / `error` sent content-free), never sent Public or to another turn's readers. The dispatcher persists a stamped event with that visibility on its `Message` envelope. Status, file-change and session events, public turns and turns no prompt started are unchanged. The runner lists `turnVisibility.v1` in `protocol_info.runtimeFeatures`, refuses a private prompt while a flow takes chat (a flow turn cannot keep one prompt's readers), and refuses a private prompt that names no human reader.
8
+
9
+ ## 6.7.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - An agent is rendered once per instance. `add agent:@crew/bookkeeper` writes `.claude/agents/<instance id>.md` (omp: `.omp/agents/<id>/`, codex: `.codex/agents/<id>.toml`) and no file named after the asset. The asset-named file is written only for an agent that no instance binds, and an agent called as a `binding: run` role gets no native file (p416). `install`, `update` and `add` remove the asset-named file an earlier CLI wrote when skaile still owns it (the bytes equal the lock); an edited file stays. Renaming an instance in `skaile.yaml` converges with one `install`: `check` is clean at once (p2080). `install` no longer says `the deployed copy is gone` when the instance file is there (p2083). `update` re-runs the rebuild for every agent that holds a pin, so `check` and `run` stay clean after a library edit (p1911).
14
+
15
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - The repl banner lists the declared instances for `--instance` and the delegate sub-agents on their own line. The generated `.gitignore` now ignores `.skaile/composition-runs/` and `.skaile/agent-instances-managed.json`, an existing project gets the lines on the next write, and only the 20 newest run snapshots are kept. `run --dry-run` names the bound instances and `--instance <id>` when `agents:` is set and no primary agent is. `serve` refuses an `agents.<id>.ref` that does not resolve with one line, as `validate` does. The docs say that `composition.<id>` is a name in the compile plan and that omp and codex reach a connector through `skaile connector`.
16
+
17
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - A manifest entry whose root holds no files now fails `validate`, `library index` (exit 1) and the publish plan with one line, and `add` fails with the same line. `add` on a reader library or a source clone no longer tells the user to run `library index`; it names the owner's push and `library pull` or `source sync`. `library init --path` on a folder with `SKILL.md` at its root indexes the skill with root `.` instead of a ghost entry. `add` of a renamed flow no longer prints `LibraryEntryError:`. `library init --path` refuses a git clone with no branch checked out. `validate` of a connector without `id` prints one error and never the id `undefined`. `migrate assets` ends with `N file(s) not converted: ...` and exits 1 when it leaves a bundle behind. `.coverage`, `htmlcov/`, `.tox/`, `.nox/`, `.nyc_output/`, `*.egg-info/` and `._*` (any depth) and `dist/`, `build/`, `coverage/` (directly in the asset root only) are no longer deployed or hashed, and `library index` warns once per untracked file in the root of an asset the git library already holds. `library create` without `--library` writes into the library whose folder holds the current directory and names it in the output. The `authoring-skaile-assets` skill shows the `composes:` entry shape.
18
+
19
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - `skaile --help` now ends with a `More:` group that lists `asset`, `migrate`, `providers`, `auth`, `cache`, `npx`, `rebuild`, `verify` and `complete`. `config get <unknown key>` exits 1 with the key list, as `config set` does. `session show`, `switch`, `delete` and `resume --session` print `Run skaile session list to see the ids.` when an id matches no session and the project has sessions.
20
+
21
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - A failing `install`, `update` or `install --locked` writes nothing: not `skaile.lock.yaml` (the upgrade of a 5.10.0 to 5.13.0 lock included), not a deployed copy, not an instance file (p1642). `check` and `outdated` print `! lock predates instance files: run skaile update` for a lock written before it listed the instance files, and the first run that writes prints `Restored <file>` for an instance file whose bytes it changes. The omp folder of an `AGENT.md` library agent names the version the lock holds, not `1.0.0` (p2025). `migrate harness` labels each line with its scope (`project settings.json`, `user settings.json`), changes the user-level `settings.json` only with `--user`, and keeps a one-line `settings.json` on one line.
22
+
23
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - The plugin store no longer trusts `.skaile/plugins/.reconcile-hash` when `node_modules` is missing a declared package, so a clone or a copied store installs its plugins again; `skaile init` adds the hash file to `.gitignore`. `plugin install` loads the new plugin after the other declared plugins, so a target id that one of them already registers fails the install and restores `skaile.yaml`. `plugin install` prints `Added` or `Updated` only after the install worked. `resolveLanguageModel` refuses `<x>/<y>` when `<x>` is no provider, also for a registry whose entries list no models, so a typo in the provider id never sends a credential to another entry.
24
+
25
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - Every failed `capability_result` now carries `error` (equal to `message`), whichever handler answered. `serve --port 0` names the port it got in the no-token WARNING. The agent's managed gitconfig also includes `~/.config/git/config` (or `$XDG_CONFIG_HOME/git/config`), before `~/.gitconfig`, as git reads them. A git command that fails because the mount token is withheld ends its error with the cause and the fix, for example `token withheld: your global git config sets http.sslCAInfo; use GIT_SSL_CAINFO or remove the key`. A claude-sdk turn that fails on an expired login sends one fatal `error` with `category: "auth"` and no extra `text` event. A default `serve` that no client sent `session_init` to buffers the events of a turn that ran while no client was connected. The docs now say that a prompt before `session_init` is held in provisioned mode, and every version gate reads `major > N || (major === N && minor >= M)`.
26
+
27
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - `run --dry-run` now always prints the plan, then one `✗` line per problem the real run would stop on, and exits 1 when there is one. The problems are a missing harness program (`omp`, `gemini`, `qwen`, `opencode`, `goose`, `continue`) or SDK (`claude-sdk`, `codex`), a provider surface the harness cannot speak (`claude-sdk` with `--model ollama/llama3`, `gemini` or `qwen` with an entry they cannot bind), and a model the harness refuses. One preflight per harness serves `run`, `run --dry-run` and `repl`. An id no registry entry lists (`nosuch/foo`, `meta-llama/Llama-3.3-70B`) now reaches omp exactly as typed instead of as `<first entry>/<id>`; omp is asked whether it lists it. `run --help` shows that `claude-code` (deploy) is `claude-sdk` (run). The `run` docs and tutorial 03 say that a dry run exits 1 on a missing SDK or program.
28
+
29
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - `outdated` no longer says `All assets are up to date.` for a source it could not compare: a clone whose `origin` is another repository than the declared url, or a clone folder with no git checkout, is named and `outdated`, `check` and `doctor` exit 1. A clone origin that differs only by case, a trailing slash or `.git` is the same repository. `source sync` points a changed origin back at the declared url. `skaile.yaml` `sources[].publisher` and `branch:` follow the rules of `source add`, and `validate` refuses a bad one with one line. `update` re-locks only what `outdated` lists: a dependent asset whose files did not change keeps its lock entry. A kind-qualified ref of the wrong kind says `It is an agent: agent:@pub/name.`. `library init --git <empty remote>` commits its scaffold, so `library pull` and `sync` work at once; the line for uncommitted changes names `skaile library commit`. A diverged source clone names the unpublished commit and the reset command. `source sync` replaces a clone folder with no git checkout; `source add` checks out the only branch when the remote `HEAD` names a missing one. `library init --git` and `library link` refuse a remote a source already clones. A source clone's library row is derived from the clone: `library list` shows it only in a project that declares the source, and it goes with the clone.
30
+
31
+ - [#1126](https://github.com/skaile-ai/workspaces/pull/1126) [`124a7de`](https://github.com/skaile-ai/workspaces/commit/124a7dedbfc306165a7d9181e6ba47ec5302e0c9) Thanks [@mortegro](https://github.com/mortegro)! - `outdated`, `check` and `doctor` now name the locked store assets they could not check when the store does not answer (`store unreachable: skill:@admin/review#0.1.0 not checked (...)`) and exit 1, as `install` and `update` do. An air-gapped client (`catalog.cache_ttl: 0`) gets the same line as information and exits 0; `catalog.url: local` and `install --locked` stay offline-safe. `info` of a locked store skill shows the locked version and the upstream repository and commit as `source:`, with the path of the copy on a `deployed:` line. An agent whose `extends` parent is not part of its copy prints one plain line per run instead of a raw path line.
32
+
33
+ ### Patch Changes
34
+
35
+ - [#1123](https://github.com/skaile-ai/workspaces/pull/1123) [`6dffc64`](https://github.com/skaile-ai/workspaces/commit/6dffc6410196be90b9d147f1fa7b785396fee37e) Thanks [@Frozen666](https://github.com/Frozen666)! - Flow routers: a router inside an earlier router's chosen branch now skips its losing target, and when that inner router is itself skipped, all of its targets are skipped too. Before, the auto-ship-v2 graph left the unselected merge node open and the run never reached done.
36
+
3
37
  ## 6.6.0
4
38
 
5
39
  ### Minor Changes
package/dist/ai-sdk.js CHANGED
@@ -1,17 +1,15 @@
1
- import { loadMergedProviderRegistry } from './chunk-MXI3XWV6.js';
2
- import { entryModelIds } from './chunk-F4CZQD3T.js';
3
- import { buildCredentialHeaders } from './chunk-BSMW3PX2.js';
4
- import './chunk-G5SUWZEU.js';
5
- import { installCommandFor } from './chunk-6ARPZHOV.js';
1
+ import { loadMergedProviderRegistry } from './chunk-3HSLJAMJ.js';
2
+ import { buildCredentialHeaders } from './chunk-6UP2EDFN.js';
3
+ import { installCommandFor } from './chunk-TMJBEGS4.js';
6
4
  import './chunk-4GY63JU6.js';
7
- import './chunk-JIQUF3X2.js';
5
+ import './chunk-G7NMF5WQ.js';
8
6
  import './chunk-5KRMNUL4.js';
9
7
  import './chunk-C5HFK34M.js';
10
8
  import './chunk-MWXYN6NY.js';
11
- import './chunk-6SXSVKQY.js';
9
+ import './chunk-O7ADRMCR.js';
12
10
  import './chunk-L5VSIPQD.js';
13
11
  import './chunk-VTETQCR6.js';
14
- import './chunk-E2EC6SAX.js';
12
+ import './chunk-QC5BYUED.js';
15
13
  import './chunk-GNUA7XT2.js';
16
14
  import './chunk-RVRB27AN.js';
17
15
  import './chunk-V5KG6CCV.js';
@@ -36,7 +34,7 @@ async function resolveLanguageModel(selector, opts = {}) {
36
34
  `no provider for '${selector}': run \`skaile providers add openrouter --credential env:OPENROUTER_API_KEY --workspace\``
37
35
  );
38
36
  }
39
- let providerId = ref.providerId;
37
+ const providerId = ref.providerId;
40
38
  const warnings = [...ref.warnings];
41
39
  const slash = ref.modelId?.indexOf("/") ?? -1;
42
40
  const vendorHead = ref.fallback && slash > 0 ? ref.modelId?.slice(0, slash) : void 0;
@@ -44,14 +42,9 @@ async function resolveLanguageModel(selector, opts = {}) {
44
42
  const llm = registryEntries(merged).filter(
45
43
  (pair) => pair[1].kind === "llm" && isEntryEnabled(pair[1])
46
44
  );
47
- const passThrough = llm.find(([, e]) => entryModelIds(e).length === 0);
48
- if (!passThrough) {
49
- throw new Error(
50
- `'${vendorHead}' is no provider of this registry, and no provider takes '${selector}' as a model id. Providers: ${llm.map(([id]) => id).join(", ") || "none"}. Write <provider>/<model> with one of them, or use a provider that lists no models.`
51
- );
52
- }
53
- providerId = passThrough[0];
54
- warnings.push(`'${vendorHead}' is no provider; sent to '${providerId}' as a bare model id`);
45
+ throw new Error(
46
+ `'${vendorHead}' is not a provider of this registry (providers: ${llm.map(([id]) => id).join(", ") || "none"}). Write <provider>/<model> with one of them; a model id that contains a slash goes after the provider id (<provider>/${ref.modelId}).`
47
+ );
55
48
  }
56
49
  const entry = merged.providers[providerId];
57
50
  if (!entry || entry.kind !== "llm") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/ai-sdk.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAM,yBAAA,GAA4B,0BAAA;AAuClC,eAAsB,oBAAA,CACpB,QAAA,EACA,IAAA,GAAoC,EAAC,EACL;AAChC,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,0BAAA,CAA2B;AAAA,IACzD,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,OAAA,CAAQ,GAAA;AAAI,GAC5C,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,YACZ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA,CACpC,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,IAAA,GAAO,GAAG,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,OAAO,CAAA,CAAA,GAAK,CAAA,CAAE,OAAQ,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAEjF,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,KAAK,KAAK,CAAA;AACtD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oBAAoB,QAAQ,CAAA,0FAAA;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,IAAI,aAAa,GAAA,CAAI,UAAA;AACrB,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA;AAMjC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAA;AAE3C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,IAAY,KAAA,GAAQ,CAAA,GAAI,IAAI,OAAA,EAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,MAAA;AAC9E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,MAAM,CAAA,CAAE,MAAA;AAAA,MAClC,CAAC,IAAA,KACC,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,KAAA,IAAS,cAAA,CAAe,IAAA,CAAK,CAAC,CAAC;AAAA,KACpD;AACA,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA;AACrE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,IAAI,UAAU,CAAA,0DAAA,EAA6D,QAAQ,CAAA,4BAAA,EACnE,IAAI,GAAA,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,oFAAA;AAAA,OAE5D;AAAA,IACF;AACA,IAAA,UAAA,GAAa,YAAY,CAAC,CAAA;AAC1B,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,EAAI,UAAU,CAAA,2BAAA,EAA8B,UAAU,CAAA,oBAAA,CAAsB,CAAA;AAAA,EAC5F;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,qBAAA,CAAuB,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,OAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,CAAA,EAAI,QAAQ,CAAA,gBAAA,EAAmB,GAAA,CAAI,SAAS,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAK,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,MAAM,EAAE,CAAA;AAAA,KAC/F;AAAA,EACF;AACA,EAAA,MAAM,UAAU,qBAAA,CAAsB,mBAAA,CAAoB,KAAK,CAAA,EAAG,MAAM,OAAO,CAAA;AAC/E,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,iBAAA,CAAmB,CAAA;AACxE,EAAA,MAAM,aAAa,iBAAA,CAAkB,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAC7D,EAAA,IAAI,UAAA,CAAW,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,aAAa,UAAU,CAAA,GAAA,EAAM,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAErF,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,KAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,CAAW,KAAA;AAAA,IACX,IAAA,CAAK,UAAA,IAAc,OAAA,CAAQ,GAAA;AAAI,GACjC;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC;AAAA,IACnD;AAAA,GACF;AACF;AAGA,eAAe,eAAA,CACb,IAAA,EACA,GAAA,EACA,UAAA,EACA,SACA,UAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,UAAA,EAAa,UAAU,CAAA,QAAA,EAAW,GAAG,CAAA,qBAAA,EAAwB,OAAO,CAAA,wBAAA,EAC3C,iBAAA,CAAkB,GAAA,EAAK,UAAU,CAAC,CAAA,CAAA;AAAA,MAC3D,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACF;AAEA,eAAe,YACb,KAAA,EACA,UAAA,EACA,OAAA,EACA,OAAA,EACA,QACA,UAAA,EACsB;AAGtB,EAAA,MAAM,iBAAA,GAAoB,sBAAA,CAAuB,KAAA,EAAO,MAAM,CAAA;AAC9D,EAAA,MAAM,UAAU,EAAE,GAAG,KAAA,CAAM,OAAA,EAAS,GAAG,iBAAA,EAAkB;AACzD,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,aAAA,KAAkB,MAAA,GAAY,MAAA,GAAS,MAAA;AACxE,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,oBAAA;AACjC,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,oBAAA,EAAsB;AACzB,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,eAAA;AAAA,QAChC,MAAM,OAAO,mBAAmB,CAAA;AAAA,QAChC,mBAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAKA,MAAA,OAAO,eAAA,CAAgB;AAAA,QACrB,OAAA,EAAS,CAAA,EAAG,yBAAA,CAA0B,OAAO,KAAK,OAAO,CAAA,GAAA,CAAA;AAAA,QACzD,GAAI,MAAA,KAAW,MAAA,GACX,EAAE,SAAA,EAAW,MAAA,EAAO,GACpB,EAAE,MAAA,EAAQ,iBAAA,CAAkB,WAAW,CAAA,IAAK,yBAAA,EAA0B;AAAA,QAC1E;AAAA,OACD,EAAE,OAAO,CAAA;AAAA,IACZ;AAAA,IACA,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,eAAA;AAAA,QAC7B,MAAM,OAAO,gBAAgB,CAAA;AAAA,QAC7B,gBAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,OAAO,aAAa,EAAE,OAAA,EAAS,QAAQ,MAAA,IAAU,yBAAA,EAA2B,SAAS,CAAA;AAAA,QACnF;AAAA,OACF;AAAA,IACF;AAAA,IACA,KAAK,oBAAA,EAAsB;AACzB,MAAA,MAAM,EAAE,sBAAA,EAAuB,GAAI,MAAM,eAAA;AAAA,QACvC,MAAM,OAAO,2BAA2B,CAAA;AAAA,QACxC,2BAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,sBAAA,CAAuB;AAAA,QAC5B,IAAA,EAAM,UAAA;AAAA,QACN,OAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR;AAAA,OACD,CAAA,CAAE,SAAA,CAAU,OAAO,CAAA;AAAA,IACtB;AAAA,IACA;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,UAAA,EAAa,UAAU,CAAA,YAAA,EAAe,OAAO,CAAA,sFAAA;AAAA,OAC/C;AAAA;AAEN","file":"ai-sdk.js","sourcesContent":["/**\n * `@skaile/workspaces/ai-sdk` — a provider-registry selector as a Vercel AI SDK\n * `LanguageModel`.\n *\n * Any AI-SDK host (a Nuxt route, a script) names a model the way the CLI does —\n * `<providerId>/<modelId>` or a bare model id — and gets a model object wired\n * to the merged `providers.yml` registry: endpoint, headers and credential\n * (`env:` refs read at call time). The provider SDKs (`@ai-sdk/anthropic`,\n * `@ai-sdk/openai`, `@ai-sdk/openai-compatible`) are optional peers, loaded\n * only for the surface the selected entry speaks.\n */\n\nimport {\n type AIProviderLlmEntry,\n installCommandFor,\n isEntryEnabled,\n normalizeAnthropicBaseUrl,\n normalizeEntryBaseUrl,\n parseModelRef,\n registryEntries,\n resolveCredential,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core\";\nimport type { LanguageModel } from \"ai\";\nimport { buildCredentialHeaders } from \"./provider-catalog.js\";\nimport { entryModelIds } from \"./provider-materialize/env-harnesses.js\";\nimport { loadMergedProviderRegistry } from \"./provider-registry-load.js\";\n\n/**\n * Passed as the SDK `apiKey` where the entry carries no key, so the SDK never\n * falls back to an ambient `OPENAI_API_KEY` / `ANTHROPIC_API_KEY`.\n */\nconst NO_CREDENTIAL_PLACEHOLDER = \"no-credential-configured\";\n\n/** A model object (never the bare-string gateway selector `LanguageModel` also admits). */\ntype ModelObject = Exclude<LanguageModel, string>;\n\n/** The result of {@link resolveLanguageModel}. */\nexport interface ResolvedLanguageModel {\n /** The AI SDK model, ready for `streamText` / `generateText` / `wrapLanguageModel`. */\n model: ModelObject;\n /** Registry entry the selector routed to. */\n providerId: string;\n /** Provider-side model id the request carries (`model_map` applied). */\n modelId: string;\n /** Endpoint the model talks to; for `anthropic-messages` the host root without `/v1`. */\n baseUrl: string;\n /** The role name, when the selector was `@role`. */\n role?: string;\n /** Non-fatal notes from resolving the selector (a dangling role, …). */\n warnings: string[];\n}\n\nexport interface ResolveLanguageModelOptions {\n /** Project whose `.skaile/providers.yml` is the workspace layer. Default: `process.cwd()`. */\n projectDir?: string;\n /** Where `env:` credential references are read from. Default: `process.env`. */\n env?: Record<string, string | undefined>;\n /**\n * Role → model-ref map `@role` selectors resolve against (the session\n * config's `roles`). Without it every `@role` selector fails.\n */\n roles?: Record<string, string>;\n}\n\n/**\n * The AI SDK model for `selector`, or an error naming the fix. Throws when the\n * registry has errors, no entry matches, the credential is unresolved, the\n * entry's surface has no AI SDK factory, or the provider SDK it needs is not\n * installed.\n */\nexport async function resolveLanguageModel(\n selector: string,\n opts: ResolveLanguageModelOptions = {},\n): Promise<ResolvedLanguageModel> {\n const { merged, diagnostics } = loadMergedProviderRegistry({\n projectDir: opts.projectDir ?? process.cwd(),\n });\n const errors = diagnostics\n .filter((d) => d.severity === \"error\")\n .map((d) => (d.path ? `${d.path}: ${d.message}` : d.message));\n if (errors.length > 0) throw new Error(`providers registry: ${errors.join(\"; \")}`);\n\n const ref = parseModelRef(selector, merged, opts.roles);\n if (!ref) {\n throw new Error(\n `no provider for '${selector}': run \\`skaile providers add openrouter --credential env:OPENROUTER_API_KEY --workspace\\``,\n );\n }\n let providerId = ref.providerId;\n const warnings = [...ref.warnings];\n // `<x>/<y>` where `<x>` is no entry and no entry lists the model: `parseModelRef` took the first\n // entry only because something has to carry the id. That sends the credential to an entry the\n // caller never named (a typo'd provider id), so only an entry that declares no models, which\n // takes any `<provider>/<model>` as is (as the model endpoint does), may carry it, and the\n // result says so.\n const slash = ref.modelId?.indexOf(\"/\") ?? -1;\n // A bare id (no `/`) goes to the first entry as before; only `<x>/<y>` names a vendor head.\n const vendorHead = ref.fallback && slash > 0 ? ref.modelId?.slice(0, slash) : undefined;\n if (vendorHead) {\n const llm = registryEntries(merged).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n pair[1].kind === \"llm\" && isEntryEnabled(pair[1]),\n );\n const passThrough = llm.find(([, e]) => entryModelIds(e).length === 0);\n if (!passThrough) {\n throw new Error(\n `'${vendorHead}' is no provider of this registry, and no provider takes '${selector}' as a model id. ` +\n `Providers: ${llm.map(([id]) => id).join(\", \") || \"none\"}. ` +\n \"Write <provider>/<model> with one of them, or use a provider that lists no models.\",\n );\n }\n providerId = passThrough[0];\n warnings.push(`'${vendorHead}' is no provider; sent to '${providerId}' as a bare model id`);\n }\n const entry = merged.providers[providerId];\n if (!entry || entry.kind !== \"llm\") {\n throw new Error(`provider '${providerId}' is not an llm entry`);\n }\n const modelId = ref.providerModelId ?? ref.modelId;\n if (!modelId) {\n throw new Error(\n `'${selector}' names no model${ref.warnings.length > 0 ? ` (${ref.warnings.join(\"; \")})` : \"\"}`,\n );\n }\n const baseUrl = normalizeEntryBaseUrl(resolveEntryBaseUrl(entry), entry.surface);\n if (!baseUrl) throw new Error(`provider '${providerId}' has no base_url`);\n const credential = resolveCredential(entry, { env: opts.env });\n if (credential.error) throw new Error(`provider '${providerId}': ${credential.error}`);\n\n const model = await createModel(\n entry,\n providerId,\n modelId,\n baseUrl,\n credential.value,\n opts.projectDir ?? process.cwd(),\n );\n return {\n model,\n providerId,\n modelId,\n baseUrl,\n ...(ref.role !== undefined ? { role: ref.role } : {}),\n warnings,\n };\n}\n\n/** `import(pkg)` with a missing-package error that names the package and the surface. */\nasync function loadProviderSdk<T>(\n load: () => Promise<T>,\n pkg: string,\n providerId: string,\n surface: string,\n projectDir: string,\n): Promise<T> {\n try {\n return await load();\n } catch (cause) {\n throw new Error(\n `provider '${providerId}' needs ${pkg} installed (surface '${surface}'). ` +\n `Run in the project: ${installCommandFor(pkg, projectDir)}`,\n { cause },\n );\n }\n}\n\nasync function createModel(\n entry: AIProviderLlmEntry,\n providerId: string,\n modelId: string,\n baseURL: string,\n secret: string | undefined,\n projectDir: string,\n): Promise<ModelObject> {\n // Same merge as model discovery (`models.ts`): static headers, then the\n // credential carrier the preset / credential kind names.\n const credentialHeaders = buildCredentialHeaders(entry, secret);\n const headers = { ...entry.headers, ...credentialHeaders };\n const bearer = credentialHeaders.Authorization !== undefined ? secret : undefined;\n const surface = entry.surface ?? \"openai-completions\";\n switch (surface) {\n case \"anthropic-messages\": {\n const { createAnthropic } = await loadProviderSdk(\n () => import(\"@ai-sdk/anthropic\"),\n \"@ai-sdk/anthropic\",\n providerId,\n surface,\n projectDir,\n );\n // `@ai-sdk/anthropic` wants the versioned base; the registry stores the host root.\n // Bearer credentials go through `authToken` (the SDK's only `Authorization` path);\n // everything else through `apiKey`, with a placeholder when the entry carries none so\n // the SDK never reads `ANTHROPIC_API_KEY` from the process environment.\n return createAnthropic({\n baseURL: `${normalizeAnthropicBaseUrl(baseURL) ?? baseURL}/v1`,\n ...(bearer !== undefined\n ? { authToken: bearer }\n : { apiKey: credentialHeaders[\"x-api-key\"] ?? NO_CREDENTIAL_PLACEHOLDER }),\n headers,\n })(modelId);\n }\n case \"openai-responses\": {\n const { createOpenAI } = await loadProviderSdk(\n () => import(\"@ai-sdk/openai\"),\n \"@ai-sdk/openai\",\n providerId,\n surface,\n projectDir,\n );\n // A placeholder `apiKey` keeps the SDK off `OPENAI_API_KEY`; the real credential\n // header (when any) is in `headers`, which the SDK applies last.\n return createOpenAI({ baseURL, apiKey: bearer ?? NO_CREDENTIAL_PLACEHOLDER, headers })(\n modelId,\n );\n }\n case \"openai-completions\": {\n const { createOpenAICompatible } = await loadProviderSdk(\n () => import(\"@ai-sdk/openai-compatible\"),\n \"@ai-sdk/openai-compatible\",\n providerId,\n surface,\n projectDir,\n );\n // No env fallback in this SDK: an absent `apiKey` sends no `Authorization` header.\n return createOpenAICompatible({\n name: providerId,\n baseURL,\n apiKey: bearer,\n headers,\n }).chatModel(modelId);\n }\n default:\n throw new Error(\n `provider '${providerId}': surface '${surface}' has no AI SDK factory yet (openai-completions, openai-responses, anthropic-messages)`,\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/ai-sdk.ts"],"names":[],"mappings":"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","file":"ai-sdk.js","sourcesContent":["/**\n * `@skaile/workspaces/ai-sdk` — a provider-registry selector as a Vercel AI SDK\n * `LanguageModel`.\n *\n * Any AI-SDK host (a Nuxt route, a script) names a model the way the CLI does —\n * `<providerId>/<modelId>` or a bare model id — and gets a model object wired\n * to the merged `providers.yml` registry: endpoint, headers and credential\n * (`env:` refs read at call time). The provider SDKs (`@ai-sdk/anthropic`,\n * `@ai-sdk/openai`, `@ai-sdk/openai-compatible`) are optional peers, loaded\n * only for the surface the selected entry speaks.\n */\n\nimport {\n type AIProviderLlmEntry,\n installCommandFor,\n isEntryEnabled,\n normalizeAnthropicBaseUrl,\n normalizeEntryBaseUrl,\n parseModelRef,\n registryEntries,\n resolveCredential,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core\";\nimport type { LanguageModel } from \"ai\";\nimport { buildCredentialHeaders } from \"./provider-catalog.js\";\nimport { loadMergedProviderRegistry } from \"./provider-registry-load.js\";\n\n/**\n * Passed as the SDK `apiKey` where the entry carries no key, so the SDK never\n * falls back to an ambient `OPENAI_API_KEY` / `ANTHROPIC_API_KEY`.\n */\nconst NO_CREDENTIAL_PLACEHOLDER = \"no-credential-configured\";\n\n/** A model object (never the bare-string gateway selector `LanguageModel` also admits). */\ntype ModelObject = Exclude<LanguageModel, string>;\n\n/** The result of {@link resolveLanguageModel}. */\nexport interface ResolvedLanguageModel {\n /** The AI SDK model, ready for `streamText` / `generateText` / `wrapLanguageModel`. */\n model: ModelObject;\n /** Registry entry the selector routed to. */\n providerId: string;\n /** Provider-side model id the request carries (`model_map` applied). */\n modelId: string;\n /** Endpoint the model talks to; for `anthropic-messages` the host root without `/v1`. */\n baseUrl: string;\n /** The role name, when the selector was `@role`. */\n role?: string;\n /** Non-fatal notes from resolving the selector (a dangling role, …). */\n warnings: string[];\n}\n\nexport interface ResolveLanguageModelOptions {\n /** Project whose `.skaile/providers.yml` is the workspace layer. Default: `process.cwd()`. */\n projectDir?: string;\n /** Where `env:` credential references are read from. Default: `process.env`. */\n env?: Record<string, string | undefined>;\n /**\n * Role → model-ref map `@role` selectors resolve against (the session\n * config's `roles`). Without it every `@role` selector fails.\n */\n roles?: Record<string, string>;\n}\n\n/**\n * The AI SDK model for `selector`, or an error naming the fix. Throws when the\n * registry has errors, no entry matches, the credential is unresolved, the\n * entry's surface has no AI SDK factory, or the provider SDK it needs is not\n * installed.\n */\nexport async function resolveLanguageModel(\n selector: string,\n opts: ResolveLanguageModelOptions = {},\n): Promise<ResolvedLanguageModel> {\n const { merged, diagnostics } = loadMergedProviderRegistry({\n projectDir: opts.projectDir ?? process.cwd(),\n });\n const errors = diagnostics\n .filter((d) => d.severity === \"error\")\n .map((d) => (d.path ? `${d.path}: ${d.message}` : d.message));\n if (errors.length > 0) throw new Error(`providers registry: ${errors.join(\"; \")}`);\n\n const ref = parseModelRef(selector, merged, opts.roles);\n if (!ref) {\n throw new Error(\n `no provider for '${selector}': run \\`skaile providers add openrouter --credential env:OPENROUTER_API_KEY --workspace\\``,\n );\n }\n const providerId = ref.providerId;\n const warnings = [...ref.warnings];\n // `<x>/<y>` where `<x>` is no entry and no entry maps the whole string: `parseModelRef` took the\n // first entry only because something has to carry the id. That would send the credential to an\n // entry the caller never named (a typo'd provider id), so it is refused for every registry, as\n // the model endpoint of `serve` does (404). A model of an open entry is named\n // `<entry>/<id>` (`openrouter/meta-llama/x`). A bare id (no `/`) goes to the first entry.\n const slash = ref.modelId?.indexOf(\"/\") ?? -1;\n const vendorHead = ref.fallback && slash > 0 ? ref.modelId?.slice(0, slash) : undefined;\n if (vendorHead) {\n const llm = registryEntries(merged).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n pair[1].kind === \"llm\" && isEntryEnabled(pair[1]),\n );\n throw new Error(\n `'${vendorHead}' is not a provider of this registry (providers: ${llm.map(([id]) => id).join(\", \") || \"none\"}). ` +\n `Write <provider>/<model> with one of them; a model id that contains a slash goes after the provider id (<provider>/${ref.modelId}).`,\n );\n }\n const entry = merged.providers[providerId];\n if (!entry || entry.kind !== \"llm\") {\n throw new Error(`provider '${providerId}' is not an llm entry`);\n }\n const modelId = ref.providerModelId ?? ref.modelId;\n if (!modelId) {\n throw new Error(\n `'${selector}' names no model${ref.warnings.length > 0 ? ` (${ref.warnings.join(\"; \")})` : \"\"}`,\n );\n }\n const baseUrl = normalizeEntryBaseUrl(resolveEntryBaseUrl(entry), entry.surface);\n if (!baseUrl) throw new Error(`provider '${providerId}' has no base_url`);\n const credential = resolveCredential(entry, { env: opts.env });\n if (credential.error) throw new Error(`provider '${providerId}': ${credential.error}`);\n\n const model = await createModel(\n entry,\n providerId,\n modelId,\n baseUrl,\n credential.value,\n opts.projectDir ?? process.cwd(),\n );\n return {\n model,\n providerId,\n modelId,\n baseUrl,\n ...(ref.role !== undefined ? { role: ref.role } : {}),\n warnings,\n };\n}\n\n/** `import(pkg)` with a missing-package error that names the package and the surface. */\nasync function loadProviderSdk<T>(\n load: () => Promise<T>,\n pkg: string,\n providerId: string,\n surface: string,\n projectDir: string,\n): Promise<T> {\n try {\n return await load();\n } catch (cause) {\n throw new Error(\n `provider '${providerId}' needs ${pkg} installed (surface '${surface}'). ` +\n `Run in the project: ${installCommandFor(pkg, projectDir)}`,\n { cause },\n );\n }\n}\n\nasync function createModel(\n entry: AIProviderLlmEntry,\n providerId: string,\n modelId: string,\n baseURL: string,\n secret: string | undefined,\n projectDir: string,\n): Promise<ModelObject> {\n // Same merge as model discovery (`models.ts`): static headers, then the\n // credential carrier the preset / credential kind names.\n const credentialHeaders = buildCredentialHeaders(entry, secret);\n const headers = { ...entry.headers, ...credentialHeaders };\n const bearer = credentialHeaders.Authorization !== undefined ? secret : undefined;\n const surface = entry.surface ?? \"openai-completions\";\n switch (surface) {\n case \"anthropic-messages\": {\n const { createAnthropic } = await loadProviderSdk(\n () => import(\"@ai-sdk/anthropic\"),\n \"@ai-sdk/anthropic\",\n providerId,\n surface,\n projectDir,\n );\n // `@ai-sdk/anthropic` wants the versioned base; the registry stores the host root.\n // Bearer credentials go through `authToken` (the SDK's only `Authorization` path);\n // everything else through `apiKey`, with a placeholder when the entry carries none so\n // the SDK never reads `ANTHROPIC_API_KEY` from the process environment.\n return createAnthropic({\n baseURL: `${normalizeAnthropicBaseUrl(baseURL) ?? baseURL}/v1`,\n ...(bearer !== undefined\n ? { authToken: bearer }\n : { apiKey: credentialHeaders[\"x-api-key\"] ?? NO_CREDENTIAL_PLACEHOLDER }),\n headers,\n })(modelId);\n }\n case \"openai-responses\": {\n const { createOpenAI } = await loadProviderSdk(\n () => import(\"@ai-sdk/openai\"),\n \"@ai-sdk/openai\",\n providerId,\n surface,\n projectDir,\n );\n // A placeholder `apiKey` keeps the SDK off `OPENAI_API_KEY`; the real credential\n // header (when any) is in `headers`, which the SDK applies last.\n return createOpenAI({ baseURL, apiKey: bearer ?? NO_CREDENTIAL_PLACEHOLDER, headers })(\n modelId,\n );\n }\n case \"openai-completions\": {\n const { createOpenAICompatible } = await loadProviderSdk(\n () => import(\"@ai-sdk/openai-compatible\"),\n \"@ai-sdk/openai-compatible\",\n providerId,\n surface,\n projectDir,\n );\n // No env fallback in this SDK: an absent `apiKey` sends no `Authorization` header.\n return createOpenAICompatible({\n name: providerId,\n baseURL,\n apiKey: bearer,\n headers,\n }).chatModel(modelId);\n }\n default:\n throw new Error(\n `provider '${providerId}': surface '${surface}' has no AI SDK factory yet (openai-completions, openai-responses, anthropic-messages)`,\n );\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { PROTOCOL_VERSION_STRING } from '../chunk-G5SYFFMD.js';
1
+ import { PROTOCOL_VERSION_STRING } from '../chunk-7NN3P6VF.js';
2
2
  import '../chunk-NSBPE2FW.js';
3
3
  import * as z from 'zod';
4
4
 
@@ -1,33 +1,33 @@
1
- import { storeNotInstallableReason } from './chunk-6RHWTZPT.js';
2
- import { getKnownKinds } from './chunk-RAU5QPI6.js';
3
- import './chunk-5XHQBCB5.js';
1
+ import { storeNotInstallableReason } from './chunk-YZD7DUEF.js';
2
+ import { getKnownKinds } from './chunk-QCR5AE5E.js';
3
+ import './chunk-WFK4MUBL.js';
4
4
  import './chunk-7RGTAEG6.js';
5
- import './chunk-JRVQV7WC.js';
6
- import './chunk-MMOWIRHP.js';
7
- import './chunk-J4WKNJHO.js';
8
- import './chunk-VJRL6ZK6.js';
5
+ import './chunk-757G6TTZ.js';
6
+ import './chunk-G44FFUMA.js';
7
+ import './chunk-O5Y7VMVQ.js';
8
+ import './chunk-OSABUEWA.js';
9
9
  import './chunk-F3D25RGM.js';
10
10
  import './chunk-3TXEJN4W.js';
11
11
  import './chunk-ISHJITXJ.js';
12
12
  import './chunk-LNFKL23K.js';
13
13
  import './chunk-JRN5QF4C.js';
14
14
  import './chunk-NUELZWCF.js';
15
- import './chunk-DI6J2PJB.js';
15
+ import './chunk-KO3VSZQP.js';
16
16
  import './chunk-PKE3PXOK.js';
17
17
  import './chunk-KTBKW2FI.js';
18
18
  import './chunk-UQ6LFBPZ.js';
19
- import './chunk-DS6UUCFG.js';
19
+ import './chunk-4CD2R4MJ.js';
20
20
  import './chunk-VT6G5AJV.js';
21
- import './chunk-6ARPZHOV.js';
21
+ import './chunk-TMJBEGS4.js';
22
22
  import './chunk-4GY63JU6.js';
23
- import { factoryAssetRoots } from './chunk-JIQUF3X2.js';
23
+ import { factoryAssetRoots } from './chunk-G7NMF5WQ.js';
24
24
  import './chunk-5KRMNUL4.js';
25
25
  import './chunk-C5HFK34M.js';
26
26
  import './chunk-MWXYN6NY.js';
27
- import { scanRepo } from './chunk-6SXSVKQY.js';
27
+ import { scanRepo } from './chunk-O7ADRMCR.js';
28
28
  import './chunk-L5VSIPQD.js';
29
29
  import './chunk-VTETQCR6.js';
30
- import './chunk-E2EC6SAX.js';
30
+ import './chunk-QC5BYUED.js';
31
31
  import { parseRequires } from './chunk-GNUA7XT2.js';
32
32
  import './chunk-RVRB27AN.js';
33
33
  import './chunk-V5KG6CCV.js';
@@ -60,8 +60,8 @@ function libraryEntryOf(asset) {
60
60
  async function libraryAssets() {
61
61
  const notes = [];
62
62
  try {
63
- const { openLibraryManager } = await import('./open-library-OJ4HT2X4.js');
64
- const { getKindRegistry } = await import('./open-registry-LWGIOJDK.js');
63
+ const { openLibraryManager } = await import('./open-library-F56D46K7.js');
64
+ const { getKindRegistry } = await import('./open-registry-RZW2AFD6.js');
65
65
  const { scanAuthoringLibraries } = await import('./library/index.js');
66
66
  const { library: index, close } = await openLibraryManager();
67
67
  try {
@@ -94,7 +94,7 @@ async function libraryAssets() {
94
94
  async function storeAssets(projectDir) {
95
95
  const notes = [];
96
96
  try {
97
- const { resolveCatalogSource } = await import('./open-library-OJ4HT2X4.js');
97
+ const { resolveCatalogSource } = await import('./open-library-F56D46K7.js');
98
98
  const { source, close } = await resolveCatalogSource({ projectDir });
99
99
  try {
100
100
  const assets = (await source.listAssets()).filter(
@@ -175,5 +175,5 @@ async function gatherAssetFeeds(am, projectDir) {
175
175
  }
176
176
 
177
177
  export { gatherAssetFeeds };
178
- //# sourceMappingURL=asset-feeds-WQ6YQPHV.js.map
179
- //# sourceMappingURL=asset-feeds-WQ6YQPHV.js.map
178
+ //# sourceMappingURL=asset-feeds-NU5UOO5F.js.map
179
+ //# sourceMappingURL=asset-feeds-NU5UOO5F.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-WQ6YQPHV.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Four feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex`, read through\n * `scanAuthoringLibraries` (`@skaile/workspaces/library`): the same scan\n * `library index` / `search --local` use, so publishers and refs match them\n * (per-asset `publisher_overrides` honoured), `dev_paths` assets are left out,\n * and a library that fails to scan becomes one note while the rest stay listed.\n * - **Factory assets** — the bundled first-party `factory-assets` tree\n * (`factoryAssetRoots()`), scanned from disk. Always present; no network.\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n parseRequires,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\nimport { storeNotInstallableReason } from \"./store-addable.ts\";\nimport type { DiscoveredAsset } from \"@skaile/workspaces/discovery\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\" | \"factory\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"factory\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n /**\n * Second-level grouping label for the manage tree. Defaults (when unset) to the\n * entry's `publisher`; the source feed sets it to the source's short repo name\n * so the Sources band groups by source — \"which repo did this come from\" — not\n * by the asset-intrinsic publisher.\n */\n group?: string;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Map one discovered library asset to the `CatalogEntry` the manage rows read.\n * `publisher` is the bare per-asset publisher (what `search --local` prints),\n * `source` the manifest path. `repo` is left unset: it only feeds the Sources-tree\n * org grouping. `requires` / `dependencies` come from the manifest the way the\n * scanner fills them — string `requires:` refs parsed to `{kind, name}`, a bundle's\n * string `dependencies:` list verbatim.\n */\nfunction libraryEntryOf(asset: DiscoveredAsset): CatalogEntry {\n const { manifest } = asset;\n const nested = (manifest.metadata as Record<string, unknown> | undefined)?.requires;\n const rawRequires = manifest.requires ?? nested;\n const requireRefs =\n typeof rawRequires === \"string\"\n ? rawRequires\n : Array.isArray(rawRequires)\n ? rawRequires.filter((r): r is string => typeof r === \"string\")\n : undefined;\n const deps = manifest.dependencies;\n return {\n name: asset.name,\n kind: asset.kind as AssetKind,\n description: typeof manifest.description === \"string\" ? manifest.description : \"\",\n source: asset.manifestPath,\n publisher: asset.publisher,\n ...(asset.plugin ? { plugin: asset.plugin } : {}),\n version: asset.version,\n requires: requireRefs === undefined ? [] : parseRequires({ requires: requireRefs }),\n dependencies:\n asset.kind === \"bundle\" && Array.isArray(deps)\n ? deps.filter((d): d is string => typeof d === \"string\" && d.length > 0)\n : [],\n };\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache) through\n * `scanAuthoringLibraries`, grouped under the bare library name\n * (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * comes from `DiscoveredAsset.plugin`. A library whose scan fails becomes one\n * `FeedNote`; the outer `catch` covers only opening the index.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n // Lazy: the library subpath pulls in SQLite, which the other feeds never need.\n const { openLibraryManager } = await import(\"./open-library.ts\");\n const { getKindRegistry } = await import(\"./open-registry.ts\");\n const { scanAuthoringLibraries } = await import(\"@skaile/workspaces/library\");\n const { library: index, close } = await openLibraryManager();\n try {\n const entries: OriginEntry[] = [];\n for (const scan of await scanAuthoringLibraries(index, getKindRegistry())) {\n if (scan.error !== undefined) {\n notes.push({ feed: \"libraries\", message: `${scan.library.name}: ${scan.error}` });\n continue;\n }\n for (const asset of scan.assets) {\n entries.push({\n origin: \"library\",\n entry: libraryEntryOf(asset),\n group: scan.library.name,\n });\n }\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n // The store lists only what `skaile add` can install (see store-addable.ts).\n const assets = (await source.listAssets()).filter(\n (a) => storeNotInstallableReason(a) === undefined,\n );\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n plugin: a.plugin,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/** The slice of `AssetManager` the source feed needs (kept narrow for tests). */\ninterface AssetManagerLike {\n search: () => Promise<CatalogEntry[]>;\n searchRepoRoots: () => { repoName: string; root: string }[];\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Plugin grouping\n * (`entry.plugin`) is stamped by the scanner, so entries pass through as-is.\n */\nasync function sourceAssets(am: AssetManagerLike): Promise<OriginEntry[]> {\n // The bundled factory tree is injected into the repositories map as an implicit\n // source, so `am.search()` returns it too. It has its own `factory` origin band,\n // so drop it here — otherwise the same first-party skills list twice under Sources.\n const factoryPrefixes = factoryAssetRoots().map((r) => (r.endsWith(path.sep) ? r : r + path.sep));\n const isFactoryPath = (p: string) =>\n factoryPrefixes.some((fp) => p === fp.slice(0, -1) || p.startsWith(fp));\n\n const all = (await am.search()).filter((e) => !isFactoryPath(e.source));\n const entries: OriginEntry[] = [];\n // Group each source's entries under the source node (its short repo name), not\n // the publisher: under Sources the navigational question is \"which repo did\n // this come from\". Each entry's `source` (absolute manifest path) lives under\n // exactly one declared root, so group by prefix. The cache slug is\n // URL-keyed `github.com/<org>/<repo>` — take the trailing segment.\n for (const { repoName, root } of am.searchRepoRoots()) {\n if (isFactoryPath(root)) continue;\n const prefix = root.endsWith(path.sep) ? root : root + path.sep;\n const owned = all.filter((e) => e.source === root || e.source.startsWith(prefix));\n if (owned.length === 0) continue;\n const sourceName = repoName.split(\"/\").pop() || repoName;\n for (const entry of owned) entries.push({ origin: \"source\", entry, group: sourceName });\n }\n return entries;\n}\n\n/**\n * Factory-asset feed: scan the bundled first-party `factory-assets` tree(s)\n * resolved by `factoryAssetRoots()` (the `SKAILE_FACTORY_ASSETS_DIR` override\n * layer ahead of the bundled tree). Local disk only, no network — the entries are\n * the built-in skills / connectors / bundles that ship with `@skaile/workspaces`.\n * `factoryAssetRoots()` already dedupes, so the env override pointing at the\n * bundled dir collapses to one root.\n */\nasync function factoryAssets(): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const entries: CatalogEntry[] = [];\n for (const root of factoryAssetRoots()) {\n entries.push(...(await scanRepo(root, \"skaile-factory\", { knownKinds: getKnownKinds() })));\n }\n return { entries, notes };\n } catch (err) {\n notes.push({\n feed: \"factory\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk. The factory\n * scan is local disk only, so it runs inline.\n */\nexport async function gatherAssetFeeds(\n am: AssetManagerLike,\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n const factory = await factoryAssets();\n const src = await sourceAssets(am);\n return {\n entries: [\n ...src,\n ...libs.entries,\n ...tag(\"factory\", factory.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes, ...factory.notes],\n };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-NU5UOO5F.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Four feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex`, read through\n * `scanAuthoringLibraries` (`@skaile/workspaces/library`): the same scan\n * `library index` / `search --local` use, so publishers and refs match them\n * (per-asset `publisher_overrides` honoured), `dev_paths` assets are left out,\n * and a library that fails to scan becomes one note while the rest stay listed.\n * - **Factory assets** — the bundled first-party `factory-assets` tree\n * (`factoryAssetRoots()`), scanned from disk. Always present; no network.\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport * as path from \"node:path\";\nimport {\n type AssetKind,\n type CatalogEntry,\n factoryAssetRoots,\n parseRequires,\n scanRepo,\n} from \"@skaile/workspaces/core\";\nimport { getKnownKinds } from \"./open-registry.ts\";\nimport { storeNotInstallableReason } from \"./store-addable.ts\";\nimport type { DiscoveredAsset } from \"@skaile/workspaces/discovery\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\" | \"factory\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"factory\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n /**\n * Second-level grouping label for the manage tree. Defaults (when unset) to the\n * entry's `publisher`; the source feed sets it to the source's short repo name\n * so the Sources band groups by source — \"which repo did this come from\" — not\n * by the asset-intrinsic publisher.\n */\n group?: string;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Map one discovered library asset to the `CatalogEntry` the manage rows read.\n * `publisher` is the bare per-asset publisher (what `search --local` prints),\n * `source` the manifest path. `repo` is left unset: it only feeds the Sources-tree\n * org grouping. `requires` / `dependencies` come from the manifest the way the\n * scanner fills them — string `requires:` refs parsed to `{kind, name}`, a bundle's\n * string `dependencies:` list verbatim.\n */\nfunction libraryEntryOf(asset: DiscoveredAsset): CatalogEntry {\n const { manifest } = asset;\n const nested = (manifest.metadata as Record<string, unknown> | undefined)?.requires;\n const rawRequires = manifest.requires ?? nested;\n const requireRefs =\n typeof rawRequires === \"string\"\n ? rawRequires\n : Array.isArray(rawRequires)\n ? rawRequires.filter((r): r is string => typeof r === \"string\")\n : undefined;\n const deps = manifest.dependencies;\n return {\n name: asset.name,\n kind: asset.kind as AssetKind,\n description: typeof manifest.description === \"string\" ? manifest.description : \"\",\n source: asset.manifestPath,\n publisher: asset.publisher,\n ...(asset.plugin ? { plugin: asset.plugin } : {}),\n version: asset.version,\n requires: requireRefs === undefined ? [] : parseRequires({ requires: requireRefs }),\n dependencies:\n asset.kind === \"bundle\" && Array.isArray(deps)\n ? deps.filter((d): d is string => typeof d === \"string\" && d.length > 0)\n : [],\n };\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/cache/sources/` cache) through\n * `scanAuthoringLibraries`, grouped under the bare library name\n * (`group: <name>`) so the manage TUI shows a clean `<name>` band — no\n * `library:` prefix (mirrors the source feed). Plugin grouping (`entry.plugin`)\n * comes from `DiscoveredAsset.plugin`. A library whose scan fails becomes one\n * `FeedNote`; the outer `catch` covers only opening the index.\n */\nasync function libraryAssets(): Promise<{\n entries: OriginEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n // Lazy: the library subpath pulls in SQLite, which the other feeds never need.\n const { openLibraryManager } = await import(\"./open-library.ts\");\n const { getKindRegistry } = await import(\"./open-registry.ts\");\n const { scanAuthoringLibraries } = await import(\"@skaile/workspaces/library\");\n const { library: index, close } = await openLibraryManager();\n try {\n const entries: OriginEntry[] = [];\n for (const scan of await scanAuthoringLibraries(index, getKindRegistry())) {\n if (scan.error !== undefined) {\n notes.push({ feed: \"libraries\", message: `${scan.library.name}: ${scan.error}` });\n continue;\n }\n for (const asset of scan.assets) {\n entries.push({\n origin: \"library\",\n entry: libraryEntryOf(asset),\n group: scan.library.name,\n });\n }\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n // The store lists only what `skaile add` can install (see store-addable.ts).\n const assets = (await source.listAssets()).filter(\n (a) => storeNotInstallableReason(a) === undefined,\n );\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n plugin: a.plugin,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/** The slice of `AssetManager` the source feed needs (kept narrow for tests). */\ninterface AssetManagerLike {\n search: () => Promise<CatalogEntry[]>;\n searchRepoRoots: () => { repoName: string; root: string }[];\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Plugin grouping\n * (`entry.plugin`) is stamped by the scanner, so entries pass through as-is.\n */\nasync function sourceAssets(am: AssetManagerLike): Promise<OriginEntry[]> {\n // The bundled factory tree is injected into the repositories map as an implicit\n // source, so `am.search()` returns it too. It has its own `factory` origin band,\n // so drop it here — otherwise the same first-party skills list twice under Sources.\n const factoryPrefixes = factoryAssetRoots().map((r) => (r.endsWith(path.sep) ? r : r + path.sep));\n const isFactoryPath = (p: string) =>\n factoryPrefixes.some((fp) => p === fp.slice(0, -1) || p.startsWith(fp));\n\n const all = (await am.search()).filter((e) => !isFactoryPath(e.source));\n const entries: OriginEntry[] = [];\n // Group each source's entries under the source node (its short repo name), not\n // the publisher: under Sources the navigational question is \"which repo did\n // this come from\". Each entry's `source` (absolute manifest path) lives under\n // exactly one declared root, so group by prefix. The cache slug is\n // URL-keyed `github.com/<org>/<repo>` — take the trailing segment.\n for (const { repoName, root } of am.searchRepoRoots()) {\n if (isFactoryPath(root)) continue;\n const prefix = root.endsWith(path.sep) ? root : root + path.sep;\n const owned = all.filter((e) => e.source === root || e.source.startsWith(prefix));\n if (owned.length === 0) continue;\n const sourceName = repoName.split(\"/\").pop() || repoName;\n for (const entry of owned) entries.push({ origin: \"source\", entry, group: sourceName });\n }\n return entries;\n}\n\n/**\n * Factory-asset feed: scan the bundled first-party `factory-assets` tree(s)\n * resolved by `factoryAssetRoots()` (the `SKAILE_FACTORY_ASSETS_DIR` override\n * layer ahead of the bundled tree). Local disk only, no network — the entries are\n * the built-in skills / connectors / bundles that ship with `@skaile/workspaces`.\n * `factoryAssetRoots()` already dedupes, so the env override pointing at the\n * bundled dir collapses to one root.\n */\nasync function factoryAssets(): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const entries: CatalogEntry[] = [];\n for (const root of factoryAssetRoots()) {\n entries.push(...(await scanRepo(root, \"skaile-factory\", { knownKinds: getKnownKinds() })));\n }\n return { entries, notes };\n } catch (err) {\n notes.push({\n feed: \"factory\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk. The factory\n * scan is local disk only, so it runs inline.\n */\nexport async function gatherAssetFeeds(\n am: AssetManagerLike,\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n const factory = await factoryAssets();\n const src = await sourceAssets(am);\n return {\n entries: [\n ...src,\n ...libs.entries,\n ...tag(\"factory\", factory.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes, ...factory.notes],\n };\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  export { WORKSPACE_MOUNT_ENV_VAR, deployAll, deployCatalogEntry, findAiAssetsRoot, isUnderWorkspaceMount, resolveFlowSkills, undeployCatalogEntry, workspaceMountDirs } from '../chunk-USSP43U3.js';
2
- import '../chunk-6ARPZHOV.js';
2
+ import '../chunk-TMJBEGS4.js';
3
3
  import '../chunk-4GY63JU6.js';
4
- import '../chunk-JIQUF3X2.js';
4
+ import '../chunk-G7NMF5WQ.js';
5
5
  import '../chunk-5KRMNUL4.js';
6
6
  import '../chunk-C5HFK34M.js';
7
7
  import '../chunk-MWXYN6NY.js';
8
- import '../chunk-6SXSVKQY.js';
8
+ import '../chunk-O7ADRMCR.js';
9
9
  import '../chunk-L5VSIPQD.js';
10
10
  import '../chunk-VTETQCR6.js';
11
- import '../chunk-E2EC6SAX.js';
11
+ import '../chunk-QC5BYUED.js';
12
12
  import '../chunk-GNUA7XT2.js';
13
13
  import '../chunk-RVRB27AN.js';
14
14
  import '../chunk-V5KG6CCV.js';
@@ -1,29 +1,29 @@
1
- export { AssetManager, LibraryEntryError, MissingManifestError, installAgentInstances, labelDiffHeaders, mcpNotRunnableReason, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, setLibraryAssetCheck, setRenamedEntryLookup, softDepName } from '../chunk-JRVQV7WC.js';
2
- import '../chunk-MMOWIRHP.js';
3
- import '../chunk-J4WKNJHO.js';
4
- import '../chunk-VJRL6ZK6.js';
1
+ export { AssetManager, LibraryEntryError, MissingManifestError, installAgentInstances, labelDiffHeaders, mcpNotRunnableReason, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, setLibraryAssetCheck, setRenamedEntryLookup, softDepName } from '../chunk-757G6TTZ.js';
2
+ import '../chunk-G44FFUMA.js';
3
+ import '../chunk-O5Y7VMVQ.js';
4
+ import '../chunk-OSABUEWA.js';
5
5
  import '../chunk-F3D25RGM.js';
6
6
  import '../chunk-3TXEJN4W.js';
7
7
  import '../chunk-ISHJITXJ.js';
8
8
  import '../chunk-LNFKL23K.js';
9
9
  import '../chunk-JRN5QF4C.js';
10
10
  import '../chunk-NUELZWCF.js';
11
- export { SCAFFOLD_KINDS, createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-DI6J2PJB.js';
11
+ export { SCAFFOLD_KINDS, createScaffold, deployAll, installAgent, installTargetOf, removeAsset } from '../chunk-KO3VSZQP.js';
12
12
  export { BUILT_IN_FRAGMENTS, loadPromptExtensions, resolveFragments } from '../chunk-PKE3PXOK.js';
13
13
  export { appendHistory, clearHistory, getRecentHistory, loadHistory } from '../chunk-KTBKW2FI.js';
14
14
  import '../chunk-UQ6LFBPZ.js';
15
- export { AGENT_RENDERERS, claudeCodeRenderer, codexRenderer, harnessTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-DS6UUCFG.js';
15
+ export { AGENT_RENDERERS, claudeCodeRenderer, codexRenderer, harnessTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-4CD2R4MJ.js';
16
16
  import '../chunk-VT6G5AJV.js';
17
- export { FACTORY_SOURCE_URL } from '../chunk-6ARPZHOV.js';
17
+ export { FACTORY_SOURCE_URL } from '../chunk-TMJBEGS4.js';
18
18
  import '../chunk-4GY63JU6.js';
19
- import '../chunk-JIQUF3X2.js';
19
+ import '../chunk-G7NMF5WQ.js';
20
20
  import '../chunk-5KRMNUL4.js';
21
21
  import '../chunk-C5HFK34M.js';
22
22
  import '../chunk-MWXYN6NY.js';
23
- import '../chunk-6SXSVKQY.js';
23
+ import '../chunk-O7ADRMCR.js';
24
24
  import '../chunk-L5VSIPQD.js';
25
25
  import '../chunk-VTETQCR6.js';
26
- import '../chunk-E2EC6SAX.js';
26
+ import '../chunk-QC5BYUED.js';
27
27
  import '../chunk-GNUA7XT2.js';
28
28
  import '../chunk-RVRB27AN.js';
29
29
  import '../chunk-V5KG6CCV.js';
@@ -1,17 +1,17 @@
1
- export { SCAFFOLD_KINDS, assertNoLibrarySymlinks, cachedComposedFiles, canonicalEntryRef, composedDriftRefs, createScaffold, deployAll, deployAsset, deployedAssetDrift, diffDeployedAgent, entriesNeedingDeploy, installTargetOf, readKeptLegacyCopies, removeAsset, sourceComposedFiles, writeKeptLegacyCopies } from '../chunk-DI6J2PJB.js';
1
+ export { SCAFFOLD_KINDS, assertNoLibrarySymlinks, cachedComposedFiles, canonicalEntryRef, composedDriftRefs, createScaffold, deployAll, deployAsset, deployedAssetDrift, diffDeployedAgent, entriesNeedingDeploy, installTargetOf, readKeptLegacyCopies, removeAsset, sourceComposedFiles, writeKeptLegacyCopies } from '../chunk-KO3VSZQP.js';
2
2
  import '../chunk-PKE3PXOK.js';
3
- import '../chunk-DS6UUCFG.js';
3
+ import '../chunk-4CD2R4MJ.js';
4
4
  import '../chunk-VT6G5AJV.js';
5
- import '../chunk-6ARPZHOV.js';
5
+ import '../chunk-TMJBEGS4.js';
6
6
  import '../chunk-4GY63JU6.js';
7
- import '../chunk-JIQUF3X2.js';
7
+ import '../chunk-G7NMF5WQ.js';
8
8
  import '../chunk-5KRMNUL4.js';
9
9
  import '../chunk-C5HFK34M.js';
10
10
  import '../chunk-MWXYN6NY.js';
11
- import '../chunk-6SXSVKQY.js';
11
+ import '../chunk-O7ADRMCR.js';
12
12
  import '../chunk-L5VSIPQD.js';
13
13
  import '../chunk-VTETQCR6.js';
14
- import '../chunk-E2EC6SAX.js';
14
+ import '../chunk-QC5BYUED.js';
15
15
  import '../chunk-GNUA7XT2.js';
16
16
  import '../chunk-RVRB27AN.js';
17
17
  import '../chunk-V5KG6CCV.js';
@@ -1,15 +1,15 @@
1
- export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, agentRenderFiles, claudeCodeRenderer, codexRenderer, harnessTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-DS6UUCFG.js';
1
+ export { AGENT_RENDERERS, CODEX_IDENTITY_DIR, agentRenderFiles, claudeCodeRenderer, codexRenderer, harnessTargetSupportsAgents, ompRenderer, renderAgentToFramework } from '../chunk-4CD2R4MJ.js';
2
2
  import '../chunk-VT6G5AJV.js';
3
- import '../chunk-6ARPZHOV.js';
3
+ import '../chunk-TMJBEGS4.js';
4
4
  import '../chunk-4GY63JU6.js';
5
- import '../chunk-JIQUF3X2.js';
5
+ import '../chunk-G7NMF5WQ.js';
6
6
  import '../chunk-5KRMNUL4.js';
7
7
  import '../chunk-C5HFK34M.js';
8
8
  import '../chunk-MWXYN6NY.js';
9
- import '../chunk-6SXSVKQY.js';
9
+ import '../chunk-O7ADRMCR.js';
10
10
  import '../chunk-L5VSIPQD.js';
11
11
  import '../chunk-VTETQCR6.js';
12
- import '../chunk-E2EC6SAX.js';
12
+ import '../chunk-QC5BYUED.js';
13
13
  import '../chunk-GNUA7XT2.js';
14
14
  import '../chunk-RVRB27AN.js';
15
15
  import '../chunk-V5KG6CCV.js';