@skaile/workspaces 0.8.5 → 0.9.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 (390) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +2 -2
  3. package/dist/asset-manager/index.js +12 -12
  4. package/dist/asset-manager/installer.js +10 -10
  5. package/dist/asset-manager/renderers.js +2 -2
  6. package/dist/asset-manager/scaffold.js +10 -10
  7. package/dist/base-assets/connectors/deploy/adapter.d.ts +21 -19
  8. package/dist/base-assets/connectors/deploy/adapter.d.ts.map +1 -1
  9. package/dist/base-assets/connectors/deploy.js +10 -10
  10. package/dist/base-assets/connectors/devserver/adapter.d.ts +14 -12
  11. package/dist/base-assets/connectors/devserver/adapter.d.ts.map +1 -1
  12. package/dist/base-assets/connectors/devserver.js +10 -10
  13. package/dist/base-assets/connectors/flow/adapter.d.ts +13 -10
  14. package/dist/base-assets/connectors/flow/adapter.d.ts.map +1 -1
  15. package/dist/base-assets/connectors/flow/adapter.js +10 -10
  16. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts +5 -167
  17. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -1
  18. package/dist/base-assets/connectors/flow/engine.js +1 -1
  19. package/dist/base-assets/connectors/flow/index.d.ts +1 -1
  20. package/dist/base-assets/connectors/flow/index.d.ts.map +1 -1
  21. package/dist/base-assets/connectors/flow/run-flow.d.ts.map +1 -1
  22. package/dist/base-assets/connectors/flow/run-flow.js +12 -12
  23. package/dist/base-assets/connectors/flow.js +10 -10
  24. package/dist/base-assets/{mounts → connectors}/git/driver.d.ts +34 -32
  25. package/dist/base-assets/connectors/git/driver.d.ts.map +1 -0
  26. package/dist/base-assets/connectors/git.js +20 -0
  27. package/dist/base-assets/connectors/gmail/adapter.d.ts +16 -15
  28. package/dist/base-assets/connectors/gmail/adapter.d.ts.map +1 -1
  29. package/dist/base-assets/connectors/gmail.js +10 -10
  30. package/dist/base-assets/connectors/local/driver.d.ts +28 -0
  31. package/dist/base-assets/connectors/local/driver.d.ts.map +1 -0
  32. package/dist/base-assets/connectors/local.js +20 -0
  33. package/dist/base-assets/connectors/mattermost/adapter.d.ts +23 -22
  34. package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +1 -1
  35. package/dist/base-assets/connectors/mattermost.js +10 -10
  36. package/dist/base-assets/connectors/memory/adapter.d.ts +18 -17
  37. package/dist/base-assets/connectors/memory/adapter.d.ts.map +1 -1
  38. package/dist/base-assets/connectors/memory.js +10 -10
  39. package/dist/base-assets/connectors/minio/adapter.d.ts +17 -16
  40. package/dist/base-assets/connectors/minio/adapter.d.ts.map +1 -1
  41. package/dist/base-assets/connectors/minio.js +10 -10
  42. package/dist/base-assets/connectors/postgres/adapter.d.ts +17 -21
  43. package/dist/base-assets/connectors/postgres/adapter.d.ts.map +1 -1
  44. package/dist/base-assets/connectors/postgres.js +10 -10
  45. package/dist/base-assets/connectors/redis/adapter.d.ts +19 -19
  46. package/dist/base-assets/connectors/redis/adapter.d.ts.map +1 -1
  47. package/dist/base-assets/connectors/redis.js +10 -10
  48. package/dist/base-assets/connectors/s3/driver.d.ts +46 -0
  49. package/dist/base-assets/connectors/s3/driver.d.ts.map +1 -0
  50. package/dist/base-assets/connectors/s3.js +20 -0
  51. package/dist/base-assets/connectors/sharepoint/driver.d.ts +34 -0
  52. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -0
  53. package/dist/base-assets/connectors/sharepoint.js +20 -0
  54. package/dist/base-assets/connectors/sqlite/adapter.d.ts +16 -16
  55. package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +1 -1
  56. package/dist/base-assets/connectors/sqlite.js +10 -10
  57. package/dist/base-assets/connectors/static-server/adapter.d.ts +16 -12
  58. package/dist/base-assets/connectors/static-server/adapter.d.ts.map +1 -1
  59. package/dist/base-assets/connectors/static-server.js +10 -10
  60. package/dist/base-assets/connectors/tunnel/adapter.d.ts +14 -12
  61. package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +1 -1
  62. package/dist/base-assets/connectors/tunnel.js +10 -10
  63. package/dist/base-assets/connectors/webdav/driver.d.ts +35 -0
  64. package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -0
  65. package/dist/base-assets/connectors/webdav.js +20 -0
  66. package/dist/base-assets/connectors/xstate/adapter.d.ts +18 -16
  67. package/dist/base-assets/connectors/xstate/adapter.d.ts.map +1 -1
  68. package/dist/base-assets/connectors/xstate-store/adapter.d.ts +20 -19
  69. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
  70. package/dist/base-assets/connectors/xstate-store.js +10 -10
  71. package/dist/base-assets/connectors/xstate.js +10 -10
  72. package/dist/base-assets/connectors/yjs/adapter.d.ts +22 -21
  73. package/dist/base-assets/connectors/yjs/adapter.d.ts.map +1 -1
  74. package/dist/base-assets/connectors/yjs.js +10 -10
  75. package/dist/base-assets/index.js.map +1 -1
  76. package/dist/bridge/drivers/claude-sdk.js +3 -3
  77. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  78. package/dist/bridge/drivers/codex.js +2 -2
  79. package/dist/bridge/drivers/echo.js +2 -2
  80. package/dist/bridge/drivers/omp.js +2 -2
  81. package/dist/bridge/index.js +3 -3
  82. package/dist/{chunk-V37HONL7.js → chunk-24UIWON4.js} +61 -6
  83. package/dist/chunk-24UIWON4.js.map +1 -0
  84. package/dist/{chunk-JLPC4YWT.js → chunk-37JKX6D7.js} +3 -4
  85. package/dist/chunk-37JKX6D7.js.map +1 -0
  86. package/dist/{chunk-DOMCYP7D.js → chunk-42OQF7UU.js} +227 -21
  87. package/dist/chunk-42OQF7UU.js.map +1 -0
  88. package/dist/{chunk-65CYXYUW.js → chunk-4RUVG5GX.js} +50 -5
  89. package/dist/chunk-4RUVG5GX.js.map +1 -0
  90. package/dist/{chunk-MJHLQRJJ.js → chunk-5IC6CJL4.js} +11 -29
  91. package/dist/chunk-5IC6CJL4.js.map +1 -0
  92. package/dist/{chunk-MBBTBKAS.js → chunk-5VNUL5KL.js} +3 -3
  93. package/dist/{chunk-MBBTBKAS.js.map → chunk-5VNUL5KL.js.map} +1 -1
  94. package/dist/{chunk-GVOLEJG5.js → chunk-6DEGWPAR.js} +3 -3
  95. package/dist/{chunk-GVOLEJG5.js.map → chunk-6DEGWPAR.js.map} +1 -1
  96. package/dist/{chunk-7HLNUSNE.js → chunk-6FNCZYJY.js} +3 -3
  97. package/dist/{chunk-7HLNUSNE.js.map → chunk-6FNCZYJY.js.map} +1 -1
  98. package/dist/{chunk-D5IH3QMH.js → chunk-7R6W5EQR.js} +20 -19
  99. package/dist/chunk-7R6W5EQR.js.map +1 -0
  100. package/dist/{chunk-TS6VCR4W.js → chunk-DIKFRNCS.js} +3 -3
  101. package/dist/{chunk-TS6VCR4W.js.map → chunk-DIKFRNCS.js.map} +1 -1
  102. package/dist/{chunk-7H7EOIRH.js → chunk-EBMFCF4P.js} +2 -2
  103. package/dist/{chunk-7H7EOIRH.js.map → chunk-EBMFCF4P.js.map} +1 -1
  104. package/dist/{chunk-3W7Z74ZP.js → chunk-EPGHAOEU.js} +5856 -5822
  105. package/dist/chunk-EPGHAOEU.js.map +1 -0
  106. package/dist/{chunk-CSUBFKAN.js → chunk-GAZINYCS.js} +4 -4
  107. package/dist/{chunk-CSUBFKAN.js.map → chunk-GAZINYCS.js.map} +1 -1
  108. package/dist/{chunk-Y46TBPLI.js → chunk-GCJXPUHG.js} +3 -3
  109. package/dist/{chunk-Y46TBPLI.js.map → chunk-GCJXPUHG.js.map} +1 -1
  110. package/dist/{chunk-46T37EBP.js → chunk-GKIA2PU5.js} +7 -35
  111. package/dist/chunk-GKIA2PU5.js.map +1 -0
  112. package/dist/{chunk-EE3XTJ62.js → chunk-I3S4BAAR.js} +7 -7
  113. package/dist/{chunk-EE3XTJ62.js.map → chunk-I3S4BAAR.js.map} +1 -1
  114. package/dist/{chunk-ZUQIXLRJ.js → chunk-ICS76R4T.js} +14 -14
  115. package/dist/chunk-ICS76R4T.js.map +1 -0
  116. package/dist/{chunk-CCKGX5AS.js → chunk-KMIWXGQ7.js} +3 -3
  117. package/dist/{chunk-CCKGX5AS.js.map → chunk-KMIWXGQ7.js.map} +1 -1
  118. package/dist/{chunk-AIGWF3TJ.js → chunk-LDUNTZB6.js} +46 -4
  119. package/dist/chunk-LDUNTZB6.js.map +1 -0
  120. package/dist/{chunk-UMMBL7SW.js → chunk-M2NLRGIX.js} +5 -5
  121. package/dist/{chunk-UMMBL7SW.js.map → chunk-M2NLRGIX.js.map} +1 -1
  122. package/dist/{chunk-Z3RER6YZ.js → chunk-NELZIQ2E.js} +42 -42
  123. package/dist/chunk-NELZIQ2E.js.map +1 -0
  124. package/dist/{chunk-7HCGI2GW.js → chunk-NMREHIHP.js} +37 -29
  125. package/dist/chunk-NMREHIHP.js.map +1 -0
  126. package/dist/{chunk-NYJKXVG6.js → chunk-O32AN5P2.js} +151 -185
  127. package/dist/chunk-O32AN5P2.js.map +1 -0
  128. package/dist/chunk-PBWMV5GM.js +171 -0
  129. package/dist/chunk-PBWMV5GM.js.map +1 -0
  130. package/dist/chunk-R7FOF242.js +59 -0
  131. package/dist/chunk-R7FOF242.js.map +1 -0
  132. package/dist/{chunk-XEGHWFAX.js → chunk-SVNFQSU3.js} +5 -10
  133. package/dist/chunk-SVNFQSU3.js.map +1 -0
  134. package/dist/{chunk-77CUYYO3.js → chunk-VAJB2UJ5.js} +5 -5
  135. package/dist/{chunk-77CUYYO3.js.map → chunk-VAJB2UJ5.js.map} +1 -1
  136. package/dist/{chunk-Q5URN24L.js → chunk-W75ASXH4.js} +23 -27
  137. package/dist/chunk-W75ASXH4.js.map +1 -0
  138. package/dist/{chunk-5CSE3QL2.js → chunk-XIVOEUAF.js} +5 -5
  139. package/dist/{chunk-5CSE3QL2.js.map → chunk-XIVOEUAF.js.map} +1 -1
  140. package/dist/{chunk-BVHFSUFM.js → chunk-ZHLRRT5D.js} +4 -25
  141. package/dist/chunk-ZHLRRT5D.js.map +1 -0
  142. package/dist/{chunk-6UQ66R46.js → chunk-ZWIG55ZX.js} +2 -2
  143. package/dist/{chunk-6UQ66R46.js.map → chunk-ZWIG55ZX.js.map} +1 -1
  144. package/dist/cli/index.js +321 -300
  145. package/dist/cli/index.js.map +1 -1
  146. package/dist/cli/src/commands/connector.d.ts +2 -1
  147. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  148. package/dist/cli/src/commands/logs.d.ts.map +1 -1
  149. package/dist/cli/src/commands/project.d.ts +73 -3
  150. package/dist/cli/src/commands/project.d.ts.map +1 -1
  151. package/dist/cli/src/commands/session-logs/local-query.d.ts +3 -4
  152. package/dist/cli/src/commands/session-logs/local-query.d.ts.map +1 -1
  153. package/dist/cli/src/commands/session-logs/local-tail.d.ts +0 -3
  154. package/dist/cli/src/commands/session-logs/local-tail.d.ts.map +1 -1
  155. package/dist/cli/src/commands/session-logs/sqlite-row.d.ts +0 -26
  156. package/dist/cli/src/commands/session-logs/sqlite-row.d.ts.map +1 -1
  157. package/dist/cli/src/index.d.ts +1 -1
  158. package/dist/connectors/config.js +7 -7
  159. package/dist/connectors/index.js +10 -10
  160. package/dist/connectors/rclone.js +1 -1
  161. package/dist/connectors/src/config.d.ts +9 -10
  162. package/dist/connectors/src/config.d.ts.map +1 -1
  163. package/dist/connectors/src/connector-base.d.ts +23 -0
  164. package/dist/connectors/src/connector-base.d.ts.map +1 -0
  165. package/dist/connectors/src/connector-manager.d.ts +158 -58
  166. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  167. package/dist/connectors/src/connector-prompt.d.ts +72 -0
  168. package/dist/connectors/src/connector-prompt.d.ts.map +1 -0
  169. package/dist/connectors/src/connector-registry.d.ts +34 -35
  170. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  171. package/dist/connectors/src/connector-types.d.ts +147 -60
  172. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  173. package/dist/connectors/src/index.d.ts +17 -23
  174. package/dist/connectors/src/index.d.ts.map +1 -1
  175. package/dist/connectors/src/npm-installer.d.ts +2 -2
  176. package/dist/connectors/src/npm-installer.d.ts.map +1 -1
  177. package/dist/connectors/src/rclone-process-manager.d.ts +1 -1
  178. package/dist/connectors/src/secrets.d.ts +3 -3
  179. package/dist/connectors/src/watcher.d.ts +3 -3
  180. package/dist/connectors/src/watcher.d.ts.map +1 -1
  181. package/dist/connectors-PTCSHCHZ.js +5 -0
  182. package/dist/{connectors-7WS2KOSZ.js.map → connectors-PTCSHCHZ.js.map} +1 -1
  183. package/dist/core/index.js +6 -6
  184. package/dist/core/logging.js +1 -1
  185. package/dist/core/manifest.js +2 -2
  186. package/dist/core/models.js +1 -1
  187. package/dist/core/runtime-assets.js +4 -4
  188. package/dist/core/src/index.d.ts +4 -2
  189. package/dist/core/src/index.d.ts.map +1 -1
  190. package/dist/core/src/logging/index.d.ts +2 -0
  191. package/dist/core/src/logging/index.d.ts.map +1 -1
  192. package/dist/core/src/logging/sinks/sqlite-runtime.d.ts +24 -0
  193. package/dist/core/src/logging/sinks/sqlite-runtime.d.ts.map +1 -0
  194. package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
  195. package/dist/core/src/manifest.d.ts +2 -23
  196. package/dist/core/src/manifest.d.ts.map +1 -1
  197. package/dist/core/src/models.d.ts +1 -1
  198. package/dist/core/src/models.d.ts.map +1 -1
  199. package/dist/core/src/runtime-assets.d.ts +12 -13
  200. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  201. package/dist/core/src/subprocess.d.ts +35 -0
  202. package/dist/core/src/subprocess.d.ts.map +1 -0
  203. package/dist/core/src/workspace-config.d.ts +32 -10
  204. package/dist/core/src/workspace-config.d.ts.map +1 -1
  205. package/dist/core/workspace-config.js +3 -3
  206. package/dist/discovery/index.js +4 -4
  207. package/dist/discovery/src/builtin-providers.d.ts +5 -4
  208. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  209. package/dist/discovery/src/index.d.ts +1 -1
  210. package/dist/discovery/src/index.d.ts.map +1 -1
  211. package/dist/discovery/src/source-config.d.ts +24 -233
  212. package/dist/discovery/src/source-config.d.ts.map +1 -1
  213. package/dist/{flows-ZULSVHX5.js → flows-6BNO4GKK.js} +3 -3
  214. package/dist/{flows-ZULSVHX5.js.map → flows-6BNO4GKK.js.map} +1 -1
  215. package/dist/library/index.js +6 -5
  216. package/dist/library/src/config.d.ts +25 -77
  217. package/dist/library/src/config.d.ts.map +1 -1
  218. package/dist/library/src/index.d.ts +2 -0
  219. package/dist/library/src/index.d.ts.map +1 -1
  220. package/dist/library/src/install/install-from-manifest.d.ts +80 -0
  221. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -0
  222. package/dist/library/src/install/source-fetch-github.d.ts +43 -0
  223. package/dist/library/src/install/source-fetch-github.d.ts.map +1 -0
  224. package/dist/library/src/knowledge/knowledge-manifest.d.ts +3 -17
  225. package/dist/library/src/knowledge/knowledge-manifest.d.ts.map +1 -1
  226. package/dist/library/src/library.d.ts +6 -0
  227. package/dist/library/src/library.d.ts.map +1 -1
  228. package/dist/library/src/local/db.d.ts.map +1 -1
  229. package/dist/library/src/local/library.d.ts +41 -0
  230. package/dist/library/src/local/library.d.ts.map +1 -1
  231. package/dist/library/src/local/schema.d.ts +19 -0
  232. package/dist/library/src/local/schema.d.ts.map +1 -1
  233. package/dist/library/src/remote/remote-catalog-source.d.ts +22 -0
  234. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  235. package/dist/library/src/user-library.d.ts +1 -2
  236. package/dist/library/src/user-library.d.ts.map +1 -1
  237. package/dist/library/src/workspace-config.d.ts +45 -243
  238. package/dist/library/src/workspace-config.d.ts.map +1 -1
  239. package/dist/open-library-S6FK4N4S.js +13 -0
  240. package/dist/{open-library-N5T5HRTS.js.map → open-library-S6FK4N4S.js.map} +1 -1
  241. package/dist/{provider-QXKEDXWJ.js → provider-GAWKFQ3T.js} +20 -4
  242. package/dist/provider-GAWKFQ3T.js.map +1 -0
  243. package/dist/runner/index.js +15 -15
  244. package/dist/runner/src/builtin-capabilities.d.ts.map +1 -1
  245. package/dist/runner/src/define-capability.d.ts +1 -1
  246. package/dist/runner/src/define-capability.d.ts.map +1 -1
  247. package/dist/runner/src/refresh-flag-dispatcher.d.ts +20 -20
  248. package/dist/runner/src/refresh-flag-dispatcher.d.ts.map +1 -1
  249. package/dist/runner/src/resource-handler.d.ts +8 -6
  250. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  251. package/dist/runner/src/resources.d.ts +14 -22
  252. package/dist/runner/src/resources.d.ts.map +1 -1
  253. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  254. package/dist/runner/src/serve.d.ts.map +1 -1
  255. package/dist/runner/src/session-builder.d.ts +5 -7
  256. package/dist/runner/src/session-builder.d.ts.map +1 -1
  257. package/dist/runner/src/workspace-migration.d.ts +2 -2
  258. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  259. package/dist/sdk/asset-manager.js +12 -12
  260. package/dist/sdk/bridge.js +3 -3
  261. package/dist/sdk/core.js +6 -6
  262. package/dist/sdk/flow.js +1 -1
  263. package/dist/sdk/index.js +15 -15
  264. package/dist/sdk/runner.js +15 -15
  265. package/dist/sdk/telemetry.js +1 -1
  266. package/dist/sdk/transport/ws/server.js +1 -1
  267. package/dist/sdk/transport/ws.js +1 -1
  268. package/dist/sdk/transport.js +1 -1
  269. package/dist/{setup-BMTC562F.js → setup-IZG3QE43.js} +10 -10
  270. package/dist/{setup-BMTC562F.js.map → setup-IZG3QE43.js.map} +1 -1
  271. package/dist/source-fetch-github-QN4LLTL5.js +4 -0
  272. package/dist/source-fetch-github-QN4LLTL5.js.map +1 -0
  273. package/dist/store-client-BM3IBDPT.js +14 -0
  274. package/dist/{store-client-X7Y7D5QX.js.map → store-client-BM3IBDPT.js.map} +1 -1
  275. package/dist/telemetry/index.js +1 -1
  276. package/dist/transport/index.js +1 -1
  277. package/dist/transport/src/ws/server.d.ts +11 -8
  278. package/dist/transport/src/ws/server.d.ts.map +1 -1
  279. package/dist/transport/ws/server.js +1 -1
  280. package/dist/transport/ws.js +1 -1
  281. package/dist/tui/index.js +16 -25
  282. package/dist/tui/index.js.map +1 -1
  283. package/dist/tui/src/repl.d.ts.map +1 -1
  284. package/dist/types/manifests.js +1 -1
  285. package/dist/types/src/index.d.ts +1 -0
  286. package/dist/types/src/index.d.ts.map +1 -1
  287. package/dist/types/src/install-manifest.d.ts +33 -0
  288. package/dist/types/src/install-manifest.d.ts.map +1 -0
  289. package/dist/types/src/manifests/_shared.d.ts +39 -100
  290. package/dist/types/src/manifests/_shared.d.ts.map +1 -1
  291. package/dist/types/src/manifests/agent.d.ts +43 -248
  292. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  293. package/dist/types/src/manifests/connector.d.ts +7 -107
  294. package/dist/types/src/manifests/connector.d.ts.map +1 -1
  295. package/dist/types/src/manifests/contract.d.ts +10 -75
  296. package/dist/types/src/manifests/contract.d.ts.map +1 -1
  297. package/dist/types/src/manifests/mcp-server.d.ts +9 -29
  298. package/dist/types/src/manifests/mcp-server.d.ts.map +1 -1
  299. package/dist/types/src/manifests/mount.d.ts +4 -76
  300. package/dist/types/src/manifests/mount.d.ts.map +1 -1
  301. package/dist/types/src/manifests/persona.d.ts +10 -75
  302. package/dist/types/src/manifests/persona.d.ts.map +1 -1
  303. package/dist/types/src/manifests/preset.d.ts +82 -642
  304. package/dist/types/src/manifests/preset.d.ts.map +1 -1
  305. package/dist/types/src/manifests/prompt.d.ts +10 -75
  306. package/dist/types/src/manifests/prompt.d.ts.map +1 -1
  307. package/dist/types/src/manifests/ruleset.d.ts +10 -75
  308. package/dist/types/src/manifests/ruleset.d.ts.map +1 -1
  309. package/dist/types/src/manifests/skill.d.ts +46 -2328
  310. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  311. package/dist/validator-47SQUW3J.js +5 -0
  312. package/dist/{validator-764EQNM3.js.map → validator-47SQUW3J.js.map} +1 -1
  313. package/dist/workspace-plugin/adapters/mcp.js +8 -9
  314. package/dist/workspace-plugin/adapters/mcp.js.map +1 -1
  315. package/dist/workspace-plugin/adapters/omp.js +19 -18
  316. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  317. package/dist/workspace-plugin/index.js +2 -2
  318. package/dist/workspace-plugin/src/adapters/mcp.d.ts.map +1 -1
  319. package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
  320. package/dist/workspace-plugin/src/plugin.d.ts +5 -3
  321. package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
  322. package/dist/workspace-plugin/src/tools/connectors.d.ts +38 -0
  323. package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
  324. package/dist/workspace-plugin/src/tools/validator.d.ts +6 -4
  325. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  326. package/package.json +217 -117
  327. package/dist/base-assets/mounts/git/driver.d.ts.map +0 -1
  328. package/dist/base-assets/mounts/git.js +0 -20
  329. package/dist/base-assets/mounts/local/driver.d.ts +0 -27
  330. package/dist/base-assets/mounts/local/driver.d.ts.map +0 -1
  331. package/dist/base-assets/mounts/local.js +0 -20
  332. package/dist/base-assets/mounts/s3/driver.d.ts +0 -27
  333. package/dist/base-assets/mounts/s3/driver.d.ts.map +0 -1
  334. package/dist/base-assets/mounts/s3.js +0 -20
  335. package/dist/base-assets/mounts/sharepoint/driver.d.ts +0 -31
  336. package/dist/base-assets/mounts/sharepoint/driver.d.ts.map +0 -1
  337. package/dist/base-assets/mounts/sharepoint.js +0 -20
  338. package/dist/base-assets/mounts/webdav/driver.d.ts +0 -32
  339. package/dist/base-assets/mounts/webdav/driver.d.ts.map +0 -1
  340. package/dist/base-assets/mounts/webdav.js +0 -20
  341. package/dist/chunk-3W7Z74ZP.js.map +0 -1
  342. package/dist/chunk-46T37EBP.js.map +0 -1
  343. package/dist/chunk-65CYXYUW.js.map +0 -1
  344. package/dist/chunk-7HCGI2GW.js.map +0 -1
  345. package/dist/chunk-AIGWF3TJ.js.map +0 -1
  346. package/dist/chunk-BVHFSUFM.js.map +0 -1
  347. package/dist/chunk-D5IH3QMH.js.map +0 -1
  348. package/dist/chunk-DOMCYP7D.js.map +0 -1
  349. package/dist/chunk-JLPC4YWT.js.map +0 -1
  350. package/dist/chunk-MJHLQRJJ.js.map +0 -1
  351. package/dist/chunk-NYJKXVG6.js.map +0 -1
  352. package/dist/chunk-Q5URN24L.js.map +0 -1
  353. package/dist/chunk-QT2KQHDT.js +0 -49
  354. package/dist/chunk-QT2KQHDT.js.map +0 -1
  355. package/dist/chunk-V37HONL7.js.map +0 -1
  356. package/dist/chunk-XEGHWFAX.js.map +0 -1
  357. package/dist/chunk-XOSBNBB6.js +0 -155
  358. package/dist/chunk-XOSBNBB6.js.map +0 -1
  359. package/dist/chunk-Z3RER6YZ.js.map +0 -1
  360. package/dist/chunk-ZUQIXLRJ.js.map +0 -1
  361. package/dist/cli/src/commands/mount.d.ts +0 -22
  362. package/dist/cli/src/commands/mount.d.ts.map +0 -1
  363. package/dist/connectors/src/adapters/base.d.ts +0 -66
  364. package/dist/connectors/src/adapters/base.d.ts.map +0 -1
  365. package/dist/connectors/src/connector-tools.d.ts +0 -61
  366. package/dist/connectors/src/connector-tools.d.ts.map +0 -1
  367. package/dist/connectors/src/drivers/base.d.ts +0 -44
  368. package/dist/connectors/src/drivers/base.d.ts.map +0 -1
  369. package/dist/connectors/src/mount-manager.d.ts +0 -147
  370. package/dist/connectors/src/mount-manager.d.ts.map +0 -1
  371. package/dist/connectors/src/mount-prompt.d.ts +0 -13
  372. package/dist/connectors/src/mount-prompt.d.ts.map +0 -1
  373. package/dist/connectors/src/mount-registry.d.ts +0 -61
  374. package/dist/connectors/src/mount-registry.d.ts.map +0 -1
  375. package/dist/connectors/src/mount-types.d.ts +0 -222
  376. package/dist/connectors/src/mount-types.d.ts.map +0 -1
  377. package/dist/connectors-7WS2KOSZ.js +0 -5
  378. package/dist/mounts-PQLFYD2C.js +0 -5
  379. package/dist/mounts-PQLFYD2C.js.map +0 -1
  380. package/dist/open-library-N5T5HRTS.js +0 -12
  381. package/dist/provider-QXKEDXWJ.js.map +0 -1
  382. package/dist/store-client-X7Y7D5QX.js +0 -14
  383. package/dist/validator-764EQNM3.js +0 -5
  384. package/dist/workspace-plugin/src/tools/mounts.d.ts +0 -51
  385. package/dist/workspace-plugin/src/tools/mounts.d.ts.map +0 -1
  386. /package/dist/base-assets/{mounts → connectors}/git.js.map +0 -0
  387. /package/dist/base-assets/{mounts → connectors}/local.js.map +0 -0
  388. /package/dist/base-assets/{mounts → connectors}/s3.js.map +0 -0
  389. /package/dist/base-assets/{mounts → connectors}/sharepoint.js.map +0 -0
  390. /package/dist/base-assets/{mounts → connectors}/webdav.js.map +0 -0
@@ -0,0 +1,171 @@
1
+ import { createServer } from 'http';
2
+ import { WebSocketServer } from 'ws';
3
+
4
+ // transport/src/ws/server.ts
5
+ function validateSessionInitShape(cmd) {
6
+ if (cmd.type !== "session_init") return "type must be 'session_init'";
7
+ const identity = cmd.identity;
8
+ if (!identity || typeof identity !== "object" || Array.isArray(identity)) {
9
+ return "identity must be an object";
10
+ }
11
+ if (typeof identity.containerId !== "string") return "identity.containerId must be a string";
12
+ if (typeof identity.sessionId !== "string") return "identity.sessionId must be a string";
13
+ if (typeof identity.projectId !== "string") return "identity.projectId must be a string";
14
+ const protocolVersion = cmd.protocolVersion;
15
+ if (!protocolVersion || typeof protocolVersion !== "object" || Array.isArray(protocolVersion)) {
16
+ return "protocolVersion must be an object";
17
+ }
18
+ if (typeof protocolVersion.major !== "number") return "protocolVersion.major must be a number";
19
+ if (typeof protocolVersion.minor !== "number") return "protocolVersion.minor must be a number";
20
+ if (typeof protocolVersion.patch !== "number") return "protocolVersion.patch must be a number";
21
+ if (!cmd.resolvedConfig || typeof cmd.resolvedConfig !== "object" || Array.isArray(cmd.resolvedConfig)) {
22
+ return "resolvedConfig must be an object";
23
+ }
24
+ if (!cmd.credentials || typeof cmd.credentials !== "object" || Array.isArray(cmd.credentials)) {
25
+ return "credentials must be an object";
26
+ }
27
+ return null;
28
+ }
29
+ var WebSocketServerTransport = class {
30
+ httpServer = null;
31
+ wss = null;
32
+ activeClient = null;
33
+ port;
34
+ log;
35
+ commandHandlers = /* @__PURE__ */ new Set();
36
+ connectHandlers = /* @__PURE__ */ new Set();
37
+ disconnectHandlers = /* @__PURE__ */ new Set();
38
+ constructor(options) {
39
+ this.port = options.port;
40
+ this.log = options.onLog ?? console.log;
41
+ }
42
+ /** Start the server and accept connections. */
43
+ async listen() {
44
+ const httpServer = createServer((_req, res) => {
45
+ res.writeHead(200, { "content-type": "text/plain" });
46
+ res.end("skaile agent server");
47
+ });
48
+ const wss = new WebSocketServer({ server: httpServer });
49
+ wss.on("connection", (ws) => this.handleConnection(ws));
50
+ this.httpServer = httpServer;
51
+ this.wss = wss;
52
+ await new Promise((resolve, reject) => {
53
+ httpServer.once("error", reject);
54
+ httpServer.listen(this.port, () => {
55
+ httpServer.off("error", reject);
56
+ resolve();
57
+ });
58
+ });
59
+ const addr = httpServer.address();
60
+ const boundPort = typeof addr === "object" && addr ? addr.port : this.port;
61
+ this.log(`[ws-server] listening on port ${boundPort}`);
62
+ }
63
+ handleConnection(ws) {
64
+ if (this.activeClient) {
65
+ this.log("[ws-server] replacing previous connection");
66
+ try {
67
+ this.activeClient.close(4001, "Replaced by new connection");
68
+ } catch {
69
+ }
70
+ }
71
+ this.log("[ws-server] client connected");
72
+ this.activeClient = ws;
73
+ for (const handler of this.connectHandlers) {
74
+ handler();
75
+ }
76
+ ws.on("message", (data) => {
77
+ try {
78
+ const parsed = JSON.parse(String(data));
79
+ if (parsed && typeof parsed === "object" && parsed.type === "session_init") {
80
+ const reason = validateSessionInitShape(parsed);
81
+ if (reason !== null) {
82
+ this.log(`[ws-server] rejecting invalid session_init: ${reason}`);
83
+ this.sendRaw({
84
+ type: "error",
85
+ message: `Invalid session_init: ${reason}`,
86
+ fatal: false
87
+ });
88
+ return;
89
+ }
90
+ }
91
+ const cmd = parsed;
92
+ for (const handler of this.commandHandlers) {
93
+ handler(cmd);
94
+ }
95
+ } catch (err) {
96
+ this.sendRaw({
97
+ type: "error",
98
+ message: `Invalid message: ${err instanceof Error ? err.message : String(err)}`,
99
+ fatal: false
100
+ });
101
+ }
102
+ });
103
+ ws.on("close", () => {
104
+ this.log("[ws-server] client disconnected");
105
+ if (this.activeClient === ws) {
106
+ this.activeClient = null;
107
+ for (const handler of this.disconnectHandlers) {
108
+ handler();
109
+ }
110
+ }
111
+ });
112
+ }
113
+ /**
114
+ * Stop the server.
115
+ *
116
+ * Terminates the active socket immediately — otherwise a still-connected
117
+ * client would keep the event loop alive and block process shutdown.
118
+ */
119
+ async close() {
120
+ try {
121
+ this.activeClient?.terminate();
122
+ } catch {
123
+ }
124
+ this.activeClient = null;
125
+ this.wss?.close();
126
+ this.wss = null;
127
+ const httpServer = this.httpServer;
128
+ this.httpServer = null;
129
+ if (httpServer) {
130
+ httpServer.closeAllConnections();
131
+ await new Promise((resolve) => httpServer.close(() => resolve()));
132
+ }
133
+ }
134
+ send(event) {
135
+ this.sendRaw(event);
136
+ }
137
+ onCommand(handler) {
138
+ this.commandHandlers.add(handler);
139
+ return () => {
140
+ this.commandHandlers.delete(handler);
141
+ };
142
+ }
143
+ onConnect(handler) {
144
+ this.connectHandlers.add(handler);
145
+ return () => {
146
+ this.connectHandlers.delete(handler);
147
+ };
148
+ }
149
+ onDisconnect(handler) {
150
+ this.disconnectHandlers.add(handler);
151
+ return () => {
152
+ this.disconnectHandlers.delete(handler);
153
+ };
154
+ }
155
+ get connected() {
156
+ return this.activeClient !== null;
157
+ }
158
+ sendRaw(data) {
159
+ try {
160
+ const client = this.activeClient;
161
+ if (client && client.readyState === 1) {
162
+ client.send(JSON.stringify(data));
163
+ }
164
+ } catch {
165
+ }
166
+ }
167
+ };
168
+
169
+ export { WebSocketServerTransport };
170
+ //# sourceMappingURL=chunk-PBWMV5GM.js.map
171
+ //# sourceMappingURL=chunk-PBWMV5GM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../transport/src/ws/server.ts"],"names":[],"mappings":"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","file":"chunk-PBWMV5GM.js","sourcesContent":["/**\n * WebSocketServerTransport — `ws`-based WebSocket server.\n *\n * Accepts one client at a time. Implements ServerTransport from @skaile/workspaces/types.\n * Built on the `ws` package + `node:http`, both of which run under Node and Bun.\n */\n\nimport { createServer, type Server as HttpServer } from \"node:http\";\nimport type { AgentCommand, AgentEvent, ServerTransport } from \"@skaile/workspaces/types\";\nimport { type WebSocket, WebSocketServer } from \"ws\";\n\n/**\n * Options for {@link WebSocketServerTransport}.\n *\n * @param port - TCP port to bind to.\n * @param onLog - Optional callback for internal log lines (client connect/disconnect events).\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport interface WebSocketServerOptions {\n port: number;\n onLog?: (line: string) => void;\n}\n\n/**\n * Shape-validate a `session_init` frame at ingress before forwarding to the\n * runner. Protocol v3 requires the deterministic bootstrap envelope to carry\n * an identity tuple, a semver-shaped `protocolVersion`, a resolved config\n * object, and a `credentials` map keyed by `mounts` / `connectors`. Frames\n * that fail the guard are rejected on the wire so the runner never sees a\n * malformed boot envelope.\n *\n * Returns `null` when the frame is well-formed, or a human-readable reason\n * when it should be rejected.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"SessionInitCommand schema\".\n *\n * @internal\n */\nfunction validateSessionInitShape(cmd: Record<string, unknown>): string | null {\n if (cmd.type !== \"session_init\") return \"type must be 'session_init'\";\n\n const identity = cmd.identity as Record<string, unknown> | undefined;\n if (!identity || typeof identity !== \"object\" || Array.isArray(identity)) {\n return \"identity must be an object\";\n }\n if (typeof identity.containerId !== \"string\") return \"identity.containerId must be a string\";\n if (typeof identity.sessionId !== \"string\") return \"identity.sessionId must be a string\";\n if (typeof identity.projectId !== \"string\") return \"identity.projectId must be a string\";\n\n const protocolVersion = cmd.protocolVersion as Record<string, unknown> | undefined;\n if (!protocolVersion || typeof protocolVersion !== \"object\" || Array.isArray(protocolVersion)) {\n return \"protocolVersion must be an object\";\n }\n if (typeof protocolVersion.major !== \"number\") return \"protocolVersion.major must be a number\";\n if (typeof protocolVersion.minor !== \"number\") return \"protocolVersion.minor must be a number\";\n if (typeof protocolVersion.patch !== \"number\") return \"protocolVersion.patch must be a number\";\n\n if (\n !cmd.resolvedConfig ||\n typeof cmd.resolvedConfig !== \"object\" ||\n Array.isArray(cmd.resolvedConfig)\n ) {\n return \"resolvedConfig must be an object\";\n }\n\n if (!cmd.credentials || typeof cmd.credentials !== \"object\" || Array.isArray(cmd.credentials)) {\n return \"credentials must be an object\";\n }\n\n return null;\n}\n\n/**\n * `ServerTransport` implementation backed by the `ws` package on top of a\n * `node:http` server.\n *\n * Enforces a single-client policy: if a new connection arrives while a client is\n * already connected, the stale connection is closed with code 4001 and replaced.\n * Incoming frames are parsed as JSON `AgentCommand` messages and fanned out to\n * registered `onCommand` handlers; outgoing `AgentEvent` objects are JSON-serialised\n * before sending. Call `listen()` to start accepting connections and `close()` to\n * shut down cleanly — `close()` terminates the active socket immediately rather\n * than keeping the event loop alive.\n *\n * @example\n * ```ts\n * const server = new WebSocketServerTransport({ port: 8080 });\n * await server.listen();\n * server.onCommand((cmd) => console.log(cmd));\n * server.send({ type: 'agent_end' });\n * await server.close();\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport class WebSocketServerTransport implements ServerTransport {\n private httpServer: HttpServer | null = null;\n private wss: WebSocketServer | null = null;\n private activeClient: WebSocket | null = null;\n private readonly port: number;\n private readonly log: (line: string) => void;\n\n private readonly commandHandlers = new Set<(command: AgentCommand) => void>();\n private readonly connectHandlers = new Set<() => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketServerOptions) {\n this.port = options.port;\n this.log = options.onLog ?? console.log;\n }\n\n /** Start the server and accept connections. */\n async listen(): Promise<void> {\n const httpServer = createServer((_req, res) => {\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"skaile agent server\");\n });\n const wss = new WebSocketServer({ server: httpServer });\n wss.on(\"connection\", (ws) => this.handleConnection(ws));\n this.httpServer = httpServer;\n this.wss = wss;\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n httpServer.listen(this.port, () => {\n httpServer.off(\"error\", reject);\n resolve();\n });\n });\n\n const addr = httpServer.address();\n const boundPort = typeof addr === \"object\" && addr ? addr.port : this.port;\n this.log(`[ws-server] listening on port ${boundPort}`);\n }\n\n private handleConnection(ws: WebSocket): void {\n if (this.activeClient) {\n // Close the stale connection instead of rejecting the new one.\n // This handles the race where waitForWsReady's probe hasn't\n // fully disconnected before the real gateway client connects.\n this.log(\"[ws-server] replacing previous connection\");\n try {\n this.activeClient.close(4001, \"Replaced by new connection\");\n } catch {\n // already closed\n }\n }\n this.log(\"[ws-server] client connected\");\n this.activeClient = ws;\n for (const handler of this.connectHandlers) {\n handler();\n }\n\n ws.on(\"message\", (data) => {\n try {\n const parsed = JSON.parse(String(data)) as Record<string, unknown>;\n // Protocol v3: shape-validate `session_init` at ingress so the\n // runner never receives a malformed boot envelope. Other command\n // shapes pass through unchanged — invalid `AgentCommand`s surface\n // through the existing per-command handlers in serve.ts.\n if (parsed && typeof parsed === \"object\" && parsed.type === \"session_init\") {\n const reason = validateSessionInitShape(parsed);\n if (reason !== null) {\n this.log(`[ws-server] rejecting invalid session_init: ${reason}`);\n this.sendRaw({\n type: \"error\",\n message: `Invalid session_init: ${reason}`,\n fatal: false,\n });\n return;\n }\n }\n const cmd = parsed as unknown as AgentCommand;\n for (const handler of this.commandHandlers) {\n handler(cmd);\n }\n } catch (err) {\n this.sendRaw({\n type: \"error\",\n message: `Invalid message: ${err instanceof Error ? err.message : String(err)}`,\n fatal: false,\n });\n }\n });\n\n ws.on(\"close\", () => {\n this.log(\"[ws-server] client disconnected\");\n if (this.activeClient === ws) {\n this.activeClient = null;\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n }\n });\n }\n\n /**\n * Stop the server.\n *\n * Terminates the active socket immediately — otherwise a still-connected\n * client would keep the event loop alive and block process shutdown.\n */\n async close(): Promise<void> {\n try {\n this.activeClient?.terminate();\n } catch {\n // already closed\n }\n this.activeClient = null;\n this.wss?.close();\n this.wss = null;\n const httpServer = this.httpServer;\n this.httpServer = null;\n if (httpServer) {\n httpServer.closeAllConnections();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n }\n }\n\n send(event: AgentEvent): void {\n this.sendRaw(event);\n }\n\n onCommand(handler: (command: AgentCommand) => void): () => void {\n this.commandHandlers.add(handler);\n return () => {\n this.commandHandlers.delete(handler);\n };\n }\n\n onConnect(handler: () => void): () => void {\n this.connectHandlers.add(handler);\n return () => {\n this.connectHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.activeClient !== null;\n }\n\n private sendRaw(data: unknown): void {\n try {\n const client = this.activeClient;\n if (client && client.readyState === 1) {\n client.send(JSON.stringify(data));\n }\n } catch {\n // Silently ignore send failures\n }\n }\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import { Octokit } from '@octokit/rest';
2
+
3
+ // library/src/install/source-fetch-github.ts
4
+ var GITHUB_PAT_ENV = "SKAILE_GITHUB_PAT";
5
+ function parseRepo(url) {
6
+ const m = url.match(/github\.com[/:]([^/]+)\/([^/]+?)(?:\.git)?(?:[/#?].*)?$/i);
7
+ if (!m) throw new Error(`unsupported source URL: ${url}`);
8
+ return { owner: m[1], repo: m[2] };
9
+ }
10
+ async function fetchAssetFilesFromGitHub(opts) {
11
+ if (!/^[0-9a-f]{40}$/i.test(opts.commitSha)) {
12
+ throw new Error(
13
+ `pinned commit must be a 40-character hex SHA, got '${opts.commitSha}' \u2014 a branch or tag would make the install mutable`
14
+ );
15
+ }
16
+ const octo = opts.octokit ?? new Octokit({ auth: process.env[GITHUB_PAT_ENV] });
17
+ const { owner, repo } = parseRepo(opts.url);
18
+ let tree;
19
+ try {
20
+ tree = await octo.rest.git.getTree({
21
+ owner,
22
+ repo,
23
+ tree_sha: opts.commitSha,
24
+ recursive: "true"
25
+ });
26
+ } catch (e) {
27
+ throw new Error(`unreachable: cannot read tree at ${opts.commitSha}: ${e.message}`);
28
+ }
29
+ const byPath = /* @__PURE__ */ new Map();
30
+ for (const node of tree.data.tree) {
31
+ if (node.type === "blob" && node.path && node.sha) {
32
+ byPath.set(node.path, node.sha);
33
+ }
34
+ }
35
+ const result = {};
36
+ for (const path of opts.paths) {
37
+ const blobSha = byPath.get(path);
38
+ if (!blobSha) {
39
+ if (tree.data.truncated) {
40
+ throw new Error(
41
+ `tree truncated \u2014 repo too large for recursive listing at ${opts.commitSha}`
42
+ );
43
+ }
44
+ throw new Error(`unreachable: path not in tree: ${path}`);
45
+ }
46
+ const blob = await octo.rest.git.getBlob({ owner, repo, file_sha: blobSha });
47
+ if (blob.data.encoding !== "base64") {
48
+ throw new Error(
49
+ `unreachable: blob ${path} has unsupported encoding '${blob.data.encoding}' (likely too large)`
50
+ );
51
+ }
52
+ result[path] = Buffer.from(blob.data.content, "base64");
53
+ }
54
+ return result;
55
+ }
56
+
57
+ export { GITHUB_PAT_ENV, fetchAssetFilesFromGitHub };
58
+ //# sourceMappingURL=chunk-R7FOF242.js.map
59
+ //# sourceMappingURL=chunk-R7FOF242.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../library/src/install/source-fetch-github.ts"],"names":[],"mappings":"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","file":"chunk-R7FOF242.js","sourcesContent":["/**\n * GitHub asset-byte fetcher for the pointer-only install path.\n *\n * Given an upstream repo URL and a pinned commit SHA, walks the recursive\n * git tree at that commit and fetches the blob bytes for each requested path.\n * The Catalog never serves asset bytes — it only hands clients the Pointer\n * Triple (`source.url` + `source.commitSha` + per-file `{path, sha256}`),\n * and `installFromManifest` verifies every byte against those hashes.\n *\n * Authentication: an optional GitHub PAT is read from the `SKAILE_GITHUB_PAT`\n * environment variable when no `octokit` instance is injected. Public repos\n * work unauthenticated (subject to GitHub's anonymous rate limit).\n *\n * @docLink packages/library/concepts#install\n */\n\nimport { Octokit } from \"@octokit/rest\";\n\n/** GitHub PAT environment variable used when no Octokit is injected. */\nexport const GITHUB_PAT_ENV = \"SKAILE_GITHUB_PAT\";\n\n/**\n * Options for {@link fetchAssetFilesFromGitHub}.\n */\nexport interface FetchOpts {\n /** Upstream repo URL (e.g. `https://github.com/skaile-ai/skaile-ai-assets`). */\n url: string;\n /** Immutable 40-char git commit SHA the asset version was pinned at. */\n commitSha: string;\n /** Repo-relative paths to fetch. */\n paths: string[];\n /** Optional Octokit instance — injectable for tests. */\n octokit?: Octokit;\n}\n\n/**\n * Parse `{ owner, repo }` out of a GitHub repo URL.\n *\n * Accepts both HTTPS (`https://github.com/owner/repo[.git]`) and SCP-style\n * SSH (`git@github.com:owner/repo[.git]`) forms.\n */\nfunction parseRepo(url: string): { owner: string; repo: string } {\n // Repo names may contain dots (e.g. `skaile-ai/www.skaile.ai`). Capture the\n // full repo segment up to a path separator / end-of-string, and strip an\n // optional trailing `.git` suffix only.\n const m = url.match(/github\\.com[/:]([^/]+)\\/([^/]+?)(?:\\.git)?(?:[/#?].*)?$/i);\n if (!m) throw new Error(`unsupported source URL: ${url}`);\n return { owner: m[1]!, repo: m[2]! };\n}\n\n/**\n * Fetch the bytes of each requested path from a GitHub repo at a pinned commit.\n *\n * Reads the recursive git tree at `commitSha`, maps each blob path to its blob\n * SHA, then fetches each requested path's blob and base64-decodes it.\n *\n * @returns A `{ path → Buffer }` map covering every requested path.\n * @throws An error whose message matches `/unreachable/i` if the tree cannot\n * be read or any requested path is absent from the tree.\n */\nexport async function fetchAssetFilesFromGitHub(opts: FetchOpts): Promise<Record<string, Buffer>> {\n // The pointer-only integrity model depends on `commitSha` being an immutable\n // git commit SHA. GitHub's tree API also accepts branch/tag names, which\n // would produce a mutable fetch and a non-pinned `Instance.sourceCommitSha` —\n // silently breaking the auditable/re-verifiable guarantee. Reject anything\n // that is not exactly 40 hex characters.\n if (!/^[0-9a-f]{40}$/i.test(opts.commitSha)) {\n throw new Error(\n `pinned commit must be a 40-character hex SHA, got '${opts.commitSha}' — ` +\n \"a branch or tag would make the install mutable\",\n );\n }\n const octo = opts.octokit ?? new Octokit({ auth: process.env[GITHUB_PAT_ENV] });\n const { owner, repo } = parseRepo(opts.url);\n\n let tree: Awaited<ReturnType<typeof octo.rest.git.getTree>>;\n try {\n tree = await octo.rest.git.getTree({\n owner,\n repo,\n tree_sha: opts.commitSha,\n recursive: \"true\",\n });\n } catch (e) {\n throw new Error(`unreachable: cannot read tree at ${opts.commitSha}: ${(e as Error).message}`);\n }\n\n // path → blob SHA\n const byPath = new Map<string, string>();\n for (const node of tree.data.tree) {\n if (node.type === \"blob\" && node.path && node.sha) {\n byPath.set(node.path, node.sha);\n }\n }\n\n const result: Record<string, Buffer> = {};\n for (const path of opts.paths) {\n const blobSha = byPath.get(path);\n if (!blobSha) {\n // [H1] A recursive tree listing is truncated for large repos\n // (`data.truncated: true`). A path missing from a truncated listing is\n // not necessarily absent from the repo — surface a distinct, accurate\n // error rather than the misleading \"path not in tree\".\n if (tree.data.truncated) {\n throw new Error(\n `tree truncated — repo too large for recursive listing at ${opts.commitSha}`,\n );\n }\n throw new Error(`unreachable: path not in tree: ${path}`);\n }\n const blob = await octo.rest.git.getBlob({ owner, repo, file_sha: blobSha });\n // [L2] GitHub returns `encoding: \"none\"` (with empty content) for blobs\n // larger than ~1MB. Only base64 is decodable here — fail loudly otherwise.\n if (blob.data.encoding !== \"base64\") {\n throw new Error(\n `unreachable: blob ${path} has unsupported encoding '${blob.data.encoding}' (likely too large)`,\n );\n }\n result[path] = Buffer.from(blob.data.content, \"base64\");\n }\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { resolveSkWorkspaceConfig, readLinks } from './chunk-CSUBFKAN.js';
2
- import { scanDirectory } from './chunk-BVHFSUFM.js';
1
+ import { resolveSkWorkspaceConfig, readLinks } from './chunk-GAZINYCS.js';
2
+ import { scanDirectory } from './chunk-ZHLRRT5D.js';
3
3
  import { existsSync, readFileSync, lstatSync } from 'fs';
4
4
  import { resolve, join, dirname } from 'path';
5
5
  import { fileURLToPath } from 'url';
@@ -78,9 +78,7 @@ async function populate(projectDir, target) {
78
78
  continue;
79
79
  }
80
80
  try {
81
- const entries = scanDirectory(repoDir, name).filter(
82
- (e) => e.kind === "mount" || e.kind === "connector"
83
- );
81
+ const entries = scanDirectory(repoDir, name).filter((e) => e.kind === "connector");
84
82
  target.catalogEntries.push(...entries);
85
83
  } catch (err) {
86
84
  target.warnings.push({
@@ -90,9 +88,6 @@ async function populate(projectDir, target) {
90
88
  });
91
89
  }
92
90
  }
93
- for (const m of config.mounts ?? []) {
94
- target.implicitRefs.push({ kind: "mount", name: m.driver, declarationId: m.id });
95
- }
96
91
  for (const c of config.connectors ?? []) {
97
92
  target.implicitRefs.push({ kind: "connector", name: c.driver, declarationId: c.id });
98
93
  }
@@ -170,5 +165,5 @@ function findCatalogEntry(entries, query) {
170
165
  }
171
166
 
172
167
  export { BASE_ASSETS_REPO_NAME, resolveBaseAssetsRoot, resolveRuntimeAssets };
173
- //# sourceMappingURL=chunk-XEGHWFAX.js.map
174
- //# sourceMappingURL=chunk-XEGHWFAX.js.map
168
+ //# sourceMappingURL=chunk-SVNFQSU3.js.map
169
+ //# sourceMappingURL=chunk-SVNFQSU3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/src/runtime-assets.ts"],"names":["resolvePath","require"],"mappings":"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","file":"chunk-SVNFQSU3.js","sourcesContent":["/**\n * Runtime asset resolution — read `skaile.yaml`, scan all declared repositories\n * (including the built-in `base-assets/` directory as an implicit default), and\n * produce a unified view of connector catalog entries plus the implicit refs\n * that the `skaile.yaml` `connectors:` section adds to the dependency graph.\n *\n * This module is the single source of truth for \"which connectors does this\n * project see at runtime, and where do their implementations live on disk\".\n * Both the runner (serve, REPL, flow) and the platform's mid-session\n * `add_resource` flow consume `RuntimeAssetsResult.catalogEntries` and pass\n * it into `ConnectorManager` for catalog-based resolution.\n *\n * `base-assets/` is a subdirectory of the single published `@skaile/workspaces`\n * package — not a standalone package. Its on-disk path is resolved with this\n * precedence:\n * 1. `process.env.SKAILE_BASE_ASSETS_DIR` — set by the agent container at\n * runtime to point at `/app/base-assets/`.\n * 2. `require.resolve('@skaile/workspaces/package.json')` + `base-assets/` —\n * works when `@skaile/workspaces` is installed as a dependency.\n * 3. Walk upward from this module's location for the `@skaile/workspaces`\n * package root (a `package.json` whose `name` is `@skaile/workspaces`)\n * that contains a `base-assets/` subdirectory. This is the dev-workspace\n * fallback — it is bounded and works regardless of where the consumer\n * lives in the tree.\n */\n\nimport { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport type { CatalogEntry } from \"./models.js\";\nimport { scanDirectory } from \"./manifest.js\";\nimport type { RepositoryDeclaration } from \"./workspace-config.js\";\nimport { resolveSkWorkspaceConfig } from \"./workspace-config.js\";\nimport { readLinks } from \"./repo-manager.js\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Catalog entry filtered to mount/connector kinds. Same shape as `CatalogEntry`.\n * @docLink packages/core/concepts#runtime-catalog-entry\n */\nexport type RuntimeCatalogEntry = CatalogEntry;\n\n/**\n * Implicit catalog reference derived from a `connectors:` declaration in `skaile.yaml`.\n * Each connector driver becomes an implicit ref that must be resolved in the catalog.\n * @docLink packages/core/concepts#runtime-asset-ref\n */\nexport interface RuntimeAssetRef {\n kind: \"connector\";\n /** Driver name — matches `RuntimeCatalogEntry.name`. */\n name: string;\n /** Source declaration id from `skaile.yaml`. */\n declarationId: string;\n}\n\n/**\n * Aggregated npm packages required by all resolved mount/connector adapters.\n * Populated from `metadata.npm_deps` in each matched catalog entry.\n * @docLink packages/core/concepts#runtime-npm-deps\n */\nexport interface RuntimeNpmDeps {\n required: string[];\n optional: string[];\n}\n\n/**\n * Non-fatal warning emitted during `resolveRuntimeAssets` when a repo is unavailable\n * or a driver is not found in any catalog.\n * @docLink packages/core/concepts#runtime-asset-warning\n */\nexport interface RuntimeAssetWarning {\n /** Stable code for filtering / structured logging. */\n code: \"missing_driver\" | \"repo_unavailable\" | \"invalid_repo_decl\";\n message: string;\n /** Declaration id when applicable. */\n declarationId?: string;\n /** Driver / repository name when applicable. */\n name?: string;\n}\n\n/**\n * Repository name used for the implicit `@skaile/base-assets` catalog entry.\n * Callers can override this repo by declaring `repositories: { base-assets: ... }` in `skaile.yaml`.\n * @docLink packages/core/concepts#base-assets-repo-name\n */\nexport const BASE_ASSETS_REPO_NAME = \"base-assets\";\n\n/**\n * Result of `resolveRuntimeAssets`.\n * The same object is mutated in place by `refresh()`, allowing callers to hold\n * a stable reference and observe updates after a new repository is cloned or\n * a driver is installed mid-session.\n * @docLink packages/core/concepts#runtime-assets-result\n */\nexport interface RuntimeAssetsResult {\n catalogEntries: RuntimeCatalogEntry[];\n implicitRefs: RuntimeAssetRef[];\n requiredNpmDeps: RuntimeNpmDeps;\n warnings: RuntimeAssetWarning[];\n /** Re-scan repositories and re-derive implicit refs. Mutates in place. */\n refresh(): Promise<void>;\n /**\n * Catalog lookup. When `kind` is omitted and multiple entries share the\n * `name`, returns `undefined` (caller must disambiguate).\n */\n findEntry(query: { kind?: \"connector\"; name: string }): RuntimeCatalogEntry | undefined;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Resolve all runtime assets visible to a project by scanning declared repositories.\n *\n * Reads `skaile.yaml`, scans every declared repository (plus the implicit\n * `@skaile/base-assets` repo), and derives implicit refs from `mounts:` /\n * `connectors:` declarations. Does not clone or install anything — purely a\n * read-only scan of what is already on disk. URL-only repositories that have\n * not been cloned yet are reported as `repo_unavailable` warnings.\n *\n * @param projectDir - Absolute path to the project workspace root\n * @returns `RuntimeAssetsResult` with catalog entries, implicit refs, npm deps, and warnings\n * @docLink packages/core/concepts#resolve-runtime-assets\n */\nexport async function resolveRuntimeAssets(projectDir: string): Promise<RuntimeAssetsResult> {\n const result: RuntimeAssetsResult = {\n catalogEntries: [],\n implicitRefs: [],\n requiredNpmDeps: { required: [], optional: [] },\n warnings: [],\n refresh: async () => {\n await populate(projectDir, result);\n },\n findEntry: (query) => findCatalogEntry(result.catalogEntries, query),\n };\n\n await populate(projectDir, result);\n return result;\n}\n\n/**\n * Resolve the on-disk root of `@skaile/base-assets`.\n *\n * Resolution tiers:\n * 1. `SKAILE_BASE_ASSETS_DIR` env var\n * 2. `require.resolve('@skaile/workspaces/base-assets/package.json')` (npm install / hoisted)\n * 3. Walk upward from this module looking for `base-assets/package.json` or\n * `ai-assets-skaile/package.json` (legacy shell-repo layout)\n *\n * @returns Absolute path to the `@skaile/base-assets` package directory\n * @throws When none of the three tiers can locate the package\n * @docLink packages/core/concepts#resolve-base-assets-root\n */\nexport function resolveBaseAssetsRoot(): string {\n const envDir = process.env.SKAILE_BASE_ASSETS_DIR;\n if (envDir && existsSync(envDir)) return resolvePath(envDir);\n\n try {\n const require = createRequire(import.meta.url);\n const pkgJson = require.resolve(\"@skaile/workspaces/package.json\");\n const candidate = join(dirname(pkgJson), \"base-assets\");\n if (existsSync(candidate)) return candidate;\n } catch {\n // Fall through to workspace walk.\n }\n\n const workspaceHit = findInWorkspace(import.meta.url);\n if (workspaceHit) return workspaceHit;\n\n throw new Error(\n `Cannot resolve the base-assets directory. ` +\n `Set SKAILE_BASE_ASSETS_DIR to the on-disk path, ` +\n `ensure @skaile/workspaces is installed, ` +\n `or run from within the @skaile/workspaces package tree.`,\n );\n}\n\n/**\n * Walk upward from `startUrl` looking for the `@skaile/workspaces` package\n * root — a directory whose `package.json` `name` is `@skaile/workspaces` and\n * which contains a `base-assets/` subdirectory. Bounded to 8 levels.\n */\nfunction findInWorkspace(startUrl: string): string | null {\n let dir: string;\n try {\n dir = dirname(fileURLToPath(startUrl));\n } catch {\n return null;\n }\n for (let i = 0; i < 8; i++) {\n const pkgPath = join(dir, \"package.json\");\n const baseAssets = join(dir, \"base-assets\");\n if (existsSync(pkgPath) && existsSync(baseAssets)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { name?: string };\n if (pkg.name === \"@skaile/workspaces\") return baseAssets;\n } catch {\n // Ignore malformed package.json and keep walking.\n }\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n// ─── Internals ────────────────────────────────────────────────────────────────\n\nasync function populate(projectDir: string, target: RuntimeAssetsResult): Promise<void> {\n target.catalogEntries = [];\n target.implicitRefs = [];\n target.requiredNpmDeps = { required: [], optional: [] };\n target.warnings = [];\n\n const config = resolveSkWorkspaceConfig(projectDir);\n const repositories = buildEffectiveRepositories(config.repositories);\n const links = readLinks(projectDir);\n\n // Scan each repository for connector entries.\n for (const [name, decl] of Object.entries(repositories)) {\n const repoDir = resolveRepoDir(name, decl, projectDir, links);\n if (!repoDir) {\n target.warnings.push({\n code: \"repo_unavailable\",\n name,\n message: repoUnavailableMessage(name, decl),\n });\n continue;\n }\n try {\n const entries = scanDirectory(repoDir, name).filter((e) => e.kind === \"connector\");\n target.catalogEntries.push(...entries);\n } catch (err) {\n target.warnings.push({\n code: \"repo_unavailable\",\n name,\n message: `Failed to scan repository \"${name}\" at ${repoDir}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n });\n }\n }\n\n // Derive implicit refs from skaile.yaml connectors.\n for (const c of config.connectors ?? []) {\n target.implicitRefs.push({ kind: \"connector\", name: c.driver, declarationId: c.id });\n }\n\n // Validate refs and aggregate npm deps.\n const requiredSet = new Set<string>();\n const optionalSet = new Set<string>();\n for (const ref of target.implicitRefs) {\n const entry = findCatalogEntry(target.catalogEntries, ref);\n if (!entry) {\n target.warnings.push({\n code: \"missing_driver\",\n declarationId: ref.declarationId,\n name: ref.name,\n message:\n `Unknown ${ref.kind} driver \"${ref.name}\" referenced by ${ref.kind} \"${ref.declarationId}\". ` +\n `Run \\`skaile ${ref.kind} catalog\\` to see available drivers, ` +\n `or declare a repository in skaile.yaml that provides this driver.`,\n });\n continue;\n }\n const npm = (entry.metadata?.npm_deps ?? {}) as { required?: string[]; optional?: string[] };\n for (const p of npm.required ?? []) requiredSet.add(p);\n for (const p of npm.optional ?? []) optionalSet.add(p);\n }\n target.requiredNpmDeps.required = [...requiredSet];\n target.requiredNpmDeps.optional = [...optionalSet];\n}\n\n/**\n * Build the effective `repositories` map: caller's declarations first, then\n * the implicit `base-assets` repo if absent. Caller's entries always win — an\n * org can override the default by declaring `repositories: { base-assets: {...} }`.\n */\nfunction buildEffectiveRepositories(\n declared: Record<string, RepositoryDeclaration> | undefined,\n): Record<string, RepositoryDeclaration> {\n const result: Record<string, RepositoryDeclaration> = { ...(declared ?? {}) };\n if (!result[BASE_ASSETS_REPO_NAME]) {\n try {\n const baseDir = resolveBaseAssetsRoot();\n result[BASE_ASSETS_REPO_NAME] = { path: baseDir };\n } catch (err) {\n // Surface as a warning during scan rather than throwing here — let the\n // caller decide whether base-assets is required for this project.\n // We re-discover the failure in resolveRepoDir() and emit there.\n result[BASE_ASSETS_REPO_NAME] = { path: \"\" };\n }\n }\n return result;\n}\n\n/**\n * Resolve a repository declaration to an on-disk directory. Order:\n * 1. Linked override (`.skaile/links.yaml`).\n * 2. Local `path` — relative to `projectDir`.\n * 3. Cloned URL repo at `.skaile/repos/<name>/` (must already exist).\n *\n * Returns `null` when none of these resolve. Does not clone.\n */\nfunction resolveRepoDir(\n name: string,\n decl: RepositoryDeclaration,\n projectDir: string,\n links: Record<string, string>,\n): string | null {\n // 1. Linked override\n const linked = links[name];\n if (linked && existsSync(linked)) return linked;\n\n // 2. Local path\n if (decl.path) {\n const resolved = resolvePath(projectDir, decl.path);\n return existsSync(resolved) ? resolved : null;\n }\n\n // 3. URL repo cloned to project's .skaile/repos/<name>\n if (decl.url) {\n const projectDest = join(projectDir, \".skaile\", \"repos\", name);\n if (existsSync(projectDest)) {\n // Either a real directory or a symlink to the global cache.\n try {\n return lstatSync(projectDest).isSymbolicLink() ? projectDest : projectDest;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n return null;\n}\n\nfunction repoUnavailableMessage(name: string, decl: RepositoryDeclaration): string {\n if (name === BASE_ASSETS_REPO_NAME && !decl.path && !decl.url) {\n return (\n `Cannot resolve @skaile/base-assets. ` +\n `Set SKAILE_BASE_ASSETS_DIR or ensure the package is installed.`\n );\n }\n if (decl.url) {\n return `Repository \"${name}\" (${decl.url}) is not available. Register it as a Library Source via \\`skaile source add\\`.`;\n }\n if (decl.path) {\n return `Repository \"${name}\" path not found: ${decl.path}`;\n }\n return `Repository \"${name}\" has neither url nor path.`;\n}\n\nfunction findCatalogEntry(\n entries: RuntimeCatalogEntry[],\n query: { kind?: \"connector\"; name: string },\n): RuntimeCatalogEntry | undefined {\n if (query.kind) {\n return entries.find((e) => e.kind === query.kind && e.name === query.name);\n }\n const matches = entries.filter((e) => e.name === query.name);\n if (matches.length === 1) return matches[0];\n // 0 or >1 with no kind — caller must disambiguate.\n return undefined;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { logErr } from './chunk-4NDWKA64.js';
2
- import { knowledgeKindProvider } from './chunk-DOMCYP7D.js';
3
- import { createDefaultRegistry } from './chunk-46T37EBP.js';
4
- import { flowKindProvider } from './chunk-ZUQIXLRJ.js';
2
+ import { knowledgeKindProvider } from './chunk-42OQF7UU.js';
3
+ import { createDefaultRegistry } from './chunk-GKIA2PU5.js';
4
+ import { flowKindProvider } from './chunk-ICS76R4T.js';
5
5
 
6
6
  // cli/src/open-registry.ts
7
7
  function createFullRegistry() {
@@ -97,5 +97,5 @@ async function openUserLibraryManager() {
97
97
  }
98
98
 
99
99
  export { createFullRegistry, openCatalogSource, openLibrary, openUserLibraryManager, resolveCatalogSource };
100
- //# sourceMappingURL=chunk-77CUYYO3.js.map
101
- //# sourceMappingURL=chunk-77CUYYO3.js.map
100
+ //# sourceMappingURL=chunk-VAJB2UJ5.js.map
101
+ //# sourceMappingURL=chunk-VAJB2UJ5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/open-registry.ts","../cli/src/open-library.ts"],"names":["source"],"mappings":"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","file":"chunk-77CUYYO3.js","sourcesContent":["/**\n * open-registry.ts — shared helper to create a full AssetKindRegistry.\n *\n * Bootstraps the registry with all built-in providers (9 core + preset)\n * from @skaile/discovery, plus the extension kind providers (flow from\n * @skaile/workspaces/base-assets/connectors/flow/engine, knowledge from @skaile/library).\n *\n * This is the single registration point for the CLI. All code paths\n * that need a registry (source sync, lib-status, etc.) should use this.\n */\n\nimport { flowKindProvider } from \"@skaile/workspaces/base-assets/connectors/flow/engine\";\nimport type { AssetKindRegistry } from \"@skaile/workspaces/discovery\";\nimport { createDefaultRegistry } from \"@skaile/workspaces/discovery\";\nimport { knowledgeKindProvider } from \"@skaile/workspaces/library\";\n\n/**\n * Create a fully-configured AssetKindRegistry with all known providers.\n *\n * Registers:\n * - 9 core kinds (skill, agent, connector, mount, mcp-server, contract, prompt, persona, ruleset)\n * - preset (composition entity)\n * - flow (extension, from @skaile/workspaces/base-assets/connectors/flow/engine)\n * - knowledge (extension, from @skaile/library)\n *\n * @returns An unfrozen registry (auto-freezes on first read)\n */\nexport function createFullRegistry(): AssetKindRegistry {\n const registry = createDefaultRegistry();\n registry.register(flowKindProvider);\n registry.register(knowledgeKindProvider);\n return registry;\n}\n","/**\n * open-library.ts — shared helpers to open the LocalLibrary and the configured\n * Catalog source.\n *\n * Lazy-loads the `@skaile/workspaces/library` subpath and returns the\n * LocalLibrary instance (backed by `@libsql/client`; runs on Node and Bun).\n * The catalog-source helper reads\n * `~/.skaile/config.yaml` (and project-level overlay if `projectDir` is given)\n * to decide between {@link RemoteCatalogSource} (default — points at\n * `https://skaile.store`) and a {@link LocalCatalogSource} bound to the most\n * recent local source registered via `skaile source add`.\n */\n\nimport { logErr } from \"./helpers.ts\";\nimport { createFullRegistry } from \"./open-registry.ts\";\n\n/**\n * Open the LocalLibrary with the full kind registry. Exits with code 1\n * if the library directory cannot be created.\n *\n * @returns A `LocalLibrary` instance ready for use.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibrary() {\n try {\n const { LocalLibrary } = await import(\"@skaile/workspaces/library\");\n return new LocalLibrary({ kindRegistry: createFullRegistry() });\n } catch (err) {\n logErr(`Could not open LocalLibrary: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Resolve the configured **remote** Catalog source for the CLI.\n *\n * Reads `~/.skaile/config.yaml` (plus the optional project-level overlay) and\n * returns a {@link RemoteCatalogSource} pointing at `catalog.url` (default:\n * `https://skaile.store`). The `cache_ttl: 0` config flag flips the source\n * into air-gapped mode: network reads are disabled, only `skaile update`\n * performs refreshes.\n *\n * **Local-mode rejection.** If the resolved config has `catalog.url: local`\n * this helper throws — callers wanting the dispatched local-or-remote source\n * must use {@link resolveCatalogSource}. Remote-only consumers like\n * `skaile update --catalog-only` rely on this strict behaviour.\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A configured {@link RemoteCatalogSource}.\n * @throws When `catalog.url` is the `local` sentinel.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<\n | import(\"@skaile/workspaces/library\").RemoteCatalogSource\n | import(\"@skaile/workspaces/library\").RestCatalogSource\n> {\n const { resolveConfig, RemoteCatalogSource, RestCatalogSource, isLocalCatalogUrl } = await import(\n \"@skaile/workspaces/library\"\n );\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n if (isLocalCatalogUrl(baseUrl)) {\n throw new Error(\n \"catalog.url is set to 'local' — remote catalog is disabled. \" +\n \"Use `skaile source add <path>` + `skaile source sync` for local sources, \" +\n \"or set `catalog.url: https://skaile.store` in ~/.skaile/config.yaml.\",\n );\n }\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n if (cfg.catalog.framing === \"rest\") {\n return new RestCatalogSource({ baseUrl, cacheTtlMs });\n }\n return new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n}\n\n/**\n * Resolved catalog source plus a close handle for releasing any underlying\n * resources (e.g. the `LocalLibrary` SQLite connection in local mode).\n *\n * Callers MUST invoke `close()` when done — typically in a `finally` block.\n * For remote-mode sources `close()` is a no-op, but the contract is uniform\n * so consumers don't have to branch.\n *\n * @docLink cli/dev-guide#open-library\n */\nexport interface ResolvedCatalogSource {\n /** The {@link ICatalogSource} ready for use. */\n source: import(\"@skaile/workspaces/library\").ICatalogSource;\n /** Release any underlying resources (SQLite handle in local mode). */\n close(): void;\n}\n\n/**\n * Resolve the configured Catalog source — local or remote — based on\n * `~/.skaile/config.yaml`.\n *\n * Dispatch:\n * - `catalog.url: local` → opens {@link LocalLibrary}, picks the most recently\n * registered local source whose `path` still exists on disk, and returns a\n * {@link LocalCatalogSource} bound to that source. Throws if no usable local\n * source is registered.\n * - any URL → returns {@link RemoteCatalogSource} (same as\n * {@link openCatalogSource}).\n *\n * The returned `close()` releases the underlying `LocalLibrary` SQLite handle\n * in local mode (no-op in remote mode). Callers MUST invoke it — typically in\n * a `finally` block — to satisfy `library/CLAUDE.md` § \"Notes for Consumers\".\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A `ResolvedCatalogSource` carrying the source and a close handle.\n * @throws When `local` is configured but no usable local source is registered.\n * @docLink cli/dev-guide#open-library\n */\nexport async function resolveCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<ResolvedCatalogSource> {\n const {\n resolveConfig,\n RemoteCatalogSource,\n RestCatalogSource,\n LocalCatalogSource,\n isLocalCatalogUrl,\n } = await import(\"@skaile/workspaces/library\");\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n\n if (isLocalCatalogUrl(baseUrl)) {\n const fs = await import(\"node:fs\");\n const library = await openLibrary();\n try {\n const sources = await library.listSources();\n type SourceRow = (typeof sources)[number];\n // Type-narrow: `path` is required for local sources after the filter.\n const usable = sources\n .filter(\n (s): s is SourceRow & { path: string } =>\n s.type === \"local\" && typeof s.path === \"string\" && s.path.length > 0,\n )\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n if (usable.length === 0) {\n throw new Error(\n \"catalog.url is set to 'local' but no local source is registered. \" +\n \"Run `skaile source add <path>` first, then `skaile source sync`.\",\n );\n }\n\n // Prefer the most recently added source whose path still exists.\n const present = usable.find((s) => fs.existsSync(s.path));\n if (!present) {\n const head = usable[0];\n throw new Error(\n `catalog.url is set to 'local' but every registered local source has a missing path on disk. ` +\n `Most recent: ${head.path} (source ${head.id}). ` +\n `Re-register with \\`skaile source add <existing-path>\\` or run \\`skaile source list\\` to inspect.`,\n );\n }\n\n const source = new LocalCatalogSource(\n library,\n present.id,\n present.path,\n createFullRegistry(),\n );\n return { source, close: () => library.close() };\n } catch (err) {\n // Release the handle on any failure during dispatch — otherwise the\n // SQLite WAL state leaks for the lifetime of the process.\n library.close();\n throw err;\n }\n }\n\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n const source =\n cfg.catalog.framing === \"rest\"\n ? new RestCatalogSource({ baseUrl, cacheTtlMs })\n : new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n return { source, close: () => {} };\n}\n\n/**\n * Open the UserLibraryManager bound to the active LocalLibrary.\n * Caller owns lifetime — must call `close()` (returned helper closes the\n * underlying LocalLibrary).\n *\n * @docLink cli/dev-guide#open-library\n */\nexport async function openUserLibraryManager(): Promise<{\n manager: import(\"@skaile/workspaces/library\").UserLibraryManager;\n library: import(\"@skaile/workspaces/library\").LocalLibrary;\n close: () => void;\n}> {\n const { UserLibraryManager } = await import(\"@skaile/workspaces/library\");\n const library = await openLibrary();\n const manager = new UserLibraryManager(library);\n return { manager, library, close: () => library.close() };\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/open-registry.ts","../cli/src/open-library.ts"],"names":["source"],"mappings":"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","file":"chunk-VAJB2UJ5.js","sourcesContent":["/**\n * open-registry.ts — shared helper to create a full AssetKindRegistry.\n *\n * Bootstraps the registry with all built-in providers (9 core + preset)\n * from @skaile/discovery, plus the extension kind providers (flow from\n * @skaile/workspaces/base-assets/connectors/flow/engine, knowledge from @skaile/library).\n *\n * This is the single registration point for the CLI. All code paths\n * that need a registry (source sync, lib-status, etc.) should use this.\n */\n\nimport { flowKindProvider } from \"@skaile/workspaces/base-assets/connectors/flow/engine\";\nimport type { AssetKindRegistry } from \"@skaile/workspaces/discovery\";\nimport { createDefaultRegistry } from \"@skaile/workspaces/discovery\";\nimport { knowledgeKindProvider } from \"@skaile/workspaces/library\";\n\n/**\n * Create a fully-configured AssetKindRegistry with all known providers.\n *\n * Registers:\n * - 9 core kinds (skill, agent, connector, mount, mcp-server, contract, prompt, persona, ruleset)\n * - preset (composition entity)\n * - flow (extension, from @skaile/workspaces/base-assets/connectors/flow/engine)\n * - knowledge (extension, from @skaile/library)\n *\n * @returns An unfrozen registry (auto-freezes on first read)\n */\nexport function createFullRegistry(): AssetKindRegistry {\n const registry = createDefaultRegistry();\n registry.register(flowKindProvider);\n registry.register(knowledgeKindProvider);\n return registry;\n}\n","/**\n * open-library.ts — shared helpers to open the LocalLibrary and the configured\n * Catalog source.\n *\n * Lazy-loads the `@skaile/workspaces/library` subpath and returns the\n * LocalLibrary instance (backed by `@libsql/client`; runs on Node and Bun).\n * The catalog-source helper reads\n * `~/.skaile/config.yaml` (and project-level overlay if `projectDir` is given)\n * to decide between {@link RemoteCatalogSource} (default — points at\n * `https://skaile.store`) and a {@link LocalCatalogSource} bound to the most\n * recent local source registered via `skaile source add`.\n */\n\nimport { logErr } from \"./helpers.ts\";\nimport { createFullRegistry } from \"./open-registry.ts\";\n\n/**\n * Open the LocalLibrary with the full kind registry. Exits with code 1\n * if the library directory cannot be created.\n *\n * @returns A `LocalLibrary` instance ready for use.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openLibrary() {\n try {\n const { LocalLibrary } = await import(\"@skaile/workspaces/library\");\n return new LocalLibrary({ kindRegistry: createFullRegistry() });\n } catch (err) {\n logErr(`Could not open LocalLibrary: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Resolve the configured **remote** Catalog source for the CLI.\n *\n * Reads `~/.skaile/config.yaml` (plus the optional project-level overlay) and\n * returns a {@link RemoteCatalogSource} pointing at `catalog.url` (default:\n * `https://skaile.store`). The `cache_ttl: 0` config flag flips the source\n * into air-gapped mode: network reads are disabled, only `skaile update`\n * performs refreshes.\n *\n * **Local-mode rejection.** If the resolved config has `catalog.url: local`\n * this helper throws — callers wanting the dispatched local-or-remote source\n * must use {@link resolveCatalogSource}. Remote-only consumers like\n * `skaile update --catalog-only` rely on this strict behaviour.\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A configured {@link RemoteCatalogSource}.\n * @throws When `catalog.url` is the `local` sentinel.\n * @docLink cli/dev-guide#open-library\n */\nexport async function openCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<\n | import(\"@skaile/workspaces/library\").RemoteCatalogSource\n | import(\"@skaile/workspaces/library\").RestCatalogSource\n> {\n const { resolveConfig, RemoteCatalogSource, RestCatalogSource, isLocalCatalogUrl } = await import(\n \"@skaile/workspaces/library\"\n );\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n if (isLocalCatalogUrl(baseUrl)) {\n throw new Error(\n \"catalog.url is set to 'local' — remote catalog is disabled. \" +\n \"Use `skaile source add <path>` + `skaile source sync` for local sources, \" +\n \"or set `catalog.url: https://skaile.store` in ~/.skaile/config.yaml.\",\n );\n }\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n if (cfg.catalog.framing === \"rest\") {\n return new RestCatalogSource({ baseUrl, cacheTtlMs });\n }\n return new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n}\n\n/**\n * Resolved catalog source plus a close handle for releasing any underlying\n * resources (e.g. the `LocalLibrary` SQLite connection in local mode).\n *\n * Callers MUST invoke `close()` when done — typically in a `finally` block.\n * For remote-mode sources `close()` is a no-op, but the contract is uniform\n * so consumers don't have to branch.\n *\n * @docLink cli/dev-guide#open-library\n */\nexport interface ResolvedCatalogSource {\n /** The {@link ICatalogSource} ready for use. */\n source: import(\"@skaile/workspaces/library\").ICatalogSource;\n /** Release any underlying resources (SQLite handle in local mode). */\n close(): void;\n}\n\n/**\n * Resolve the configured Catalog source — local or remote — based on\n * `~/.skaile/config.yaml`.\n *\n * Dispatch:\n * - `catalog.url: local` → opens {@link LocalLibrary}, picks the most recently\n * registered local source whose `path` still exists on disk, and returns a\n * {@link LocalCatalogSource} bound to that source. Throws if no usable local\n * source is registered.\n * - any URL → returns {@link RemoteCatalogSource} (same as\n * {@link openCatalogSource}).\n *\n * The returned `close()` releases the underlying `LocalLibrary` SQLite handle\n * in local mode (no-op in remote mode). Callers MUST invoke it — typically in\n * a `finally` block — to satisfy `library/CLAUDE.md` § \"Notes for Consumers\".\n *\n * @param opts - Project directory (overlays project config) and explicit overrides.\n * @returns A `ResolvedCatalogSource` carrying the source and a close handle.\n * @throws When `local` is configured but no usable local source is registered.\n * @docLink cli/dev-guide#open-library\n */\nexport async function resolveCatalogSource(opts?: {\n projectDir?: string;\n baseUrlOverride?: string;\n /** Override the user-config path for tests. */\n userConfigFile?: string;\n}): Promise<ResolvedCatalogSource> {\n const {\n resolveConfig,\n RemoteCatalogSource,\n RestCatalogSource,\n LocalCatalogSource,\n isLocalCatalogUrl,\n } = await import(\"@skaile/workspaces/library\");\n const cfg = resolveConfig({\n projectDir: opts?.projectDir,\n userConfigFile: opts?.userConfigFile,\n });\n const baseUrl = opts?.baseUrlOverride ?? cfg.catalog.url;\n\n if (isLocalCatalogUrl(baseUrl)) {\n const fs = await import(\"node:fs\");\n const library = await openLibrary();\n try {\n const sources = await library.listSources();\n type SourceRow = (typeof sources)[number];\n // Type-narrow: `path` is required for local sources after the filter.\n const usable = sources\n .filter(\n (s): s is SourceRow & { path: string } =>\n s.type === \"local\" && typeof s.path === \"string\" && s.path.length > 0,\n )\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n if (usable.length === 0) {\n throw new Error(\n \"catalog.url is set to 'local' but no local source is registered. \" +\n \"Run `skaile source add <path>` first, then `skaile source sync`.\",\n );\n }\n\n // Prefer the most recently added source whose path still exists.\n const present = usable.find((s) => fs.existsSync(s.path));\n if (!present) {\n const head = usable[0];\n throw new Error(\n `catalog.url is set to 'local' but every registered local source has a missing path on disk. ` +\n `Most recent: ${head.path} (source ${head.id}). ` +\n `Re-register with \\`skaile source add <existing-path>\\` or run \\`skaile source list\\` to inspect.`,\n );\n }\n\n const source = new LocalCatalogSource(\n library,\n present.id,\n present.path,\n createFullRegistry(),\n );\n return { source, close: () => library.close() };\n } catch (err) {\n // Release the handle on any failure during dispatch — otherwise the\n // SQLite WAL state leaks for the lifetime of the process.\n library.close();\n throw err;\n }\n }\n\n const cacheTtlMs = cfg.catalog.cache_ttl * 1000;\n const source =\n cfg.catalog.framing === \"rest\"\n ? new RestCatalogSource({ baseUrl, cacheTtlMs })\n : new RemoteCatalogSource({ baseUrl, cacheTtlMs });\n return { source, close: () => {} };\n}\n\n/**\n * Open the UserLibraryManager bound to the active LocalLibrary.\n * Caller owns lifetime — must call `close()` (returned helper closes the\n * underlying LocalLibrary).\n *\n * @docLink cli/dev-guide#open-library\n */\nexport async function openUserLibraryManager(): Promise<{\n manager: import(\"@skaile/workspaces/library\").UserLibraryManager;\n library: import(\"@skaile/workspaces/library\").LocalLibrary;\n close: () => void;\n}> {\n const { UserLibraryManager } = await import(\"@skaile/workspaces/library\");\n const library = await openLibrary();\n const manager = new UserLibraryManager(library);\n return { manager, library, close: () => library.close() };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { resolveSkWorkspaceConfig } from './chunk-CSUBFKAN.js';
2
- import { createLogger } from './chunk-V37HONL7.js';
1
+ import { resolveSkWorkspaceConfig } from './chunk-GAZINYCS.js';
2
+ import { createLogger } from './chunk-24UIWON4.js';
3
3
 
4
4
  // connectors/src/secrets.ts
5
5
  var log = createLogger({ kind: "connector", subkind: "secrets" });
@@ -83,7 +83,7 @@ var PreMintedSecretProvider = class {
83
83
  * Look up the full {@link PreMintedCredential} for a `mount:` /
84
84
  * `connector:` keyed entry. Callers that only need the token use
85
85
  * {@link resolve} via the chain; callers that need expiry / audit
86
- * metadata (e.g. MountManager) use this entry point.
86
+ * metadata (e.g. ConnectorManager) use this entry point.
87
87
  */
88
88
  mintFor(kind, id) {
89
89
  return this.mints.get(`${kind}:${id}`);
@@ -92,7 +92,7 @@ var PreMintedSecretProvider = class {
92
92
  if (!ref) return void 0;
93
93
  if (!(ref.startsWith("mount:") || ref.startsWith("connector:"))) return void 0;
94
94
  const mint = this.mints.get(ref);
95
- return mint && mint.ok ? mint.token : void 0;
95
+ return mint?.ok ? mint.token : void 0;
96
96
  }
97
97
  has(ref) {
98
98
  return this.resolve(ref) !== void 0;
@@ -224,38 +224,34 @@ var SecretProviderChain = class {
224
224
  };
225
225
 
226
226
  // connectors/src/config.ts
227
- function loadMountDeclarations(projectDir) {
228
- const config = resolveSkWorkspaceConfig(projectDir);
229
- if (!config.mounts || config.mounts.length === 0) return [];
230
- return config.mounts.map(workspaceMountToDeclaration);
231
- }
232
227
  function loadConnectorDeclarations(projectDir) {
233
228
  const config = resolveSkWorkspaceConfig(projectDir);
229
+ if (config.mounts && config.mounts.length > 0) {
230
+ throw new Error(
231
+ "'mounts:' is no longer supported \u2014 move entries under 'connectors:' with a 'mount:' sub-block. See docs/migration-mounts-to-connectors.md"
232
+ );
233
+ }
234
234
  if (!config.connectors || config.connectors.length === 0) return [];
235
235
  return config.connectors.map(workspaceConnectorToDeclaration);
236
236
  }
237
- function workspaceMountToDeclaration(v) {
238
- return {
239
- id: v.id,
240
- driver: v.driver,
241
- source: v.source,
242
- target: v.target,
243
- access: v.access ?? "read-only",
244
- auth: v.auth,
245
- watch: v.watch,
246
- exposeAccessToken: v.exposeAccessToken,
247
- accessTokenTTL: v.accessTokenTTL,
248
- options: v.options
249
- };
250
- }
251
237
  function workspaceConnectorToDeclaration(c) {
252
- return {
238
+ const decl = {
253
239
  id: c.id,
254
240
  driver: c.driver,
255
241
  access: c.access ?? "read-only",
256
242
  auth: c.auth,
257
243
  options: c.options
258
244
  };
245
+ if (c.mount) {
246
+ decl.mount = {
247
+ source: c.mount.source,
248
+ target: c.mount.target,
249
+ watch: c.mount.watch,
250
+ exposeAccessToken: c.mount.exposeAccessToken,
251
+ accessTokenTTL: c.mount.accessTokenTTL
252
+ };
253
+ }
254
+ return decl;
259
255
  }
260
256
  function createForgeSecretProviderChain(forgeProvider, extraProviders = []) {
261
257
  return new SecretProviderChain([...extraProviders, forgeProvider, new EnvSecretProvider()]);
@@ -305,6 +301,6 @@ function resolveAuthRef(auth, mountId) {
305
301
  throw new LegacyAuthGrammarError(auth, mountId);
306
302
  }
307
303
 
308
- export { EnvSecretProvider, ForgeSecretProvider, InMemorySecretProvider, LegacyAuthGrammarError, LockedSecretProvider, OAuthRequiredError, PreMintedSecretProvider, SecretProviderChain, createCliSecretProviderChain, createForgeSecretProviderChain, loadConnectorDeclarations, loadMountDeclarations, resolveAuth, resolveAuthRef, resolveBackendAuthFor };
309
- //# sourceMappingURL=chunk-Q5URN24L.js.map
310
- //# sourceMappingURL=chunk-Q5URN24L.js.map
304
+ export { EnvSecretProvider, ForgeSecretProvider, InMemorySecretProvider, LegacyAuthGrammarError, LockedSecretProvider, OAuthRequiredError, PreMintedSecretProvider, SecretProviderChain, createCliSecretProviderChain, createForgeSecretProviderChain, loadConnectorDeclarations, resolveAuth, resolveAuthRef, resolveBackendAuthFor };
305
+ //# sourceMappingURL=chunk-W75ASXH4.js.map
306
+ //# sourceMappingURL=chunk-W75ASXH4.js.map