@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
@@ -2,7 +2,7 @@ import { EventEmitter } from 'events';
2
2
  import { ulid } from 'ulid';
3
3
  import { mkdirSync } from 'fs';
4
4
  import path from 'path';
5
- import { Database } from 'bun:sqlite';
5
+ import { createRequire } from 'module';
6
6
 
7
7
  // core/src/logging/log-store.ts
8
8
  var LEVEL_RANK = {
@@ -297,6 +297,60 @@ function makeLogger(source, store) {
297
297
  }
298
298
  };
299
299
  }
300
+ var nodeRequire = createRequire(import.meta.url);
301
+ var isBun = typeof globalThis.Bun !== "undefined";
302
+ function wrapStatement(stmt) {
303
+ return {
304
+ run: (params) => {
305
+ if (params === void 0) stmt.run();
306
+ else stmt.run(params);
307
+ },
308
+ all: (params) => params === void 0 ? stmt.all() : stmt.all(params),
309
+ get: (params) => params === void 0 ? stmt.get() : stmt.get(params)
310
+ };
311
+ }
312
+ function openBunSqlite(path2, opts) {
313
+ const { Database } = nodeRequire("bun:sqlite");
314
+ const db = opts.readonly ? new Database(path2, { readonly: true }) : new Database(path2);
315
+ return {
316
+ exec: (sql) => {
317
+ db.exec(sql);
318
+ },
319
+ prepare: (sql) => wrapStatement(db.prepare(sql)),
320
+ transaction: (fn) => db.transaction(fn),
321
+ close: () => {
322
+ db.close();
323
+ }
324
+ };
325
+ }
326
+ function openNodeSqlite(path2, opts) {
327
+ const { DatabaseSync } = nodeRequire("node:sqlite");
328
+ const db = opts.readonly ? new DatabaseSync(path2, { readOnly: true }) : new DatabaseSync(path2);
329
+ return {
330
+ exec: (sql) => {
331
+ db.exec(sql);
332
+ },
333
+ prepare: (sql) => wrapStatement(db.prepare(sql)),
334
+ transaction: (fn) => (...args) => {
335
+ db.exec("BEGIN");
336
+ try {
337
+ fn(...args);
338
+ db.exec("COMMIT");
339
+ } catch (err) {
340
+ db.exec("ROLLBACK");
341
+ throw err;
342
+ }
343
+ },
344
+ close: () => {
345
+ db.close();
346
+ }
347
+ };
348
+ }
349
+ function openSqlite(path2, opts = {}) {
350
+ return isBun ? openBunSqlite(path2, opts) : openNodeSqlite(path2, opts);
351
+ }
352
+
353
+ // core/src/logging/sinks/sqlite-sink.ts
300
354
  var SCHEMA = `
301
355
  CREATE TABLE IF NOT EXISTS log_entries (
302
356
  id TEXT PRIMARY KEY,
@@ -320,7 +374,7 @@ var SqliteSink = class {
320
374
  insertMany;
321
375
  closed = false;
322
376
  constructor(opts) {
323
- this.db = new Database(opts.path);
377
+ this.db = openSqlite(opts.path);
324
378
  if (opts.path !== ":memory:") {
325
379
  this.db.exec("PRAGMA journal_mode = WAL");
326
380
  }
@@ -415,7 +469,8 @@ var SqliteSink = class {
415
469
  nextCursor: hasMore ? entries[entries.length - 1].id : void 0
416
470
  };
417
471
  }
418
- // bun:sqlite requires $-prefixed keys when SQL uses $name placeholders
472
+ // Both bun:sqlite and node:sqlite bind `$name` SQL placeholders from
473
+ // matching `$`-prefixed object keys.
419
474
  toRow(e) {
420
475
  return {
421
476
  $id: e.id,
@@ -521,6 +576,6 @@ var WsLogSink = class {
521
576
  }
522
577
  };
523
578
 
524
- export { LogStore, LogStoreDisabledError, NoOpSink, OnLogBridgeSink, SqliteSink, StdoutSink, WsLogSink, createLogStoreFromConfig, createLogger, getLogStore, normalizeError, registerLogStore, resetLogStore, resolveLogStoreConfig, sanitizeData };
525
- //# sourceMappingURL=chunk-V37HONL7.js.map
526
- //# sourceMappingURL=chunk-V37HONL7.js.map
579
+ export { LogStore, LogStoreDisabledError, NoOpSink, OnLogBridgeSink, SqliteSink, StdoutSink, WsLogSink, createLogStoreFromConfig, createLogger, getLogStore, normalizeError, openSqlite, registerLogStore, resetLogStore, resolveLogStoreConfig, sanitizeData };
580
+ //# sourceMappingURL=chunk-24UIWON4.js.map
581
+ //# sourceMappingURL=chunk-24UIWON4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/src/logging/log-store.ts","../core/src/logging/sanitize.ts","../core/src/logging/sinks/types.ts","../core/src/logging/sinks/no-op-sink.ts","../core/src/logging/sinks/stdout-sink.ts","../core/src/logging/create-logger.ts","../core/src/logging/sinks/sqlite-runtime.ts","../core/src/logging/sinks/sqlite-sink.ts","../core/src/logging/config.ts","../core/src/logging/sinks/on-log-bridge-sink.ts","../core/src/logging/sinks/ws-log-sink.ts"],"names":["path"],"mappings":"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","file":"chunk-24UIWON4.js","sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { ulid } from \"ulid\";\nimport type {\n LogEntry,\n LogLevel,\n LogQuery,\n LogQueryResult,\n LogSource,\n} from \"@skaile/workspaces/types\";\nimport type { LogSink } from \"./sinks/types.js\";\n\nexport interface LogStoreOptions {\n sessionId: string;\n level: LogLevel;\n sinks: LogSink[];\n flushIntervalMs?: number; // default 50\n flushBatchSize?: number; // default 100\n}\n\nexport interface RecordInput {\n source: LogSource;\n level: LogLevel;\n message: string;\n data?: Record<string, unknown>;\n error?: { name: string; message: string; stack?: string };\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\n/**\n * In-memory log buffer with periodic flush to sinks.\n *\n * The LogStore buffers log entries and flushes them to registered sinks\n * either when the buffer reaches a certain size, after a time interval,\n * or when explicitly flushed. Supports subscribing to live log entries.\n *\n * @see {@link LogStoreOptions} for configuration\n * @see {@link LogEntry} for the log entry format\n * @category Logging\n * @since 2.0.0\n */\nexport class LogStore {\n private sessionId: string;\n private level: LogLevel;\n private sinks: LogSink[];\n private flushIntervalMs: number;\n private flushBatchSize: number;\n private buffer: LogEntry[] = [];\n private timer: NodeJS.Timeout | null = null;\n private emitter = new EventEmitter();\n private closed = false;\n\n constructor(opts: LogStoreOptions) {\n this.sessionId = opts.sessionId;\n this.level = opts.level;\n this.sinks = opts.sinks;\n this.flushIntervalMs = opts.flushIntervalMs ?? 50;\n this.flushBatchSize = opts.flushBatchSize ?? 100;\n this.emitter.setMaxListeners(0);\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Append a sink after construction. Used by bridges (e.g. OnLogBridgeSink). */\n addSink(sink: LogSink): void {\n this.sinks.push(sink);\n }\n\n /** Returns true if the level is enabled. Used by createLogger to short-circuit. */\n isEnabled(level: LogLevel): boolean {\n return LEVEL_RANK[level] >= LEVEL_RANK[this.level];\n }\n\n record(input: RecordInput): void {\n if (this.closed) return;\n if (!this.isEnabled(input.level)) return;\n const entry: LogEntry = {\n id: ulid(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n source: input.source,\n level: input.level,\n message: input.message,\n data: input.data,\n error: input.error,\n };\n this.emitter.emit(\"entry\", entry);\n this.buffer.push(entry);\n if (this.buffer.length >= this.flushBatchSize) {\n this.flushSync();\n } else if (this.flushIntervalMs > 0 && this.timer === null) {\n this.timer = setTimeout(() => this.flushSync(), this.flushIntervalMs);\n } else if (this.flushIntervalMs === 0) {\n this.flushSync();\n }\n }\n\n /** Subscribe to live entries. Returns an unsubscribe function. */\n subscribe(handler: (entry: LogEntry) => void): () => void {\n this.emitter.on(\"entry\", handler);\n return () => this.emitter.off(\"entry\", handler);\n }\n\n /**\n * Query stored log entries.\n *\n * Queries the first sink that supports querying (typically SQLiteSink).\n * Returns empty result if no sink supports querying.\n *\n * @param q - Query parameters including filters and pagination\n * @returns Query result with matching entries\n */\n query(q: LogQuery): LogQueryResult {\n for (const sink of this.sinks) {\n if (sink.query) return sink.query(q);\n }\n return { entries: [] };\n }\n\n /** Force-flush. SQLite writes are synchronous, so this returns once writes complete. */\n flush(): void {\n this.flushSync();\n }\n\n /**\n * Close the log store and release resources.\n *\n * Flushes any pending entries, marks the store as closed, and closes\n * all registered sinks.\n */\n close(): void {\n if (this.closed) return;\n this.flushSync();\n this.closed = true;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n for (const sink of this.sinks) sink.close();\n this.emitter.removeAllListeners();\n }\n\n private flushSync(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.buffer.length === 0) return;\n const batch = this.buffer;\n this.buffer = [];\n for (const sink of this.sinks) {\n try {\n sink.writeBatch(batch);\n } catch (err) {\n // Last-resort: log to stderr; never let a sink failure crash the producer.\n process.stderr.write(`LogStore sink write failed: ${String(err)}\\n`);\n }\n }\n }\n}\n","import type { NormalizedError } from \"@skaile/workspaces/types\";\n\nexport function normalizeError(value: unknown): NormalizedError | undefined {\n if (value === undefined || value === null) return undefined;\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (typeof value === \"string\") {\n return { name: \"Error\", message: value };\n }\n try {\n return { name: \"Error\", message: JSON.stringify(value) };\n } catch {\n return { name: \"Error\", message: String(value) };\n }\n}\n\nexport function sanitizeData(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined || value === null) return undefined;\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || v === undefined) return v;\n if (typeof v === \"bigint\") return v.toString();\n if (typeof v === \"function\") return \"[Function]\";\n if (typeof v === \"symbol\") return v.toString();\n if (v instanceof Error) return normalizeError(v);\n if (typeof v !== \"object\") return v;\n if (seen.has(v as object)) return \"[Circular]\";\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const [k, child] of Object.entries(v as Record<string, unknown>)) {\n out[k] = walk(child);\n }\n return out;\n };\n const result = walk(value);\n if (typeof result !== \"object\" || result === null || Array.isArray(result)) {\n return { value: result };\n }\n return result as Record<string, unknown>;\n}\n","// LogSink interface lives in @skaile/workspaces/types so consumers can type-check\n// sink instances without depending on core. Runtime errors live here.\nexport type { LogSink } from \"@skaile/workspaces/types\";\n\nexport class LogStoreDisabledError extends Error {\n constructor() {\n super(\"LogStore is disabled (mode=off); query is unavailable\");\n this.name = \"LogStoreDisabledError\";\n }\n}\n","import type { LogEntry, LogQuery, LogQueryResult } from \"@skaile/workspaces/types\";\nimport { LogStoreDisabledError, type LogSink } from \"./types.js\";\n\nexport class NoOpSink implements LogSink {\n write(_entry: LogEntry): void {}\n writeBatch(_entries: LogEntry[]): void {}\n query(_q: LogQuery): LogQueryResult {\n throw new LogStoreDisabledError();\n }\n close(): void {}\n}\n","import type { LogEntry, LogSource } from \"@skaile/workspaces/types\";\nimport type { LogSink } from \"./types.js\";\n\nexport type StdoutFormat = \"pretty\" | \"json\";\n\n/** Which standard stream the sink writes to. */\nexport type StdoutStream = \"stdout\" | \"stderr\";\n\nexport interface StdoutSinkOptions {\n format?: StdoutFormat;\n /**\n * Standard stream to write to. Default: `\"stdout\"`. Set to `\"stderr\"` for\n * processes whose stdout is a reserved channel — e.g. a stdio MCP server,\n * where stdout carries JSON-RPC and any log line would corrupt the protocol.\n */\n stream?: StdoutStream;\n}\n\nfunction formatSource(source: LogSource): string {\n const parts = [source.kind, source.subkind];\n if (source.instance) parts.push(source.instance);\n return `[${parts.join(\":\")}]`;\n}\n\nfunction formatTime(iso: string): string {\n // HH:MM:SS.sss\n return iso.slice(11, 23);\n}\n\nconst LEVEL_LABEL = {\n debug: \"DEBUG\",\n info: \"INFO \",\n warn: \"WARN \",\n error: \"ERROR\",\n} as const;\n\nexport class StdoutSink implements LogSink {\n private format: StdoutFormat;\n private stream: NodeJS.WriteStream;\n\n constructor(opts: StdoutSinkOptions = {}) {\n this.stream = opts.stream === \"stderr\" ? process.stderr : process.stdout;\n this.format = opts.format ?? (this.stream.isTTY ? \"pretty\" : \"json\");\n }\n\n write(entry: LogEntry): void {\n this.stream.write(`${this.render(entry)}\\n`);\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {}\n\n private render(entry: LogEntry): string {\n if (this.format === \"json\") {\n return JSON.stringify(entry);\n }\n const head = `${formatTime(entry.timestamp)} ${LEVEL_LABEL[entry.level]} ${formatSource(entry.source)}`;\n const tail = entry.message;\n const detail = entry.data ? `\\n > ${JSON.stringify(entry.data)}` : \"\";\n const err = entry.error ? `\\n ! ${entry.error.name}: ${entry.error.message}` : \"\";\n return `${head} ${tail}${detail}${err}`;\n }\n}\n","import type { Logger, LogSource } from \"@skaile/workspaces/types\";\nimport { normalizeError, sanitizeData } from \"./sanitize.js\";\nimport { LogStore } from \"./log-store.js\";\nimport { NoOpSink } from \"./sinks/no-op-sink.js\";\nimport { StdoutSink } from \"./sinks/stdout-sink.js\";\n\n/**\n * The active LogStore is a process-singleton. It is stored on `globalThis`\n * under a `Symbol.for` key so it survives module duplication — under vitest's\n * `skaile-src` aliasing and the runner's lazy `import(\"@skaile/workspaces/runner\")`,\n * `core/logging` can be evaluated as two distinct module instances. A plain\n * module-scoped `let` would give each instance its own store, so a logger\n * created on one instance would not see a store registered on the other.\n * The `globalThis` slot makes the singleton genuinely process-wide.\n */\nconst ACTIVE_STORE_KEY = Symbol.for(\"@skaile/workspaces:logging:activeStore\");\n\ntype GlobalWithStore = typeof globalThis & {\n [ACTIVE_STORE_KEY]?: LogStore | null;\n};\n\nconst globalStoreSlot = globalThis as GlobalWithStore;\n\nexport function registerLogStore(store: LogStore): void {\n globalStoreSlot[ACTIVE_STORE_KEY] = store;\n}\n\nexport function getLogStore(): LogStore | null {\n return globalStoreSlot[ACTIVE_STORE_KEY] ?? null;\n}\n\nexport function resetLogStore(): void {\n globalStoreSlot[ACTIVE_STORE_KEY] = null;\n}\n\nexport interface CreateLoggerOptions {\n /**\n * When true (default), create + register a lazy off-mode LogStore if none\n * is registered. When false, throw if no store has been registered.\n */\n fallback?: boolean;\n}\n\nfunction ensureLogStore(): LogStore {\n const existing = globalStoreSlot[ACTIVE_STORE_KEY];\n if (existing) return existing;\n // Lazy off-mode fallback: NoOp + Stdout, no SQLite, no sessionId.\n const fallback = new LogStore({\n sessionId: \"no-session\",\n level: \"info\",\n sinks: [new NoOpSink(), new StdoutSink()],\n });\n globalStoreSlot[ACTIVE_STORE_KEY] = fallback;\n return fallback;\n}\n\n/**\n * Creates a logger for the given source.\n *\n * If no LogStore is registered and fallback is enabled (default), a lazy\n * off-mode fallback store (NoOp + Stdout) is created.\n *\n * @param source - The log source (e.g., { kind: 'agent', name: 'my-agent' })\n * @param opts - Configuration options for logger creation\n * @param opts.fallback - When true (default), creates a fallback store if none registered\n * @returns A logger instance\n * @throws {Error} When no LogStore is registered and fallback is false\n *\n * @example\n * ```typescript\n * const logger = createLogger({ kind: 'agent', name: 'my-agent' });\n * logger.info('Agent started');\n * ```\n */\nexport function createLogger(source: LogSource, opts: CreateLoggerOptions = {}): Logger {\n const fallback = opts.fallback !== false;\n if (!getLogStore() && !fallback) {\n throw new Error(\"createLogger: no LogStore registered. Call registerLogStore() first.\");\n }\n const store = ensureLogStore();\n return makeLogger(source, store);\n}\n\nfunction makeLogger(source: LogSource, store: LogStore): Logger {\n const emit = (\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n message: string,\n data?: object,\n err?: unknown,\n ) => {\n if (!store.isEnabled(level)) return;\n store.record({\n source,\n level,\n message,\n data: sanitizeData(data),\n error: normalizeError(err),\n });\n };\n return {\n debug(message, data) {\n emit(\"debug\", message, data);\n },\n info(message, data) {\n emit(\"info\", message, data);\n },\n warn(message, data) {\n emit(\"warn\", message, data);\n },\n error(message, err, data) {\n emit(\"error\", message, data, err);\n },\n child(partial) {\n return makeLogger({ ...source, ...partial }, store);\n },\n };\n}\n","/**\n * Runtime-portable embedded SQLite for the logging sink.\n *\n * The log store needs a synchronous, embedded SQLite driver. Bun ships\n * `bun:sqlite`; Node 22.5+ ships `node:sqlite`. This shim selects the right\n * one at runtime so the CLI and runtime run unmodified under either — no Bun\n * dependency baked into the published build.\n *\n * Both drivers accept `$`-prefixed named-parameter keys directly, so callers\n * use one binding convention. The only API gap is transactions: `bun:sqlite`\n * has `db.transaction()`, `node:sqlite` does not — {@link openSqlite}\n * synthesizes it with manual `BEGIN`/`COMMIT`/`ROLLBACK`.\n */\nimport { createRequire } from \"node:module\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\n/** True when executing under the Bun runtime. */\nconst isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\n\n/** A prepared statement bound with `$`-prefixed named parameters. */\nexport interface PortableStatement {\n run(params?: Record<string, unknown>): void;\n all<T = unknown>(params?: Record<string, unknown>): T[];\n get<T = unknown>(params?: Record<string, unknown>): T | undefined;\n}\n\n/** A synchronous embedded SQLite handle, uniform across Bun and Node. */\nexport interface PortableDatabase {\n exec(sql: string): void;\n prepare(sql: string): PortableStatement;\n /** Wrap `fn` so the statements it runs commit as one transaction. */\n transaction<A extends unknown[]>(fn: (...args: A) => void): (...args: A) => void;\n close(): void;\n}\n\nexport interface OpenSqliteOptions {\n /** Open read-only. The database file must already exist. */\n readonly?: boolean;\n}\n\n/** Minimal structural shape shared by `bun:sqlite` and `node:sqlite` handles. */\ninterface RawStatement {\n run(params?: unknown): unknown;\n all(params?: unknown): unknown[];\n get(params?: unknown): unknown;\n}\ninterface RawDatabase {\n exec(sql: string): unknown;\n prepare(sql: string): RawStatement;\n close(): void;\n}\n\nfunction wrapStatement(stmt: RawStatement): PortableStatement {\n return {\n run: (params) => {\n if (params === undefined) stmt.run();\n else stmt.run(params);\n },\n all: (params) => (params === undefined ? stmt.all() : stmt.all(params)) as never,\n get: (params) => (params === undefined ? stmt.get() : stmt.get(params)) as never,\n };\n}\n\nfunction openBunSqlite(path: string, opts: OpenSqliteOptions): PortableDatabase {\n const { Database } = nodeRequire(\"bun:sqlite\") as {\n Database: new (\n p: string,\n o?: { readonly?: boolean },\n ) => RawDatabase & {\n transaction<A extends unknown[]>(fn: (...args: A) => void): (...args: A) => void;\n };\n };\n const db = opts.readonly ? new Database(path, { readonly: true }) : new Database(path);\n return {\n exec: (sql) => {\n db.exec(sql);\n },\n prepare: (sql) => wrapStatement(db.prepare(sql)),\n transaction: (fn) => db.transaction(fn),\n close: () => {\n db.close();\n },\n };\n}\n\nfunction openNodeSqlite(path: string, opts: OpenSqliteOptions): PortableDatabase {\n const { DatabaseSync } = nodeRequire(\"node:sqlite\") as {\n DatabaseSync: new (p: string, o?: { readOnly?: boolean }) => RawDatabase;\n };\n const db = opts.readonly ? new DatabaseSync(path, { readOnly: true }) : new DatabaseSync(path);\n return {\n exec: (sql) => {\n db.exec(sql);\n },\n prepare: (sql) => wrapStatement(db.prepare(sql)),\n transaction:\n (fn) =>\n (...args) => {\n db.exec(\"BEGIN\");\n try {\n fn(...args);\n db.exec(\"COMMIT\");\n } catch (err) {\n db.exec(\"ROLLBACK\");\n throw err;\n }\n },\n close: () => {\n db.close();\n },\n };\n}\n\n/**\n * Open an embedded SQLite database using the runtime's native driver —\n * `bun:sqlite` under Bun, `node:sqlite` under Node 22.5+.\n */\nexport function openSqlite(path: string, opts: OpenSqliteOptions = {}): PortableDatabase {\n return isBun ? openBunSqlite(path, opts) : openNodeSqlite(path, opts);\n}\n","import type { LogEntry, LogQuery, LogQueryResult } from \"@skaile/workspaces/types\";\nimport { openSqlite, type PortableDatabase, type PortableStatement } from \"./sqlite-runtime.js\";\nimport type { LogSink } from \"./types.js\";\n\nexport interface SqliteSinkOptions {\n path: string; // ':memory:' or filesystem path\n}\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS log_entries (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL,\n session_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n subkind TEXT NOT NULL,\n instance TEXT,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n data_json TEXT,\n error_json TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_logs_timestamp ON log_entries(timestamp);\nCREATE INDEX IF NOT EXISTS idx_logs_kind_level ON log_entries(kind, level);\nCREATE INDEX IF NOT EXISTS idx_logs_source ON log_entries(kind, subkind, instance);\n`;\n\ninterface LogEntryRow {\n id: string;\n timestamp: string;\n session_id: string;\n kind: string;\n subkind: string;\n instance: string | null;\n level: string;\n message: string;\n data_json: string | null;\n error_json: string | null;\n}\n\nexport class SqliteSink implements LogSink {\n private db: PortableDatabase;\n private insertStmt: PortableStatement;\n private insertMany: (entries: LogEntry[]) => void;\n private closed = false;\n\n constructor(opts: SqliteSinkOptions) {\n this.db = openSqlite(opts.path);\n if (opts.path !== \":memory:\") {\n this.db.exec(\"PRAGMA journal_mode = WAL\");\n }\n this.db.exec(SCHEMA);\n this.insertStmt = this.db.prepare(\n `INSERT INTO log_entries (id, timestamp, session_id, kind, subkind, instance, level, message, data_json, error_json)\n VALUES ($id, $timestamp, $session_id, $kind, $subkind, $instance, $level, $message, $data_json, $error_json)`,\n );\n this.insertMany = this.db.transaction((entries: LogEntry[]) => {\n for (const e of entries) this.insertStmt.run(this.toRow(e));\n });\n }\n\n write(entry: LogEntry): void {\n if (this.closed) return;\n this.insertStmt.run(this.toRow(entry));\n }\n\n writeBatch(entries: LogEntry[]): void {\n if (this.closed || entries.length === 0) return;\n this.insertMany(entries);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.db.close();\n }\n\n query(q: LogQuery): LogQueryResult {\n if (this.closed) return { entries: [] };\n const where: string[] = [\"session_id = $sessionId\"];\n const params: Record<string, unknown> = { $sessionId: q.sessionId };\n\n if (q.source?.kind) {\n where.push(\"kind = $kind\");\n params.$kind = q.source.kind;\n }\n if (q.source?.subkind) {\n where.push(\"subkind = $subkind\");\n params.$subkind = q.source.subkind;\n }\n if (q.source?.instance) {\n where.push(\"instance = $instance\");\n params.$instance = q.source.instance;\n }\n if (q.levels && q.levels.length > 0) {\n const placeholders = q.levels.map((_, i) => `$level${i}`).join(\", \");\n where.push(`level IN (${placeholders})`);\n q.levels.forEach((lvl, i) => {\n params[`$level${i}`] = lvl;\n });\n }\n if (q.since) {\n where.push(\"timestamp >= $since\");\n params.$since = q.since;\n }\n if (q.until) {\n where.push(\"timestamp < $until\");\n params.$until = q.until;\n }\n if (q.search) {\n // Escape SQL LIKE wildcards so a search for \"100%\" matches the literal string,\n // not \"100<anything>\". \\\\ is also escaped because it's the escape character itself.\n const escaped = q.search.replace(/[\\\\%_]/g, \"\\\\$&\");\n where.push(\"message LIKE $search ESCAPE '\\\\'\");\n params.$search = `%${escaped}%`;\n }\n if (q.cursor) {\n where.push(\"id < $cursor\");\n params.$cursor = q.cursor;\n }\n\n const limit = Math.min(q.limit ?? 500, 5000);\n params.$limit = limit + 1;\n\n const sql = `SELECT id, timestamp, session_id, kind, subkind, instance, level, message, data_json, error_json\n FROM log_entries\n WHERE ${where.join(\" AND \")}\n ORDER BY id DESC\n LIMIT $limit`;\n\n const rows = this.db.prepare(sql).all<LogEntryRow>(params);\n\n const hasMore = rows.length > limit;\n const sliced = hasMore ? rows.slice(0, limit) : rows;\n const entries: LogEntry[] = sliced.map((r) => ({\n id: r.id,\n timestamp: r.timestamp,\n sessionId: r.session_id,\n source: {\n kind: r.kind as LogEntry[\"source\"][\"kind\"],\n subkind: r.subkind,\n instance: r.instance ?? undefined,\n },\n level: r.level as LogEntry[\"level\"],\n message: r.message,\n data: r.data_json ? JSON.parse(r.data_json) : undefined,\n error: r.error_json ? JSON.parse(r.error_json) : undefined,\n }));\n\n return {\n entries,\n nextCursor: hasMore ? entries[entries.length - 1].id : undefined,\n };\n }\n\n // Both bun:sqlite and node:sqlite bind `$name` SQL placeholders from\n // matching `$`-prefixed object keys.\n private toRow(e: LogEntry): Record<string, unknown> {\n return {\n $id: e.id,\n $timestamp: e.timestamp,\n $session_id: e.sessionId,\n $kind: e.source.kind,\n $subkind: e.source.subkind,\n $instance: e.source.instance ?? null,\n $level: e.level,\n $message: e.message,\n $data_json: e.data ? JSON.stringify(e.data) : null,\n $error_json: e.error ? JSON.stringify(e.error) : null,\n };\n }\n}\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { LogLevel, LogStoreConfig, LogStoreMode } from \"@skaile/workspaces/types\";\nimport { LogStore } from \"./log-store.js\";\nimport { NoOpSink } from \"./sinks/no-op-sink.js\";\nimport { SqliteSink } from \"./sinks/sqlite-sink.js\";\nimport { StdoutSink } from \"./sinks/stdout-sink.js\";\n\nconst VALID_MODES: LogStoreMode[] = [\"persistent\", \"ephemeral\", \"off\"];\nconst VALID_LEVELS: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n\nexport interface ResolveLogStoreConfigInput {\n sessionId: string;\n workspacePath?: string;\n yamlBlock?: Partial<{\n mode: LogStoreMode;\n level: LogLevel;\n retention: { maxEntries?: number; maxAgeDays?: number };\n }>;\n}\n\nexport function resolveLogStoreConfig(input: ResolveLogStoreConfigInput): LogStoreConfig {\n const yaml = input.yamlBlock ?? {};\n const envMode = process.env.SKAILE_LOG_MODE as LogStoreMode | undefined;\n const envLevel = process.env.SKAILE_LOG_LEVEL as LogLevel | undefined;\n\n const mode = envMode ?? yaml.mode ?? \"persistent\";\n if (!VALID_MODES.includes(mode)) {\n throw new Error(`Invalid logging.mode: ${mode}`);\n }\n const level = envLevel ?? yaml.level ?? \"info\";\n if (!VALID_LEVELS.includes(level)) {\n throw new Error(`Invalid logging.level: ${level}`);\n }\n\n return {\n sessionId: input.sessionId,\n workspacePath: input.workspacePath,\n mode,\n level,\n retention: yaml.retention,\n };\n}\n\nexport function createLogStoreFromConfig(cfg: LogStoreConfig): LogStore {\n const sinks = [];\n if (cfg.mode === \"off\") {\n sinks.push(new NoOpSink());\n } else if (cfg.mode === \"ephemeral\") {\n sinks.push(new SqliteSink({ path: \":memory:\" }));\n } else {\n if (!cfg.workspacePath) {\n throw new Error(\"logging.mode=persistent requires workspacePath\");\n }\n const dir = path.join(cfg.workspacePath, \".skaile\");\n mkdirSync(dir, { recursive: true });\n const dbPath = path.join(dir, \"logs.db\");\n sinks.push(new SqliteSink({ path: dbPath }));\n }\n // Always include stdout for live container logs (dev-friendly).\n sinks.push(new StdoutSink());\n return new LogStore({\n sessionId: cfg.sessionId,\n level: cfg.level,\n sinks,\n });\n}\n","import type { LogEntry, LogSink } from \"@skaile/workspaces/types\";\n\n/**\n * OnLogBridgeSink — forwards every entry as a single formatted text line to\n * a legacy `onLog(line)` callback. Used as a back-compat bridge for callers\n * that historically received plain text lines from the runner.\n *\n * Format: `[level] [kind:subkind[:instance]] message [data-json] [— error.message]`\n */\nexport class OnLogBridgeSink implements LogSink {\n constructor(private readonly onLog: (line: string) => void) {}\n\n write(entry: LogEntry): void {\n const tag = entry.source.instance\n ? `${entry.source.kind}:${entry.source.subkind}:${entry.source.instance}`\n : `${entry.source.kind}:${entry.source.subkind}`;\n let line = `[${entry.level}] [${tag}] ${entry.message}`;\n if (entry.data && Object.keys(entry.data).length > 0) {\n line += ` ${JSON.stringify(entry.data)}`;\n }\n if (entry.error?.message) {\n line += ` — ${entry.error.message}`;\n }\n this.onLog(line);\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {\n /* no-op */\n }\n}\n","import type { LogEntry, LogEntryEvent } from \"@skaile/workspaces/types\";\nimport type { LogSink } from \"./types.js\";\n\nexport interface WsLogSinkOptions {\n /**\n * Transport send callback. Typically wired to `transport.send` on the\n * runner's `WebSocketServerTransport`. The transport already drops sends\n * when no client is connected — this sink does not buffer.\n */\n send: (event: LogEntryEvent) => void;\n}\n\n/**\n * Forwards every LogEntry recorded by LogStore as a `log_entry` AgentEvent\n * over the configured transport. Used by the runner to make container-side\n * structured logs visible to the platform gateway in real time. Historical\n * reads still go through SQLite — this sink is for live tail only.\n */\nexport class WsLogSink implements LogSink {\n private readonly send: (event: LogEntryEvent) => void;\n\n constructor(opts: WsLogSinkOptions) {\n this.send = opts.send;\n }\n\n write(entry: LogEntry): void {\n try {\n this.send({ type: \"log_entry\", entry });\n } catch {\n // Logging must never break the agent — drop on transport failure.\n }\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {\n /* nothing to release — transport lifecycle is owned by the caller */\n }\n}\n"]}
@@ -10,8 +10,7 @@ var ASSET_KINDS = [
10
10
  "persona",
11
11
  "ruleset",
12
12
  "knowledge",
13
- "connector",
14
- "mount"
13
+ "connector"
15
14
  ];
16
15
  var INDIVIDUAL_KINDS = [
17
16
  "skill",
@@ -120,5 +119,5 @@ function repositoryToRaw(r) {
120
119
  }
121
120
 
122
121
  export { ASSET_KINDS, INDIVIDUAL_KINDS, assetRefToDep, assetRefToStr, depToStr, entryFromRaw, entryToRaw, parseAssetRef, parseDep, repositoryFromRaw, repositoryToRaw };
123
- //# sourceMappingURL=chunk-JLPC4YWT.js.map
124
- //# sourceMappingURL=chunk-JLPC4YWT.js.map
122
+ //# sourceMappingURL=chunk-37JKX6D7.js.map
123
+ //# sourceMappingURL=chunk-37JKX6D7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/src/models.ts"],"names":[],"mappings":"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","file":"chunk-37JKX6D7.js","sourcesContent":["/**\n * Pure data models — no I/O, no side effects.\n */\n\n/**\n * Discriminator for catalog entries and asset references.\n * Used in asset ref strings (e.g. `'skill:my-skill'`, `'agent:my-agent'`).\n * @docLink packages/core/concepts#asset-kind\n */\nexport type AssetKind =\n | \"skill\"\n | \"agent\"\n | \"prompt\"\n | \"bundle\"\n | \"flow\"\n | \"contract\"\n | \"mcp-server\"\n | \"persona\" // identity fragment — replaces SOUL.md in composition\n | \"ruleset\" // behavioral constraints — replaces RULES.md in composition\n | \"knowledge\" // knowledge bundle directory\n | \"connector\"; // connector descriptor (CONNECTOR.md)\n\n/**\n * All valid AssetKind values as a readonly array.\n * @docLink packages/core/concepts#asset-kinds\n */\nexport const ASSET_KINDS: readonly AssetKind[] = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"bundle\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n \"persona\",\n \"ruleset\",\n \"knowledge\",\n \"connector\",\n];\n/**\n * Asset kinds that represent individually installable assets (excludes \"bundle\").\n * Note: persona, ruleset, and knowledge are valid AssetKind values but are not\n * individually installable — they are resolved at session creation time via the\n * mixin-resolver, not through the install/deploy pipeline.\n * @docLink packages/core/concepts#individual-kinds\n */\nexport const INDIVIDUAL_KINDS = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n] as const satisfies AssetKind[];\n\n// ── Dependency ────────────────────────────────────────────────────────────────\n\n/**\n * Declared dependency on another catalog asset.\n * @docLink packages/core/concepts#dependency\n */\nexport interface Dependency {\n /** Asset kind (e.g. \"skill\", \"agent\", \"contract\"). */\n kind: string;\n /** Asset name within that kind. */\n name: string;\n}\n\n/**\n * Parse a `\"kind:name\"` dependency string, or a bare `\"name\"` (defaults kind to `\"skill\"`).\n *\n * @param s - Dependency string, e.g. `\"skill:use-exa\"` or `\"use-exa\"`\n * @returns Parsed `{ kind, name }` dependency object\n * @docLink packages/core/concepts#parse-dep\n */\nexport function parseDep(s: string): Dependency {\n const i = s.indexOf(\":\");\n if (i !== -1) {\n const kind = s.slice(0, i).trim();\n const name = s.slice(i + 1).trim();\n return { kind, name };\n }\n return { kind: \"skill\", name: s.trim() };\n}\n\n/**\n * Serialize a Dependency back to its `\"kind:name\"` string form.\n *\n * @param d - Dependency to serialize\n * @returns String in `\"kind:name\"` format\n * @docLink packages/core/concepts#dep-to-str\n */\nexport function depToStr(d: Dependency): string {\n return `${d.kind}:${d.name}`;\n}\n\n// ── CatalogEntry ──────────────────────────────────────────────────────────────\n\n/**\n * A resolved catalog entry describing an installable asset.\n * Produced by manifest parsers and stored in the catalog YAML.\n * @docLink packages/core/concepts#catalog-entry\n */\nexport interface CatalogEntry {\n /** Unique asset name within its kind. */\n name: string;\n /** Asset kind discriminator. */\n kind: AssetKind;\n /** Short description of what this asset does. */\n description: string;\n /** Absolute path to manifest file */\n source: string;\n /** Originating repository name */\n repository?: string;\n /** Domain this asset belongs to (top-level directory in the repo root). */\n domain?: string;\n /** Semantic version string (may be empty if not declared in the manifest). */\n version: string;\n /** Skills, agents, or other assets this entry depends on. */\n requires: Dependency[];\n /** Bundle dependencies — asset refs to install (bundles only). */\n dependencies: string[];\n /**\n * Kind-specific metadata extracted from the manifest frontmatter.\n * Used by MCP servers to carry default config (transport, command, args, env, url, headers)\n * so that `mcp:name` dependency refs resolve to a runnable declaration without\n * requiring verbose inline config in `skaile.yaml`.\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Construct a CatalogEntry from a raw deserialized record (e.g. from catalog.yaml).\n *\n * @param d - Raw object with loosely typed fields\n * @returns Normalized CatalogEntry\n * @docLink packages/core/concepts#entry-from-raw\n */\nexport function entryFromRaw(d: Record<string, unknown>): CatalogEntry {\n const rawDeps = d.dependencies;\n const deps = Array.isArray(rawDeps) ? (rawDeps as string[]).filter(Boolean) : [];\n const entry: CatalogEntry = {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"skill\") as AssetKind,\n description: String(d.description ?? \"\"),\n source: String(d.source ?? \"\"),\n repository: d.repository != null ? String(d.repository) : undefined,\n domain: d.domain != null ? String(d.domain) : undefined,\n version: String(d.version ?? \"\"),\n requires: Array.isArray(d.requires)\n ? (d.requires as string[]).filter(Boolean).map(parseDep)\n : [],\n dependencies: deps,\n };\n if (d.metadata != null && typeof d.metadata === \"object\" && !Array.isArray(d.metadata)) {\n entry.metadata = d.metadata as Record<string, unknown>;\n }\n return entry;\n}\n\n/**\n * Serialize a CatalogEntry to a plain record suitable for YAML/JSON persistence.\n *\n * @param e - CatalogEntry to serialize\n * @returns Plain object with string-serialized requires and dependencies\n * @docLink packages/core/concepts#entry-to-raw\n */\nexport function entryToRaw(e: CatalogEntry): Record<string, unknown> {\n const raw: Record<string, unknown> = {\n name: e.name,\n kind: e.kind,\n description: e.description,\n source: e.source,\n repository: e.repository,\n domain: e.domain,\n version: e.version,\n requires: e.requires.map(depToStr),\n dependencies: e.dependencies,\n };\n if (e.metadata) raw.metadata = e.metadata;\n return raw;\n}\n\n// ── AssetRef ─────────────────────────────────────────────────────────────────\n\n/**\n * A parsed asset reference: `kind:name[@repository][#pin]`.\n * Produced by `parseAssetRef`; consumed by `resolveAsset` and `resolveAll`.\n * @docLink packages/core/concepts#asset-ref\n */\nexport interface AssetRef {\n kind: string;\n name: string;\n /** Optional repository qualifier (from skaile.yaml repositories section). */\n repository?: string;\n /** Optional pin: git tag, commit SHA, or branch name. */\n pin?: string;\n}\n\n/**\n * Parse an asset reference string into an `AssetRef` object.\n *\n * Formats:\n * \"skill:overview\" → { kind: \"skill\", name: \"overview\" }\n * \"skill:overview@skaile-ai\" → { kind: \"skill\", name: \"overview\", repository: \"skaile-ai\" }\n * \"skill:overview@skaile-ai#v2.1.0\" → { kind: \"skill\", name: \"overview\", repository: \"skaile-ai\", pin: \"v2.1.0\" }\n * \"overview\" → { kind: \"skill\", name: \"overview\" }\n *\n * The shorthand `mcp:` is normalized to `mcp-server:`.\n *\n * @param s - Asset reference string\n * @returns Parsed `AssetRef`\n * @docLink packages/core/concepts#parse-asset-ref\n */\nexport function parseAssetRef(s: string): AssetRef {\n let rest = s.trim();\n let kind = \"skill\";\n\n // Extract kind: prefix\n const colonIdx = rest.indexOf(\":\");\n if (colonIdx !== -1) {\n kind = rest.slice(0, colonIdx).trim();\n rest = rest.slice(colonIdx + 1).trim();\n }\n\n // Normalize shorthand aliases\n if (kind === \"mcp\") kind = \"mcp-server\";\n\n // Extract #pin suffix\n let pin: string | undefined;\n const hashIdx = rest.indexOf(\"#\");\n if (hashIdx !== -1) {\n pin = rest.slice(hashIdx + 1).trim() || undefined;\n rest = rest.slice(0, hashIdx).trim();\n }\n\n // Extract @repository suffix\n let repository: string | undefined;\n const atIdx = rest.indexOf(\"@\");\n if (atIdx !== -1) {\n repository = rest.slice(atIdx + 1).trim() || undefined;\n rest = rest.slice(0, atIdx).trim();\n }\n\n return { kind, name: rest, repository, pin };\n}\n\n/**\n * Serialize an AssetRef back to its canonical string form.\n *\n * @param ref - AssetRef to serialize\n * @returns String in `\"kind:name[@repository][#pin]\"` format\n * @docLink packages/core/concepts#asset-ref-to-str\n */\nexport function assetRefToStr(ref: AssetRef): string {\n let s = `${ref.kind}:${ref.name}`;\n if (ref.repository) s += `@${ref.repository}`;\n if (ref.pin) s += `#${ref.pin}`;\n return s;\n}\n\n/**\n * Convert an AssetRef to a simple Dependency, dropping the repository and pin qualifiers.\n *\n * @param ref - Full asset reference (may include repository and pin)\n * @returns Dependency with only kind and name\n * @docLink packages/core/concepts#asset-ref-to-dep\n */\nexport function assetRefToDep(ref: AssetRef): Dependency {\n return { kind: ref.kind, name: ref.name };\n}\n\n// ── Lock File ────────────────────────────────────────────────────────────────\n\n/**\n * Repository entry recorded in the lock file.\n * Captures the source URL or path, branch, and resolved HEAD commit.\n * @docLink packages/core/api-reference#lock-repository\n */\nexport interface LockRepository {\n /** Remote git URL (for cloned repos). */\n url?: string;\n /** Local filesystem path (for path repos). */\n path?: string;\n /** Branch that was locked. */\n branch: string;\n /** HEAD commit SHA at lock time. */\n commit?: string;\n}\n\n/**\n * Per-asset entry in the lock file.\n * Records the resolved version, repo source, content integrity hash, and resolution provenance.\n * @docLink packages/core/api-reference#lock-entry\n */\nexport interface LockEntry {\n /** Semver version at lock time. */\n version: string;\n /** Name of the repository this asset was resolved from. */\n repository: string;\n /** Path to manifest relative to repo root. */\n source: string;\n /** Domain this asset belongs to (top-level directory in the repo root). */\n domain?: string;\n /** SHA-256 hash of manifest content. */\n integrity: string;\n /** What caused this asset to be included: \"direct\" or \"kind:name\" of parent. */\n resolved_by: string;\n}\n\n/**\n * Full skaile.lock.yaml structure.\n * Captures the complete resolved state of all asset dependencies at install time.\n * @docLink packages/core/api-reference#lock-file\n */\nexport interface LockFile {\n /** Lock file schema version. */\n lockfile_version: number;\n /** ISO timestamp of when the lock was generated. */\n locked_at: string;\n /** Repositories declared in skaile.yaml, with their locked commits. */\n repositories: Record<string, LockRepository>;\n /** All resolved assets keyed by \"kind:name\". */\n assets: Record<string, LockEntry>;\n}\n\n// ── AgentManifest ────────────────────────────────────────────────────────────\n\n/**\n * Agent package manifest — parsed from `agent.yaml` in an agent directory.\n * Defines the agent's identity, model preferences, capability requirements, and composition mixins.\n * @docLink packages/core/concepts#agent-manifest\n */\nexport interface AgentManifest {\n spec_version?: string;\n name?: string;\n version?: string;\n description?: string;\n model?: {\n preferred?: string;\n fallback?: string[];\n constraints?: { temperature?: number; max_tokens?: number };\n };\n tools?: {\n allowed?: string[];\n denied?: string[];\n };\n delegation?: { mode?: string };\n requires?: Array<{ name: string; source: string; version?: string; mount: string }>;\n tags?: string[];\n author?: string;\n metadata?: Record<string, unknown>;\n /**\n * @deprecated Use `persona`, `rules`, and `knowledge` mixin arrays instead.\n * This field is declared but was never resolved at runtime.\n */\n extends?: string;\n abilities?: string[];\n /**\n * Identity fragments to compose into the agent persona.\n * Each entry is a catalog ref (`persona:name@repo#pin`), a bare name\n * (defaults to kind \"persona\"), or a local path (`./my.persona.md`).\n * Resolved in order — concatenated with \\n\\n---\\n\\n separator.\n */\n persona?: string[];\n /**\n * Behavioral rule sets to compose into the agent's constraints.\n * Each entry is a catalog ref (`ruleset:name@repo#pin`), bare name,\n * or local path. All rules apply (union).\n */\n rules?: string[];\n /**\n * Knowledge bundles to compose into the agent's domain knowledge.\n * Each entry is a catalog ref (`knowledge:name@repo#pin`), bare name,\n * or local path to a knowledge directory. Loaded in declaration order.\n */\n knowledge?: string[];\n contracts?: string[];\n /**\n * v2 composition items. Each entry references an asset (skill, connector,\n * soul, ruleset, etc.) with binding semantics (discoverable, inline-live,\n * inline-snapshot). Resolved at session start via the composition module.\n */\n composes?: Array<{\n kind: string;\n ref: string;\n instance?: string;\n binding?: \"discoverable\" | \"inline-live\" | \"inline-snapshot\";\n }>;\n runtime?: {\n max_turns?: number;\n timeout?: number;\n [key: string]: unknown;\n };\n}\n\n// ── Repository ───────────────────────────────────────────────────────────────\n\ntype RepositoryKind = \"local\" | \"github\";\n\n/**\n * A registered asset repository (local path or cloned GitHub repo).\n * Stored in the catalog; consumed by `repo-manager` for cloning and scanning.\n * @docLink packages/core/concepts#repository\n */\nexport interface Repository {\n /** Logical repository name. */\n name: string;\n /** Storage kind: \"local\" for paths, \"github\" for remote URLs. */\n kind: RepositoryKind;\n /** Absolute path (local) or remote URL (github). */\n path: string;\n /** Active branch. */\n branch: string;\n /** Upstream fork URL (for fork-based workflows). */\n upstream?: string;\n}\n\n/**\n * Construct a `Repository` from a raw deserialized record.\n *\n * @param d - Raw object from YAML/JSON\n * @returns Normalized `Repository`\n * @docLink packages/core/concepts#repository-from-raw\n */\nexport function repositoryFromRaw(d: Record<string, unknown>): Repository {\n return {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"local\") as RepositoryKind,\n path: String(d.path ?? \"\"),\n branch: String(d.branch ?? \"main\"),\n upstream: d.upstream != null ? String(d.upstream) : undefined,\n };\n}\n\n/**\n * Serialize a `Repository` to a plain record for YAML/JSON persistence.\n * Omits the `branch` field when it equals `\"main\"` to keep serialized output clean.\n *\n * @param r - Repository to serialize\n * @returns Plain object suitable for YAML/JSON\n * @docLink packages/core/concepts#repository-to-raw\n */\nexport function repositoryToRaw(r: Repository): Record<string, unknown> {\n const d: Record<string, unknown> = {\n name: r.name,\n kind: r.kind,\n path: r.path,\n };\n if (r.branch !== \"main\") d.branch = r.branch;\n if (r.upstream != null) d.upstream = r.upstream;\n return d;\n}\n"]}
@@ -1,9 +1,11 @@
1
- import { discoverAssetsInTree, loadSourceConfig } from './chunk-46T37EBP.js';
2
- import { PresetManifestSchema } from './chunk-Z3RER6YZ.js';
1
+ import { discoverAssetsInTree, loadSourceConfig } from './chunk-GKIA2PU5.js';
2
+ import { PresetManifestSchema } from './chunk-NELZIQ2E.js';
3
3
  import { __export, __require } from './chunk-NSBPE2FW.js';
4
4
  import * as crypto from 'crypto';
5
+ import { createHash } from 'crypto';
5
6
  import * as fs10 from 'fs';
6
7
  import * as path5 from 'path';
8
+ import { resolve, join, sep, dirname, isAbsolute } from 'path';
7
9
  import { eq, like, and } from 'drizzle-orm';
8
10
  import * as z2 from 'zod';
9
11
  import * as os from 'os';
@@ -11,6 +13,7 @@ import { stringify, parse, parseDocument } from 'yaml';
11
13
  import { createClient } from '@libsql/client';
12
14
  import { drizzle } from 'drizzle-orm/libsql';
13
15
  import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
16
+ import { rm, mkdir, writeFile } from 'fs/promises';
14
17
  import { spawnSync } from 'child_process';
15
18
 
16
19
  // library/src/library.ts
@@ -247,7 +250,8 @@ var instances = sqliteTable("instances", {
247
250
  credentialRef: text("credential_ref"),
248
251
  createdAt: text("created_at").notNull(),
249
252
  updatedAt: text("updated_at").notNull(),
250
- createdBy: text("created_by")
253
+ createdBy: text("created_by"),
254
+ sourceCommitSha: text("source_commit_sha")
251
255
  });
252
256
  var subscriptions = sqliteTable("subscriptions", {
253
257
  id: text("id").primaryKey(),
@@ -298,14 +302,15 @@ CREATE INDEX IF NOT EXISTS idx_asset_defs_publisher ON asset_definitions(publi
298
302
  CREATE INDEX IF NOT EXISTS idx_asset_defs_library_id ON asset_definitions(library_id);
299
303
 
300
304
  CREATE TABLE IF NOT EXISTS instances (
301
- id TEXT PRIMARY KEY,
302
- def_ref TEXT NOT NULL,
303
- def_pin TEXT NOT NULL,
304
- config TEXT NOT NULL DEFAULT '{}',
305
- credential_ref TEXT,
306
- created_at TEXT NOT NULL,
307
- updated_at TEXT NOT NULL,
308
- created_by TEXT
305
+ id TEXT PRIMARY KEY,
306
+ def_ref TEXT NOT NULL,
307
+ def_pin TEXT NOT NULL,
308
+ config TEXT NOT NULL DEFAULT '{}',
309
+ credential_ref TEXT,
310
+ created_at TEXT NOT NULL,
311
+ updated_at TEXT NOT NULL,
312
+ created_by TEXT,
313
+ source_commit_sha TEXT
309
314
  );
310
315
  CREATE INDEX IF NOT EXISTS idx_instances_def_ref ON instances(def_ref);
311
316
 
@@ -420,9 +425,87 @@ async function createLibraryDb(dbPath) {
420
425
  await runLibrariesMigration(client);
421
426
  }
422
427
  await client.executeMultiple(DDL);
428
+ try {
429
+ await client.execute("ALTER TABLE instances ADD COLUMN source_commit_sha TEXT");
430
+ } catch (err) {
431
+ if (!/duplicate column/i.test(err instanceof Error ? err.message : String(err))) {
432
+ throw err;
433
+ }
434
+ }
423
435
  const db = drizzle(client, { schema: schema_exports });
424
436
  return { db, close: () => client.close() };
425
437
  }
438
+ function assertSafeManifestPath(installPath, p) {
439
+ const bad = () => {
440
+ throw new Error(`unsafe path in manifest: ${p}`);
441
+ };
442
+ if (!p || p.length === 0) bad();
443
+ if (isAbsolute(p) || p.startsWith("/") || p.startsWith("\\")) bad();
444
+ const segments = p.split(/[/\\]/);
445
+ if (segments.some((s) => s === "..")) bad();
446
+ const resolved = resolve(installPath, p);
447
+ if (resolved !== installPath && !resolved.startsWith(installPath + sep)) bad();
448
+ }
449
+ function assertSafeRefComponent(kind, value) {
450
+ const hasControlChar = [...value].some((c) => c.charCodeAt(0) < 32);
451
+ if (!value || value.startsWith(".") || /[/\\]/.test(value) || hasControlChar) {
452
+ throw new Error(`unsafe ref ${kind} component in manifest: '${value}'`);
453
+ }
454
+ }
455
+ async function installFromManifest(opts) {
456
+ const { manifest, libraryRoot } = opts;
457
+ const fetcher = opts.fetcher ?? (await import('./source-fetch-github-QN4LLTL5.js')).fetchAssetFilesFromGitHub;
458
+ const m = manifest.ref.match(/^@?([^/@\s]+)\/([^/@\s]+)@([^/@\s]+)$/);
459
+ if (!m) throw new Error(`invalid ref: ${manifest.ref}`);
460
+ const [, publisher, name, version] = m;
461
+ assertSafeRefComponent("publisher", publisher);
462
+ assertSafeRefComponent("name", name);
463
+ assertSafeRefComponent("version", version);
464
+ const root = resolve(libraryRoot);
465
+ const installPath = resolve(join(root, `@${publisher}`, name, version));
466
+ if (installPath !== root && !installPath.startsWith(root + sep)) {
467
+ throw new Error(
468
+ `unsafe install path: ref '${manifest.ref}' resolves outside the library root`
469
+ );
470
+ }
471
+ for (const f of manifest.files) {
472
+ assertSafeManifestPath(installPath, f.path);
473
+ }
474
+ const paths = manifest.files.map((f) => f.path);
475
+ const bytes = await fetcher({
476
+ url: manifest.source.url,
477
+ commitSha: manifest.source.commitSha,
478
+ paths
479
+ });
480
+ for (const f of manifest.files) {
481
+ assertSafeManifestPath(installPath, f.path);
482
+ const buf = bytes[f.path];
483
+ if (!buf) throw new Error(`fetcher returned no bytes for ${f.path}`);
484
+ const actual = createHash("sha256").update(buf).digest("hex");
485
+ if (actual !== f.sha256) {
486
+ throw new Error(`hash mismatch for ${f.path}: expected ${f.sha256}, got ${actual}`);
487
+ }
488
+ }
489
+ const sortedLines = manifest.files.slice().sort((a, b) => a.path.localeCompare(b.path)).map((e) => `${e.path}:${e.sha256}
490
+ `).join("");
491
+ const actualComposite = createHash("sha256").update(sortedLines, "utf-8").digest("hex");
492
+ if (actualComposite !== manifest.sha256) {
493
+ throw new Error(`composite hash mismatch: expected ${manifest.sha256}, got ${actualComposite}`);
494
+ }
495
+ await rm(installPath, { recursive: true, force: true });
496
+ try {
497
+ for (const f of manifest.files) {
498
+ const target = join(installPath, f.path);
499
+ await mkdir(dirname(target), { recursive: true });
500
+ await writeFile(target, bytes[f.path]);
501
+ }
502
+ } catch (e) {
503
+ await rm(installPath, { recursive: true, force: true }).catch(() => {
504
+ });
505
+ throw e;
506
+ }
507
+ return { installPath };
508
+ }
426
509
 
427
510
  // library/src/local/library.ts
428
511
  function escapeLikePrefix(prefix) {
@@ -480,7 +563,8 @@ function rowToInstance(row) {
480
563
  credentialRef: row.credentialRef ?? void 0,
481
564
  createdAt: new Date(row.createdAt),
482
565
  updatedAt: new Date(row.updatedAt),
483
- createdBy: row.createdBy ?? void 0
566
+ createdBy: row.createdBy ?? void 0,
567
+ sourceCommitSha: row.sourceCommitSha ?? void 0
484
568
  };
485
569
  }
486
570
  function rowToSubscription(row) {
@@ -497,6 +581,8 @@ var LocalLibrary = class {
497
581
  dbHandleRef = null;
498
582
  dbPromise = null;
499
583
  _kindRegistry;
584
+ /** Absolute path to the library storage directory. */
585
+ libraryDir;
500
586
  /**
501
587
  * Construct a LocalLibrary. Synchronous — does not open the DB.
502
588
  *
@@ -514,6 +600,7 @@ var LocalLibrary = class {
514
600
  if (!fs10.existsSync(dir)) {
515
601
  fs10.mkdirSync(dir, { recursive: true });
516
602
  }
603
+ this.libraryDir = dir;
517
604
  this.dbPath = path5.join(dir, "lib.db");
518
605
  }
519
606
  /**
@@ -666,7 +753,8 @@ var LocalLibrary = class {
666
753
  credentialRef: input.credentialRef ?? null,
667
754
  createdAt: now,
668
755
  updatedAt: now,
669
- createdBy: input.createdBy ?? null
756
+ createdBy: input.createdBy ?? null,
757
+ sourceCommitSha: null
670
758
  }).run();
671
759
  return {
672
760
  id,
@@ -679,6 +767,70 @@ var LocalLibrary = class {
679
767
  createdBy: input.createdBy
680
768
  };
681
769
  }
770
+ /**
771
+ * Install an asset from a pointer-only {@link InstallManifest}.
772
+ *
773
+ * This is the pointer-only install path: the caller obtains the manifest
774
+ * from a catalog source (`RemoteCatalogSource.getInstallManifest(ref)` —
775
+ * a `RemoteCatalogSource`-only method, not on the `ICatalogSource`
776
+ * contract), and `install` then:
777
+ *
778
+ * 1. fetches the asset bytes directly from the upstream repo at the
779
+ * pinned commit and verifies every per-file + the composite SHA256
780
+ * (via {@link installFromManifest});
781
+ * 2. records an {@link Instance} row carrying `sourceCommitSha` so the
782
+ * install is auditable and re-verifiable.
783
+ *
784
+ * Not part of the {@link ILibrary} interface — `LocalLibrary`-only, since
785
+ * the platform variant resolves install bytes differently.
786
+ *
787
+ * @param manifest - The pointer-only install manifest from the Catalog.
788
+ * @param opts.libraryRoot - Filesystem root to install asset bytes under.
789
+ * Defaults to an `installed/` subdirectory of the library storage dir.
790
+ * @param opts.fetcher - Pluggable byte fetcher (tests inject a mock);
791
+ * defaults to `fetchAssetFilesFromGitHub`.
792
+ * @param opts.config - Initial Instance config. Defaults to `{}`.
793
+ * @param opts.defPin - Pin policy for the Instance. Defaults to `exact`
794
+ * (a pointer-only install is pinned to an immutable commit).
795
+ * @returns The created Instance plus its on-disk install path.
796
+ */
797
+ async install(manifest, opts) {
798
+ const libraryRoot = opts?.libraryRoot ?? path5.join(this.libraryDir, "installed");
799
+ const { installPath } = await installFromManifest({
800
+ manifest,
801
+ libraryRoot,
802
+ fetcher: opts?.fetcher
803
+ });
804
+ const id = crypto.randomUUID();
805
+ const now = (/* @__PURE__ */ new Date()).toISOString();
806
+ const pin = opts?.defPin ?? "exact";
807
+ const config = opts?.config ?? {};
808
+ const db = await this.ensureDb();
809
+ await db.insert(instances).values({
810
+ id,
811
+ defRef: manifest.ref,
812
+ defPin: pin,
813
+ config: JSON.stringify(config),
814
+ credentialRef: null,
815
+ createdAt: now,
816
+ updatedAt: now,
817
+ createdBy: opts?.createdBy ?? null,
818
+ sourceCommitSha: manifest.source.commitSha
819
+ }).run();
820
+ return {
821
+ instance: {
822
+ id,
823
+ defRef: manifest.ref,
824
+ defPin: pin,
825
+ config,
826
+ createdAt: new Date(now),
827
+ updatedAt: new Date(now),
828
+ createdBy: opts?.createdBy,
829
+ sourceCommitSha: manifest.source.commitSha
830
+ },
831
+ installPath
832
+ };
833
+ }
682
834
  async getInstance(id) {
683
835
  const db = await this.ensureDb();
684
836
  const row = await db.select().from(instances).where(eq(instances.id, id)).get();
@@ -1440,7 +1592,8 @@ assets: []
1440
1592
  if (!current.includes(MANIFEST_FILENAME)) {
1441
1593
  fs10.writeFileSync(
1442
1594
  excludePath,
1443
- (current.endsWith("\n") || current === "" ? current : current + "\n") + `# skaile-managed local-overlay manifest
1595
+ (current.endsWith("\n") || current === "" ? current : `${current}
1596
+ `) + `# skaile-managed local-overlay manifest
1444
1597
  ${MANIFEST_FILENAME}
1445
1598
  `,
1446
1599
  "utf-8"
@@ -2016,6 +2169,49 @@ var RemoteCatalogSource = class {
2016
2169
  }
2017
2170
  return { assetsCached: items.length };
2018
2171
  }
2172
+ /**
2173
+ * Fetch the pointer-only install manifest for an asset ref.
2174
+ *
2175
+ * The install manifest is the Pointer Triple: the immutable upstream
2176
+ * `source.url` + `source.commitSha`, the per-file `files[].sha256` list, a
2177
+ * composite `sha256` rollup, plus `kind` and `tier`. Callers fetch the asset
2178
+ * bytes directly from the upstream repo at that commit and verify each file
2179
+ * against the recorded hashes — the Catalog itself never serves asset bytes.
2180
+ *
2181
+ * Wire surface: `GET /trpc/catalog.getInstallManifest?input=<superjson({ ref })>`.
2182
+ *
2183
+ * This is a `RemoteCatalogSource`-only method — it is not part of the
2184
+ * `ICatalogSource` contract. `LocalCatalogSource` has the asset bytes on disk
2185
+ * and has no pointer-triple concept, so adding it to the shared interface
2186
+ * would force a meaningless implementation there.
2187
+ *
2188
+ * Not cached: the install path is a one-shot read driven by `skaile install`.
2189
+ *
2190
+ * @throws {@link CatalogHttpError} on a non-2xx response or malformed envelope.
2191
+ */
2192
+ async getInstallManifest(ref) {
2193
+ const url = trpcGetUrl(this.baseUrl, "catalog.getInstallManifest", { ref });
2194
+ const res = await this.httpClient(url, {
2195
+ method: "GET",
2196
+ headers: { Accept: "application/json" }
2197
+ });
2198
+ if (!res.ok) {
2199
+ throw new CatalogHttpError(
2200
+ `catalog.getInstallManifest ${ref} failed: ${res.status} ${res.statusText}`,
2201
+ res.status,
2202
+ url
2203
+ );
2204
+ }
2205
+ const data = await parseTrpcGet(res);
2206
+ if (data === null || data === void 0 || typeof data !== "object") {
2207
+ throw new CatalogHttpError(
2208
+ `catalog.getInstallManifest ${ref} returned a non-object payload (got ${typeof data})`,
2209
+ 200,
2210
+ url
2211
+ );
2212
+ }
2213
+ return data;
2214
+ }
2019
2215
  /**
2020
2216
  * Wait for any in-flight stale-while-revalidate background fetches to settle.
2021
2217
  * Test-only escape hatch.
@@ -2162,11 +2358,16 @@ function pickString(r, key) {
2162
2358
  const v = r[key];
2163
2359
  return typeof v === "string" ? v : void 0;
2164
2360
  }
2361
+ var CATALOG_REQUEST_TIMEOUT_MS = 1e4;
2165
2362
  var defaultFetch = async (url, init) => {
2166
2363
  if (typeof fetch === "undefined") {
2167
2364
  throw new Error("global fetch is not available; pass an httpClient explicitly");
2168
2365
  }
2169
- return fetch(url, init);
2366
+ const requestInit = init ?? {};
2367
+ return fetch(url, {
2368
+ ...requestInit,
2369
+ signal: requestInit.signal ?? AbortSignal.timeout(CATALOG_REQUEST_TIMEOUT_MS)
2370
+ });
2170
2371
  };
2171
2372
 
2172
2373
  // library/src/remote/rest-catalog-source.ts
@@ -2484,20 +2685,25 @@ function tryParseJson(s) {
2484
2685
  }
2485
2686
  return {};
2486
2687
  }
2688
+ var CATALOG_REQUEST_TIMEOUT_MS2 = 1e4;
2487
2689
  var defaultFetch2 = async (url, init) => {
2488
2690
  if (typeof fetch === "undefined") {
2489
2691
  throw new Error("global fetch is not available; pass an httpClient explicitly");
2490
2692
  }
2491
- return fetch(url, init);
2693
+ const requestInit = init ?? {};
2694
+ return fetch(url, {
2695
+ ...requestInit,
2696
+ signal: requestInit.signal ?? AbortSignal.timeout(CATALOG_REQUEST_TIMEOUT_MS2)
2697
+ });
2492
2698
  };
2493
- var KnowledgeManifestSchema = z2.object({
2699
+ var KnowledgeManifestSchema = z2.looseObject({
2494
2700
  name: z2.string().optional(),
2495
2701
  description: z2.string().optional(),
2496
2702
  version: z2.string().optional(),
2497
2703
  files: z2.array(z2.string()).optional(),
2498
2704
  keywords: z2.array(z2.string()).optional(),
2499
2705
  license: z2.string().optional()
2500
- }).passthrough();
2706
+ });
2501
2707
  function validateKnowledge(data) {
2502
2708
  const result = KnowledgeManifestSchema.safeParse(data);
2503
2709
  if (result.success) {
@@ -3224,6 +3430,6 @@ function deepEqual(a, b) {
3224
3430
  return JSON.stringify(a) === JSON.stringify(b);
3225
3431
  }
3226
3432
 
3227
- export { CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateLibraryNameError, DuplicateSubscriptionError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LIBRARY_STRUCTURES, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalLibrary, LocalSyncDriver, LockFileSchema, LockSubscriptionSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, StoreSyncDriver, SubscriptionNotFoundError, TarballHashMismatchError, UserLibraryManager, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, hasInterpolationTokens, interpolate, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveItem, resolveLibraryDir, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, sha256Hex, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeManifestIfMissing };
3228
- //# sourceMappingURL=chunk-DOMCYP7D.js.map
3229
- //# sourceMappingURL=chunk-DOMCYP7D.js.map
3433
+ export { CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateLibraryNameError, DuplicateSubscriptionError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LIBRARY_STRUCTURES, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalLibrary, LocalSyncDriver, LockFileSchema, LockSubscriptionSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, StoreSyncDriver, SubscriptionNotFoundError, TarballHashMismatchError, UserLibraryManager, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, hasInterpolationTokens, installFromManifest, interpolate, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveItem, resolveLibraryDir, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, sha256Hex, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeManifestIfMissing };
3434
+ //# sourceMappingURL=chunk-42OQF7UU.js.map
3435
+ //# sourceMappingURL=chunk-42OQF7UU.js.map