@skaile/workspaces 1.16.0 → 2.0.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 (289) hide show
  1. package/CHANGELOG.md +265 -0
  2. package/dist/{asset-feeds-WIBEP37F.js → asset-feeds-7VQVISDI.js} +25 -24
  3. package/dist/asset-feeds-7VQVISDI.js.map +1 -0
  4. package/dist/asset-manager/catalog-deployer.js +13 -1
  5. package/dist/asset-manager/index.js +10 -9
  6. package/dist/asset-manager/installer.js +7 -6
  7. package/dist/asset-manager/src/catalog-deployer.d.ts +70 -5
  8. package/dist/asset-manager/src/catalog-deployer.d.ts.map +1 -1
  9. package/dist/asset-manager/src/index.d.ts +22 -17
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/bridge/drivers/claude-sdk.js +108 -56
  12. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  13. package/dist/bridge/drivers/codex.js +3 -2
  14. package/dist/bridge/drivers/codex.js.map +1 -1
  15. package/dist/bridge/drivers/continue.js +4 -3
  16. package/dist/bridge/drivers/continue.js.map +1 -1
  17. package/dist/bridge/drivers/echo.js +3 -2
  18. package/dist/bridge/drivers/echo.js.map +1 -1
  19. package/dist/bridge/drivers/gemini.js +5 -4
  20. package/dist/bridge/drivers/goose.js +4 -3
  21. package/dist/bridge/drivers/goose.js.map +1 -1
  22. package/dist/bridge/drivers/omp.js +3 -2
  23. package/dist/bridge/drivers/omp.js.map +1 -1
  24. package/dist/bridge/drivers/opencode.js +4 -3
  25. package/dist/bridge/drivers/opencode.js.map +1 -1
  26. package/dist/bridge/drivers/qwen.js +5 -4
  27. package/dist/bridge/drivers/qwen.js.map +1 -1
  28. package/dist/bridge/index.js +4 -3
  29. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  30. package/dist/bridge/src/drivers/scrub-transcript.d.ts +21 -1
  31. package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +1 -1
  32. package/dist/{chunk-344DEXZS.js → chunk-35ELAMQ5.js} +4 -4
  33. package/dist/{chunk-344DEXZS.js.map → chunk-35ELAMQ5.js.map} +1 -1
  34. package/dist/{chunk-WSTY3AWY.js → chunk-6FJH63NN.js} +4 -4
  35. package/dist/{chunk-WSTY3AWY.js.map → chunk-6FJH63NN.js.map} +1 -1
  36. package/dist/{chunk-ISA7R7PK.js → chunk-72EOJJOM.js} +82 -38
  37. package/dist/chunk-72EOJJOM.js.map +1 -0
  38. package/dist/chunk-7GOCNYUV.js +300 -0
  39. package/dist/chunk-7GOCNYUV.js.map +1 -0
  40. package/dist/{chunk-TFIFNDT2.js → chunk-A5OYCQGT.js} +4 -4
  41. package/dist/{chunk-TFIFNDT2.js.map → chunk-A5OYCQGT.js.map} +1 -1
  42. package/dist/{chunk-KY5NY7LB.js → chunk-BCTU4TN7.js} +11 -11
  43. package/dist/chunk-BCTU4TN7.js.map +1 -0
  44. package/dist/chunk-BEAIJRVF.js +159 -0
  45. package/dist/chunk-BEAIJRVF.js.map +1 -0
  46. package/dist/chunk-BK3WL3QK.js +10 -0
  47. package/dist/chunk-BK3WL3QK.js.map +1 -0
  48. package/dist/{chunk-BI2NKPA4.js → chunk-CA5CWLGN.js} +3 -2
  49. package/dist/chunk-CA5CWLGN.js.map +1 -0
  50. package/dist/{chunk-2TSSCHCQ.js → chunk-CKVIN4H3.js} +5 -5
  51. package/dist/{chunk-2TSSCHCQ.js.map → chunk-CKVIN4H3.js.map} +1 -1
  52. package/dist/{chunk-GXC3TYMQ.js → chunk-CZZRDYT4.js} +70 -32
  53. package/dist/chunk-CZZRDYT4.js.map +1 -0
  54. package/dist/{chunk-MNKUZUN2.js → chunk-DRXDEL3A.js} +3 -3
  55. package/dist/{chunk-MNKUZUN2.js.map → chunk-DRXDEL3A.js.map} +1 -1
  56. package/dist/{chunk-BYS6JDZB.js → chunk-DY2AK577.js} +3 -3
  57. package/dist/{chunk-BYS6JDZB.js.map → chunk-DY2AK577.js.map} +1 -1
  58. package/dist/chunk-DYMWJAL4.js +552 -0
  59. package/dist/chunk-DYMWJAL4.js.map +1 -0
  60. package/dist/{chunk-ACXLKNIM.js → chunk-E7HKNQTH.js} +10 -4
  61. package/dist/chunk-E7HKNQTH.js.map +1 -0
  62. package/dist/{chunk-O5VCUU6D.js → chunk-KUZEIKZH.js} +4 -4
  63. package/dist/{chunk-O5VCUU6D.js.map → chunk-KUZEIKZH.js.map} +1 -1
  64. package/dist/{chunk-YULV7UTU.js → chunk-KYLWY3A7.js} +10 -10
  65. package/dist/{chunk-YULV7UTU.js.map → chunk-KYLWY3A7.js.map} +1 -1
  66. package/dist/{chunk-2BQBWWFX.js → chunk-LBZP2IYG.js} +6 -6
  67. package/dist/chunk-LBZP2IYG.js.map +1 -0
  68. package/dist/{chunk-MZV6WCF3.js → chunk-MAN7AGQJ.js} +3 -3
  69. package/dist/{chunk-MZV6WCF3.js.map → chunk-MAN7AGQJ.js.map} +1 -1
  70. package/dist/{chunk-7J7LQP6T.js → chunk-MMD2KQ3A.js} +31 -19
  71. package/dist/chunk-MMD2KQ3A.js.map +1 -0
  72. package/dist/{chunk-FIUGSIKC.js → chunk-NYCJ7B27.js} +19 -11
  73. package/dist/chunk-NYCJ7B27.js.map +1 -0
  74. package/dist/{chunk-ACWCVB5Q.js → chunk-ORZW7MMO.js} +3 -3
  75. package/dist/{chunk-ACWCVB5Q.js.map → chunk-ORZW7MMO.js.map} +1 -1
  76. package/dist/{chunk-M5GJT3D7.js → chunk-OYX22NJL.js} +3 -3
  77. package/dist/{chunk-M5GJT3D7.js.map → chunk-OYX22NJL.js.map} +1 -1
  78. package/dist/{chunk-C4KVFALU.js → chunk-QIQTYN7F.js} +3 -3
  79. package/dist/{chunk-C4KVFALU.js.map → chunk-QIQTYN7F.js.map} +1 -1
  80. package/dist/{chunk-2IJFUAZB.js → chunk-RK3HU3H3.js} +123 -18
  81. package/dist/chunk-RK3HU3H3.js.map +1 -0
  82. package/dist/{chunk-5NZ56R63.js → chunk-ST3DLLNZ.js} +18 -6
  83. package/dist/chunk-ST3DLLNZ.js.map +1 -0
  84. package/dist/{chunk-6POODADP.js → chunk-SVL4EZJT.js} +453 -250
  85. package/dist/chunk-SVL4EZJT.js.map +1 -0
  86. package/dist/{chunk-JB35MVBN.js → chunk-U5POE4BA.js} +4 -298
  87. package/dist/chunk-U5POE4BA.js.map +1 -0
  88. package/dist/{chunk-MO43URUI.js → chunk-UAQVFATZ.js} +7 -7
  89. package/dist/{chunk-MO43URUI.js.map → chunk-UAQVFATZ.js.map} +1 -1
  90. package/dist/{chunk-A22KZ7GZ.js → chunk-UVW3R6S7.js} +72 -37
  91. package/dist/chunk-UVW3R6S7.js.map +1 -0
  92. package/dist/{chunk-STQOPWPS.js → chunk-VCU4NPUS.js} +4 -4
  93. package/dist/{chunk-STQOPWPS.js.map → chunk-VCU4NPUS.js.map} +1 -1
  94. package/dist/{chunk-MB6563TL.js → chunk-WCWXDW22.js} +3 -3
  95. package/dist/{chunk-MB6563TL.js.map → chunk-WCWXDW22.js.map} +1 -1
  96. package/dist/{chunk-BG4XVMG2.js → chunk-WZPADAE7.js} +254 -135
  97. package/dist/chunk-WZPADAE7.js.map +1 -0
  98. package/dist/{chunk-EPWY2ABE.js → chunk-Y3JVBJ3Y.js} +5 -5
  99. package/dist/{chunk-EPWY2ABE.js.map → chunk-Y3JVBJ3Y.js.map} +1 -1
  100. package/dist/cli/index.js +347 -127
  101. package/dist/cli/index.js.map +1 -1
  102. package/dist/cli/src/asset-feeds.d.ts +2 -2
  103. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  104. package/dist/cli/src/commands/catalog.d.ts +51 -2
  105. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  106. package/dist/cli/src/commands/connector.d.ts +1 -1
  107. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  108. package/dist/cli/src/commands/logs.d.ts.map +1 -1
  109. package/dist/cli/src/commands/manage.d.ts +30 -3
  110. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  111. package/dist/cli/src/commands/project.d.ts +5 -2
  112. package/dist/cli/src/commands/project.d.ts.map +1 -1
  113. package/dist/connectors/config.js +7 -6
  114. package/dist/connectors/index.js +8 -7
  115. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  116. package/dist/connectors/src/watcher.d.ts.map +1 -1
  117. package/dist/connectors/src/worktree.d.ts +20 -2
  118. package/dist/connectors/src/worktree.d.ts.map +1 -1
  119. package/dist/core/index.js +6 -5
  120. package/dist/core/logging.js +2 -1
  121. package/dist/core/manifest.js +2 -1
  122. package/dist/core/runtime-assets.js +4 -3
  123. package/dist/core/src/fs-deadline.d.ts +84 -0
  124. package/dist/core/src/fs-deadline.d.ts.map +1 -0
  125. package/dist/core/src/index.d.ts +4 -3
  126. package/dist/core/src/index.d.ts.map +1 -1
  127. package/dist/core/src/manifest.d.ts +142 -18
  128. package/dist/core/src/manifest.d.ts.map +1 -1
  129. package/dist/core/src/repo-manager.d.ts +2 -2
  130. package/dist/core/src/repo-manager.d.ts.map +1 -1
  131. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  132. package/dist/core/src/subprocess.d.ts +33 -1
  133. package/dist/core/src/subprocess.d.ts.map +1 -1
  134. package/dist/core/src/walker.d.ts +1 -1
  135. package/dist/core/src/walker.d.ts.map +1 -1
  136. package/dist/core/src/workspace-config.d.ts +9 -2
  137. package/dist/core/src/workspace-config.d.ts.map +1 -1
  138. package/dist/core/workspace-config.js +3 -2
  139. package/dist/deploy/index.js +12 -7
  140. package/dist/deploy/index.js.map +1 -1
  141. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  142. package/dist/discovery/index.js +3 -2
  143. package/dist/{ensure-sources-RSTZONIE.js → ensure-sources-JLVHHZI2.js} +13 -12
  144. package/dist/ensure-sources-JLVHHZI2.js.map +1 -0
  145. package/dist/factory-assets/connectors/box.js +8 -7
  146. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +19 -0
  147. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -1
  148. package/dist/factory-assets/connectors/deploy.js +8 -7
  149. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -1
  150. package/dist/factory-assets/connectors/devserver.js +8 -7
  151. package/dist/factory-assets/connectors/flow/adapter.js +8 -7
  152. package/dist/factory-assets/connectors/flow/engine.js +6 -5
  153. package/dist/factory-assets/connectors/flow/run-flow.js +10 -9
  154. package/dist/factory-assets/connectors/flow.js +8 -7
  155. package/dist/factory-assets/connectors/git/driver.d.ts +12 -1
  156. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  157. package/dist/factory-assets/connectors/git.js +8 -7
  158. package/dist/factory-assets/connectors/gmail.js +8 -7
  159. package/dist/factory-assets/connectors/googledrive.js +8 -7
  160. package/dist/factory-assets/connectors/local/driver.d.ts +25 -1
  161. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -1
  162. package/dist/factory-assets/connectors/local.js +8 -7
  163. package/dist/factory-assets/connectors/mattermost.js +8 -7
  164. package/dist/factory-assets/connectors/memory.js +8 -7
  165. package/dist/factory-assets/connectors/minio.js +8 -7
  166. package/dist/factory-assets/connectors/postgres.js +8 -7
  167. package/dist/factory-assets/connectors/s3/driver.d.ts +15 -0
  168. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
  169. package/dist/factory-assets/connectors/s3.js +8 -7
  170. package/dist/factory-assets/connectors/sharepoint.js +8 -7
  171. package/dist/factory-assets/connectors/sqlite/adapter.d.ts +8 -1
  172. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
  173. package/dist/factory-assets/connectors/sqlite.js +8 -7
  174. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -1
  175. package/dist/factory-assets/connectors/static-server.js +8 -7
  176. package/dist/factory-assets/connectors/tunnel.js +8 -7
  177. package/dist/factory-assets/connectors/webdav.js +8 -7
  178. package/dist/factory-assets/connectors/xstate/adapter.d.ts +6 -0
  179. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -1
  180. package/dist/factory-assets/connectors/xstate-store.js +8 -7
  181. package/dist/factory-assets/connectors/xstate.js +8 -7
  182. package/dist/flows-LV5WYJ2I.js +20 -0
  183. package/dist/{flows-FHWBCLXF.js.map → flows-LV5WYJ2I.js.map} +1 -1
  184. package/dist/{helpers-GUUWPPAX.js → helpers-PJ3CPUUL.js} +13 -12
  185. package/dist/{helpers-GUUWPPAX.js.map → helpers-PJ3CPUUL.js.map} +1 -1
  186. package/dist/library/index.js +8 -7
  187. package/dist/library/install.js +6 -5
  188. package/dist/{library-publish-UKKSJP7V.js → library-publish-HVZRCE3C.js} +16 -15
  189. package/dist/library-publish-HVZRCE3C.js.map +1 -0
  190. package/dist/{open-library-VALRYGFV.js → open-library-RMI2FTQ4.js} +14 -13
  191. package/dist/{open-library-VALRYGFV.js.map → open-library-RMI2FTQ4.js.map} +1 -1
  192. package/dist/{paths-5QJJBAND.js → paths-JSVTQAVW.js} +11 -10
  193. package/dist/{paths-5QJJBAND.js.map → paths-JSVTQAVW.js.map} +1 -1
  194. package/dist/plugin-registry/src/deploy-helpers.d.ts +1 -1
  195. package/dist/{plugin-store-ZBJZ7F6D.js → plugin-store-7TVJB2TS.js} +8 -7
  196. package/dist/plugin-store-7TVJB2TS.js.map +1 -0
  197. package/dist/{project-IRUJLIVX.js → project-P636MSYT.js} +14 -13
  198. package/dist/{project-IRUJLIVX.js.map → project-P636MSYT.js.map} +1 -1
  199. package/dist/resolver/index.js +13 -1
  200. package/dist/resolver/src/types.d.ts +7 -0
  201. package/dist/resolver/src/types.d.ts.map +1 -1
  202. package/dist/resolver/src/validator.d.ts +8 -1
  203. package/dist/resolver/src/validator.d.ts.map +1 -1
  204. package/dist/runner/index.js +13 -12
  205. package/dist/runner/src/external-mcp.d.ts +1 -1
  206. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  207. package/dist/runner/src/mcp-prompt.d.ts +7 -3
  208. package/dist/runner/src/mcp-prompt.d.ts.map +1 -1
  209. package/dist/runner/src/mcp-runtime-handlers.d.ts +12 -0
  210. package/dist/runner/src/mcp-runtime-handlers.d.ts.map +1 -1
  211. package/dist/runner/src/mixin-resolver.d.ts.map +1 -1
  212. package/dist/runner/src/recipe-resolver.d.ts +20 -6
  213. package/dist/runner/src/recipe-resolver.d.ts.map +1 -1
  214. package/dist/runner/src/resource-handler.d.ts +43 -0
  215. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  216. package/dist/runner/src/resources.d.ts +12 -5
  217. package/dist/runner/src/resources.d.ts.map +1 -1
  218. package/dist/runner/src/serve.d.ts +5 -5
  219. package/dist/runner/src/serve.d.ts.map +1 -1
  220. package/dist/runner/src/session-builder.d.ts +9 -0
  221. package/dist/runner/src/session-builder.d.ts.map +1 -1
  222. package/dist/runner/src/session-capability-wiring.d.ts +5 -0
  223. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  224. package/dist/runner/src/workspace-migration.d.ts +37 -3
  225. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  226. package/dist/sdk/asset-manager.js +10 -9
  227. package/dist/sdk/bridge.js +4 -3
  228. package/dist/sdk/core.js +6 -5
  229. package/dist/sdk/flow.js +6 -5
  230. package/dist/sdk/index.js +13 -12
  231. package/dist/sdk/index.js.map +1 -1
  232. package/dist/sdk/resolver.js +13 -1
  233. package/dist/sdk/runner.js +13 -12
  234. package/dist/sdk/session.js +1 -1
  235. package/dist/sdk/store.js +1 -1
  236. package/dist/session/index.js +1 -1
  237. package/dist/session/src/dispatcher.d.ts.map +1 -1
  238. package/dist/{setup-WJPNUE32.js → setup-OYW3W3XK.js} +10 -9
  239. package/dist/setup-OYW3W3XK.js.map +1 -0
  240. package/dist/skills-QY5PHBD3.js +20 -0
  241. package/dist/{skills-BMI6H7HI.js.map → skills-QY5PHBD3.js.map} +1 -1
  242. package/dist/{source-5KDURFBS.js → source-63CHWDC2.js} +15 -14
  243. package/dist/{source-5KDURFBS.js.map → source-63CHWDC2.js.map} +1 -1
  244. package/dist/{source-manifest-publish-DPQI44D3.js → source-manifest-publish-DLASGDK5.js} +17 -16
  245. package/dist/source-manifest-publish-DLASGDK5.js.map +1 -0
  246. package/dist/store/index.js +1 -1
  247. package/dist/store/src/store.d.ts +9 -0
  248. package/dist/store/src/store.d.ts.map +1 -1
  249. package/dist/tui/index.js +13 -12
  250. package/dist/tui/index.js.map +1 -1
  251. package/dist/validator-RN64BKFW.js +5 -0
  252. package/dist/{validator-VF5M764T.js.map → validator-RN64BKFW.js.map} +1 -1
  253. package/dist/workspace-plugin/adapters/mcp.js +18 -5
  254. package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
  255. package/dist/workspace-plugin/adapters/omp.js +10 -10
  256. package/dist/workspace-plugin/index.js +3 -2
  257. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  258. package/dist/workspace-plugin/src/utils/ai-assets.d.ts +11 -6
  259. package/dist/workspace-plugin/src/utils/ai-assets.d.ts.map +1 -1
  260. package/package.json +1 -1
  261. package/dist/asset-feeds-WIBEP37F.js.map +0 -1
  262. package/dist/chunk-2BQBWWFX.js.map +0 -1
  263. package/dist/chunk-2IJFUAZB.js.map +0 -1
  264. package/dist/chunk-5NZ56R63.js.map +0 -1
  265. package/dist/chunk-6POODADP.js.map +0 -1
  266. package/dist/chunk-7J7LQP6T.js.map +0 -1
  267. package/dist/chunk-A22KZ7GZ.js.map +0 -1
  268. package/dist/chunk-ACXLKNIM.js.map +0 -1
  269. package/dist/chunk-BG4XVMG2.js.map +0 -1
  270. package/dist/chunk-BI2NKPA4.js.map +0 -1
  271. package/dist/chunk-BQCGFPHW.js +0 -345
  272. package/dist/chunk-BQCGFPHW.js.map +0 -1
  273. package/dist/chunk-FIUGSIKC.js.map +0 -1
  274. package/dist/chunk-GXC3TYMQ.js.map +0 -1
  275. package/dist/chunk-ISA7R7PK.js.map +0 -1
  276. package/dist/chunk-JB35MVBN.js.map +0 -1
  277. package/dist/chunk-KY5NY7LB.js.map +0 -1
  278. package/dist/chunk-LV2HPH3C.js +0 -73
  279. package/dist/chunk-LV2HPH3C.js.map +0 -1
  280. package/dist/chunk-XCBG2KDC.js +0 -23
  281. package/dist/chunk-XCBG2KDC.js.map +0 -1
  282. package/dist/ensure-sources-RSTZONIE.js.map +0 -1
  283. package/dist/flows-FHWBCLXF.js +0 -7
  284. package/dist/library-publish-UKKSJP7V.js.map +0 -1
  285. package/dist/plugin-store-ZBJZ7F6D.js.map +0 -1
  286. package/dist/setup-WJPNUE32.js.map +0 -1
  287. package/dist/skills-BMI6H7HI.js +0 -7
  288. package/dist/source-manifest-publish-DPQI44D3.js.map +0 -1
  289. package/dist/validator-VF5M764T.js +0 -5
@@ -1,5 +1,5 @@
1
- import { getStoreConfig, getStoreToken, storeFetch } from './chunk-MB6563TL.js';
2
- import { S, logErr, logWarn, logOk, logInfo } from './chunk-BYS6JDZB.js';
1
+ import { getStoreConfig, getStoreToken, storeFetch } from './chunk-WCWXDW22.js';
2
+ import { S, logErr, logWarn, logOk, logInfo } from './chunk-DY2AK577.js';
3
3
 
4
4
  // cli/src/store-publisher.ts
5
5
  function makeHttpPublisherClient(config = getStoreConfig(), timeoutMs = 2e4) {
@@ -154,5 +154,5 @@ async function publishToStore(opts) {
154
154
  }
155
155
 
156
156
  export { bareName, formatNamespaceAvailability, makeHttpPublisherClient, preflightNamespace, publishToStore, refFor };
157
- //# sourceMappingURL=chunk-WSTY3AWY.js.map
158
- //# sourceMappingURL=chunk-WSTY3AWY.js.map
157
+ //# sourceMappingURL=chunk-6FJH63NN.js.map
158
+ //# sourceMappingURL=chunk-6FJH63NN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/store-publisher.ts","../cli/src/commands/publish-core.ts"],"names":[],"mappings":"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","file":"chunk-WSTY3AWY.js","sourcesContent":["/**\n * Typed REST client for the AI Asset Store **publisher** surface — the\n * curator-publish flow (`skaile source manifest publish` / `yank`). Thin\n * wrappers over {@link storeFetch}; every method maps 1:1 to an `/api/v1/…`\n * endpoint. The {@link PublisherClient} interface is injectable so the\n * orchestration in `commands/source-manifest-publish.ts` can be unit-tested\n * against a fake without a live store.\n *\n * @docLink cli/dev-guide#store-publisher\n */\n\nimport { getStoreConfig, getStoreToken, type StoreConfig, storeFetch } from \"./store-client.ts\";\n\n/**\n * The publisher REST surface used by the curator-publish flow. Kept minimal —\n * only the endpoints `runPublish` / `runYank` actually call. Response shapes\n * are narrowed to the fields the orchestration reads (the server returns more).\n */\nexport interface PublisherClient {\n /**\n * Identity of the caller. `username` is the Keycloak login (personal-tier\n * namespace); `githubLogin` is the verified GitHub handle when connected —\n * the namespace to publish under when it differs from the login.\n */\n me(): Promise<{ username: string; githubLogin?: string | null }>;\n /** Register (or re-register) a source; returns the created/existing row id. */\n sourcesAdd(body: {\n url: string;\n ref: string;\n sidecarUrl?: string;\n sidecarRef?: string;\n /**\n * Target publisher namespace (the manifest's `publisher`). When it differs\n * from the caller's login username, the store resolves the CLAIMED Publisher\n * for it (the store must already have the claim). Omitted → the store\n * defaults to `@<username>` (personal).\n */\n namespace?: string;\n }): Promise<{ id: string }>;\n /** List sources — used to recover an id when `sourcesAdd` rejects a dup url. */\n sourcesList(): Promise<Array<{ id: string; url: string }>>;\n /** Kick off a source sync; returns the async job id to poll. */\n sourceSync(id: string): Promise<{ jobId: string }>;\n /** Poll a job's terminal status + per-item results. */\n jobGet(\n jobId: string,\n ): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }>;\n /** Discovered publishable candidates for a synced source. */\n sourceCandidates(id: string): Promise<\n Array<{\n id: string;\n name: string;\n version: string;\n kind: string;\n published: boolean;\n assetRoot: string;\n }>\n >;\n /** Per-asset preview — the discovered file set + resolved candidate metadata. */\n assetPreview(id: string): Promise<{\n discoveredFiles: string[];\n candidate: { name: string; version: string; kind: string; publisherNamespace: string };\n }>;\n /**\n * Publish one asset. `dryRun` returns the would-be `{ manifest }` without\n * launching a job; the normal path returns `{ jobId }`.\n */\n assetPublish(\n id: string,\n body: { ref: string; files: string[] },\n dryRun?: boolean,\n ): Promise<{ jobId?: string; manifest?: unknown }>;\n /** Retract a published asset. Response body is ignored. */\n assetUnpublish(id: string): Promise<unknown>;\n /**\n * Read-only \"can I publish under `@<ns>` right now, and if not, what's the\n * path?\" probe. Backs the `publish --dry-run` namespace status line; its\n * `message` is store-authored and meant to be surfaced verbatim.\n */\n namespaceAvailability(ns: string): Promise<{\n namespace: string;\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n claimMethod?: string;\n message: string;\n }>;\n}\n\n/**\n * Construct the real HTTP-backed {@link PublisherClient}. Every call carries a\n * longer timeout than the default store client because publish/sync trigger\n * server-side clone work.\n *\n * @param config - Store connection config; defaults to {@link getStoreConfig}.\n * @param timeoutMs - Per-request abort timeout (default 20s).\n */\nexport function makeHttpPublisherClient(\n config: StoreConfig = getStoreConfig(),\n timeoutMs = 20_000,\n): PublisherClient {\n // Acquire a fresh Keycloak token per call (device-flow session in\n // ~/.skaile/auth.json, refreshed on demand) rather than a static config.jwt.\n const call = async <T>(\n path: string,\n opts?: { method?: string; body?: unknown; params?: Record<string, string> },\n ): Promise<T> => {\n const jwt = await getStoreToken();\n return storeFetch<T>({ ...config, jwt }, path, { timeoutMs, ...opts });\n };\n return {\n me: () => call(\"/api/v1/me\"),\n sourcesAdd: (body) => call(\"/api/v1/sources\", { method: \"POST\", body }),\n sourcesList: () => call(\"/api/v1/sources\"),\n sourceSync: (id) => call(`/api/v1/sources/${id}/sync`, { method: \"POST\", body: {} }),\n jobGet: (jobId) => call(`/api/v1/jobs/${jobId}`),\n sourceCandidates: (id) => call(`/api/v1/sources/${id}/candidates`),\n assetPreview: (id) => call(`/api/v1/assets/${id}/preview`),\n assetPublish: (id, body, dryRun) =>\n call(`/api/v1/assets/${id}/publish`, {\n method: \"POST\",\n body,\n ...(dryRun ? { params: { dryRun: \"1\" } } : {}),\n }),\n assetUnpublish: (id) => call(`/api/v1/assets/${id}/unpublish`, { method: \"POST\", body: {} }),\n namespaceAvailability: (ns) =>\n call(`/api/v1/namespaces/${encodeURIComponent(ns)}/availability`),\n };\n}\n","/**\n * Shared store-interaction core for the two publish front-ends — the curator\n * sidecar flow (`source manifest publish`) and the first-party library flow\n * (`library publish`). Both differ only in their git side-effects + how they\n * resolve the source repo; the store orchestration below (register → sync →\n * candidates → per-asset preview+publish) is identical.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * so the orchestration stays unit/integration-testable without a live store.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport type { SkPublishManifest } from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport type { PublisherClient } from \"../store-publisher.ts\";\n\n/**\n * One-line rendering of a namespace-availability probe for a `--dry-run` plan.\n * The `message` is store-authored (identical to what a real publish would echo)\n * — we only prepend a status glyph so the reader sees green/amber/red at a\n * glance without the CLI re-deriving any authorization logic.\n */\nexport function formatNamespaceAvailability(a: {\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n message: string;\n}): string {\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return `${S.ok(\"✓\")} ${a.message}`;\n case \"claimable-by-you\":\n return `${S.warn(\"!\")} ${a.message}`;\n default:\n return `${S.err(\"✗\")} ${a.message}`;\n }\n}\n\n/**\n * Preflight the target namespace against the store's availability probe BEFORE a\n * publish does any irreversible work (a public git push). Returns `{ ok: false }`\n * with a guided message for `reserved` (not yours) and `claimable-by-you` (must\n * claim first) — the two states a real publish would reject — so the caller can\n * abort with actionable guidance instead of a raw 422 after pushing bytes.\n *\n * The probe is advisory: any failure (offline, older store) returns `{ ok: true }`\n * so the store stays the authority and a valid publish is never blocked.\n */\nexport async function preflightNamespace(\n client: PublisherClient,\n namespace: string,\n): Promise<{ ok: boolean; message?: string }> {\n let a: Awaited<ReturnType<PublisherClient[\"namespaceAvailability\"]>>;\n try {\n a = await client.namespaceAvailability(namespace);\n } catch {\n return { ok: true };\n }\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return { ok: true };\n case \"claimable-by-you\":\n return {\n ok: false,\n message:\n `@${namespace} isn't yours yet — claim it in the store first` +\n `${a.claimMethod ? ` (${a.claimMethod})` : \"\"}, then re-run. ${a.message}`,\n };\n default: // reserved, or any unrecognized future status (fail safe → block)\n return { ok: false, message: `Cannot publish under @${namespace} — ${a.message}` };\n }\n}\n\n/** One candidate row shape the matcher operates on (kind + name are the key). */\ninterface CandidateLike {\n kind: string;\n name: string;\n}\n\n/**\n * Keep only candidates whose `(kind, name)` pair is declared in the manifest.\n * The backend may merge extra assets from the base repo into the candidate\n * list; a publish only touches what the manifest curated/declared.\n */\nexport function matchCandidatesToManifest<T extends CandidateLike>(\n candidates: T[],\n manifest: SkPublishManifest,\n): T[] {\n const wanted = new Set((manifest.assets ?? []).map((a) => `${a.kind}:${a.name}`));\n return candidates.filter((c) => wanted.has(`${c.kind}:${c.name}`));\n}\n\n/** A canonical ref string `kind:@publisher/name[#version]` for reporting. */\nexport function refFor(kind: string, publisher: string, name: string, version?: string): string {\n const base = `${kind}:@${publisher}/${name}`;\n return version ? `${base}#${version}` : base;\n}\n\n/** The bare asset name from a `kind:@publisher/name#version` ref or a plain name. */\nexport function bareName(ref: string): string {\n const afterKind = ref.includes(\":\") ? ref.slice(ref.indexOf(\":\") + 1) : ref;\n const afterScope = afterKind.includes(\"/\")\n ? afterKind.slice(afterKind.indexOf(\"/\") + 1)\n : afterKind;\n return afterScope.split(\"#\")[0];\n}\n\n/**\n * Poll a job until it leaves `running` or the deadline passes. Returns the last\n * observed state — the caller MUST treat a still-`running` result as a timeout\n * (not success), since it means the deadline was hit before the job finished.\n */\nexport async function pollJob(\n client: PublisherClient,\n jobId: string,\n intervalMs = 1_500,\n timeoutMs = 60_000,\n): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }> {\n const deadline = Date.now() + timeoutMs;\n let job = await client.jobGet(jobId);\n while (job.status === \"running\" && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n job = await client.jobGet(jobId);\n }\n return job;\n}\n\n/**\n * True when a `sourcesAdd` rejection is a duplicate-URL conflict (the source is\n * already registered) — the only error the publish flow recovers from by looking\n * the existing row up. Every other failure (auth, 5xx, network) must propagate.\n */\nexport function isDupSourceError(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return /\\b409\\b|conflict|duplicate|already exists|already registered|unique/.test(msg);\n}\n\n/**\n * Register + sync the source, then publish its curated/declared candidates —\n * the store-side steps shared by both publish front-ends. Git side-effects (the\n * sidecar push, or the library commit+push) happen in the caller *before* this;\n * this function is purely store interaction.\n *\n * The sidecar front-end passes `sidecar` (so `sourcesAdd` carries the sidecar\n * pin); the library front-end omits it (the source repo IS the manifest host).\n * `assetName`, when set, narrows publication to the single candidate of that\n * name. Fatal store states (`sourcesAdd` non-dup failure) surface; sync failures\n * and empty candidate sets `process.exit(1)` with the same messages as before.\n */\nexport async function publishToStore(opts: {\n sourceUrl: string;\n ref: string;\n sidecar?: { url: string; ref: string };\n manifest: SkPublishManifest;\n assetName?: string;\n client: PublisherClient;\n}): Promise<{ published: string[] }> {\n const { sourceUrl, ref, sidecar, manifest, assetName, client: pub } = opts;\n\n let sourceId: string;\n try {\n const added = await pub.sourcesAdd({\n url: sourceUrl,\n ref,\n ...(sidecar ? { sidecarUrl: sidecar.url, sidecarRef: sidecar.ref } : {}),\n // Publish under the manifest's declared namespace; the store resolves a\n // claimed Publisher when it differs from the caller's login, else defaults\n // to `@<username>`. Omitted when the manifest carries no publisher.\n ...(manifest.publisher ? { namespace: manifest.publisher } : {}),\n });\n sourceId = added.id;\n } catch (err) {\n // Only a duplicate-url conflict is recoverable (source already registered);\n // auth/5xx/network failures must surface, not silently reuse a stale row.\n if (!isDupSourceError(err)) throw err;\n const rows = await pub.sourcesList();\n const found = rows.find((r) => r.url === sourceUrl);\n if (!found) {\n throw new Error(\n `Source ${sourceUrl} looked already-registered but no owned row matched: ` +\n `${err instanceof Error ? err.message : String(err)}`,\n );\n }\n sourceId = found.id;\n }\n\n const { jobId } = await pub.sourceSync(sourceId);\n const job = await pollJob(pub, jobId);\n if (job.status === \"failed\" || job.status === \"cancelled\") {\n const failed = (job.items ?? []).filter((i) => i.status === \"failed\");\n for (const i of failed) logErr(`sync: ${i.label}: ${i.error ?? \"failed\"}`);\n logErr(`Source sync ${job.status}.`);\n process.exit(1);\n }\n // A still-`running` job means the poll deadline was hit — do NOT proceed on an\n // unfinished sync (it would read incomplete candidates).\n if (job.status === \"running\") {\n logErr(\"Source sync timed out before completing — re-run `publish`, or check the store.\");\n process.exit(1);\n }\n\n let candidates = matchCandidatesToManifest(await pub.sourceCandidates(sourceId), manifest);\n if (assetName) candidates = candidates.filter((c) => c.name === assetName);\n if (candidates.length === 0) {\n logWarn(\"No candidates discovered — check the manifest and the source ref.\");\n process.exit(1);\n }\n\n const published: string[] = [];\n for (const c of candidates) {\n try {\n const preview = await pub.assetPreview(c.id);\n const res = await pub.assetPublish(c.id, { ref, files: preview.discoveredFiles });\n // Publish is async — wait for the job so we only report refs that actually\n // landed, not ones whose import is still in flight or about to fail.\n if (res.jobId) {\n const pubJob = await pollJob(pub, res.jobId);\n if (pubJob.status !== \"succeeded\") {\n const errs = (pubJob.items ?? [])\n .filter((i) => i.status === \"failed\")\n .map((i) => i.error)\n .filter(Boolean);\n logWarn(\n `Publish of ${c.kind}:${c.name} did not succeed (${pubJob.status})` +\n (errs.length ? `: ${errs.join(\"; \")}` : \"\"),\n );\n continue;\n }\n }\n published.push(refFor(c.kind, preview.candidate.publisherNamespace, c.name, c.version));\n } catch (err) {\n logWarn(\n `Failed to publish ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Published ${published.length} asset(s):`);\n for (const r of published) logInfo(` ${r}`);\n return { published };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/store-publisher.ts","../cli/src/commands/publish-core.ts"],"names":[],"mappings":"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","file":"chunk-6FJH63NN.js","sourcesContent":["/**\n * Typed REST client for the AI Asset Store **publisher** surface — the\n * curator-publish flow (`skaile source manifest publish` / `yank`). Thin\n * wrappers over {@link storeFetch}; every method maps 1:1 to an `/api/v1/…`\n * endpoint. The {@link PublisherClient} interface is injectable so the\n * orchestration in `commands/source-manifest-publish.ts` can be unit-tested\n * against a fake without a live store.\n *\n * @docLink cli/dev-guide#store-publisher\n */\n\nimport { getStoreConfig, getStoreToken, type StoreConfig, storeFetch } from \"./store-client.ts\";\n\n/**\n * The publisher REST surface used by the curator-publish flow. Kept minimal —\n * only the endpoints `runPublish` / `runYank` actually call. Response shapes\n * are narrowed to the fields the orchestration reads (the server returns more).\n */\nexport interface PublisherClient {\n /**\n * Identity of the caller. `username` is the Keycloak login (personal-tier\n * namespace); `githubLogin` is the verified GitHub handle when connected —\n * the namespace to publish under when it differs from the login.\n */\n me(): Promise<{ username: string; githubLogin?: string | null }>;\n /** Register (or re-register) a source; returns the created/existing row id. */\n sourcesAdd(body: {\n url: string;\n ref: string;\n sidecarUrl?: string;\n sidecarRef?: string;\n /**\n * Target publisher namespace (the manifest's `publisher`). When it differs\n * from the caller's login username, the store resolves the CLAIMED Publisher\n * for it (the store must already have the claim). Omitted → the store\n * defaults to `@<username>` (personal).\n */\n namespace?: string;\n }): Promise<{ id: string }>;\n /** List sources — used to recover an id when `sourcesAdd` rejects a dup url. */\n sourcesList(): Promise<Array<{ id: string; url: string }>>;\n /** Kick off a source sync; returns the async job id to poll. */\n sourceSync(id: string): Promise<{ jobId: string }>;\n /** Poll a job's terminal status + per-item results. */\n jobGet(\n jobId: string,\n ): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }>;\n /** Discovered publishable candidates for a synced source. */\n sourceCandidates(id: string): Promise<\n Array<{\n id: string;\n name: string;\n version: string;\n kind: string;\n published: boolean;\n assetRoot: string;\n }>\n >;\n /** Per-asset preview — the discovered file set + resolved candidate metadata. */\n assetPreview(id: string): Promise<{\n discoveredFiles: string[];\n candidate: { name: string; version: string; kind: string; publisherNamespace: string };\n }>;\n /**\n * Publish one asset. `dryRun` returns the would-be `{ manifest }` without\n * launching a job; the normal path returns `{ jobId }`.\n */\n assetPublish(\n id: string,\n body: { ref: string; files: string[] },\n dryRun?: boolean,\n ): Promise<{ jobId?: string; manifest?: unknown }>;\n /** Retract a published asset. Response body is ignored. */\n assetUnpublish(id: string): Promise<unknown>;\n /**\n * Read-only \"can I publish under `@<ns>` right now, and if not, what's the\n * path?\" probe. Backs the `publish --dry-run` namespace status line; its\n * `message` is store-authored and meant to be surfaced verbatim.\n */\n namespaceAvailability(ns: string): Promise<{\n namespace: string;\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n claimMethod?: string;\n message: string;\n }>;\n}\n\n/**\n * Construct the real HTTP-backed {@link PublisherClient}. Every call carries a\n * longer timeout than the default store client because publish/sync trigger\n * server-side clone work.\n *\n * @param config - Store connection config; defaults to {@link getStoreConfig}.\n * @param timeoutMs - Per-request abort timeout (default 20s).\n */\nexport function makeHttpPublisherClient(\n config: StoreConfig = getStoreConfig(),\n timeoutMs = 20_000,\n): PublisherClient {\n // Acquire a fresh Keycloak token per call (device-flow session in\n // ~/.skaile/auth.json, refreshed on demand) rather than a static config.jwt.\n const call = async <T>(\n path: string,\n opts?: { method?: string; body?: unknown; params?: Record<string, string> },\n ): Promise<T> => {\n const jwt = await getStoreToken();\n return storeFetch<T>({ ...config, jwt }, path, { timeoutMs, ...opts });\n };\n return {\n me: () => call(\"/api/v1/me\"),\n sourcesAdd: (body) => call(\"/api/v1/sources\", { method: \"POST\", body }),\n sourcesList: () => call(\"/api/v1/sources\"),\n sourceSync: (id) => call(`/api/v1/sources/${id}/sync`, { method: \"POST\", body: {} }),\n jobGet: (jobId) => call(`/api/v1/jobs/${jobId}`),\n sourceCandidates: (id) => call(`/api/v1/sources/${id}/candidates`),\n assetPreview: (id) => call(`/api/v1/assets/${id}/preview`),\n assetPublish: (id, body, dryRun) =>\n call(`/api/v1/assets/${id}/publish`, {\n method: \"POST\",\n body,\n ...(dryRun ? { params: { dryRun: \"1\" } } : {}),\n }),\n assetUnpublish: (id) => call(`/api/v1/assets/${id}/unpublish`, { method: \"POST\", body: {} }),\n namespaceAvailability: (ns) =>\n call(`/api/v1/namespaces/${encodeURIComponent(ns)}/availability`),\n };\n}\n","/**\n * Shared store-interaction core for the two publish front-ends — the curator\n * sidecar flow (`source manifest publish`) and the first-party library flow\n * (`library publish`). Both differ only in their git side-effects + how they\n * resolve the source repo; the store orchestration below (register → sync →\n * candidates → per-asset preview+publish) is identical.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * so the orchestration stays unit/integration-testable without a live store.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport type { SkPublishManifest } from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport type { PublisherClient } from \"../store-publisher.ts\";\n\n/**\n * One-line rendering of a namespace-availability probe for a `--dry-run` plan.\n * The `message` is store-authored (identical to what a real publish would echo)\n * — we only prepend a status glyph so the reader sees green/amber/red at a\n * glance without the CLI re-deriving any authorization logic.\n */\nexport function formatNamespaceAvailability(a: {\n status: \"owned-by-you\" | \"claimable-by-you\" | \"reserved\" | \"available\";\n message: string;\n}): string {\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return `${S.ok(\"✓\")} ${a.message}`;\n case \"claimable-by-you\":\n return `${S.warn(\"!\")} ${a.message}`;\n default:\n return `${S.err(\"✗\")} ${a.message}`;\n }\n}\n\n/**\n * Preflight the target namespace against the store's availability probe BEFORE a\n * publish does any irreversible work (a public git push). Returns `{ ok: false }`\n * with a guided message for `reserved` (not yours) and `claimable-by-you` (must\n * claim first) — the two states a real publish would reject — so the caller can\n * abort with actionable guidance instead of a raw 422 after pushing bytes.\n *\n * The probe is advisory: any failure (offline, older store) returns `{ ok: true }`\n * so the store stays the authority and a valid publish is never blocked.\n */\nexport async function preflightNamespace(\n client: PublisherClient,\n namespace: string,\n): Promise<{ ok: boolean; message?: string }> {\n let a: Awaited<ReturnType<PublisherClient[\"namespaceAvailability\"]>>;\n try {\n a = await client.namespaceAvailability(namespace);\n } catch {\n return { ok: true };\n }\n switch (a.status) {\n case \"owned-by-you\":\n case \"available\":\n return { ok: true };\n case \"claimable-by-you\":\n return {\n ok: false,\n message:\n `@${namespace} isn't yours yet — claim it in the store first` +\n `${a.claimMethod ? ` (${a.claimMethod})` : \"\"}, then re-run. ${a.message}`,\n };\n default: // reserved, or any unrecognized future status (fail safe → block)\n return { ok: false, message: `Cannot publish under @${namespace} — ${a.message}` };\n }\n}\n\n/** One candidate row shape the matcher operates on (kind + name are the key). */\ninterface CandidateLike {\n kind: string;\n name: string;\n}\n\n/**\n * Keep only candidates whose `(kind, name)` pair is declared in the manifest.\n * The backend may merge extra assets from the base repo into the candidate\n * list; a publish only touches what the manifest curated/declared.\n */\nexport function matchCandidatesToManifest<T extends CandidateLike>(\n candidates: T[],\n manifest: SkPublishManifest,\n): T[] {\n const wanted = new Set((manifest.assets ?? []).map((a) => `${a.kind}:${a.name}`));\n return candidates.filter((c) => wanted.has(`${c.kind}:${c.name}`));\n}\n\n/** A canonical ref string `kind:@publisher/name[#version]` for reporting. */\nexport function refFor(kind: string, publisher: string, name: string, version?: string): string {\n const base = `${kind}:@${publisher}/${name}`;\n return version ? `${base}#${version}` : base;\n}\n\n/** The bare asset name from a `kind:@publisher/name#version` ref or a plain name. */\nexport function bareName(ref: string): string {\n const afterKind = ref.includes(\":\") ? ref.slice(ref.indexOf(\":\") + 1) : ref;\n const afterScope = afterKind.includes(\"/\")\n ? afterKind.slice(afterKind.indexOf(\"/\") + 1)\n : afterKind;\n return afterScope.split(\"#\")[0];\n}\n\n/**\n * Poll a job until it leaves `running` or the deadline passes. Returns the last\n * observed state — the caller MUST treat a still-`running` result as a timeout\n * (not success), since it means the deadline was hit before the job finished.\n */\nexport async function pollJob(\n client: PublisherClient,\n jobId: string,\n intervalMs = 1_500,\n timeoutMs = 60_000,\n): Promise<{ status: string; items?: Array<{ label: string; status: string; error?: string }> }> {\n const deadline = Date.now() + timeoutMs;\n let job = await client.jobGet(jobId);\n while (job.status === \"running\" && Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n job = await client.jobGet(jobId);\n }\n return job;\n}\n\n/**\n * True when a `sourcesAdd` rejection is a duplicate-URL conflict (the source is\n * already registered) — the only error the publish flow recovers from by looking\n * the existing row up. Every other failure (auth, 5xx, network) must propagate.\n */\nexport function isDupSourceError(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return /\\b409\\b|conflict|duplicate|already exists|already registered|unique/.test(msg);\n}\n\n/**\n * Register + sync the source, then publish its curated/declared candidates —\n * the store-side steps shared by both publish front-ends. Git side-effects (the\n * sidecar push, or the library commit+push) happen in the caller *before* this;\n * this function is purely store interaction.\n *\n * The sidecar front-end passes `sidecar` (so `sourcesAdd` carries the sidecar\n * pin); the library front-end omits it (the source repo IS the manifest host).\n * `assetName`, when set, narrows publication to the single candidate of that\n * name. Fatal store states (`sourcesAdd` non-dup failure) surface; sync failures\n * and empty candidate sets `process.exit(1)` with the same messages as before.\n */\nexport async function publishToStore(opts: {\n sourceUrl: string;\n ref: string;\n sidecar?: { url: string; ref: string };\n manifest: SkPublishManifest;\n assetName?: string;\n client: PublisherClient;\n}): Promise<{ published: string[] }> {\n const { sourceUrl, ref, sidecar, manifest, assetName, client: pub } = opts;\n\n let sourceId: string;\n try {\n const added = await pub.sourcesAdd({\n url: sourceUrl,\n ref,\n ...(sidecar ? { sidecarUrl: sidecar.url, sidecarRef: sidecar.ref } : {}),\n // Publish under the manifest's declared namespace; the store resolves a\n // claimed Publisher when it differs from the caller's login, else defaults\n // to `@<username>`. Omitted when the manifest carries no publisher.\n ...(manifest.publisher ? { namespace: manifest.publisher } : {}),\n });\n sourceId = added.id;\n } catch (err) {\n // Only a duplicate-url conflict is recoverable (source already registered);\n // auth/5xx/network failures must surface, not silently reuse a stale row.\n if (!isDupSourceError(err)) throw err;\n const rows = await pub.sourcesList();\n const found = rows.find((r) => r.url === sourceUrl);\n if (!found) {\n throw new Error(\n `Source ${sourceUrl} looked already-registered but no owned row matched: ` +\n `${err instanceof Error ? err.message : String(err)}`,\n );\n }\n sourceId = found.id;\n }\n\n const { jobId } = await pub.sourceSync(sourceId);\n const job = await pollJob(pub, jobId);\n if (job.status === \"failed\" || job.status === \"cancelled\") {\n const failed = (job.items ?? []).filter((i) => i.status === \"failed\");\n for (const i of failed) logErr(`sync: ${i.label}: ${i.error ?? \"failed\"}`);\n logErr(`Source sync ${job.status}.`);\n process.exit(1);\n }\n // A still-`running` job means the poll deadline was hit — do NOT proceed on an\n // unfinished sync (it would read incomplete candidates).\n if (job.status === \"running\") {\n logErr(\"Source sync timed out before completing — re-run `publish`, or check the store.\");\n process.exit(1);\n }\n\n let candidates = matchCandidatesToManifest(await pub.sourceCandidates(sourceId), manifest);\n if (assetName) candidates = candidates.filter((c) => c.name === assetName);\n if (candidates.length === 0) {\n logWarn(\"No candidates discovered — check the manifest and the source ref.\");\n process.exit(1);\n }\n\n const published: string[] = [];\n for (const c of candidates) {\n try {\n const preview = await pub.assetPreview(c.id);\n const res = await pub.assetPublish(c.id, { ref, files: preview.discoveredFiles });\n // Publish is async — wait for the job so we only report refs that actually\n // landed, not ones whose import is still in flight or about to fail.\n if (res.jobId) {\n const pubJob = await pollJob(pub, res.jobId);\n if (pubJob.status !== \"succeeded\") {\n const errs = (pubJob.items ?? [])\n .filter((i) => i.status === \"failed\")\n .map((i) => i.error)\n .filter(Boolean);\n logWarn(\n `Publish of ${c.kind}:${c.name} did not succeed (${pubJob.status})` +\n (errs.length ? `: ${errs.join(\"; \")}` : \"\"),\n );\n continue;\n }\n }\n published.push(refFor(c.kind, preview.candidate.publisherNamespace, c.name, c.version));\n } catch (err) {\n logWarn(\n `Failed to publish ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Published ${published.length} asset(s):`);\n for (const r of published) logInfo(` ${r}`);\n return { published };\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { decodeSkaileManifest, SKAILE_MANIFEST_FILENAME } from './chunk-P4VHQA4N.js';
2
- import { scanDirectory, parseFrontmatter, bundleDepRefs, fromMcpServerMdContent } from './chunk-BQCGFPHW.js';
2
+ import { scanDirectory, parseFrontmatter, bundleDepRefs, fromMcpServerMdContent, withFsDeadline, tryWithFsDeadline, fsDeadlineMs } from './chunk-DYMWJAL4.js';
3
3
  import { isValidAssetName, slugifyAssetName, parseAssetRef, assetRefToStr } from './chunk-GEEW6SY2.js';
4
4
  import { SUPPORTED_DRIVER_TARGETS, globalBackendRoot } from './chunk-MENCWIHW.js';
5
- import { existsSync, mkdirSync, renameSync, readdirSync, rmdirSync, readFileSync, writeFileSync, rmSync, lstatSync, symlinkSync, cpSync } from 'fs';
5
+ import { existsSync, mkdirSync, renameSync, readdirSync, rmdirSync, readFileSync, writeFileSync, rmSync, lstatSync, symlinkSync } from 'fs';
6
+ import { readdir, stat, cp } from 'fs/promises';
6
7
  import { homedir } from 'os';
7
8
  import { join, dirname, relative, resolve, parse as parse$1, basename } from 'path';
8
9
  import { parse, stringify } from 'yaml';
@@ -110,25 +111,25 @@ var KIND_DIRS = [
110
111
  var MD_FILE_BY_KIND = Object.fromEntries(
111
112
  KIND_DIRS.map((k) => [k.kind, k.mdName])
112
113
  );
113
- function buildProvenanceIndex(clones, _opts) {
114
+ async function buildProvenanceIndex(clones, _opts) {
114
115
  const index = /* @__PURE__ */ new Map();
115
- for (const clone of clones) walkOne(clone, index);
116
+ for (const clone of clones) await walkOne(clone, index);
116
117
  return index;
117
118
  }
118
- function walkOne(clone, index) {
119
+ async function walkOne(clone, index) {
119
120
  if (clone.overlayManifestPath && existsSync(clone.overlayManifestPath)) {
120
- if (walkWithManifest(clone, clone.overlayManifestPath, index)) return;
121
+ if (await walkWithManifest(clone, clone.overlayManifestPath, index)) return;
121
122
  }
122
123
  const manifestPaths = findManifestFiles(clone.localPath);
123
124
  if (manifestPaths.length === 0) {
124
- walkFilenameConvention(clone, index);
125
+ await walkFilenameConvention(clone, index);
125
126
  return;
126
127
  }
127
128
  let produced = false;
128
129
  for (const p of manifestPaths) {
129
- if (walkWithManifest(clone, p, index)) produced = true;
130
+ if (await walkWithManifest(clone, p, index)) produced = true;
130
131
  }
131
- if (!produced) walkFilenameConvention(clone, index);
132
+ if (!produced) await walkFilenameConvention(clone, index);
132
133
  }
133
134
  function findManifestFiles(root) {
134
135
  const found = [];
@@ -144,7 +145,7 @@ function findManifestFiles(root) {
144
145
  walk(root);
145
146
  return found;
146
147
  }
147
- function walkWithManifest(clone, manifestPath, index) {
148
+ async function walkWithManifest(clone, manifestPath, index) {
148
149
  const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
149
150
  const repoRoot = clone.localPath;
150
151
  const manifestPublisher = manifest.publisher ?? publisherFromGithubUrl(clone.sourceUrl);
@@ -173,7 +174,7 @@ function walkWithManifest(clone, manifestPath, index) {
173
174
  files,
174
175
  sha256: a.sha256 ?? compositeSha256(files),
175
176
  metadata: resolved.metadata,
176
- deps: a.dependencies ?? manifestDeps(repoRoot, files, a.kind)
177
+ deps: a.dependencies ?? await manifestDeps(repoRoot, files, a.kind)
177
178
  };
178
179
  applyStoreListingMetadata(candidate, a, manifest, resolved.frontmatter);
179
180
  push(index, `${assetPublisher}/${a.kind}:${name}`, candidate);
@@ -267,7 +268,7 @@ var DIR_SCOPED_KINDS = /* @__PURE__ */ new Set([
267
268
  "connector",
268
269
  "knowledge"
269
270
  ]);
270
- function walkFilenameConvention(clone, index) {
271
+ async function walkFilenameConvention(clone, index) {
271
272
  const publisher = publisherFromGithubUrl(clone.sourceUrl);
272
273
  if (!publisher) {
273
274
  throw new Error(
@@ -275,7 +276,7 @@ function walkFilenameConvention(clone, index) {
275
276
  );
276
277
  }
277
278
  const version = (clone.tag ? clone.tag.replace(/^v/, "") : void 0) ?? syntheticVersion(clone.commit);
278
- for (const e of scanDirectory(clone.localPath, publisher)) {
279
+ for (const e of await scanDirectory(clone.localPath, publisher)) {
279
280
  const manifestAbs = e.source;
280
281
  const files = [];
281
282
  if (DIR_SCOPED_KINDS.has(e.kind)) {
@@ -293,7 +294,7 @@ function walkFilenameConvention(clone, index) {
293
294
  files,
294
295
  sha256: compositeSha256(files),
295
296
  metadata: readMetadata(clone.localPath, files, e.kind),
296
- deps: manifestDeps(clone.localPath, files, e.kind)
297
+ deps: await manifestDeps(clone.localPath, files, e.kind)
297
298
  };
298
299
  push(index, `${publisher}/${e.kind}:${e.name}`, candidate);
299
300
  }
@@ -329,11 +330,11 @@ function readContentFrontmatter(repoRoot, files, kind) {
329
330
  return void 0;
330
331
  }
331
332
  }
332
- function manifestDeps(repoRoot, files, kind) {
333
+ async function manifestDeps(repoRoot, files, kind) {
333
334
  const ext = kind === "bundle" ? [".bundle.yaml", "BUNDLE.md"] : kind === "flow" ? [".flow.yaml", ".flow.json"] : null;
334
335
  if (!ext) return void 0;
335
336
  const mf = files.find((f) => ext.some((e) => f.path.endsWith(e)));
336
- return mf ? bundleDepRefs(join(repoRoot, mf.path)) : void 0;
337
+ return mf ? await bundleDepRefs(join(repoRoot, mf.path)) : void 0;
337
338
  }
338
339
  function push(index, key, candidate) {
339
340
  const arr = index.get(key) ?? [];
@@ -581,16 +582,16 @@ function resolveSourcePublisher(repoDir) {
581
582
  const org = repoSlugFromGitRemote(repoDir)?.split("/")[0];
582
583
  return org ? normalizeGithubOrg(org) : void 0;
583
584
  }
584
- function scanRepo(repoDir, repoName) {
585
+ async function scanRepo(repoDir, repoName) {
585
586
  const repo = repoSlugFromGitRemote(repoDir);
586
587
  const publisher = resolveSourcePublisher(repoDir) ?? repoName;
587
- return scanDirectory(repoDir, repoName).map((e) => ({
588
+ return (await scanDirectory(repoDir, repoName)).map((e) => ({
588
589
  ...e,
589
590
  publisher,
590
591
  ...repo ? { repo } : {}
591
592
  }));
592
593
  }
593
- function resolveAsset(ref, repositories, reposDir, opts) {
594
+ async function resolveAsset(ref, repositories, reposDir, opts) {
594
595
  let repoNames;
595
596
  if (ref.publisher) {
596
597
  repoNames = [ref.publisher];
@@ -605,7 +606,7 @@ function resolveAsset(ref, repositories, reposDir, opts) {
605
606
  if (!decl) continue;
606
607
  const repoDir = resolveRepoDir(decl, repoName, reposDir, opts?.projectDir);
607
608
  if (!repoDir || !existsSync(repoDir)) continue;
608
- const entries = scanRepo(repoDir, repoName);
609
+ const entries = await scanRepo(repoDir, repoName);
609
610
  const match = entries.find((e) => e.kind === ref.kind && e.name === ref.name);
610
611
  if (match) return match;
611
612
  }
@@ -1660,13 +1661,43 @@ function loadMaterializedMcpDeclarations(projectDir) {
1660
1661
  }
1661
1662
  return result;
1662
1663
  }
1663
- function stageMaterializedSkills(projectDir, skillsDir, opts) {
1664
+ function subdirNames(dir) {
1665
+ try {
1666
+ return readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
1667
+ } catch {
1668
+ return [];
1669
+ }
1670
+ }
1671
+ function loadStoreStagedMcpDeclarations(projectDir) {
1672
+ const root = join(projectDir, ".skaile/cache/store");
1673
+ if (!existsSync(root)) return [];
1674
+ const result = [];
1675
+ for (const publisher of subdirNames(root)) {
1676
+ const kindDir = join(root, publisher, "mcp-server");
1677
+ for (const name of subdirNames(kindDir)) {
1678
+ const nameDir = join(kindDir, name);
1679
+ const versions = subdirNames(nameDir).sort(
1680
+ (a, b) => a.localeCompare(b, "en", { numeric: true })
1681
+ );
1682
+ for (const version of versions) {
1683
+ const decl = deriveSingleMaterializedMcpDeclaration(join(nameDir, version), name);
1684
+ if (decl) result.push(decl);
1685
+ }
1686
+ }
1687
+ }
1688
+ return result;
1689
+ }
1690
+ var TREE_COPY_DEADLINE_FACTOR = 4;
1691
+ async function stageMaterializedSkills(projectDir, skillsDir, opts) {
1664
1692
  const dir = join(projectDir, ".skaile/assets/skill");
1665
- if (!existsSync(dir)) return [];
1666
1693
  const staged = [];
1667
1694
  let subdirs;
1668
1695
  try {
1669
- subdirs = readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
1696
+ const entries = await withFsDeadline(
1697
+ `readdir ${dir}`,
1698
+ () => readdir(dir, { withFileTypes: true })
1699
+ );
1700
+ subdirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
1670
1701
  } catch {
1671
1702
  return [];
1672
1703
  }
@@ -1676,15 +1707,27 @@ function stageMaterializedSkills(projectDir, skillsDir, opts) {
1676
1707
  }
1677
1708
  for (const name of subdirs) {
1678
1709
  const src = join(dir, name);
1679
- if (!existsSync(join(src, "SKILL.md"))) continue;
1680
1710
  if (declaredSet && !declaredSet.has(name) && !declaredSet.has(unscopedTail(name))) continue;
1711
+ const hasSkillMd = await tryWithFsDeadline(
1712
+ `stat ${join(src, "SKILL.md")}`,
1713
+ async () => {
1714
+ await stat(join(src, "SKILL.md"));
1715
+ return true;
1716
+ },
1717
+ false
1718
+ );
1719
+ if (!hasSkillMd) continue;
1681
1720
  const dest = join(projectDir, skillsDir, name);
1682
1721
  try {
1683
- cpSync(src, dest, {
1684
- recursive: true,
1685
- force: true,
1686
- filter: (source) => basename(source) !== ".instance.json"
1687
- });
1722
+ await withFsDeadline(
1723
+ `cp ${src} -> ${dest}`,
1724
+ () => cp(src, dest, {
1725
+ recursive: true,
1726
+ force: true,
1727
+ filter: (source) => basename(source) !== ".instance.json"
1728
+ }),
1729
+ fsDeadlineMs() * TREE_COPY_DEADLINE_FACTOR
1730
+ );
1688
1731
  staged.push(name);
1689
1732
  } catch (err) {
1690
1733
  console.warn(
@@ -1763,8 +1806,8 @@ function collectMcpRefStrings(dependencies) {
1763
1806
  }
1764
1807
  return mcpRefStrings;
1765
1808
  }
1766
- function buildMcpProvenanceIndex(sources, projectDir) {
1767
- return sources.length > 0 ? buildProvenanceIndex(buildSourceClones(sources)) : /* @__PURE__ */ new Map();
1809
+ async function buildMcpProvenanceIndex(sources, projectDir) {
1810
+ return sources.length > 0 ? await buildProvenanceIndex(buildSourceClones(sources)) : /* @__PURE__ */ new Map();
1768
1811
  }
1769
1812
  function upsertCatalogMcpDecls(mcpRefStrings, provenanceIndex, upsert) {
1770
1813
  const seen = /* @__PURE__ */ new Set();
@@ -1784,18 +1827,18 @@ function upsertCatalogMcpDecls(mcpRefStrings, provenanceIndex, upsert) {
1784
1827
  upsert(catalogDecl);
1785
1828
  }
1786
1829
  }
1787
- function upsertMaterializedMcpDecls(materialized, explicit, mcpRefStrings, upsert) {
1830
+ function upsertGatedMcpDecls(decls, explicit, mcpRefStrings, upsert) {
1788
1831
  const declaredNames = buildDeclaredMcpNames(explicit, mcpRefStrings);
1789
- for (const decl of materialized) {
1832
+ for (const decl of decls) {
1790
1833
  if (declaredNames.has(decl.id) || declaredNames.has(unscopedTail(decl.id))) upsert(decl);
1791
1834
  }
1792
1835
  }
1793
- function loadMcpServerDeclarations(projectDir) {
1836
+ async function loadMcpServerDeclarations(projectDir) {
1794
1837
  const config = resolveSkWorkspaceConfig(projectDir);
1795
1838
  const explicit = config.mcp_servers ?? [];
1796
1839
  const materialized = loadMaterializedMcpDeclarations(projectDir);
1797
1840
  const mcpRefStrings = collectMcpRefStrings(config.dependencies);
1798
- const provenanceIndex = buildMcpProvenanceIndex(config.sources ?? []);
1841
+ const provenanceIndex = await buildMcpProvenanceIndex(config.sources ?? []);
1799
1842
  const byId = /* @__PURE__ */ new Map();
1800
1843
  const order = [];
1801
1844
  const upsert = (decl) => {
@@ -1808,7 +1851,8 @@ function loadMcpServerDeclarations(projectDir) {
1808
1851
  }
1809
1852
  };
1810
1853
  upsertCatalogMcpDecls(mcpRefStrings, provenanceIndex, upsert);
1811
- upsertMaterializedMcpDecls(materialized, explicit, mcpRefStrings, upsert);
1854
+ upsertGatedMcpDecls(loadStoreStagedMcpDeclarations(projectDir), explicit, mcpRefStrings, upsert);
1855
+ upsertGatedMcpDecls(materialized, explicit, mcpRefStrings, upsert);
1812
1856
  for (const decl of explicit) {
1813
1857
  upsert(decl);
1814
1858
  }
@@ -1842,5 +1886,5 @@ function resolveAgentDir(projectDir) {
1842
1886
  }
1843
1887
 
1844
1888
  export { COMPACTION_DEFAULTS, CanonicalRefConflictError, DEFAULT_RECIPE_ATTR, SKAILE_YAML_DEFAULT, SKAILE_YAML_SUFFIX, SK_WORKSPACE_DEFAULT_NAME, SK_WORKSPACE_SUFFIX, __resetCacheMigrationMemo, buildProvenanceIndex, checkRepoStatus, checkoutPin, cloneRepo, cloudConfigFromProfile, coerceVersion, decodeSkaileYaml, deriveSingleMaterializedMcpDeclaration, encodeSkaileYaml, ensureRepo, findWorkspaceRoot, getGlobalCacheDir, getRepoCommit, globalCacheRoot, globalSkaileDir, isWorkspaceConfigFilename, linkRepo, listSkWorkspaceConfigs, loadMcpServerDeclarations, loadSkWorkspaceConfig, matchPin, mergeLegacyEntriesInto, mergeLegacyEntriesKeyed, mergeSkWorkspaceConfigs, migrateLegacyDir, normalizeConfig, pullRepo, readLinks, resolveAgentDir, resolveAll, resolveAsset, resolveGlobalBackends, resolveGlobalSkWorkspaceConfig, resolveSkWorkspaceConfig, resolveSourcePublisher, saveSkWorkspaceConfig, scanRepo, sourceCacheKey, sourceShortName, stageMaterializedSkills, storeManifestSlug, unlinkRepo, validateAssetRecipeAttr, validateAssetRecipeFlake, workspaceConfigFilename, workspaceNameFromFilename, writeLinks };
1845
- //# sourceMappingURL=chunk-ISA7R7PK.js.map
1846
- //# sourceMappingURL=chunk-ISA7R7PK.js.map
1889
+ //# sourceMappingURL=chunk-72EOJJOM.js.map
1890
+ //# sourceMappingURL=chunk-72EOJJOM.js.map