@skaile/workspaces 0.24.0 → 0.26.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 (520) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/README.md +2 -2
  3. package/dist/{asset-feeds-WKIKSZ6Z.js → asset-feeds-WMVTI7KW.js} +11 -10
  4. package/dist/asset-feeds-WMVTI7KW.js.map +1 -0
  5. package/dist/asset-manager/index.js +11 -10
  6. package/dist/asset-manager/installer.js +10 -9
  7. package/dist/asset-manager/renderers.js +2 -2
  8. package/dist/asset-manager/src/index.d.ts +6 -7
  9. package/dist/asset-manager/src/index.d.ts.map +1 -1
  10. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  11. package/dist/bridge/drivers/claude-sdk.js +14 -7
  12. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  13. package/dist/bridge/drivers/codex.js +8 -34
  14. package/dist/bridge/drivers/codex.js.map +1 -1
  15. package/dist/bridge/drivers/echo.js +1 -1
  16. package/dist/bridge/drivers/omp.js +64 -50
  17. package/dist/bridge/drivers/omp.js.map +1 -1
  18. package/dist/bridge/index.js +4 -4
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  20. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  21. package/dist/bridge/src/drivers/omp.d.ts +20 -4
  22. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  23. package/dist/bridge/src/error-classifier.d.ts +17 -0
  24. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  25. package/dist/bridge/src/models.d.ts +1 -1
  26. package/dist/bridge/src/models.d.ts.map +1 -1
  27. package/dist/bridge/src/provider-endpoints.d.ts +16 -0
  28. package/dist/bridge/src/provider-endpoints.d.ts.map +1 -0
  29. package/dist/bridge/src/validation.d.ts +1 -1
  30. package/dist/bridge/src/validation.d.ts.map +1 -1
  31. package/dist/{chunk-M5TE6YI5.js → chunk-23M4XZQW.js} +10 -52
  32. package/dist/chunk-23M4XZQW.js.map +1 -0
  33. package/dist/{chunk-DH4N5AW4.js → chunk-2FS4FPZ7.js} +3 -3
  34. package/dist/{chunk-DH4N5AW4.js.map → chunk-2FS4FPZ7.js.map} +1 -1
  35. package/dist/{chunk-6VTG73UY.js → chunk-45H3UO2R.js} +2 -2
  36. package/dist/{chunk-6VTG73UY.js.map → chunk-45H3UO2R.js.map} +1 -1
  37. package/dist/chunk-4SQ6Y6U7.js +28 -0
  38. package/dist/chunk-4SQ6Y6U7.js.map +1 -0
  39. package/dist/{chunk-LSGAYQ2E.js → chunk-5YO3H5Q4.js} +3 -3
  40. package/dist/{chunk-LSGAYQ2E.js.map → chunk-5YO3H5Q4.js.map} +1 -1
  41. package/dist/{chunk-JDX54X4Y.js → chunk-7GWYRVAX.js} +12 -9
  42. package/dist/chunk-7GWYRVAX.js.map +1 -0
  43. package/dist/{chunk-46COM7M5.js → chunk-7OBGSR7O.js} +5 -5
  44. package/dist/chunk-7OBGSR7O.js.map +1 -0
  45. package/dist/{chunk-2RFOFHSM.js → chunk-BKF3UFF4.js} +21 -9
  46. package/dist/chunk-BKF3UFF4.js.map +1 -0
  47. package/dist/{chunk-KOVLSBXK.js → chunk-BMQKMOQY.js} +81 -79
  48. package/dist/chunk-BMQKMOQY.js.map +1 -0
  49. package/dist/{chunk-J2TITSXF.js → chunk-BQRRBGDE.js} +2 -2
  50. package/dist/{chunk-J2TITSXF.js.map → chunk-BQRRBGDE.js.map} +1 -1
  51. package/dist/{chunk-5ESCS2OS.js → chunk-C32BRO2W.js} +67 -35
  52. package/dist/chunk-C32BRO2W.js.map +1 -0
  53. package/dist/{chunk-GZWJGNNN.js → chunk-DEYYRFQU.js} +3 -3
  54. package/dist/chunk-DEYYRFQU.js.map +1 -0
  55. package/dist/{chunk-YX3UWPJ5.js → chunk-IEJ5IOC3.js} +27 -49
  56. package/dist/chunk-IEJ5IOC3.js.map +1 -0
  57. package/dist/chunk-IERB3UXJ.js +215 -0
  58. package/dist/chunk-IERB3UXJ.js.map +1 -0
  59. package/dist/{chunk-FVTV7M76.js → chunk-IFGTRL2I.js} +3 -3
  60. package/dist/chunk-IFGTRL2I.js.map +1 -0
  61. package/dist/{chunk-LJ52ZKIU.js → chunk-JIQLLZ65.js} +203 -39
  62. package/dist/chunk-JIQLLZ65.js.map +1 -0
  63. package/dist/{chunk-Z3M5K67G.js → chunk-KL2MQ6WI.js} +114 -63
  64. package/dist/chunk-KL2MQ6WI.js.map +1 -0
  65. package/dist/{chunk-6FNCZYJY.js → chunk-MBOR7D65.js} +3 -3
  66. package/dist/{chunk-6FNCZYJY.js.map → chunk-MBOR7D65.js.map} +1 -1
  67. package/dist/{chunk-QAVZOJCV.js → chunk-OVRSNIKJ.js} +2 -2
  68. package/dist/chunk-OVRSNIKJ.js.map +1 -0
  69. package/dist/{chunk-DQWREFRQ.js → chunk-PAYAFNXG.js} +22 -3
  70. package/dist/chunk-PAYAFNXG.js.map +1 -0
  71. package/dist/{chunk-D3VO6WNC.js → chunk-PRLD7EXG.js} +3 -3
  72. package/dist/chunk-PRLD7EXG.js.map +1 -0
  73. package/dist/{chunk-N6TA6RSH.js → chunk-PY7AQRGH.js} +59 -13
  74. package/dist/chunk-PY7AQRGH.js.map +1 -0
  75. package/dist/{chunk-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
  76. package/dist/chunk-QDJKE557.js.map +1 -0
  77. package/dist/{chunk-OYRW5RCM.js → chunk-QHXS3YDV.js} +9 -9
  78. package/dist/chunk-QHXS3YDV.js.map +1 -0
  79. package/dist/{chunk-2F3RUZXC.js → chunk-RTAIGPTF.js} +161 -106
  80. package/dist/chunk-RTAIGPTF.js.map +1 -0
  81. package/dist/{chunk-IPUYL6TD.js → chunk-TV72ZJYN.js} +8 -5
  82. package/dist/{chunk-IPUYL6TD.js.map → chunk-TV72ZJYN.js.map} +1 -1
  83. package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
  84. package/dist/chunk-W7W66MDZ.js.map +1 -0
  85. package/dist/{chunk-JQBHCJ6N.js → chunk-WD4LP66U.js} +329 -121
  86. package/dist/chunk-WD4LP66U.js.map +1 -0
  87. package/dist/{chunk-AFLH7B64.js → chunk-XGLGS5B4.js} +3 -3
  88. package/dist/{chunk-AFLH7B64.js.map → chunk-XGLGS5B4.js.map} +1 -1
  89. package/dist/{chunk-HIIARTRZ.js → chunk-YDTW4GT6.js} +450 -207
  90. package/dist/chunk-YDTW4GT6.js.map +1 -0
  91. package/dist/{chunk-2XY6732A.js → chunk-YRU4WB6Y.js} +5 -5
  92. package/dist/chunk-YRU4WB6Y.js.map +1 -0
  93. package/dist/{chunk-542K7SR6.js → chunk-Z5DI7PDG.js} +173 -90
  94. package/dist/chunk-Z5DI7PDG.js.map +1 -0
  95. package/dist/{chunk-KLNL7QHN.js → chunk-ZAP2BDHG.js} +30 -5
  96. package/dist/chunk-ZAP2BDHG.js.map +1 -0
  97. package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
  98. package/dist/chunk-ZONCCO5N.js.map +1 -0
  99. package/dist/{chunk-ODPII24X.js → chunk-ZYDE52WE.js} +3 -3
  100. package/dist/{chunk-ODPII24X.js.map → chunk-ZYDE52WE.js.map} +1 -1
  101. package/dist/cli/index.js +566 -425
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  104. package/dist/cli/src/commands/config.d.ts.map +1 -1
  105. package/dist/cli/src/commands/connector.d.ts +7 -0
  106. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  107. package/dist/cli/src/commands/flow.d.ts +3 -2
  108. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  109. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  110. package/dist/cli/src/commands/project.d.ts.map +1 -1
  111. package/dist/cli/src/commands/run.d.ts.map +1 -1
  112. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  113. package/dist/cli/src/flow-discovery.d.ts +24 -0
  114. package/dist/cli/src/flow-discovery.d.ts.map +1 -0
  115. package/dist/cli/src/open-registry.d.ts +2 -2
  116. package/dist/cli/src/paths.d.ts +26 -9
  117. package/dist/cli/src/paths.d.ts.map +1 -1
  118. package/dist/cli/src/skill-walker.d.ts +9 -5
  119. package/dist/cli/src/skill-walker.d.ts.map +1 -1
  120. package/dist/connectors/config.js +8 -7
  121. package/dist/connectors/index.js +13 -12
  122. package/dist/connectors/rclone-config.js +1 -1
  123. package/dist/connectors/src/connector-manager.d.ts +24 -2
  124. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  125. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  126. package/dist/connectors/src/connector-registry.d.ts +3 -3
  127. package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
  128. package/dist/connectors/src/index.d.ts +4 -2
  129. package/dist/connectors/src/index.d.ts.map +1 -1
  130. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  131. package/dist/connectors/src/mount-placeholder.d.ts +68 -0
  132. package/dist/connectors/src/mount-placeholder.d.ts.map +1 -0
  133. package/dist/connectors/src/rclone-config/googledrive.d.ts +1 -1
  134. package/dist/core/discovery.js +1 -1
  135. package/dist/core/index.js +7 -6
  136. package/dist/core/manifest.js +2 -2
  137. package/dist/core/models.js +1 -1
  138. package/dist/core/publish-manifest.d.ts +2 -0
  139. package/dist/core/publish-manifest.js +5 -0
  140. package/dist/core/publish-manifest.js.map +1 -0
  141. package/dist/core/runtime-assets.js +5 -4
  142. package/dist/core/src/discovery.d.ts +27 -0
  143. package/dist/core/src/discovery.d.ts.map +1 -1
  144. package/dist/core/src/index.d.ts +9 -6
  145. package/dist/core/src/index.d.ts.map +1 -1
  146. package/dist/core/src/lock.d.ts.map +1 -1
  147. package/dist/core/src/manifest-yaml-editor.d.ts +62 -0
  148. package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -0
  149. package/dist/core/src/models.d.ts +16 -3
  150. package/dist/core/src/models.d.ts.map +1 -1
  151. package/dist/core/src/publish-manifest.d.ts +160 -0
  152. package/dist/core/src/publish-manifest.d.ts.map +1 -0
  153. package/dist/core/src/repo-manager.d.ts +9 -1
  154. package/dist/core/src/repo-manager.d.ts.map +1 -1
  155. package/dist/core/src/runtime-assets.d.ts +80 -29
  156. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  157. package/dist/core/src/walker.d.ts +19 -6
  158. package/dist/core/src/walker.d.ts.map +1 -1
  159. package/dist/core/src/workspace-config.d.ts +30 -36
  160. package/dist/core/src/workspace-config.d.ts.map +1 -1
  161. package/dist/core/src/workspace-yaml-editor.d.ts +1 -15
  162. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  163. package/dist/core/workspace-config.js +4 -3
  164. package/dist/deploy/index.js +50 -79
  165. package/dist/deploy/index.js.map +1 -1
  166. package/dist/deploy/src/targets/container-runtime.d.ts +1 -1
  167. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  168. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  169. package/dist/deploy/src/targets/nix.d.ts.map +1 -1
  170. package/dist/deploy/src/targets/process-handle.d.ts +7 -5
  171. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
  172. package/dist/discovery/index.js +5 -4
  173. package/dist/discovery/src/discover-manifest.d.ts +3 -2
  174. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  175. package/dist/discovery/src/discover.d.ts +2 -2
  176. package/dist/discovery/src/discover.d.ts.map +1 -1
  177. package/dist/discovery/src/index.d.ts +1 -1
  178. package/dist/discovery/src/index.d.ts.map +1 -1
  179. package/dist/discovery/src/source-config.d.ts +53 -12
  180. package/dist/discovery/src/source-config.d.ts.map +1 -1
  181. package/dist/discovery/src/tree-entries.d.ts +2 -2
  182. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  183. package/dist/{ensure-sources-OJUBGX6Z.js → ensure-sources-CVULUVH4.js} +12 -11
  184. package/dist/ensure-sources-CVULUVH4.js.map +1 -0
  185. package/dist/factory-assets/.skaile-source.yaml +6 -0
  186. package/dist/factory-assets/README.md +36 -0
  187. package/dist/factory-assets/bundles/workspaces-authoring/workspaces-authoring.bundle.yaml +9 -0
  188. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +41 -0
  189. package/dist/{base-assets → factory-assets}/connectors/deploy/adapter.d.ts +2 -2
  190. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -0
  191. package/dist/factory-assets/connectors/deploy.js +22 -0
  192. package/dist/factory-assets/connectors/devserver/CONNECTOR.md +44 -0
  193. package/dist/{base-assets → factory-assets}/connectors/devserver/adapter.d.ts +2 -2
  194. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -0
  195. package/dist/factory-assets/connectors/devserver.js +22 -0
  196. package/dist/factory-assets/connectors/flow/CONNECTOR.md +47 -0
  197. package/dist/{base-assets → factory-assets}/connectors/flow/adapter.d.ts +2 -2
  198. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -0
  199. package/dist/factory-assets/connectors/flow/adapter.js +22 -0
  200. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -0
  201. package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  202. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -0
  203. package/dist/factory-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -0
  204. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -0
  205. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -0
  206. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -0
  207. package/dist/factory-assets/connectors/flow/engine.js +15 -0
  208. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -0
  209. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.d.ts +5 -5
  210. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -0
  211. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js +1 -1
  212. package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.d.ts +8 -8
  213. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -0
  214. package/dist/factory-assets/connectors/flow/run-flow.js +25 -0
  215. package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.d.ts +2 -2
  216. package/dist/factory-assets/connectors/flow/stimulus-driver.d.ts.map +1 -0
  217. package/dist/factory-assets/connectors/flow/stimulus-driver.js +4 -0
  218. package/dist/factory-assets/connectors/flow.js +22 -0
  219. package/dist/factory-assets/connectors/git/CONNECTOR.md +145 -0
  220. package/dist/{base-assets → factory-assets}/connectors/git/driver.d.ts +2 -2
  221. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -0
  222. package/dist/factory-assets/connectors/git.js +22 -0
  223. package/dist/factory-assets/connectors/gmail/CONNECTOR.md +50 -0
  224. package/dist/{base-assets → factory-assets}/connectors/gmail/adapter.d.ts +2 -2
  225. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -0
  226. package/dist/factory-assets/connectors/gmail.js +22 -0
  227. package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +150 -0
  228. package/dist/{base-assets → factory-assets}/connectors/googledrive/driver.d.ts +2 -2
  229. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -0
  230. package/dist/factory-assets/connectors/googledrive.js +22 -0
  231. package/dist/factory-assets/connectors/local/CONNECTOR.md +40 -0
  232. package/dist/{base-assets → factory-assets}/connectors/local/driver.d.ts +2 -2
  233. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -0
  234. package/dist/factory-assets/connectors/local.js +22 -0
  235. package/dist/factory-assets/connectors/mattermost/CONNECTOR.md +65 -0
  236. package/dist/{base-assets → factory-assets}/connectors/mattermost/adapter.d.ts +2 -2
  237. package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -0
  238. package/dist/factory-assets/connectors/mattermost.js +22 -0
  239. package/dist/factory-assets/connectors/memory/CONNECTOR.md +40 -0
  240. package/dist/{base-assets → factory-assets}/connectors/memory/adapter.d.ts +2 -2
  241. package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -0
  242. package/dist/factory-assets/connectors/memory.js +22 -0
  243. package/dist/factory-assets/connectors/minio/CONNECTOR.md +68 -0
  244. package/dist/{base-assets → factory-assets}/connectors/minio/adapter.d.ts +2 -2
  245. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -0
  246. package/dist/factory-assets/connectors/minio.js +22 -0
  247. package/dist/factory-assets/connectors/postgres/CONNECTOR.md +46 -0
  248. package/dist/{base-assets → factory-assets}/connectors/postgres/adapter.d.ts +2 -2
  249. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -0
  250. package/dist/factory-assets/connectors/postgres.js +22 -0
  251. package/dist/factory-assets/connectors/s3/CONNECTOR.md +76 -0
  252. package/dist/{base-assets → factory-assets}/connectors/s3/driver.d.ts +2 -2
  253. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -0
  254. package/dist/factory-assets/connectors/s3.js +22 -0
  255. package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +181 -0
  256. package/dist/{base-assets → factory-assets}/connectors/sharepoint/driver.d.ts +2 -2
  257. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -0
  258. package/dist/factory-assets/connectors/sharepoint.js +22 -0
  259. package/dist/factory-assets/connectors/sqlite/CONNECTOR.md +44 -0
  260. package/dist/{base-assets → factory-assets}/connectors/sqlite/adapter.d.ts +2 -2
  261. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -0
  262. package/dist/factory-assets/connectors/sqlite.js +22 -0
  263. package/dist/factory-assets/connectors/static-server/CONNECTOR.md +41 -0
  264. package/dist/{base-assets → factory-assets}/connectors/static-server/adapter.d.ts +2 -2
  265. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -0
  266. package/dist/factory-assets/connectors/static-server.js +22 -0
  267. package/dist/factory-assets/connectors/tunnel/CONNECTOR.md +40 -0
  268. package/dist/{base-assets → factory-assets}/connectors/tunnel/adapter.d.ts +2 -2
  269. package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -0
  270. package/dist/factory-assets/connectors/tunnel.js +22 -0
  271. package/dist/factory-assets/connectors/webdav/CONNECTOR.md +139 -0
  272. package/dist/{base-assets → factory-assets}/connectors/webdav/driver.d.ts +2 -2
  273. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -0
  274. package/dist/factory-assets/connectors/webdav.js +22 -0
  275. package/dist/factory-assets/connectors/xstate/CONNECTOR.md +57 -0
  276. package/dist/{base-assets → factory-assets}/connectors/xstate/adapter.d.ts +2 -2
  277. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -0
  278. package/dist/factory-assets/connectors/xstate-store/CONNECTOR.md +48 -0
  279. package/dist/{base-assets → factory-assets}/connectors/xstate-store/adapter.d.ts +2 -2
  280. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -0
  281. package/dist/factory-assets/connectors/xstate-store.js +22 -0
  282. package/dist/factory-assets/connectors/xstate.js +22 -0
  283. package/dist/{base-assets → factory-assets}/index.d.ts +1 -1
  284. package/dist/factory-assets/index.d.ts.map +1 -0
  285. package/dist/{base-assets → factory-assets}/index.js +1 -1
  286. package/dist/factory-assets/index.js.map +1 -0
  287. package/dist/factory-assets/skaile.manifest.yaml +25 -0
  288. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +176 -0
  289. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +243 -0
  290. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +197 -0
  291. package/dist/factory-assets/skills/manifest-compliance/SKILL.md +140 -0
  292. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +239 -0
  293. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +168 -0
  294. package/dist/{flows-DYFTPCPM.js → flows-JZFJD5IN.js} +3 -3
  295. package/dist/{flows-DYFTPCPM.js.map → flows-JZFJD5IN.js.map} +1 -1
  296. package/dist/library/index.js +14 -5
  297. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  298. package/dist/library/src/library.d.ts +2 -0
  299. package/dist/library/src/library.d.ts.map +1 -1
  300. package/dist/library/src/local/library.d.ts +2 -0
  301. package/dist/library/src/local/library.d.ts.map +1 -1
  302. package/dist/library/src/local/local-catalog-source.d.ts +2 -1
  303. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  304. package/dist/library/src/local/sidecar-paths.d.ts +4 -4
  305. package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
  306. package/dist/library/src/local/store-paths.d.ts +4 -3
  307. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  308. package/dist/library/src/pin-resolver.d.ts.map +1 -1
  309. package/dist/library/src/preset/apply.d.ts.map +1 -1
  310. package/dist/library/src/preset/placeholders.d.ts.map +1 -1
  311. package/dist/library/src/remote/remote-catalog-source.d.ts +7 -0
  312. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  313. package/dist/library/src/remote/rest-catalog-source.d.ts +7 -0
  314. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  315. package/dist/library/src/sync/manifest-writeback.d.ts +1 -1
  316. package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
  317. package/dist/open-library-WYASW4BH.js +22 -0
  318. package/dist/{open-library-67FSSQWE.js.map → open-library-WYASW4BH.js.map} +1 -1
  319. package/dist/paths-BMW6JYW6.js +15 -0
  320. package/dist/{paths-FKKGS6BA.js.map → paths-BMW6JYW6.js.map} +1 -1
  321. package/dist/{plugin-store-IZ5SCRAV.js → plugin-store-O5VR45CA.js} +9 -8
  322. package/dist/plugin-store-O5VR45CA.js.map +1 -0
  323. package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
  324. package/dist/plugins/src/catalog-source.d.ts +13 -0
  325. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  326. package/dist/resolver/index.js +1 -1
  327. package/dist/resolver/src/parser.d.ts.map +1 -1
  328. package/dist/runner/index.js +20 -19
  329. package/dist/runner/src/capability-registry.d.ts +1 -1
  330. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  331. package/dist/runner/src/external-mcp.d.ts +112 -0
  332. package/dist/runner/src/external-mcp.d.ts.map +1 -0
  333. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  334. package/dist/runner/src/resources.d.ts +10 -2
  335. package/dist/runner/src/resources.d.ts.map +1 -1
  336. package/dist/runner/src/serve.d.ts.map +1 -1
  337. package/dist/runner/src/session-builder.d.ts +12 -0
  338. package/dist/runner/src/session-builder.d.ts.map +1 -1
  339. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  340. package/dist/sdk/asset-manager.js +11 -10
  341. package/dist/sdk/bridge.js +4 -4
  342. package/dist/sdk/core.js +7 -6
  343. package/dist/sdk/flow.js +12 -1
  344. package/dist/sdk/index.js +23 -22
  345. package/dist/sdk/index.js.map +1 -1
  346. package/dist/sdk/resolver.js +1 -1
  347. package/dist/sdk/runner.js +20 -19
  348. package/dist/sdk/session.js +1 -1
  349. package/dist/sdk/src/flow/index.d.ts +1 -1
  350. package/dist/sdk/src/flow/index.d.ts.map +1 -1
  351. package/dist/sdk/src/workspace.d.ts +3 -2
  352. package/dist/sdk/src/workspace.d.ts.map +1 -1
  353. package/dist/sdk/telemetry.js +1 -1
  354. package/dist/secrets/index.js +1 -1
  355. package/dist/secrets/src/providers/env.d.ts.map +1 -1
  356. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  357. package/dist/session/index.js +1 -1
  358. package/dist/session/src/mentions.d.ts.map +1 -1
  359. package/dist/{setup-J7CYEQOF.js → setup-YNLFR5GB.js} +13 -12
  360. package/dist/setup-YNLFR5GB.js.map +1 -0
  361. package/dist/skills-6HJ3WINN.js +7 -0
  362. package/dist/{skills-CRL3VJNN.js.map → skills-6HJ3WINN.js.map} +1 -1
  363. package/dist/store-client-CENBEASX.js +15 -0
  364. package/dist/{store-client-AEI6Y3KD.js.map → store-client-CENBEASX.js.map} +1 -1
  365. package/dist/telemetry/index.js +1 -1
  366. package/dist/telemetry/src/config.d.ts +0 -16
  367. package/dist/telemetry/src/config.d.ts.map +1 -1
  368. package/dist/tui/index.js +20 -19
  369. package/dist/tui/index.js.map +1 -1
  370. package/dist/types/manifests.js +1 -1
  371. package/dist/types/src/flow.d.ts +2 -2
  372. package/dist/types/src/install-manifest.d.ts +1 -1
  373. package/dist/types/src/install-manifest.d.ts.map +1 -1
  374. package/dist/types/src/manifests/index.d.ts +1 -1
  375. package/dist/types/src/manifests/skill.d.ts +21 -0
  376. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  377. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  378. package/dist/workspace-plugin/adapters/omp.js +7 -7
  379. package/dist/workspace-plugin/index.js +1 -1
  380. package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
  381. package/package.json +158 -151
  382. package/dist/asset-feeds-WKIKSZ6Z.js.map +0 -1
  383. package/dist/base-assets/connectors/deploy/adapter.d.ts.map +0 -1
  384. package/dist/base-assets/connectors/deploy.js +0 -21
  385. package/dist/base-assets/connectors/devserver/adapter.d.ts.map +0 -1
  386. package/dist/base-assets/connectors/devserver.js +0 -21
  387. package/dist/base-assets/connectors/flow/adapter.d.ts.map +0 -1
  388. package/dist/base-assets/connectors/flow/adapter.js +0 -21
  389. package/dist/base-assets/connectors/flow/engine/engine.d.ts.map +0 -1
  390. package/dist/base-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +0 -1
  391. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +0 -1
  392. package/dist/base-assets/connectors/flow/engine/index.d.ts.map +0 -1
  393. package/dist/base-assets/connectors/flow/engine/loader.d.ts.map +0 -1
  394. package/dist/base-assets/connectors/flow/engine/types.d.ts.map +0 -1
  395. package/dist/base-assets/connectors/flow/engine.js +0 -4
  396. package/dist/base-assets/connectors/flow/index.d.ts.map +0 -1
  397. package/dist/base-assets/connectors/flow/prompt-fragments.d.ts.map +0 -1
  398. package/dist/base-assets/connectors/flow/run-flow.d.ts.map +0 -1
  399. package/dist/base-assets/connectors/flow/run-flow.js +0 -24
  400. package/dist/base-assets/connectors/flow/stimulus-driver.d.ts.map +0 -1
  401. package/dist/base-assets/connectors/flow/stimulus-driver.js +0 -4
  402. package/dist/base-assets/connectors/flow.js +0 -21
  403. package/dist/base-assets/connectors/git/driver.d.ts.map +0 -1
  404. package/dist/base-assets/connectors/git.js +0 -21
  405. package/dist/base-assets/connectors/gmail/adapter.d.ts.map +0 -1
  406. package/dist/base-assets/connectors/gmail.js +0 -21
  407. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +0 -1
  408. package/dist/base-assets/connectors/googledrive.js +0 -21
  409. package/dist/base-assets/connectors/local/driver.d.ts.map +0 -1
  410. package/dist/base-assets/connectors/local.js +0 -21
  411. package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +0 -1
  412. package/dist/base-assets/connectors/mattermost.js +0 -21
  413. package/dist/base-assets/connectors/memory/adapter.d.ts.map +0 -1
  414. package/dist/base-assets/connectors/memory.js +0 -21
  415. package/dist/base-assets/connectors/minio/adapter.d.ts.map +0 -1
  416. package/dist/base-assets/connectors/minio.js +0 -21
  417. package/dist/base-assets/connectors/postgres/adapter.d.ts.map +0 -1
  418. package/dist/base-assets/connectors/postgres.js +0 -21
  419. package/dist/base-assets/connectors/s3/driver.d.ts.map +0 -1
  420. package/dist/base-assets/connectors/s3.js +0 -21
  421. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +0 -1
  422. package/dist/base-assets/connectors/sharepoint.js +0 -21
  423. package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +0 -1
  424. package/dist/base-assets/connectors/sqlite.js +0 -21
  425. package/dist/base-assets/connectors/static-server/adapter.d.ts.map +0 -1
  426. package/dist/base-assets/connectors/static-server.js +0 -21
  427. package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +0 -1
  428. package/dist/base-assets/connectors/tunnel.js +0 -21
  429. package/dist/base-assets/connectors/webdav/driver.d.ts.map +0 -1
  430. package/dist/base-assets/connectors/webdav.js +0 -21
  431. package/dist/base-assets/connectors/xstate/adapter.d.ts.map +0 -1
  432. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +0 -1
  433. package/dist/base-assets/connectors/xstate-store.js +0 -21
  434. package/dist/base-assets/connectors/xstate.js +0 -21
  435. package/dist/base-assets/index.d.ts.map +0 -1
  436. package/dist/base-assets/index.js.map +0 -1
  437. package/dist/chunk-2F3RUZXC.js.map +0 -1
  438. package/dist/chunk-2M3XTMOL.js +0 -23
  439. package/dist/chunk-2M3XTMOL.js.map +0 -1
  440. package/dist/chunk-2RFOFHSM.js.map +0 -1
  441. package/dist/chunk-2XY6732A.js.map +0 -1
  442. package/dist/chunk-46COM7M5.js.map +0 -1
  443. package/dist/chunk-542K7SR6.js.map +0 -1
  444. package/dist/chunk-5ESCS2OS.js.map +0 -1
  445. package/dist/chunk-D3VO6WNC.js.map +0 -1
  446. package/dist/chunk-DQWREFRQ.js.map +0 -1
  447. package/dist/chunk-FVTV7M76.js.map +0 -1
  448. package/dist/chunk-GCJXPUHG.js.map +0 -1
  449. package/dist/chunk-GZWJGNNN.js.map +0 -1
  450. package/dist/chunk-HIIARTRZ.js.map +0 -1
  451. package/dist/chunk-ICS76R4T.js.map +0 -1
  452. package/dist/chunk-JDX54X4Y.js.map +0 -1
  453. package/dist/chunk-JQBHCJ6N.js.map +0 -1
  454. package/dist/chunk-KLNL7QHN.js.map +0 -1
  455. package/dist/chunk-KOVLSBXK.js.map +0 -1
  456. package/dist/chunk-LJ52ZKIU.js.map +0 -1
  457. package/dist/chunk-M5TE6YI5.js.map +0 -1
  458. package/dist/chunk-N6TA6RSH.js.map +0 -1
  459. package/dist/chunk-NELZIQ2E.js.map +0 -1
  460. package/dist/chunk-OYRW5RCM.js.map +0 -1
  461. package/dist/chunk-QAVZOJCV.js.map +0 -1
  462. package/dist/chunk-YX3UWPJ5.js.map +0 -1
  463. package/dist/chunk-Z3M5K67G.js.map +0 -1
  464. package/dist/ensure-sources-OJUBGX6Z.js.map +0 -1
  465. package/dist/open-library-67FSSQWE.js +0 -13
  466. package/dist/paths-FKKGS6BA.js +0 -4
  467. package/dist/plugin-store-IZ5SCRAV.js.map +0 -1
  468. package/dist/setup-J7CYEQOF.js.map +0 -1
  469. package/dist/skills-CRL3VJNN.js +0 -7
  470. package/dist/store-client-AEI6Y3KD.js +0 -14
  471. /package/dist/{base-assets → factory-assets}/connectors/deploy.d.ts +0 -0
  472. /package/dist/{base-assets → factory-assets}/connectors/deploy.js.map +0 -0
  473. /package/dist/{base-assets → factory-assets}/connectors/devserver.d.ts +0 -0
  474. /package/dist/{base-assets → factory-assets}/connectors/devserver.js.map +0 -0
  475. /package/dist/{base-assets → factory-assets}/connectors/flow/adapter.js.map +0 -0
  476. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/engine.d.ts +0 -0
  477. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-manifest.d.ts +0 -0
  478. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/index.d.ts +0 -0
  479. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/loader.d.ts +0 -0
  480. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/types.d.ts +0 -0
  481. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.d.ts +0 -0
  482. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.js.map +0 -0
  483. /package/dist/{base-assets → factory-assets}/connectors/flow/index.d.ts +0 -0
  484. /package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js.map +0 -0
  485. /package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.js.map +0 -0
  486. /package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.js.map +0 -0
  487. /package/dist/{base-assets → factory-assets}/connectors/flow.d.ts +0 -0
  488. /package/dist/{base-assets → factory-assets}/connectors/flow.js.map +0 -0
  489. /package/dist/{base-assets → factory-assets}/connectors/git.d.ts +0 -0
  490. /package/dist/{base-assets → factory-assets}/connectors/git.js.map +0 -0
  491. /package/dist/{base-assets → factory-assets}/connectors/gmail.d.ts +0 -0
  492. /package/dist/{base-assets → factory-assets}/connectors/gmail.js.map +0 -0
  493. /package/dist/{base-assets → factory-assets}/connectors/googledrive.d.ts +0 -0
  494. /package/dist/{base-assets → factory-assets}/connectors/googledrive.js.map +0 -0
  495. /package/dist/{base-assets → factory-assets}/connectors/local.d.ts +0 -0
  496. /package/dist/{base-assets → factory-assets}/connectors/local.js.map +0 -0
  497. /package/dist/{base-assets → factory-assets}/connectors/mattermost.d.ts +0 -0
  498. /package/dist/{base-assets → factory-assets}/connectors/mattermost.js.map +0 -0
  499. /package/dist/{base-assets → factory-assets}/connectors/memory.d.ts +0 -0
  500. /package/dist/{base-assets → factory-assets}/connectors/memory.js.map +0 -0
  501. /package/dist/{base-assets → factory-assets}/connectors/minio.d.ts +0 -0
  502. /package/dist/{base-assets → factory-assets}/connectors/minio.js.map +0 -0
  503. /package/dist/{base-assets → factory-assets}/connectors/postgres.d.ts +0 -0
  504. /package/dist/{base-assets → factory-assets}/connectors/postgres.js.map +0 -0
  505. /package/dist/{base-assets → factory-assets}/connectors/s3.d.ts +0 -0
  506. /package/dist/{base-assets → factory-assets}/connectors/s3.js.map +0 -0
  507. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.d.ts +0 -0
  508. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.js.map +0 -0
  509. /package/dist/{base-assets → factory-assets}/connectors/sqlite.d.ts +0 -0
  510. /package/dist/{base-assets → factory-assets}/connectors/sqlite.js.map +0 -0
  511. /package/dist/{base-assets → factory-assets}/connectors/static-server.d.ts +0 -0
  512. /package/dist/{base-assets → factory-assets}/connectors/static-server.js.map +0 -0
  513. /package/dist/{base-assets → factory-assets}/connectors/tunnel.d.ts +0 -0
  514. /package/dist/{base-assets → factory-assets}/connectors/tunnel.js.map +0 -0
  515. /package/dist/{base-assets → factory-assets}/connectors/webdav.d.ts +0 -0
  516. /package/dist/{base-assets → factory-assets}/connectors/webdav.js.map +0 -0
  517. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.d.ts +0 -0
  518. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.js.map +0 -0
  519. /package/dist/{base-assets → factory-assets}/connectors/xstate.d.ts +0 -0
  520. /package/dist/{base-assets → factory-assets}/connectors/xstate.js.map +0 -0
@@ -1,22 +1,22 @@
1
- import { resolveAuthRef, resolveAuth } from './chunk-ODPII24X.js';
1
+ import { resolveAuthRef, resolveAuth } from './chunk-ZYDE52WE.js';
2
2
  import { createFsWatcher, RcloneProcessManager, ensureDirMode, PortPool } from './chunk-QMONOHXT.js';
3
- import { renderWebDAVConfig, renderOneDriveConfig, renderGoogleDriveConfig } from './chunk-QAVZOJCV.js';
3
+ import { renderWebDAVConfig, renderOneDriveConfig, renderGoogleDriveConfig } from './chunk-OVRSNIKJ.js';
4
4
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
5
- import { computeFlowStateFromSnapshots } from './chunk-ICS76R4T.js';
6
- import { renderStimulusPrompt } from './chunk-GZWJGNNN.js';
7
- import { computeStimulus } from './chunk-FVTV7M76.js';
8
- import { portableSpawn } from './chunk-Z3M5K67G.js';
5
+ import { computeFlowStateFromSnapshots } from './chunk-W7W66MDZ.js';
6
+ import { renderStimulusPrompt } from './chunk-DEYYRFQU.js';
7
+ import { computeStimulus } from './chunk-IFGTRL2I.js';
8
+ import { portableSpawn } from './chunk-KL2MQ6WI.js';
9
9
  import { createLogger } from './chunk-24UIWON4.js';
10
10
  import { existsSync, mkdirSync, renameSync, writeFileSync, readFileSync, cpSync, statSync, createReadStream, readdirSync, openSync, writeSync, closeSync, chmodSync } from 'fs';
11
- import { join, dirname, resolve, sep } from 'path';
11
+ import path, { join, dirname, resolve, sep } from 'path';
12
12
  import * as zNS from 'zod';
13
- import { execFile, execSync } from 'child_process';
13
+ import { execFile, execSync, spawn } from 'child_process';
14
14
  import { promisify } from 'util';
15
15
  import { createServer } from 'http';
16
16
  import mime from 'mime';
17
+ import { stat, readdir, mkdir, writeFile, chmod, rm } from 'fs/promises';
17
18
  import { createRequire } from 'module';
18
19
  import { pathToFileURL } from 'url';
19
- import { stat, readdir } from 'fs/promises';
20
20
 
21
21
  // connectors/src/connector-base.ts
22
22
  var AbstractConnector = class {
@@ -148,6 +148,9 @@ var GitConnector = class extends AbstractConnector {
148
148
  this.log.error("connect failed: missing mount.source URL", void 0);
149
149
  throw new Error("Git connector requires a mount.source URL");
150
150
  }
151
+ if (!isValidGitRefOrSha(branch)) {
152
+ throw new Error(`Git connector: invalid branch name "${branch}"`);
153
+ }
151
154
  this.log.info("mount start", { url, branch, targetDir });
152
155
  const initial = await this.acquireInitialToken(declaration, secrets, tokenMediator);
153
156
  const session = parseSessionConfig(opts);
@@ -197,6 +200,9 @@ var GitConnector = class extends AbstractConnector {
197
200
  }
198
201
  if (session.enabled && !session.isMain && session.slug) {
199
202
  const sessionBranch = `${session.branchPrefix}${session.slug}`;
203
+ if (!isValidGitRefOrSha(sessionBranch)) {
204
+ throw new Error(`Git connector: invalid session branch name "${sessionBranch}"`);
205
+ }
200
206
  try {
201
207
  git(`rev-parse --verify origin/${sessionBranch}`, targetDir);
202
208
  git(`checkout -B ${sessionBranch} origin/${sessionBranch}`, targetDir);
@@ -389,12 +395,19 @@ var GitConnector = class extends AbstractConnector {
389
395
  this.resetAutoCommitTimer(s, handle.mountPath);
390
396
  };
391
397
  let fsWatcher = null;
398
+ let closed = false;
392
399
  const ignored = [...options?.ignored ?? [], "**/.git/**"];
393
400
  createFsWatcher(handle.mountPath, s.emitChange, { ...options, ignored }).then((w) => {
394
- fsWatcher = w;
401
+ if (closed) void w.close();
402
+ else fsWatcher = w;
403
+ }).catch((err) => {
404
+ this.log.warn("watcher creation failed", {
405
+ error: err instanceof Error ? err.message : String(err)
406
+ });
395
407
  });
396
408
  return {
397
409
  close: async () => {
410
+ closed = true;
398
411
  s.emitChange = void 0;
399
412
  await fsWatcher?.close();
400
413
  }
@@ -1033,11 +1046,18 @@ var LocalConnector = class extends AbstractConnector {
1033
1046
  }
1034
1047
  watch(handle, callback, options) {
1035
1048
  let fsWatcher = null;
1049
+ let closed = false;
1036
1050
  createFsWatcher(handle.mountPath, callback, options).then((w) => {
1037
- fsWatcher = w;
1051
+ if (closed) void w.close();
1052
+ else fsWatcher = w;
1053
+ }).catch((err) => {
1054
+ this.log.warn("watcher creation failed", {
1055
+ error: err instanceof Error ? err.message : String(err)
1056
+ });
1038
1057
  });
1039
1058
  return {
1040
1059
  close: async () => {
1060
+ closed = true;
1041
1061
  await fsWatcher?.close();
1042
1062
  }
1043
1063
  };
@@ -1090,7 +1110,7 @@ var S3Connector = class extends AbstractConnector {
1090
1110
  if (endpoint) clientConfig.endpoint = endpoint;
1091
1111
  const profile = resolveAuth(declaration.auth, secrets);
1092
1112
  if (profile) {
1093
- process.env.AWS_PROFILE = profile;
1113
+ clientConfig.profile = profile;
1094
1114
  }
1095
1115
  const client = new S3Client(clientConfig);
1096
1116
  const state = { client, bucket, prefix, region };
@@ -1147,15 +1167,18 @@ var S3Connector = class extends AbstractConnector {
1147
1167
  continuationToken = resp.IsTruncated ? resp.NextContinuationToken : void 0;
1148
1168
  } while (continuationToken);
1149
1169
  let filesWritten = 0;
1170
+ let bytesTransferred = 0;
1150
1171
  for (const { key, relPath } of entries) {
1151
1172
  try {
1152
1173
  const resp = await client.send(new s3Mod.GetObjectCommand({ Bucket: bucket, Key: key }));
1153
- const body = await resp.Body?.transformToString();
1154
- if (body == null) continue;
1174
+ const bytes = await resp.Body?.transformToByteArray();
1175
+ if (bytes == null) continue;
1176
+ const body = Buffer.from(bytes);
1155
1177
  const localPath = join(targetDir, relPath);
1156
1178
  mkdirSync(dirname(localPath), { recursive: true });
1157
1179
  writeFileSync(localPath, body);
1158
1180
  filesWritten++;
1181
+ bytesTransferred += body.byteLength;
1159
1182
  } catch (err) {
1160
1183
  this.log.warn("object download failed", {
1161
1184
  key,
@@ -1163,7 +1186,7 @@ var S3Connector = class extends AbstractConnector {
1163
1186
  });
1164
1187
  }
1165
1188
  }
1166
- return { filesWritten, filesDeleted: 0, bytesTransferred: 0 };
1189
+ return { filesWritten, filesDeleted: 0, bytesTransferred };
1167
1190
  }
1168
1191
  };
1169
1192
  function createConnector4(sdkOverride) {
@@ -1343,7 +1366,7 @@ async function obscurePassword(plain) {
1343
1366
  }
1344
1367
  }
1345
1368
 
1346
- // base-assets/connectors/sharepoint/driver.ts
1369
+ // factory-assets/connectors/sharepoint/driver.ts
1347
1370
  var DEFAULT_CACHE_BASE = "/var/cache/skaile";
1348
1371
  function cacheBase() {
1349
1372
  return process.env.SKAILE_RCLONE_CACHE_BASE ?? DEFAULT_CACHE_BASE;
@@ -1528,7 +1551,7 @@ function buildRemotePath(folderPath, basePath) {
1528
1551
  return joined.length > 0 ? `/${joined}` : "/";
1529
1552
  }
1530
1553
 
1531
- // base-assets/connectors/googledrive/driver.ts
1554
+ // factory-assets/connectors/googledrive/driver.ts
1532
1555
  var CACHE_BASE2 = "/var/cache/skaile";
1533
1556
  var ALLOWED_SCOPES = /* @__PURE__ */ new Set([
1534
1557
  "drive",
@@ -1707,17 +1730,17 @@ function parseAuthBlob2(raw, log) {
1707
1730
  }
1708
1731
  }
1709
1732
 
1710
- // base-assets/connectors/memory/adapter.ts
1733
+ // factory-assets/connectors/memory/adapter.ts
1711
1734
  var MemoryConnector = class extends AbstractConnector {
1712
1735
  name = "memory";
1713
1736
  tools;
1714
1737
  constructor() {
1715
1738
  super();
1716
1739
  this.tools = {
1717
- read: (handle, path) => this._read(handle, path),
1718
- write: (handle, path, content) => this._write(handle, path, content),
1719
- delete: (handle, path) => this._delete(handle, path),
1720
- list: (handle, path, options) => this._list(handle, path, options),
1740
+ read: (handle, path2) => this._read(handle, path2),
1741
+ write: (handle, path2, content) => this._write(handle, path2, content),
1742
+ delete: (handle, path2) => this._delete(handle, path2),
1743
+ list: (handle, path2, options) => this._list(handle, path2, options),
1721
1744
  search: (handle, query, options) => this._search(handle, query, options),
1722
1745
  describeOperations: (handle) => this._describeOperations(handle),
1723
1746
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args)
@@ -1736,26 +1759,26 @@ var MemoryConnector = class extends AbstractConnector {
1736
1759
  store(handle) {
1737
1760
  return handle.state.store;
1738
1761
  }
1739
- async _read(handle, path) {
1740
- const value = this.store(handle).get(path);
1762
+ async _read(handle, path2) {
1763
+ const value = this.store(handle).get(path2);
1741
1764
  if (value === void 0) return null;
1742
1765
  return { data: value, contentType: "application/json" };
1743
1766
  }
1744
- async _write(handle, path, content) {
1745
- const isNew = !this.store(handle).has(path);
1767
+ async _write(handle, path2, content) {
1768
+ const isNew = !this.store(handle).has(path2);
1746
1769
  this.store(handle).set(
1747
- path,
1770
+ path2,
1748
1771
  typeof content.data === "string" ? content.data : content.data.toString("utf-8")
1749
1772
  );
1750
- this.emitChange?.({ path, action: isNew ? "create" : "edit", source: "operation" });
1773
+ this.emitChange?.({ path: path2, action: isNew ? "create" : "edit", source: "operation" });
1751
1774
  }
1752
- async _delete(handle, path) {
1753
- const deleted = this.store(handle).delete(path);
1754
- if (deleted) this.emitChange?.({ path, action: "delete", source: "operation" });
1775
+ async _delete(handle, path2) {
1776
+ const deleted = this.store(handle).delete(path2);
1777
+ if (deleted) this.emitChange?.({ path: path2, action: "delete", source: "operation" });
1755
1778
  return deleted;
1756
1779
  }
1757
- async _list(handle, path, options) {
1758
- const prefix = path ?? "";
1780
+ async _list(handle, path2, options) {
1781
+ const prefix = path2 ?? "";
1759
1782
  const entries = [];
1760
1783
  for (const key of this.store(handle).keys()) {
1761
1784
  if (prefix && !key.startsWith(prefix)) continue;
@@ -1853,22 +1876,26 @@ var MemoryConnector = class extends AbstractConnector {
1853
1876
  }
1854
1877
  };
1855
1878
  function matchGlob(str, pattern) {
1856
- const regex = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/\?/g, ".")}$`);
1879
+ const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1880
+ const regex = new RegExp(`^${escaped.replace(/\\\*/g, ".*").replace(/\\\?/g, ".")}$`);
1857
1881
  return regex.test(str);
1858
1882
  }
1859
1883
  function createConnector8() {
1860
1884
  return new MemoryConnector();
1861
1885
  }
1862
1886
 
1863
- // base-assets/connectors/postgres/adapter.ts
1887
+ // factory-assets/connectors/postgres/adapter.ts
1888
+ function quoteIdent(ident) {
1889
+ return ident.replace(/"/g, '""');
1890
+ }
1864
1891
  var PostgresConnector = class extends AbstractConnector {
1865
1892
  name = "postgres";
1866
1893
  tools;
1867
1894
  constructor() {
1868
1895
  super();
1869
1896
  this.tools = {
1870
- read: (handle, path) => this._read(handle, path),
1871
- list: (handle, path, options) => this._list(handle, path, options),
1897
+ read: (handle, path2) => this._read(handle, path2),
1898
+ list: (handle, path2, options) => this._list(handle, path2, options),
1872
1899
  search: (handle, query, options) => this._search(handle, query, options),
1873
1900
  describeOperations: (handle) => this._describeOperations(handle),
1874
1901
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),
@@ -1947,8 +1974,8 @@ var PostgresConnector = class extends AbstractConnector {
1947
1974
  return handle.state.pool;
1948
1975
  }
1949
1976
  // Base ops map to table/row access via path convention: <table>/<pk>
1950
- async _read(handle, path) {
1951
- const parts = path.split("/");
1977
+ async _read(handle, path2) {
1978
+ const parts = path2.split("/");
1952
1979
  if (parts.length === 1) {
1953
1980
  const table2 = parts[0];
1954
1981
  const result2 = await this.pool(handle).query(
@@ -1960,14 +1987,15 @@ var PostgresConnector = class extends AbstractConnector {
1960
1987
  return { data: JSON.stringify(result2.rows, null, 2), contentType: "application/json" };
1961
1988
  }
1962
1989
  const [table, pk] = parts;
1963
- const result = await this.pool(handle).query(`SELECT * FROM "${table}" WHERE id = $1 LIMIT 1`, [
1964
- pk
1965
- ]);
1990
+ const result = await this.pool(handle).query(
1991
+ `SELECT * FROM "${quoteIdent(table)}" WHERE id = $1 LIMIT 1`,
1992
+ [pk]
1993
+ );
1966
1994
  if (result.rows.length === 0) return null;
1967
1995
  return { data: JSON.stringify(result.rows[0], null, 2), contentType: "application/json" };
1968
1996
  }
1969
- async _list(handle, path, options) {
1970
- if (!path) {
1997
+ async _list(handle, path2, options) {
1998
+ if (!path2) {
1971
1999
  const result2 = await this.pool(handle).query(
1972
2000
  `SELECT table_name FROM information_schema.tables
1973
2001
  WHERE table_schema = 'public' ORDER BY table_name`
@@ -1979,10 +2007,12 @@ var PostgresConnector = class extends AbstractConnector {
1979
2007
  }));
1980
2008
  }
1981
2009
  const limit = options?.limit ?? 100;
1982
- const result = await this.pool(handle).query(`SELECT * FROM "${path}" LIMIT $1`, [limit]);
2010
+ const result = await this.pool(handle).query(`SELECT * FROM "${quoteIdent(path2)}" LIMIT $1`, [
2011
+ limit
2012
+ ]);
1983
2013
  return result.rows.map((row, i) => ({
1984
2014
  name: String(row.id ?? i),
1985
- path: `${path}/${row.id ?? i}`,
2015
+ path: `${path2}/${row.id ?? i}`,
1986
2016
  type: "row"
1987
2017
  }));
1988
2018
  }
@@ -1999,9 +2029,9 @@ var PostgresConnector = class extends AbstractConnector {
1999
2029
  [table.name]
2000
2030
  );
2001
2031
  if (cols.rows.length === 0) continue;
2002
- const conditions = cols.rows.map((c) => `"${c.column_name}"::text ILIKE $1`).join(" OR ");
2032
+ const conditions = cols.rows.map((c) => `"${quoteIdent(String(c.column_name))}"::text ILIKE $1`).join(" OR ");
2003
2033
  const searchResult = await this.pool(handle).query(
2004
- `SELECT * FROM "${table.name}" WHERE ${conditions} LIMIT $2`,
2034
+ `SELECT * FROM "${quoteIdent(table.name)}" WHERE ${conditions} LIMIT $2`,
2005
2035
  [`%${query}%`, maxResults - results.length]
2006
2036
  );
2007
2037
  for (const row of searchResult.rows) {
@@ -2124,14 +2154,17 @@ var PostgresConnector = class extends AbstractConnector {
2124
2154
  function createConnector9() {
2125
2155
  return new PostgresConnector();
2126
2156
  }
2157
+ function quoteIdent2(ident) {
2158
+ return ident.replace(/"/g, '""');
2159
+ }
2127
2160
  var SQLiteConnector = class extends AbstractConnector {
2128
2161
  name = "sqlite";
2129
2162
  tools;
2130
2163
  constructor() {
2131
2164
  super();
2132
2165
  this.tools = {
2133
- read: (handle, path) => this._read(handle, path),
2134
- list: (handle, path, options) => this._list(handle, path, options),
2166
+ read: (handle, path2) => this._read(handle, path2),
2167
+ list: (handle, path2, options) => this._list(handle, path2, options),
2135
2168
  search: (handle, query, options) => this._search(handle, query, options),
2136
2169
  describeOperations: (handle) => this._describeOperations(handle),
2137
2170
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args)
@@ -2215,23 +2248,25 @@ var SQLiteConnector = class extends AbstractConnector {
2215
2248
  const changes = db.getRowsModified();
2216
2249
  return changes;
2217
2250
  }
2218
- async _read(handle, path) {
2219
- const parts = path.split("/");
2251
+ async _read(handle, path2) {
2252
+ const parts = path2.split("/");
2220
2253
  if (parts.length === 1) {
2221
2254
  const table2 = parts[0];
2222
- const info = this.queryRows(this.db(handle), `PRAGMA table_info("${table2}")`);
2255
+ const info = this.queryRows(this.db(handle), `PRAGMA table_info("${quoteIdent2(table2)}")`);
2223
2256
  if (info.length === 0) return null;
2224
2257
  return { data: JSON.stringify(info, null, 2), contentType: "application/json" };
2225
2258
  }
2226
2259
  const [table, rowid] = parts;
2227
- const rows = this.queryRows(this.db(handle), `SELECT * FROM "${table}" WHERE rowid = ?`, [
2228
- rowid
2229
- ]);
2260
+ const rows = this.queryRows(
2261
+ this.db(handle),
2262
+ `SELECT * FROM "${quoteIdent2(table)}" WHERE rowid = ?`,
2263
+ [rowid]
2264
+ );
2230
2265
  if (rows.length === 0) return null;
2231
2266
  return { data: JSON.stringify(rows[0], null, 2), contentType: "application/json" };
2232
2267
  }
2233
- async _list(handle, path, options) {
2234
- if (!path) {
2268
+ async _list(handle, path2, options) {
2269
+ if (!path2) {
2235
2270
  const tables = this.queryRows(
2236
2271
  this.db(handle),
2237
2272
  "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name"
@@ -2243,10 +2278,14 @@ var SQLiteConnector = class extends AbstractConnector {
2243
2278
  }));
2244
2279
  }
2245
2280
  const limit = options?.limit ?? 100;
2246
- const rows = this.queryRows(this.db(handle), `SELECT rowid, * FROM "${path}" LIMIT ?`, [limit]);
2281
+ const rows = this.queryRows(
2282
+ this.db(handle),
2283
+ `SELECT rowid, * FROM "${quoteIdent2(path2)}" LIMIT ?`,
2284
+ [limit]
2285
+ );
2247
2286
  return rows.map((row) => ({
2248
2287
  name: String(row.rowid ?? row.id ?? "?"),
2249
- path: `${path}/${row.rowid ?? row.id ?? "?"}`,
2288
+ path: `${path2}/${row.rowid ?? row.id ?? "?"}`,
2250
2289
  type: "row"
2251
2290
  }));
2252
2291
  }
@@ -2257,15 +2296,18 @@ var SQLiteConnector = class extends AbstractConnector {
2257
2296
  for (const table of tables) {
2258
2297
  if (results.length >= maxResults) break;
2259
2298
  try {
2260
- const info = this.queryRows(this.db(handle), `PRAGMA table_info("${table.name}")`);
2299
+ const info = this.queryRows(
2300
+ this.db(handle),
2301
+ `PRAGMA table_info("${quoteIdent2(table.name)}")`
2302
+ );
2261
2303
  const textCols = info.filter((c) => /text|varchar|char/i.test(String(c.type ?? "")));
2262
2304
  if (textCols.length === 0) continue;
2263
- const conditions = textCols.map((c) => `"${c.name}" LIKE ?`).join(" OR ");
2305
+ const conditions = textCols.map((c) => `"${quoteIdent2(String(c.name))}" LIKE ?`).join(" OR ");
2264
2306
  const params = textCols.map(() => `%${query}%`);
2265
2307
  params.push(maxResults - results.length);
2266
2308
  const rows = this.queryRows(
2267
2309
  this.db(handle),
2268
- `SELECT rowid, * FROM "${table.name}" WHERE ${conditions} LIMIT ?`,
2310
+ `SELECT rowid, * FROM "${quoteIdent2(table.name)}" WHERE ${conditions} LIMIT ?`,
2269
2311
  params
2270
2312
  );
2271
2313
  for (const row of rows) {
@@ -2332,7 +2374,7 @@ var SQLiteConnector = class extends AbstractConnector {
2332
2374
  case "schema": {
2333
2375
  const table = args.table ? String(args.table) : void 0;
2334
2376
  if (table) {
2335
- const info = this.queryRows(db, `PRAGMA table_info("${table}")`);
2377
+ const info = this.queryRows(db, `PRAGMA table_info("${quoteIdent2(table)}")`);
2336
2378
  return JSON.stringify(info, null, 2);
2337
2379
  }
2338
2380
  const tables = this.queryRows(
@@ -2341,7 +2383,10 @@ var SQLiteConnector = class extends AbstractConnector {
2341
2383
  );
2342
2384
  const result = {};
2343
2385
  for (const t of tables) {
2344
- result[t.name] = this.queryRows(db, `PRAGMA table_info("${t.name}")`);
2386
+ result[t.name] = this.queryRows(
2387
+ db,
2388
+ `PRAGMA table_info("${quoteIdent2(String(t.name))}")`
2389
+ );
2345
2390
  }
2346
2391
  return JSON.stringify(result, null, 2);
2347
2392
  }
@@ -2363,15 +2408,15 @@ function createConnector10() {
2363
2408
  return new SQLiteConnector();
2364
2409
  }
2365
2410
 
2366
- // base-assets/connectors/minio/adapter.ts
2411
+ // factory-assets/connectors/minio/adapter.ts
2367
2412
  var MinIOConnector = class extends AbstractConnector {
2368
2413
  name = "minio";
2369
2414
  tools;
2370
2415
  constructor() {
2371
2416
  super();
2372
2417
  this.tools = {
2373
- list: (handle, path) => this._list(handle, path),
2374
- read: (handle, path) => this._read(handle, path),
2418
+ list: (handle, path2) => this._list(handle, path2),
2419
+ read: (handle, path2) => this._read(handle, path2),
2375
2420
  describeOperations: (handle) => this._describeOperations(handle),
2376
2421
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),
2377
2422
  describeSkill: (handle, declaration) => this._describeSkill(handle, declaration)
@@ -2549,10 +2594,10 @@ var MinIOConnector = class extends AbstractConnector {
2549
2594
  }
2550
2595
  return ops;
2551
2596
  }
2552
- async _list(handle, path) {
2597
+ async _list(handle, path2, recursive = false) {
2553
2598
  const { client, bucket } = handle.state;
2554
2599
  const entries = [];
2555
- const stream = client.listObjects(bucket, path ?? "", false);
2600
+ const stream = client.listObjects(bucket, path2 ?? "", recursive);
2556
2601
  return new Promise((resolve5, reject) => {
2557
2602
  stream.on("data", (obj) => {
2558
2603
  entries.push({
@@ -2567,10 +2612,10 @@ var MinIOConnector = class extends AbstractConnector {
2567
2612
  stream.on("error", reject);
2568
2613
  });
2569
2614
  }
2570
- async _read(handle, path) {
2615
+ async _read(handle, path2) {
2571
2616
  const { client, bucket } = handle.state;
2572
2617
  const chunks = [];
2573
- const stream = await client.getObject(bucket, path);
2618
+ const stream = await client.getObject(bucket, path2);
2574
2619
  return new Promise((resolve5, reject) => {
2575
2620
  stream.on("data", (chunk) => chunks.push(chunk));
2576
2621
  stream.on("end", () => resolve5({ data: Buffer.concat(chunks).toString() }));
@@ -2581,7 +2626,11 @@ var MinIOConnector = class extends AbstractConnector {
2581
2626
  const { client, bucket } = handle.state;
2582
2627
  switch (operation) {
2583
2628
  case "list_objects":
2584
- return JSON.stringify(await this._list(handle, String(args.prefix ?? "")), null, 2);
2629
+ return JSON.stringify(
2630
+ await this._list(handle, String(args.prefix ?? ""), Boolean(args.recursive)),
2631
+ null,
2632
+ 2
2633
+ );
2585
2634
  case "get_object": {
2586
2635
  const content = await this._read(handle, String(args.key));
2587
2636
  return content?.data?.toString() ?? "(empty)";
@@ -2619,8 +2668,8 @@ var XStateConnector = class extends AbstractConnector {
2619
2668
  constructor() {
2620
2669
  super();
2621
2670
  this.tools = {
2622
- read: (handle, path) => this._read(handle, path),
2623
- list: (handle, path, options) => this._list(handle, path, options),
2671
+ read: (handle, path2) => this._read(handle, path2),
2672
+ list: (handle, path2, options) => this._list(handle, path2, options),
2624
2673
  search: (handle, query) => this._search(handle, query),
2625
2674
  describeOperations: (handle) => this._describeOperations(handle),
2626
2675
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args)
@@ -2722,15 +2771,15 @@ var XStateConnector = class extends AbstractConnector {
2722
2771
  this.s(handle).onChange = cb;
2723
2772
  }
2724
2773
  // ── Tool face methods (private, wired in constructor) ─────────────────────
2725
- async _read(handle, path) {
2774
+ async _read(handle, path2) {
2726
2775
  const snapshot = this.s(handle).actor.getSnapshot();
2727
- if (path === "" || path === "state") {
2776
+ if (path2 === "" || path2 === "state") {
2728
2777
  return { data: JSON.stringify(snapshot.value), contentType: "application/json" };
2729
2778
  }
2730
- if (path === "context") {
2779
+ if (path2 === "context") {
2731
2780
  return { data: JSON.stringify(snapshot.context, null, 2), contentType: "application/json" };
2732
2781
  }
2733
- const value = snapshot.context?.[path];
2782
+ const value = snapshot.context?.[path2];
2734
2783
  if (value === void 0) return null;
2735
2784
  return { data: JSON.stringify(value), contentType: "application/json" };
2736
2785
  }
@@ -2917,17 +2966,17 @@ function createConnector12() {
2917
2966
  return new XStateConnector();
2918
2967
  }
2919
2968
 
2920
- // base-assets/connectors/xstate-store/adapter.ts
2969
+ // factory-assets/connectors/xstate-store/adapter.ts
2921
2970
  var XStateStoreConnector = class extends AbstractConnector {
2922
2971
  name = "xstate-store";
2923
2972
  tools;
2924
2973
  constructor() {
2925
2974
  super();
2926
2975
  this.tools = {
2927
- read: (handle, path) => this._read(handle, path),
2928
- write: (handle, path, content) => this._write(handle, path, content),
2929
- delete: (handle, path) => this._delete(handle, path),
2930
- list: (handle, path, options) => this._list(handle, path, options),
2976
+ read: (handle, path2) => this._read(handle, path2),
2977
+ write: (handle, path2, content) => this._write(handle, path2, content),
2978
+ delete: (handle, path2) => this._delete(handle, path2),
2979
+ list: (handle, path2, options) => this._list(handle, path2, options),
2931
2980
  search: (handle, query, options) => this._search(handle, query, options),
2932
2981
  describeOperations: (handle) => this._describeOperations(handle),
2933
2982
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args)
@@ -2981,17 +3030,17 @@ var XStateStoreConnector = class extends AbstractConnector {
2981
3030
  handle.state.onChange = cb;
2982
3031
  }
2983
3032
  // ── Tool face methods (private, wired in constructor) ─────────────────────
2984
- async _read(handle, path) {
3033
+ async _read(handle, path2) {
2985
3034
  const ctx = this.context(handle);
2986
- if (path === "*") {
3035
+ if (path2 === "*") {
2987
3036
  if (Object.keys(ctx).length === 0) return null;
2988
3037
  return { data: JSON.stringify(ctx, null, 2), contentType: "application/json" };
2989
3038
  }
2990
- const value = ctx[path];
3039
+ const value = ctx[path2];
2991
3040
  if (value === void 0) return null;
2992
3041
  return { data: JSON.stringify(value), contentType: "application/json" };
2993
3042
  }
2994
- async _write(handle, path, content) {
3043
+ async _write(handle, path2, content) {
2995
3044
  const data = typeof content.data === "string" ? content.data : content.data.toString("utf-8");
2996
3045
  let value;
2997
3046
  try {
@@ -2999,21 +3048,22 @@ var XStateStoreConnector = class extends AbstractConnector {
2999
3048
  } catch {
3000
3049
  value = data;
3001
3050
  }
3002
- this.storeState(handle).store.send({ type: "set", key: path, value });
3003
- this._recordHistory(handle, "set", { key: path, value });
3051
+ this.storeState(handle).store.send({ type: "set", key: path2, value });
3052
+ this._recordHistory(handle, "set", { key: path2, value });
3004
3053
  }
3005
- async _delete(handle, path) {
3054
+ async _delete(handle, path2) {
3006
3055
  const ctx = this.context(handle);
3007
- if (!(path in ctx)) return false;
3008
- this.storeState(handle).store.send({ type: "delete", key: path });
3009
- this._recordHistory(handle, "delete", { key: path });
3056
+ if (!(path2 in ctx)) return false;
3057
+ this.storeState(handle).store.send({ type: "delete", key: path2 });
3058
+ this._recordHistory(handle, "delete", { key: path2 });
3010
3059
  return true;
3011
3060
  }
3012
3061
  async _list(handle, _path, options) {
3013
3062
  const ctx = this.context(handle);
3014
3063
  let keys = Object.keys(ctx);
3015
3064
  if (options?.glob) {
3016
- const regex = new RegExp(`^${options.glob.replace(/\*/g, ".*")}$`);
3065
+ const escaped = options.glob.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
3066
+ const regex = new RegExp(`^${escaped.replace(/\*/g, ".*")}$`);
3017
3067
  keys = keys.filter((k) => regex.test(k));
3018
3068
  }
3019
3069
  if (options?.limit) keys = keys.slice(0, options.limit);
@@ -3183,7 +3233,7 @@ function createConnector13() {
3183
3233
  return new XStateStoreConnector();
3184
3234
  }
3185
3235
 
3186
- // base-assets/connectors/gmail/adapter.ts
3236
+ // factory-assets/connectors/gmail/adapter.ts
3187
3237
  var GmailConnector = class extends AbstractConnector {
3188
3238
  name = "gmail";
3189
3239
  tools;
@@ -3390,15 +3440,15 @@ function createConnector14() {
3390
3440
  return new GmailConnector();
3391
3441
  }
3392
3442
 
3393
- // base-assets/connectors/mattermost/adapter.ts
3443
+ // factory-assets/connectors/mattermost/adapter.ts
3394
3444
  var MattermostConnector = class extends AbstractConnector {
3395
3445
  name = "mattermost";
3396
3446
  tools;
3397
3447
  constructor() {
3398
3448
  super();
3399
3449
  this.tools = {
3400
- read: (handle, path) => this._read(handle, path),
3401
- write: (handle, path, content) => this._write(handle, path, content),
3450
+ read: (handle, path2) => this._read(handle, path2),
3451
+ write: (handle, path2, content) => this._write(handle, path2, content),
3402
3452
  describeOperations: (handle) => this._describeOperations(handle),
3403
3453
  executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),
3404
3454
  describeSkill: (handle, declaration) => this._describeSkill(handle, declaration)
@@ -3470,22 +3520,23 @@ var MattermostConnector = class extends AbstractConnector {
3470
3520
  handle.status = "disconnected";
3471
3521
  }
3472
3522
  // ── Tool face methods (private, wired in constructor) ─────────────────────
3473
- async _read(handle, path) {
3523
+ async _read(handle, path2) {
3474
3524
  const state = handle.state;
3475
3525
  try {
3476
- const post = await this._apiGet(state.url, state.token, `/api/v4/posts/${path}`);
3526
+ const post = await this._apiGet(state.url, state.token, `/api/v4/posts/${path2}`);
3527
+ this._assertChannelAccess(String(post.channel_id ?? ""), state.channelFilter);
3477
3528
  return { data: JSON.stringify(post, null, 2), contentType: "application/json" };
3478
3529
  } catch {
3479
3530
  return null;
3480
3531
  }
3481
3532
  }
3482
- async _write(handle, path, content) {
3533
+ async _write(handle, path2, content) {
3483
3534
  if (handle.access === "read-only")
3484
3535
  throw new Error("MattermostConnector: write denied \u2014 read-only");
3485
3536
  const state = handle.state;
3486
3537
  const message = typeof content === "string" ? content : String(content.data ?? "");
3487
- await this._apiPut(state.url, state.token, `/api/v4/posts/${path}`, { id: path, message });
3488
- this.emitChange?.({ path, action: "edit", source: "operation" });
3538
+ await this._apiPut(state.url, state.token, `/api/v4/posts/${path2}`, { id: path2, message });
3539
+ this.emitChange?.({ path: path2, action: "edit", source: "operation" });
3489
3540
  }
3490
3541
  _describeSkill(handle, declaration) {
3491
3542
  const state = handle.state;
@@ -3652,12 +3703,20 @@ var MattermostConnector = class extends AbstractConnector {
3652
3703
  2
3653
3704
  );
3654
3705
  }
3655
- case "get_thread":
3706
+ case "get_thread": {
3707
+ const postId = String(args.post_id);
3708
+ const post = await this._apiGet(
3709
+ state.url,
3710
+ state.token,
3711
+ `/api/v4/posts/${postId}`
3712
+ );
3713
+ this._assertChannelAccess(String(post.channel_id ?? ""), state.channelFilter);
3656
3714
  return JSON.stringify(
3657
- await this._apiGet(state.url, state.token, `/api/v4/posts/${args.post_id}/thread`),
3715
+ await this._apiGet(state.url, state.token, `/api/v4/posts/${postId}/thread`),
3658
3716
  null,
3659
3717
  2
3660
3718
  );
3719
+ }
3661
3720
  case "search_posts": {
3662
3721
  const body = { terms: String(args.terms), is_or_search: false };
3663
3722
  if (args.team_id) body.team_id = String(args.team_id);
@@ -3735,31 +3794,31 @@ var MattermostConnector = class extends AbstractConnector {
3735
3794
  return typeof id === "string" && filter.has(id);
3736
3795
  });
3737
3796
  }
3738
- async _apiGet(baseUrl, token, path) {
3739
- const res = await fetch(baseUrl + path, { headers: { Authorization: `Bearer ${token}` } });
3797
+ async _apiGet(baseUrl, token, path2) {
3798
+ const res = await fetch(baseUrl + path2, { headers: { Authorization: `Bearer ${token}` } });
3740
3799
  if (!res.ok) {
3741
3800
  const body = await res.text();
3742
- this.log.warn("REST error", { method: "GET", endpoint: path, status: res.status });
3743
- throw new Error(`Mattermost GET ${path}: ${res.status} ${body}`);
3801
+ this.log.warn("REST error", { method: "GET", endpoint: path2, status: res.status });
3802
+ throw new Error(`Mattermost GET ${path2}: ${res.status} ${body}`);
3744
3803
  }
3745
3804
  return res.json();
3746
3805
  }
3747
- async _apiPost(baseUrl, token, path, body) {
3748
- const res = await fetch(baseUrl + path, {
3806
+ async _apiPost(baseUrl, token, path2, body) {
3807
+ const res = await fetch(baseUrl + path2, {
3749
3808
  method: "POST",
3750
3809
  headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
3751
3810
  body: JSON.stringify(body)
3752
3811
  });
3753
- if (!res.ok) throw new Error(`Mattermost POST ${path}: ${res.status} ${await res.text()}`);
3812
+ if (!res.ok) throw new Error(`Mattermost POST ${path2}: ${res.status} ${await res.text()}`);
3754
3813
  return res.json();
3755
3814
  }
3756
- async _apiPut(baseUrl, token, path, body) {
3757
- const res = await fetch(baseUrl + path, {
3815
+ async _apiPut(baseUrl, token, path2, body) {
3816
+ const res = await fetch(baseUrl + path2, {
3758
3817
  method: "PUT",
3759
3818
  headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
3760
3819
  body: JSON.stringify(body)
3761
3820
  });
3762
- if (!res.ok) throw new Error(`Mattermost PUT ${path}: ${res.status} ${await res.text()}`);
3821
+ if (!res.ok) throw new Error(`Mattermost PUT ${path2}: ${res.status} ${await res.text()}`);
3763
3822
  return res.json();
3764
3823
  }
3765
3824
  };
@@ -3767,7 +3826,7 @@ function createConnector15() {
3767
3826
  return new MattermostConnector();
3768
3827
  }
3769
3828
 
3770
- // base-assets/connectors/devserver/adapter.ts
3829
+ // factory-assets/connectors/devserver/adapter.ts
3771
3830
  function isPidAlive(pid) {
3772
3831
  try {
3773
3832
  process.kill(pid, 0);
@@ -4446,7 +4505,7 @@ function createConnector17() {
4446
4505
  return new StaticServerConnector();
4447
4506
  }
4448
4507
 
4449
- // base-assets/connectors/tunnel/adapter.ts
4508
+ // factory-assets/connectors/tunnel/adapter.ts
4450
4509
  var TunnelConnector = class extends AbstractConnector {
4451
4510
  name = "tunnel";
4452
4511
  tools;
@@ -4646,10 +4705,14 @@ async function spawnCloudflaredTunnel(port) {
4646
4705
  return;
4647
4706
  }
4648
4707
  }
4708
+ proc.kill();
4649
4709
  reject(new Error("cloudflared: failed to parse public URL"));
4650
4710
  };
4651
4711
  readLoop().catch(reject);
4652
- setTimeout(() => reject(new Error("cloudflared: timed out")), 3e4);
4712
+ setTimeout(() => {
4713
+ proc.kill();
4714
+ reject(new Error("cloudflared: timed out"));
4715
+ }, 3e4);
4653
4716
  });
4654
4717
  }
4655
4718
  async function spawnNgrokTunnel(port) {
@@ -5009,6 +5072,157 @@ var ConnectorStartupError = class extends Error {
5009
5072
  this.failedReadWrite = failedReadWrite;
5010
5073
  }
5011
5074
  };
5075
+ function isFleetManaged(connectorId) {
5076
+ const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? "";
5077
+ if (raw.length === 0) return false;
5078
+ return raw.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0).includes(connectorId);
5079
+ }
5080
+ async function ensureFleetMounted(dir, log, options) {
5081
+ const timeoutMs = options?.timeoutMs ?? 3e3;
5082
+ const pollIntervalMs = options?.pollIntervalMs ?? 100;
5083
+ const deadline = Date.now() + timeoutMs;
5084
+ let lastErr = null;
5085
+ while (Date.now() < deadline) {
5086
+ try {
5087
+ const st = await stat(dir);
5088
+ if (!st.isDirectory()) {
5089
+ throw new Error(`fleet mountpoint ${dir} is not a directory`);
5090
+ }
5091
+ await readdir(dir);
5092
+ log.info("fleet bind mount verified", { dir });
5093
+ return;
5094
+ } catch (err) {
5095
+ lastErr = err;
5096
+ await new Promise((resolve5) => setTimeout(resolve5, pollIntervalMs));
5097
+ }
5098
+ }
5099
+ throw new Error(
5100
+ `fleet mount ${dir} not ready after ${timeoutMs}ms \u2014 check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`
5101
+ );
5102
+ }
5103
+ var NOT_READY_SENTINEL = ".skaile-workspace-not-ready";
5104
+ var SENTINEL_BODY = [
5105
+ "This workspace is backed by a remote mount that is not live yet.",
5106
+ "It is mounted read-only on purpose: writing here would create a phantom",
5107
+ "workspace that diverges from the remote once the mount comes up.",
5108
+ "Wait for the mount to finish syncing (watch connector_status) before writing.",
5109
+ ""
5110
+ ].join("\n");
5111
+ var defaultRunner = (cmd, args) => new Promise((resolve5, reject) => {
5112
+ const proc = spawn(cmd, args, { stdio: "ignore" });
5113
+ proc.once("error", reject);
5114
+ proc.once("close", (code, signal) => {
5115
+ if (code === 0) resolve5();
5116
+ else reject(new Error(`${cmd} ${args.join(" ")} exited ${code ?? `signal ${signal}`}`));
5117
+ });
5118
+ });
5119
+ var RoMountPlaceholderBarrier = class {
5120
+ run;
5121
+ modes = /* @__PURE__ */ new Map();
5122
+ constructor(opts) {
5123
+ this.run = opts?.run ?? defaultRunner;
5124
+ }
5125
+ async establish(target, log) {
5126
+ if (this.modes.has(target)) return;
5127
+ await mkdir(target, { recursive: true });
5128
+ let tmpfsMounted = false;
5129
+ try {
5130
+ await this.run("mount", [
5131
+ "-t",
5132
+ "tmpfs",
5133
+ "-o",
5134
+ "mode=0755,size=1m",
5135
+ "skaile-not-ready",
5136
+ target
5137
+ ]);
5138
+ tmpfsMounted = true;
5139
+ await writeFile(path.join(target, NOT_READY_SENTINEL), SENTINEL_BODY);
5140
+ await this.run("mount", ["-o", "remount,ro", target]);
5141
+ this.modes.set(target, "mount");
5142
+ log?.info("deferred mount barrier established (read-only tmpfs)", { target });
5143
+ } catch (err) {
5144
+ if (tmpfsMounted) await this.run("umount", [target]).catch(() => {
5145
+ });
5146
+ await this.chmodFallback(target, err, log);
5147
+ }
5148
+ }
5149
+ async onMountLive(target, log) {
5150
+ const mode = this.modes.get(target);
5151
+ if (mode === "mount") {
5152
+ log?.debug("deferred mount live; placeholder shadowed", { target });
5153
+ return;
5154
+ }
5155
+ if (mode === "chmod" || mode === "unprotected") {
5156
+ if (mode === "chmod") await chmod(target, 493).catch(() => {
5157
+ });
5158
+ await rm(path.join(target, NOT_READY_SENTINEL), { force: true }).catch(() => {
5159
+ });
5160
+ log?.debug("deferred mount live; degraded barrier lifted", { target, mode });
5161
+ }
5162
+ }
5163
+ async remove(target, log) {
5164
+ const mode = this.modes.get(target);
5165
+ if (!mode) return;
5166
+ this.modes.delete(target);
5167
+ if (mode === "mount") {
5168
+ let unmounted = false;
5169
+ try {
5170
+ await this.run("umount", [target]);
5171
+ unmounted = true;
5172
+ } catch {
5173
+ await this.run("umount", ["-l", target]).then(
5174
+ () => {
5175
+ unmounted = true;
5176
+ },
5177
+ () => {
5178
+ }
5179
+ );
5180
+ }
5181
+ if (unmounted) {
5182
+ log?.debug("deferred mount barrier removed (tmpfs unmounted)", { target });
5183
+ } else {
5184
+ log?.error(
5185
+ "deferred mount barrier: umount and umount -l both failed \u2014 tmpfs may be leaked",
5186
+ void 0,
5187
+ { target }
5188
+ );
5189
+ }
5190
+ return;
5191
+ }
5192
+ if (mode === "chmod") await chmod(target, 493).catch(() => {
5193
+ });
5194
+ await rm(path.join(target, NOT_READY_SENTINEL), { force: true }).catch(() => {
5195
+ });
5196
+ log?.debug(
5197
+ mode === "chmod" ? "deferred mount barrier removed (chmod restored)" : "deferred mount barrier removed (was never enforced \u2014 target stayed writable)",
5198
+ { target }
5199
+ );
5200
+ }
5201
+ async chmodFallback(target, cause, log) {
5202
+ await writeFile(path.join(target, NOT_READY_SENTINEL), SENTINEL_BODY).catch(() => {
5203
+ });
5204
+ const chmodOk = await chmod(target, 365).then(
5205
+ () => true,
5206
+ () => false
5207
+ );
5208
+ this.modes.set(target, chmodOk ? "chmod" : "unprotected");
5209
+ const detail = { target, error: cause instanceof Error ? cause.message : String(cause) };
5210
+ if (chmodOk) {
5211
+ log?.error(
5212
+ "deferred mount read-only barrier degraded to chmod (mount unavailable) \u2014 a write by the owning uid could bypass it",
5213
+ void 0,
5214
+ detail
5215
+ );
5216
+ } else {
5217
+ log?.error(
5218
+ "deferred mount read-only barrier FAILED (mount and chmod both unavailable) \u2014 target is WRITABLE",
5219
+ void 0,
5220
+ detail
5221
+ );
5222
+ }
5223
+ }
5224
+ };
5225
+ var defaultMountPlaceholderBarrier = new RoMountPlaceholderBarrier();
5012
5226
 
5013
5227
  // connectors/src/connector-manager.ts
5014
5228
  var KNOWN_PREFIXES = ["env:", "forge:", "op:", "kp:", "oauth:"];
@@ -5111,6 +5325,7 @@ var ConnectorManager = class {
5111
5325
  this.catalogEntries = opts.catalogEntries ?? [];
5112
5326
  this.tokenMediator = opts.tokenMediator;
5113
5327
  this.preMintedSecrets = opts.preMintedSecrets;
5328
+ this.placeholderBarrier = opts.placeholderBarrier ?? defaultMountPlaceholderBarrier;
5114
5329
  const secrets = opts.secrets;
5115
5330
  if (secrets && typeof secrets === "object" && "prepareRef" in secrets) {
5116
5331
  this.chain = secrets;
@@ -5131,6 +5346,7 @@ var ConnectorManager = class {
5131
5346
  catalogEntries;
5132
5347
  tokenMediator;
5133
5348
  preMintedSecrets;
5349
+ placeholderBarrier;
5134
5350
  mgrLog;
5135
5351
  /** Set once `disconnectAll()` starts, so in-flight deferred mounts bail. */
5136
5352
  disposed = false;
@@ -5337,7 +5553,7 @@ var ConnectorManager = class {
5337
5553
  }
5338
5554
  if (deferred.length > 0) {
5339
5555
  for (const { decl, connector } of deferred) {
5340
- this.preRegisterDeferred(decl, connector);
5556
+ await this.preRegisterDeferred(decl, connector);
5341
5557
  }
5342
5558
  const prior = this.deferredConnect;
5343
5559
  this.deferredConnect = (async () => {
@@ -5405,7 +5621,12 @@ var ConnectorManager = class {
5405
5621
  } catch {
5406
5622
  }
5407
5623
  }
5408
- this.active.set(decl.id, { connector, handle, declaration: decl });
5624
+ this.active.set(decl.id, {
5625
+ connector,
5626
+ handle,
5627
+ declaration: decl,
5628
+ placeholderTarget: previous?.placeholderTarget
5629
+ });
5409
5630
  this.opts.onStatusChange?.({
5410
5631
  type: "connector_status",
5411
5632
  connectorId: decl.id,
@@ -5437,12 +5658,26 @@ var ConnectorManager = class {
5437
5658
  /**
5438
5659
  * Register a provisional entry for a deferred filesystem-face connector so
5439
5660
  * its (deterministic) mount path shows up in `listConnectors()` / the system
5440
- * prompt before the background mount completes. The empty target dir is
5441
- * created up front so the agent can `ls` it while it is still syncing.
5661
+ * prompt before the background mount completes.
5662
+ *
5663
+ * Before exposing the target, a read-only barrier is established so the agent
5664
+ * cannot write a phantom workspace into a not-yet-mounted remote. Fleet-managed
5665
+ * mounts are skipped: the host already bound the live share at the target, so a
5666
+ * barrier on top would shadow real content.
5442
5667
  */
5443
- preRegisterDeferred(decl, connector) {
5668
+ async preRegisterDeferred(decl, connector) {
5444
5669
  const mountTarget = this.resolveMountTarget(decl);
5445
5670
  if (!existsSync(mountTarget)) mkdirSync(mountTarget, { recursive: true });
5671
+ const fleetManaged = isFleetManaged(decl.id);
5672
+ let placeholderTarget;
5673
+ if (!fleetManaged) {
5674
+ try {
5675
+ await this.placeholderBarrier.establish(mountTarget, this.mgrLog);
5676
+ placeholderTarget = mountTarget;
5677
+ } catch (err) {
5678
+ this.mgrLog.error("deferred mount barrier establish failed", err, { id: decl.id });
5679
+ }
5680
+ }
5446
5681
  const handle = {
5447
5682
  id: decl.id,
5448
5683
  driver: connector.name ?? decl.driver,
@@ -5454,7 +5689,7 @@ var ConnectorManager = class {
5454
5689
  // returns cleanly instead of dereferencing null state.
5455
5690
  state: {}
5456
5691
  };
5457
- this.active.set(decl.id, { connector, handle, declaration: decl });
5692
+ this.active.set(decl.id, { connector, handle, declaration: decl, placeholderTarget });
5458
5693
  }
5459
5694
  /** Drive all deferred mounts concurrently; resolves when every one settles. */
5460
5695
  async connectDeferred(deferred) {
@@ -5473,10 +5708,15 @@ var ConnectorManager = class {
5473
5708
  if (this.disposed) return;
5474
5709
  const result = await this.attemptConnect(decl, connector);
5475
5710
  if (!result.connected) {
5476
- const entry = this.active.get(decl.id);
5477
- if (entry && entry.handle.status === "connecting") entry.handle.status = "error";
5711
+ const entry2 = this.active.get(decl.id);
5712
+ if (entry2 && entry2.handle.status === "connecting") entry2.handle.status = "error";
5478
5713
  return;
5479
5714
  }
5715
+ const entry = this.active.get(decl.id);
5716
+ if (entry?.placeholderTarget) {
5717
+ await this.placeholderBarrier.onMountLive(entry.placeholderTarget, this.mgrLog).catch(() => {
5718
+ });
5719
+ }
5480
5720
  if (this.disposed && this.active.has(decl.id)) {
5481
5721
  await this.disconnect(decl.id).catch(() => {
5482
5722
  });
@@ -5509,6 +5749,10 @@ var ConnectorManager = class {
5509
5749
  await entry.connector.disconnect(entry.handle);
5510
5750
  } catch {
5511
5751
  }
5752
+ if (entry.placeholderTarget) {
5753
+ await this.placeholderBarrier.remove(entry.placeholderTarget, this.mgrLog).catch(() => {
5754
+ });
5755
+ }
5512
5756
  this.opts.onStatusChange?.({
5513
5757
  type: "connector_status",
5514
5758
  connectorId: id,
@@ -5523,6 +5767,10 @@ var ConnectorManager = class {
5523
5767
  * Connect a single connector (hot-plug). Resolves fields and allocates
5524
5768
  * mount target if the connector has a filesystem face.
5525
5769
  *
5770
+ * This path connects immediately and does NOT establish the read-only
5771
+ * deferred-mount barrier — bring `deferMount` (rclone-backed) connectors up
5772
+ * through `connectAll({ deferMounts: true })` so the not-ready guarantee holds.
5773
+ *
5526
5774
  * @returns The `ConnectorHandle` for subsequent operations.
5527
5775
  */
5528
5776
  async connect(declaration) {
@@ -5591,6 +5839,10 @@ var ConnectorManager = class {
5591
5839
  try {
5592
5840
  await entry.connector.disconnect(entry.handle);
5593
5841
  } finally {
5842
+ if (entry.placeholderTarget) {
5843
+ await this.placeholderBarrier.remove(entry.placeholderTarget, this.mgrLog).catch(() => {
5844
+ });
5845
+ }
5594
5846
  this.active.delete(id);
5595
5847
  this.opts.onStatusChange?.({
5596
5848
  type: "connector_status",
@@ -5764,7 +6016,7 @@ var ConnectorManager = class {
5764
6016
  }
5765
6017
  return entry.connector.tools;
5766
6018
  }
5767
- async read(id, path) {
6019
+ async read(id, path2) {
5768
6020
  const entry = this.get(id);
5769
6021
  const tools = this.requireToolFace(id, entry);
5770
6022
  if (!tools.read) {
@@ -5777,10 +6029,10 @@ var ConnectorManager = class {
5777
6029
  "skaile.connector.driver": entry.connector.name,
5778
6030
  "skaile.connector.operation": "read"
5779
6031
  },
5780
- () => tools.read(entry.handle, path)
6032
+ () => tools.read(entry.handle, path2)
5781
6033
  );
5782
6034
  }
5783
- async write(id, path, content) {
6035
+ async write(id, path2, content) {
5784
6036
  const entry = this.get(id);
5785
6037
  if (entry.declaration.access === "read-only") {
5786
6038
  throw new Error(`Connector "${id}" is read-only`);
@@ -5796,10 +6048,10 @@ var ConnectorManager = class {
5796
6048
  "skaile.connector.driver": entry.connector.name,
5797
6049
  "skaile.connector.operation": "write"
5798
6050
  },
5799
- () => tools.write(entry.handle, path, content)
6051
+ () => tools.write(entry.handle, path2, content)
5800
6052
  );
5801
6053
  }
5802
- async delete(id, path) {
6054
+ async delete(id, path2) {
5803
6055
  const entry = this.get(id);
5804
6056
  if (entry.declaration.access === "read-only") {
5805
6057
  throw new Error(`Connector "${id}" is read-only`);
@@ -5815,10 +6067,10 @@ var ConnectorManager = class {
5815
6067
  "skaile.connector.driver": entry.connector.name,
5816
6068
  "skaile.connector.operation": "delete"
5817
6069
  },
5818
- () => tools.delete(entry.handle, path)
6070
+ () => tools.delete(entry.handle, path2)
5819
6071
  );
5820
6072
  }
5821
- async list(id, path, options) {
6073
+ async list(id, path2, options) {
5822
6074
  const entry = this.get(id);
5823
6075
  const tools = this.requireToolFace(id, entry);
5824
6076
  if (!tools.list) {
@@ -5831,7 +6083,7 @@ var ConnectorManager = class {
5831
6083
  "skaile.connector.driver": entry.connector.name,
5832
6084
  "skaile.connector.operation": "list"
5833
6085
  },
5834
- () => tools.list(entry.handle, path, options)
6086
+ () => tools.list(entry.handle, path2, options)
5835
6087
  );
5836
6088
  }
5837
6089
  async search(id, query, options) {
@@ -5972,9 +6224,9 @@ async function buildSdkConnectorTools(manager, options) {
5972
6224
  connector_id: z4.string().describe("Connector ID"),
5973
6225
  path: z4.string().describe("Path within the connector")
5974
6226
  },
5975
- handler: async ({ connector_id, path }) => {
6227
+ handler: async ({ connector_id, path: path2 }) => {
5976
6228
  try {
5977
- const content = await manager.read(connector_id, path);
6229
+ const content = await manager.read(connector_id, path2);
5978
6230
  return {
5979
6231
  content: [{ type: "text", text: content?.data?.toString() ?? "(empty)" }]
5980
6232
  };
@@ -5996,11 +6248,11 @@ async function buildSdkConnectorTools(manager, options) {
5996
6248
  },
5997
6249
  handler: async ({
5998
6250
  connector_id,
5999
- path,
6251
+ path: path2,
6000
6252
  content
6001
6253
  }) => {
6002
6254
  try {
6003
- await manager.write(connector_id, path, { data: content });
6255
+ await manager.write(connector_id, path2, { data: content });
6004
6256
  return { content: [{ type: "text", text: "Written." }] };
6005
6257
  } catch (err) {
6006
6258
  return {
@@ -6020,11 +6272,11 @@ async function buildSdkConnectorTools(manager, options) {
6020
6272
  },
6021
6273
  handler: async ({
6022
6274
  connector_id,
6023
- path,
6275
+ path: path2,
6024
6276
  recursive
6025
6277
  }) => {
6026
6278
  try {
6027
- const entries = await manager.list(connector_id, path, { recursive });
6279
+ const entries = await manager.list(connector_id, path2, { recursive });
6028
6280
  return { content: [{ type: "text", text: JSON.stringify(entries, null, 2) }] };
6029
6281
  } catch (err) {
6030
6282
  return {
@@ -6060,9 +6312,9 @@ async function buildSdkConnectorTools(manager, options) {
6060
6312
  connector_id: z4.string().describe("Connector ID"),
6061
6313
  path: z4.string().describe("Path to delete")
6062
6314
  },
6063
- handler: async ({ connector_id, path }) => {
6315
+ handler: async ({ connector_id, path: path2 }) => {
6064
6316
  try {
6065
- const ok = await manager.delete(connector_id, path);
6317
+ const ok = await manager.delete(connector_id, path2);
6066
6318
  return { content: [{ type: "text", text: ok ? "Deleted." : "Not found." }] };
6067
6319
  } catch (err) {
6068
6320
  return {
@@ -6124,9 +6376,24 @@ function buildConnectorPromptSection(manager, options) {
6124
6376
  "| Mount | Driver | Path | Access |",
6125
6377
  "|---|---|---|---|"
6126
6378
  ];
6379
+ let anyUnavailable = false;
6127
6380
  for (const c of fsConnectors) {
6128
6381
  const mountPath = c.mountPath ?? "(unmounted)";
6129
- lines.push(`| ${c.id} | ${c.driver} | \`${mountPath}/\` | ${c.access} |`);
6382
+ if (c.status === "connected") {
6383
+ lines.push(`| ${c.id} | ${c.driver} | \`${mountPath}/\` | ${c.access} |`);
6384
+ } else {
6385
+ anyUnavailable = true;
6386
+ const state = c.status === "error" ? "failed" : "syncing";
6387
+ lines.push(
6388
+ `| ${c.id} | ${c.driver} | \`${mountPath}/\` | unavailable (${state}) \u2014 read-only, do not write |`
6389
+ );
6390
+ }
6391
+ }
6392
+ if (anyUnavailable) {
6393
+ lines.push("");
6394
+ lines.push(
6395
+ "> **Unavailable mounts are read-only at the filesystem layer.** A mount marked `unavailable (syncing / failed)` is not live yet \u2014 its directory is mounted read-only, so writes fail. Do not create files there: the contents are not the real workspace, and anything you write would be a phantom that diverges from the remote once it mounts. Wait for it to become writable (watch the connector status)."
6396
+ );
6130
6397
  }
6131
6398
  const fsConnectorIds = new Set(fsConnectors.map((c) => c.id));
6132
6399
  const gitConnectors = manager.listGitConnectors().filter((g) => fsConnectorIds.has(g.id));
@@ -6307,13 +6574,19 @@ line=$(grep -F " $TAG" "$CRED_FILE" 2>/dev/null | tail -n 1)
6307
6574
 
6308
6575
  # Strip the trailing ' <TAG>' from the URL.
6309
6576
  url=\${line% *}
6310
- # Extract user:pass between scheme:// and @host.
6577
+ # Extract user:pass between scheme:// and @host. The token (pass) was
6578
+ # percent-encoded at write time (buildCredentialLine), so any literal '@' in it
6579
+ # stays encoded here -- the rightmost '@' is unambiguously the host delimiter.
6311
6580
  # scheme://user:pass@host -> user:pass
6312
6581
  userinfo=\${url#*://}
6313
6582
  userinfo=\${userinfo%@*}
6314
6583
  user=\${userinfo%%:*}
6315
6584
  pass=\${userinfo#*:}
6316
6585
 
6586
+ # Percent-decode the token (encodeURIComponent inverse). '%XX' -> byte; no '+'
6587
+ # handling needed since encodeURIComponent emits '%20' for spaces.
6588
+ pass=$(printf '%b' "$(printf '%s' "$pass" | sed 's/%/\\\\x/g')")
6589
+
6317
6590
  # git wants line-oriented key=value pairs followed by a blank line.
6318
6591
  printf 'username=%s\\n' "$user"
6319
6592
  printf 'password=%s\\n' "$pass"
@@ -6337,19 +6610,19 @@ var ManagedGitconfigCollisionError = class extends Error {
6337
6610
  var blockStart = (mountId) => `# skaile-mount: ${mountId}`;
6338
6611
  var blockEnd = (mountId) => `# skaile-mount: ${mountId} (end)`;
6339
6612
  var credentialTag = (mountId) => `# skaile-mount: ${mountId}`;
6340
- function readFileOrEmpty(path) {
6613
+ function readFileOrEmpty(path2) {
6341
6614
  try {
6342
- return readFileSync(path, "utf-8");
6615
+ return readFileSync(path2, "utf-8");
6343
6616
  } catch {
6344
6617
  return "";
6345
6618
  }
6346
6619
  }
6347
- function atomicWrite(path, content, mode) {
6348
- const dir = dirname(path);
6620
+ function atomicWrite(path2, content, mode) {
6621
+ const dir = dirname(path2);
6349
6622
  if (!existsSync(dir)) {
6350
6623
  mkdirSync(dir, { recursive: true, mode: 448 });
6351
6624
  }
6352
- const tmp = `${path}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;
6625
+ const tmp = `${path2}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;
6353
6626
  const fd = openSync(tmp, "w", mode);
6354
6627
  try {
6355
6628
  writeSync(fd, content);
@@ -6357,7 +6630,7 @@ function atomicWrite(path, content, mode) {
6357
6630
  closeSync(fd);
6358
6631
  }
6359
6632
  chmodSync(tmp, mode);
6360
- renameSync(tmp, path);
6633
+ renameSync(tmp, path2);
6361
6634
  }
6362
6635
  function parseBlocks(text) {
6363
6636
  const blocks = [];
@@ -6414,15 +6687,16 @@ function buildCredentialLine(urlPrefix, token, mountId) {
6414
6687
  const u = new URL(urlPrefix);
6415
6688
  const host = u.host;
6416
6689
  const scheme = u.protocol.replace(/:$/, "");
6417
- return `${scheme}://x-access-token:${token}@${host} ${credentialTag(mountId)}`;
6690
+ const encodedToken = encodeURIComponent(token);
6691
+ return `${scheme}://x-access-token:${encodedToken}@${host} ${credentialTag(mountId)}`;
6418
6692
  }
6419
- function readCredentialLines(path) {
6420
- return readFileOrEmpty(path).split("\n").filter((l) => l.length > 0);
6693
+ function readCredentialLines(path2) {
6694
+ return readFileOrEmpty(path2).split("\n").filter((l) => l.length > 0);
6421
6695
  }
6422
- function writeCredentialLines(path, lines) {
6696
+ function writeCredentialLines(path2, lines) {
6423
6697
  const content = lines.length > 0 ? `${lines.join("\n")}
6424
6698
  ` : "";
6425
- atomicWrite(path, content, 416);
6699
+ atomicWrite(path2, content, 416);
6426
6700
  }
6427
6701
  function findExistingBlock(blocks, mountId) {
6428
6702
  return blocks.find((b) => b.mountId === mountId);
@@ -6526,55 +6800,27 @@ function isPackageResolvable(pkg, projectDir) {
6526
6800
  function findMissingPackages(packages, projectDir) {
6527
6801
  return packages.filter((p) => !isPackageResolvable(p, projectDir));
6528
6802
  }
6529
- function isFleetManaged(connectorId) {
6530
- const raw = process.env.SKAILE_FLEET_MANAGED_MOUNTS ?? "";
6531
- if (raw.length === 0) return false;
6532
- return raw.split(",").map((segment) => segment.trim()).filter((segment) => segment.length > 0).includes(connectorId);
6533
- }
6534
- async function ensureFleetMounted(dir, log, options) {
6535
- const timeoutMs = options?.timeoutMs ?? 3e3;
6536
- const pollIntervalMs = options?.pollIntervalMs ?? 100;
6537
- const deadline = Date.now() + timeoutMs;
6538
- let lastErr = null;
6539
- while (Date.now() < deadline) {
6540
- try {
6541
- const st = await stat(dir);
6542
- if (!st.isDirectory()) {
6543
- throw new Error(`fleet mountpoint ${dir} is not a directory`);
6544
- }
6545
- await readdir(dir);
6546
- log.info("fleet bind mount verified", { dir });
6547
- return;
6548
- } catch (err) {
6549
- lastErr = err;
6550
- await new Promise((resolve5) => setTimeout(resolve5, pollIntervalMs));
6551
- }
6552
- }
6553
- throw new Error(
6554
- `fleet mount ${dir} not ready after ${timeoutMs}ms \u2014 check SKAILE_FLEET_MANAGED_MOUNTS env var and host bind: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`
6555
- );
6556
- }
6557
6803
  var WorktreeRegistryImpl = class {
6558
6804
  entries = /* @__PURE__ */ new Map();
6559
- register(path, owner) {
6560
- let owners = this.entries.get(path);
6805
+ register(path2, owner) {
6806
+ let owners = this.entries.get(path2);
6561
6807
  if (!owners) {
6562
6808
  owners = /* @__PURE__ */ new Set();
6563
- this.entries.set(path, owners);
6809
+ this.entries.set(path2, owners);
6564
6810
  }
6565
6811
  owners.add(owner);
6566
6812
  }
6567
- deregister(path, owner) {
6568
- const owners = this.entries.get(path);
6813
+ deregister(path2, owner) {
6814
+ const owners = this.entries.get(path2);
6569
6815
  if (!owners) return;
6570
6816
  owners.delete(owner);
6571
- if (owners.size === 0) this.entries.delete(path);
6817
+ if (owners.size === 0) this.entries.delete(path2);
6572
6818
  }
6573
- isInUse(path) {
6574
- return (this.entries.get(path)?.size ?? 0) > 0;
6819
+ isInUse(path2) {
6820
+ return (this.entries.get(path2)?.size ?? 0) > 0;
6575
6821
  }
6576
- owners(path) {
6577
- return [...this.entries.get(path) ?? []];
6822
+ owners(path2) {
6823
+ return [...this.entries.get(path2) ?? []];
6578
6824
  }
6579
6825
  };
6580
6826
  var worktreeRegistry = new WorktreeRegistryImpl();
@@ -6638,7 +6884,7 @@ async function listWorktrees(repoRoot) {
6638
6884
  return trees;
6639
6885
  }
6640
6886
 
6641
- // base-assets/connectors/flow/adapter.ts
6887
+ // factory-assets/connectors/flow/adapter.ts
6642
6888
  var now = () => (/* @__PURE__ */ new Date()).toISOString();
6643
6889
  function emptyNode(nodeId) {
6644
6890
  return {
@@ -6703,8 +6949,8 @@ var FlowAdapter = class extends AbstractConnector {
6703
6949
  constructor() {
6704
6950
  super();
6705
6951
  this.tools = {
6706
- read: (handle, path) => this.read(handle, path),
6707
- list: (handle, path, options) => this.list(handle, path, options),
6952
+ read: (handle, path2) => this.read(handle, path2),
6953
+ list: (handle, path2, options) => this.list(handle, path2, options),
6708
6954
  search: (handle, query, options) => this.search(handle, query, options),
6709
6955
  describeOperations: (handle) => this.describeOperations(handle),
6710
6956
  executeOp: (handle, operation, args) => this.executeOp(handle, operation, args)
@@ -6748,16 +6994,16 @@ var FlowAdapter = class extends AbstractConnector {
6748
6994
  s.execution = this.recompute(s);
6749
6995
  }
6750
6996
  // ── Base operations (private — wired into tools face in constructor) ──
6751
- async read(handle, path) {
6997
+ async read(handle, path2) {
6752
6998
  const s = this.s(handle);
6753
- if (path === "" || path === "state") {
6999
+ if (path2 === "" || path2 === "state") {
6754
7000
  return {
6755
7001
  data: JSON.stringify(s.execution, null, 2),
6756
7002
  contentType: "application/json"
6757
7003
  };
6758
7004
  }
6759
- if (path.startsWith("node/")) {
6760
- const nodeId = path.slice(5);
7005
+ if (path2.startsWith("node/")) {
7006
+ const nodeId = path2.slice(5);
6761
7007
  const node = s.flowDef.nodes.find((n) => n.id === nodeId);
6762
7008
  if (!node) return null;
6763
7009
  const exec = s.execution.nodes[nodeId];
@@ -7456,9 +7702,6 @@ var FlowAdapter = class extends AbstractConnector {
7456
7702
  if (existing.status === "not_started" && ns.status === "available") {
7457
7703
  nodes[ns.nodeId] = { ...existing, status: "available" };
7458
7704
  }
7459
- if (existing.status === "available" && ns.status === "blocked") {
7460
- nodes[ns.nodeId] = { ...existing, status: "blocked" };
7461
- }
7462
7705
  }
7463
7706
  let flowStatus = s.execution.status;
7464
7707
  if (flowStatus !== "cancelled") {
@@ -7552,6 +7795,6 @@ function createConnector() {
7552
7795
  return new FlowAdapter();
7553
7796
  }
7554
7797
 
7555
- export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, PostgresConnector, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createWorktree, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, parseAuthBlob2 as parseAuthBlob, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7556
- //# sourceMappingURL=chunk-HIIARTRZ.js.map
7557
- //# sourceMappingURL=chunk-HIIARTRZ.js.map
7798
+ export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NOT_READY_SENTINEL, PostgresConnector, RoMountPlaceholderBarrier, S3Connector, SQLiteConnector, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, atomicReplaceCredential, buildConnectorPromptSection, buildSdkConnectorTools, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createWorktree, defaultMountPlaceholderBarrier, defaultSpawn, ensureFleetMounted, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, parseAuthBlob2 as parseAuthBlob, registerBuiltinConnectors, removeMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock };
7799
+ //# sourceMappingURL=chunk-YDTW4GT6.js.map
7800
+ //# sourceMappingURL=chunk-YDTW4GT6.js.map