@skaile/workspaces 0.25.0 → 0.27.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 (562) hide show
  1. package/CHANGELOG.md +271 -0
  2. package/README.md +2 -2
  3. package/dist/{asset-feeds-77KLWCBP.js → asset-feeds-DGZO27M7.js} +20 -12
  4. package/dist/asset-feeds-DGZO27M7.js.map +1 -0
  5. package/dist/asset-manager/index.js +12 -11
  6. package/dist/asset-manager/installer.js +11 -10
  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/continue.d.ts +2 -0
  16. package/dist/bridge/drivers/continue.js +103 -0
  17. package/dist/bridge/drivers/continue.js.map +1 -0
  18. package/dist/bridge/drivers/echo.js +1 -1
  19. package/dist/bridge/drivers/gemini.d.ts +2 -0
  20. package/dist/bridge/drivers/gemini.js +10 -0
  21. package/dist/bridge/drivers/gemini.js.map +1 -0
  22. package/dist/bridge/drivers/goose.d.ts +2 -0
  23. package/dist/bridge/drivers/goose.js +88 -0
  24. package/dist/bridge/drivers/goose.js.map +1 -0
  25. package/dist/bridge/drivers/omp.js +64 -50
  26. package/dist/bridge/drivers/omp.js.map +1 -1
  27. package/dist/bridge/drivers/opencode.d.ts +2 -0
  28. package/dist/bridge/drivers/opencode.js +99 -0
  29. package/dist/bridge/drivers/opencode.js.map +1 -0
  30. package/dist/bridge/drivers/qwen.d.ts +2 -0
  31. package/dist/bridge/drivers/qwen.js +57 -0
  32. package/dist/bridge/drivers/qwen.js.map +1 -0
  33. package/dist/bridge/index.js +4 -4
  34. package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
  35. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
  36. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  37. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  38. package/dist/bridge/src/drivers/continue.d.ts +43 -0
  39. package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
  40. package/dist/bridge/src/drivers/gemini.d.ts +55 -0
  41. package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
  42. package/dist/bridge/src/drivers/goose.d.ts +42 -0
  43. package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
  44. package/dist/bridge/src/drivers/omp.d.ts +20 -4
  45. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  46. package/dist/bridge/src/drivers/opencode.d.ts +43 -0
  47. package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
  48. package/dist/bridge/src/drivers/qwen.d.ts +39 -0
  49. package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
  50. package/dist/bridge/src/error-classifier.d.ts +17 -0
  51. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  52. package/dist/bridge/src/models.d.ts +1 -1
  53. package/dist/bridge/src/models.d.ts.map +1 -1
  54. package/dist/bridge/src/provider-endpoints.d.ts +16 -0
  55. package/dist/bridge/src/provider-endpoints.d.ts.map +1 -0
  56. package/dist/bridge/src/registry.d.ts.map +1 -1
  57. package/dist/bridge/src/validation.d.ts +1 -1
  58. package/dist/bridge/src/validation.d.ts.map +1 -1
  59. package/dist/{chunk-GL45UNVS.js → chunk-2FS4FPZ7.js} +3 -3
  60. package/dist/{chunk-GL45UNVS.js.map → chunk-2FS4FPZ7.js.map} +1 -1
  61. package/dist/{chunk-4FJE6BI6.js → chunk-2NOE4AGD.js} +3 -3
  62. package/dist/{chunk-4FJE6BI6.js.map → chunk-2NOE4AGD.js.map} +1 -1
  63. package/dist/{chunk-3QTZWPGH.js → chunk-3QQSSRYN.js} +168 -90
  64. package/dist/chunk-3QQSSRYN.js.map +1 -0
  65. package/dist/{chunk-4FADEVBN.js → chunk-3ZER5DST.js} +6 -6
  66. package/dist/chunk-3ZER5DST.js.map +1 -0
  67. package/dist/chunk-5RBPPBEK.js +110 -0
  68. package/dist/chunk-5RBPPBEK.js.map +1 -0
  69. package/dist/chunk-5V5KZQIC.js +445 -0
  70. package/dist/chunk-5V5KZQIC.js.map +1 -0
  71. package/dist/{chunk-LSGAYQ2E.js → chunk-5YO3H5Q4.js} +3 -3
  72. package/dist/{chunk-LSGAYQ2E.js.map → chunk-5YO3H5Q4.js.map} +1 -1
  73. package/dist/{chunk-JDX54X4Y.js → chunk-7GWYRVAX.js} +12 -9
  74. package/dist/chunk-7GWYRVAX.js.map +1 -0
  75. package/dist/{chunk-B4ZXBH57.js → chunk-A4ASAIKK.js} +59 -13
  76. package/dist/chunk-A4ASAIKK.js.map +1 -0
  77. package/dist/{chunk-M5TE6YI5.js → chunk-AKSR434V.js} +10 -52
  78. package/dist/chunk-AKSR434V.js.map +1 -0
  79. package/dist/{chunk-KOVLSBXK.js → chunk-BMQKMOQY.js} +81 -79
  80. package/dist/chunk-BMQKMOQY.js.map +1 -0
  81. package/dist/{chunk-FJFHJBGS.js → chunk-BUL5H6J7.js} +9 -9
  82. package/dist/chunk-BUL5H6J7.js.map +1 -0
  83. package/dist/{chunk-GZWJGNNN.js → chunk-DEYYRFQU.js} +3 -3
  84. package/dist/chunk-DEYYRFQU.js.map +1 -0
  85. package/dist/{chunk-SETTLPBD.js → chunk-DGM74UP4.js} +3 -3
  86. package/dist/{chunk-SETTLPBD.js.map → chunk-DGM74UP4.js.map} +1 -1
  87. package/dist/{chunk-UD4ZLXGS.js → chunk-FWHOU3CX.js} +67 -35
  88. package/dist/chunk-FWHOU3CX.js.map +1 -0
  89. package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
  90. package/dist/chunk-GYPA2Q7F.js.map +1 -0
  91. package/dist/{chunk-WIAHJOMG.js → chunk-IEJ5IOC3.js} +10 -2
  92. package/dist/chunk-IEJ5IOC3.js.map +1 -0
  93. package/dist/chunk-IERB3UXJ.js +215 -0
  94. package/dist/chunk-IERB3UXJ.js.map +1 -0
  95. package/dist/{chunk-FVTV7M76.js → chunk-IFGTRL2I.js} +3 -3
  96. package/dist/chunk-IFGTRL2I.js.map +1 -0
  97. package/dist/{chunk-KT3CK26V.js → chunk-JIQLLZ65.js} +203 -39
  98. package/dist/chunk-JIQLLZ65.js.map +1 -0
  99. package/dist/{chunk-XVL22AWE.js → chunk-M4KLIEIJ.js} +114 -63
  100. package/dist/chunk-M4KLIEIJ.js.map +1 -0
  101. package/dist/{chunk-6FNCZYJY.js → chunk-MBOR7D65.js} +3 -3
  102. package/dist/{chunk-6FNCZYJY.js.map → chunk-MBOR7D65.js.map} +1 -1
  103. package/dist/{chunk-BJWUSHC4.js → chunk-MZDXEFXF.js} +30 -20
  104. package/dist/chunk-MZDXEFXF.js.map +1 -0
  105. package/dist/{chunk-QAVZOJCV.js → chunk-OVRSNIKJ.js} +2 -2
  106. package/dist/chunk-OVRSNIKJ.js.map +1 -0
  107. package/dist/{chunk-DQWREFRQ.js → chunk-PAYAFNXG.js} +22 -3
  108. package/dist/chunk-PAYAFNXG.js.map +1 -0
  109. package/dist/{chunk-D3VO6WNC.js → chunk-PRLD7EXG.js} +3 -3
  110. package/dist/chunk-PRLD7EXG.js.map +1 -0
  111. package/dist/{chunk-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
  112. package/dist/chunk-QDJKE557.js.map +1 -0
  113. package/dist/{chunk-QXC62DOF.js → chunk-SF4GWVR5.js} +21 -9
  114. package/dist/chunk-SF4GWVR5.js.map +1 -0
  115. package/dist/{chunk-IPUYL6TD.js → chunk-TV72ZJYN.js} +8 -5
  116. package/dist/{chunk-IPUYL6TD.js.map → chunk-TV72ZJYN.js.map} +1 -1
  117. package/dist/{chunk-4QVFQEY2.js → chunk-UAW7VRAL.js} +2 -2
  118. package/dist/{chunk-4QVFQEY2.js.map → chunk-UAW7VRAL.js.map} +1 -1
  119. package/dist/chunk-UBCZVONU.js +28 -0
  120. package/dist/chunk-UBCZVONU.js.map +1 -0
  121. package/dist/{chunk-2XY6732A.js → chunk-UIZKIUC6.js} +6 -6
  122. package/dist/chunk-UIZKIUC6.js.map +1 -0
  123. package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
  124. package/dist/chunk-W7W66MDZ.js.map +1 -0
  125. package/dist/{chunk-DCAWIRD6.js → chunk-WRRYESHC.js} +152 -187
  126. package/dist/chunk-WRRYESHC.js.map +1 -0
  127. package/dist/{chunk-XMP6XTMF.js → chunk-XHBPQ7QP.js} +450 -207
  128. package/dist/chunk-XHBPQ7QP.js.map +1 -0
  129. package/dist/chunk-Z3XXKR5E.js +88 -0
  130. package/dist/chunk-Z3XXKR5E.js.map +1 -0
  131. package/dist/{chunk-KLNL7QHN.js → chunk-ZAP2BDHG.js} +30 -5
  132. package/dist/chunk-ZAP2BDHG.js.map +1 -0
  133. package/dist/{chunk-6VTG73UY.js → chunk-ZEKWHJBB.js} +52 -2
  134. package/dist/chunk-ZEKWHJBB.js.map +1 -0
  135. package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
  136. package/dist/chunk-ZONCCO5N.js.map +1 -0
  137. package/dist/cli/index.js +618 -482
  138. package/dist/cli/index.js.map +1 -1
  139. package/dist/cli/src/asset-feeds.d.ts +14 -1
  140. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  141. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  142. package/dist/cli/src/commands/config.d.ts.map +1 -1
  143. package/dist/cli/src/commands/connector.d.ts +7 -0
  144. package/dist/cli/src/commands/connector.d.ts.map +1 -1
  145. package/dist/cli/src/commands/flow.d.ts +3 -2
  146. package/dist/cli/src/commands/flow.d.ts.map +1 -1
  147. package/dist/cli/src/commands/manage.d.ts +46 -23
  148. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  149. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  150. package/dist/cli/src/commands/run.d.ts.map +1 -1
  151. package/dist/cli/src/flow-discovery.d.ts +24 -0
  152. package/dist/cli/src/flow-discovery.d.ts.map +1 -0
  153. package/dist/cli/src/helpers.d.ts +10 -1
  154. package/dist/cli/src/helpers.d.ts.map +1 -1
  155. package/dist/cli/src/open-registry.d.ts +2 -2
  156. package/dist/cli/src/paths.d.ts +26 -9
  157. package/dist/cli/src/paths.d.ts.map +1 -1
  158. package/dist/cli/src/skill-walker.d.ts +9 -5
  159. package/dist/cli/src/skill-walker.d.ts.map +1 -1
  160. package/dist/connectors/config.js +9 -8
  161. package/dist/connectors/index.js +14 -13
  162. package/dist/connectors/rclone-config.js +1 -1
  163. package/dist/connectors/src/connector-manager.d.ts +24 -2
  164. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  165. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  166. package/dist/connectors/src/connector-registry.d.ts +3 -3
  167. package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
  168. package/dist/connectors/src/index.d.ts +4 -2
  169. package/dist/connectors/src/index.d.ts.map +1 -1
  170. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  171. package/dist/connectors/src/mount-placeholder.d.ts +68 -0
  172. package/dist/connectors/src/mount-placeholder.d.ts.map +1 -0
  173. package/dist/connectors/src/rclone-config/googledrive.d.ts +1 -1
  174. package/dist/core/discovery.js +1 -1
  175. package/dist/core/index.js +8 -7
  176. package/dist/core/manifest.js +2 -2
  177. package/dist/core/models.js +1 -1
  178. package/dist/core/publish-manifest.d.ts +2 -0
  179. package/dist/core/publish-manifest.js +5 -0
  180. package/dist/core/publish-manifest.js.map +1 -0
  181. package/dist/core/runtime-assets.js +5 -4
  182. package/dist/core/src/discovery.d.ts +27 -0
  183. package/dist/core/src/discovery.d.ts.map +1 -1
  184. package/dist/core/src/index.d.ts +8 -5
  185. package/dist/core/src/index.d.ts.map +1 -1
  186. package/dist/core/src/lock.d.ts.map +1 -1
  187. package/dist/core/src/manifest-yaml-editor.d.ts +62 -0
  188. package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -0
  189. package/dist/core/src/models.d.ts +6 -0
  190. package/dist/core/src/models.d.ts.map +1 -1
  191. package/dist/core/src/publish-manifest.d.ts +160 -0
  192. package/dist/core/src/publish-manifest.d.ts.map +1 -0
  193. package/dist/core/src/repo-manager.d.ts +9 -1
  194. package/dist/core/src/repo-manager.d.ts.map +1 -1
  195. package/dist/core/src/runtime-assets.d.ts +80 -29
  196. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  197. package/dist/core/src/walker.d.ts +19 -6
  198. package/dist/core/src/walker.d.ts.map +1 -1
  199. package/dist/core/src/workspace-config.d.ts +19 -37
  200. package/dist/core/src/workspace-config.d.ts.map +1 -1
  201. package/dist/core/src/workspace-yaml-editor.d.ts +1 -15
  202. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  203. package/dist/core/workspace-config.js +4 -3
  204. package/dist/deploy/index.js +51 -80
  205. package/dist/deploy/index.js.map +1 -1
  206. package/dist/deploy/src/targets/container-runtime.d.ts +1 -1
  207. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  208. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  209. package/dist/deploy/src/targets/nix.d.ts.map +1 -1
  210. package/dist/deploy/src/targets/process-handle.d.ts +7 -5
  211. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
  212. package/dist/discovery/index.js +5 -4
  213. package/dist/discovery/src/discover-manifest.d.ts +3 -2
  214. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  215. package/dist/discovery/src/discover.d.ts +2 -2
  216. package/dist/discovery/src/discover.d.ts.map +1 -1
  217. package/dist/discovery/src/index.d.ts +1 -1
  218. package/dist/discovery/src/index.d.ts.map +1 -1
  219. package/dist/discovery/src/source-config.d.ts +53 -12
  220. package/dist/discovery/src/source-config.d.ts.map +1 -1
  221. package/dist/discovery/src/tree-entries.d.ts +2 -2
  222. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  223. package/dist/{ensure-sources-7MOOKY3K.js → ensure-sources-KQQEUDKM.js} +15 -13
  224. package/dist/ensure-sources-KQQEUDKM.js.map +1 -0
  225. package/dist/factory-assets/.skaile-source.yaml +6 -0
  226. package/dist/factory-assets/README.md +36 -0
  227. package/dist/factory-assets/bundles/workspaces-authoring/workspaces-authoring.bundle.yaml +9 -0
  228. package/dist/factory-assets/connectors/deploy/CONNECTOR.md +41 -0
  229. package/dist/{base-assets → factory-assets}/connectors/deploy/adapter.d.ts +2 -2
  230. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -0
  231. package/dist/factory-assets/connectors/deploy.js +22 -0
  232. package/dist/factory-assets/connectors/devserver/CONNECTOR.md +44 -0
  233. package/dist/{base-assets → factory-assets}/connectors/devserver/adapter.d.ts +2 -2
  234. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -0
  235. package/dist/factory-assets/connectors/devserver.js +22 -0
  236. package/dist/factory-assets/connectors/flow/CONNECTOR.md +47 -0
  237. package/dist/{base-assets → factory-assets}/connectors/flow/adapter.d.ts +2 -2
  238. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -0
  239. package/dist/factory-assets/connectors/flow/adapter.js +22 -0
  240. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -0
  241. package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
  242. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -0
  243. package/dist/factory-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -0
  244. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -0
  245. package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -0
  246. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -0
  247. package/dist/factory-assets/connectors/flow/engine.js +15 -0
  248. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -0
  249. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.d.ts +5 -5
  250. package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -0
  251. package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js +1 -1
  252. package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.d.ts +8 -8
  253. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -0
  254. package/dist/factory-assets/connectors/flow/run-flow.js +25 -0
  255. package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.d.ts +2 -2
  256. package/dist/factory-assets/connectors/flow/stimulus-driver.d.ts.map +1 -0
  257. package/dist/factory-assets/connectors/flow/stimulus-driver.js +4 -0
  258. package/dist/factory-assets/connectors/flow.js +22 -0
  259. package/dist/factory-assets/connectors/git/CONNECTOR.md +145 -0
  260. package/dist/{base-assets → factory-assets}/connectors/git/driver.d.ts +2 -2
  261. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -0
  262. package/dist/factory-assets/connectors/git.js +22 -0
  263. package/dist/factory-assets/connectors/gmail/CONNECTOR.md +50 -0
  264. package/dist/{base-assets → factory-assets}/connectors/gmail/adapter.d.ts +2 -2
  265. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -0
  266. package/dist/factory-assets/connectors/gmail.js +22 -0
  267. package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +150 -0
  268. package/dist/{base-assets → factory-assets}/connectors/googledrive/driver.d.ts +2 -2
  269. package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -0
  270. package/dist/factory-assets/connectors/googledrive.js +22 -0
  271. package/dist/factory-assets/connectors/local/CONNECTOR.md +40 -0
  272. package/dist/{base-assets → factory-assets}/connectors/local/driver.d.ts +2 -2
  273. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -0
  274. package/dist/factory-assets/connectors/local.js +22 -0
  275. package/dist/factory-assets/connectors/mattermost/CONNECTOR.md +65 -0
  276. package/dist/{base-assets → factory-assets}/connectors/mattermost/adapter.d.ts +2 -2
  277. package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -0
  278. package/dist/factory-assets/connectors/mattermost.js +22 -0
  279. package/dist/factory-assets/connectors/memory/CONNECTOR.md +40 -0
  280. package/dist/{base-assets → factory-assets}/connectors/memory/adapter.d.ts +2 -2
  281. package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -0
  282. package/dist/factory-assets/connectors/memory.js +22 -0
  283. package/dist/factory-assets/connectors/minio/CONNECTOR.md +68 -0
  284. package/dist/{base-assets → factory-assets}/connectors/minio/adapter.d.ts +2 -2
  285. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -0
  286. package/dist/factory-assets/connectors/minio.js +22 -0
  287. package/dist/factory-assets/connectors/postgres/CONNECTOR.md +46 -0
  288. package/dist/{base-assets → factory-assets}/connectors/postgres/adapter.d.ts +2 -2
  289. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -0
  290. package/dist/factory-assets/connectors/postgres.js +22 -0
  291. package/dist/factory-assets/connectors/s3/CONNECTOR.md +76 -0
  292. package/dist/{base-assets → factory-assets}/connectors/s3/driver.d.ts +2 -2
  293. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -0
  294. package/dist/factory-assets/connectors/s3.js +22 -0
  295. package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +181 -0
  296. package/dist/{base-assets → factory-assets}/connectors/sharepoint/driver.d.ts +2 -2
  297. package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -0
  298. package/dist/factory-assets/connectors/sharepoint.js +22 -0
  299. package/dist/factory-assets/connectors/sqlite/CONNECTOR.md +44 -0
  300. package/dist/{base-assets → factory-assets}/connectors/sqlite/adapter.d.ts +2 -2
  301. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -0
  302. package/dist/factory-assets/connectors/sqlite.js +22 -0
  303. package/dist/factory-assets/connectors/static-server/CONNECTOR.md +41 -0
  304. package/dist/{base-assets → factory-assets}/connectors/static-server/adapter.d.ts +2 -2
  305. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -0
  306. package/dist/factory-assets/connectors/static-server.js +22 -0
  307. package/dist/factory-assets/connectors/tunnel/CONNECTOR.md +40 -0
  308. package/dist/{base-assets → factory-assets}/connectors/tunnel/adapter.d.ts +2 -2
  309. package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -0
  310. package/dist/factory-assets/connectors/tunnel.js +22 -0
  311. package/dist/factory-assets/connectors/webdav/CONNECTOR.md +139 -0
  312. package/dist/{base-assets → factory-assets}/connectors/webdav/driver.d.ts +2 -2
  313. package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -0
  314. package/dist/factory-assets/connectors/webdav.js +22 -0
  315. package/dist/factory-assets/connectors/xstate/CONNECTOR.md +57 -0
  316. package/dist/{base-assets → factory-assets}/connectors/xstate/adapter.d.ts +2 -2
  317. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -0
  318. package/dist/factory-assets/connectors/xstate-store/CONNECTOR.md +48 -0
  319. package/dist/{base-assets → factory-assets}/connectors/xstate-store/adapter.d.ts +2 -2
  320. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -0
  321. package/dist/factory-assets/connectors/xstate-store.js +22 -0
  322. package/dist/factory-assets/connectors/xstate.js +22 -0
  323. package/dist/{base-assets → factory-assets}/index.d.ts +1 -1
  324. package/dist/factory-assets/index.d.ts.map +1 -0
  325. package/dist/{base-assets → factory-assets}/index.js +1 -1
  326. package/dist/factory-assets/index.js.map +1 -0
  327. package/dist/factory-assets/skaile.manifest.yaml +25 -0
  328. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +176 -0
  329. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +243 -0
  330. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +197 -0
  331. package/dist/factory-assets/skills/manifest-compliance/SKILL.md +140 -0
  332. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +239 -0
  333. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +168 -0
  334. package/dist/{flows-DYFTPCPM.js → flows-L3GHQD7F.js} +4 -4
  335. package/dist/{flows-DYFTPCPM.js.map → flows-L3GHQD7F.js.map} +1 -1
  336. package/dist/helpers-F4NZ66VD.js +4 -0
  337. package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
  338. package/dist/library/index.js +12 -10
  339. package/dist/library/install.d.ts +2 -0
  340. package/dist/library/install.js +16 -0
  341. package/dist/library/install.js.map +1 -0
  342. package/dist/library/src/install/index.d.ts +3 -0
  343. package/dist/library/src/install/index.d.ts.map +1 -0
  344. package/dist/library/src/library.d.ts +2 -0
  345. package/dist/library/src/library.d.ts.map +1 -1
  346. package/dist/library/src/local/library.d.ts +2 -0
  347. package/dist/library/src/local/library.d.ts.map +1 -1
  348. package/dist/library/src/local/local-catalog-source.d.ts +2 -1
  349. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  350. package/dist/library/src/local/sidecar-paths.d.ts +4 -4
  351. package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
  352. package/dist/library/src/local/store-paths.d.ts +4 -3
  353. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  354. package/dist/library/src/pin-resolver.d.ts.map +1 -1
  355. package/dist/library/src/preset/apply.d.ts.map +1 -1
  356. package/dist/library/src/preset/placeholders.d.ts.map +1 -1
  357. package/dist/library/src/remote/remote-catalog-source.d.ts +7 -0
  358. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  359. package/dist/library/src/remote/rest-catalog-source.d.ts +7 -0
  360. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  361. package/dist/library/src/sync/manifest-writeback.d.ts +1 -1
  362. package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
  363. package/dist/open-library-I7YTADMD.js +23 -0
  364. package/dist/{open-library-GW7DWWNZ.js.map → open-library-I7YTADMD.js.map} +1 -1
  365. package/dist/paths-CE66L3AL.js +15 -0
  366. package/dist/{paths-FKKGS6BA.js.map → paths-CE66L3AL.js.map} +1 -1
  367. package/dist/{plugin-store-R32NH7JE.js → plugin-store-GL5VKYUA.js} +10 -9
  368. package/dist/plugin-store-GL5VKYUA.js.map +1 -0
  369. package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
  370. package/dist/plugins/src/catalog-source.d.ts +13 -0
  371. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  372. package/dist/resolver/index.js +1 -1
  373. package/dist/resolver/src/parser.d.ts.map +1 -1
  374. package/dist/runner/index.js +20 -19
  375. package/dist/runner/src/capability-registry.d.ts +1 -1
  376. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  377. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  378. package/dist/runner/src/resources.d.ts +1 -1
  379. package/dist/runner/src/serve.d.ts.map +1 -1
  380. package/dist/runner/src/workspace-migration.d.ts.map +1 -1
  381. package/dist/sdk/asset-manager.js +12 -11
  382. package/dist/sdk/bridge.js +4 -4
  383. package/dist/sdk/core.js +8 -7
  384. package/dist/sdk/flow.js +12 -1
  385. package/dist/sdk/index.js +23 -22
  386. package/dist/sdk/index.js.map +1 -1
  387. package/dist/sdk/resolver.js +1 -1
  388. package/dist/sdk/runner.js +20 -19
  389. package/dist/sdk/session.js +1 -1
  390. package/dist/sdk/src/flow/index.d.ts +1 -1
  391. package/dist/sdk/src/flow/index.d.ts.map +1 -1
  392. package/dist/sdk/src/workspace.d.ts +3 -2
  393. package/dist/sdk/src/workspace.d.ts.map +1 -1
  394. package/dist/sdk/telemetry.js +1 -1
  395. package/dist/secrets/index.js +1 -1
  396. package/dist/secrets/src/providers/env.d.ts.map +1 -1
  397. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  398. package/dist/session/index.js +1 -1
  399. package/dist/session/src/mentions.d.ts.map +1 -1
  400. package/dist/{setup-SRPBQOHY.js → setup-4YMN2BDU.js} +14 -13
  401. package/dist/setup-4YMN2BDU.js.map +1 -0
  402. package/dist/skills-6HJ3WINN.js +7 -0
  403. package/dist/{skills-CRL3VJNN.js.map → skills-6HJ3WINN.js.map} +1 -1
  404. package/dist/store-client-BCP5LCAZ.js +15 -0
  405. package/dist/{store-client-INZD2RYD.js.map → store-client-BCP5LCAZ.js.map} +1 -1
  406. package/dist/telemetry/index.js +1 -1
  407. package/dist/telemetry/src/config.d.ts +0 -16
  408. package/dist/telemetry/src/config.d.ts.map +1 -1
  409. package/dist/tui/index.js +20 -19
  410. package/dist/tui/index.js.map +1 -1
  411. package/dist/types/manifests.js +1 -1
  412. package/dist/types/src/flow.d.ts +2 -2
  413. package/dist/types/src/manifests/index.d.ts +1 -1
  414. package/dist/types/src/manifests/skill.d.ts +21 -0
  415. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  416. package/dist/workspace-plugin/adapters/mcp.js +4 -4
  417. package/dist/workspace-plugin/adapters/omp.js +7 -7
  418. package/dist/workspace-plugin/index.js +1 -1
  419. package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
  420. package/package.json +194 -151
  421. package/dist/asset-feeds-77KLWCBP.js.map +0 -1
  422. package/dist/base-assets/connectors/deploy/adapter.d.ts.map +0 -1
  423. package/dist/base-assets/connectors/deploy.js +0 -21
  424. package/dist/base-assets/connectors/devserver/adapter.d.ts.map +0 -1
  425. package/dist/base-assets/connectors/devserver.js +0 -21
  426. package/dist/base-assets/connectors/flow/adapter.d.ts.map +0 -1
  427. package/dist/base-assets/connectors/flow/adapter.js +0 -21
  428. package/dist/base-assets/connectors/flow/engine/engine.d.ts.map +0 -1
  429. package/dist/base-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +0 -1
  430. package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +0 -1
  431. package/dist/base-assets/connectors/flow/engine/index.d.ts.map +0 -1
  432. package/dist/base-assets/connectors/flow/engine/loader.d.ts.map +0 -1
  433. package/dist/base-assets/connectors/flow/engine/types.d.ts.map +0 -1
  434. package/dist/base-assets/connectors/flow/engine.js +0 -4
  435. package/dist/base-assets/connectors/flow/index.d.ts.map +0 -1
  436. package/dist/base-assets/connectors/flow/prompt-fragments.d.ts.map +0 -1
  437. package/dist/base-assets/connectors/flow/run-flow.d.ts.map +0 -1
  438. package/dist/base-assets/connectors/flow/run-flow.js +0 -24
  439. package/dist/base-assets/connectors/flow/stimulus-driver.d.ts.map +0 -1
  440. package/dist/base-assets/connectors/flow/stimulus-driver.js +0 -4
  441. package/dist/base-assets/connectors/flow.js +0 -21
  442. package/dist/base-assets/connectors/git/driver.d.ts.map +0 -1
  443. package/dist/base-assets/connectors/git.js +0 -21
  444. package/dist/base-assets/connectors/gmail/adapter.d.ts.map +0 -1
  445. package/dist/base-assets/connectors/gmail.js +0 -21
  446. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +0 -1
  447. package/dist/base-assets/connectors/googledrive.js +0 -21
  448. package/dist/base-assets/connectors/local/driver.d.ts.map +0 -1
  449. package/dist/base-assets/connectors/local.js +0 -21
  450. package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +0 -1
  451. package/dist/base-assets/connectors/mattermost.js +0 -21
  452. package/dist/base-assets/connectors/memory/adapter.d.ts.map +0 -1
  453. package/dist/base-assets/connectors/memory.js +0 -21
  454. package/dist/base-assets/connectors/minio/adapter.d.ts.map +0 -1
  455. package/dist/base-assets/connectors/minio.js +0 -21
  456. package/dist/base-assets/connectors/postgres/adapter.d.ts.map +0 -1
  457. package/dist/base-assets/connectors/postgres.js +0 -21
  458. package/dist/base-assets/connectors/s3/driver.d.ts.map +0 -1
  459. package/dist/base-assets/connectors/s3.js +0 -21
  460. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +0 -1
  461. package/dist/base-assets/connectors/sharepoint.js +0 -21
  462. package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +0 -1
  463. package/dist/base-assets/connectors/sqlite.js +0 -21
  464. package/dist/base-assets/connectors/static-server/adapter.d.ts.map +0 -1
  465. package/dist/base-assets/connectors/static-server.js +0 -21
  466. package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +0 -1
  467. package/dist/base-assets/connectors/tunnel.js +0 -21
  468. package/dist/base-assets/connectors/webdav/driver.d.ts.map +0 -1
  469. package/dist/base-assets/connectors/webdav.js +0 -21
  470. package/dist/base-assets/connectors/xstate/adapter.d.ts.map +0 -1
  471. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +0 -1
  472. package/dist/base-assets/connectors/xstate-store.js +0 -21
  473. package/dist/base-assets/connectors/xstate.js +0 -21
  474. package/dist/base-assets/index.d.ts.map +0 -1
  475. package/dist/base-assets/index.js.map +0 -1
  476. package/dist/chunk-2M3XTMOL.js +0 -23
  477. package/dist/chunk-2M3XTMOL.js.map +0 -1
  478. package/dist/chunk-2XY6732A.js.map +0 -1
  479. package/dist/chunk-3QTZWPGH.js.map +0 -1
  480. package/dist/chunk-4FADEVBN.js.map +0 -1
  481. package/dist/chunk-6VTG73UY.js.map +0 -1
  482. package/dist/chunk-B4ZXBH57.js.map +0 -1
  483. package/dist/chunk-BJWUSHC4.js.map +0 -1
  484. package/dist/chunk-D3VO6WNC.js.map +0 -1
  485. package/dist/chunk-DCAWIRD6.js.map +0 -1
  486. package/dist/chunk-DQWREFRQ.js.map +0 -1
  487. package/dist/chunk-FJFHJBGS.js.map +0 -1
  488. package/dist/chunk-FVTV7M76.js.map +0 -1
  489. package/dist/chunk-GCJXPUHG.js.map +0 -1
  490. package/dist/chunk-GZWJGNNN.js.map +0 -1
  491. package/dist/chunk-ICS76R4T.js.map +0 -1
  492. package/dist/chunk-JDX54X4Y.js.map +0 -1
  493. package/dist/chunk-KLNL7QHN.js.map +0 -1
  494. package/dist/chunk-KOVLSBXK.js.map +0 -1
  495. package/dist/chunk-KT3CK26V.js.map +0 -1
  496. package/dist/chunk-M5TE6YI5.js.map +0 -1
  497. package/dist/chunk-NELZIQ2E.js.map +0 -1
  498. package/dist/chunk-QAVZOJCV.js.map +0 -1
  499. package/dist/chunk-QXC62DOF.js.map +0 -1
  500. package/dist/chunk-UD4ZLXGS.js.map +0 -1
  501. package/dist/chunk-WIAHJOMG.js.map +0 -1
  502. package/dist/chunk-WSZAFRQL.js.map +0 -1
  503. package/dist/chunk-XMP6XTMF.js.map +0 -1
  504. package/dist/chunk-XVL22AWE.js.map +0 -1
  505. package/dist/ensure-sources-7MOOKY3K.js.map +0 -1
  506. package/dist/helpers-LTN3HMD3.js +0 -4
  507. package/dist/open-library-GW7DWWNZ.js +0 -21
  508. package/dist/paths-FKKGS6BA.js +0 -4
  509. package/dist/plugin-store-R32NH7JE.js.map +0 -1
  510. package/dist/setup-SRPBQOHY.js.map +0 -1
  511. package/dist/skills-CRL3VJNN.js +0 -7
  512. package/dist/store-client-INZD2RYD.js +0 -14
  513. /package/dist/{base-assets → factory-assets}/connectors/deploy.d.ts +0 -0
  514. /package/dist/{base-assets → factory-assets}/connectors/deploy.js.map +0 -0
  515. /package/dist/{base-assets → factory-assets}/connectors/devserver.d.ts +0 -0
  516. /package/dist/{base-assets → factory-assets}/connectors/devserver.js.map +0 -0
  517. /package/dist/{base-assets → factory-assets}/connectors/flow/adapter.js.map +0 -0
  518. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/engine.d.ts +0 -0
  519. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-manifest.d.ts +0 -0
  520. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/index.d.ts +0 -0
  521. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/loader.d.ts +0 -0
  522. /package/dist/{base-assets → factory-assets}/connectors/flow/engine/types.d.ts +0 -0
  523. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.d.ts +0 -0
  524. /package/dist/{base-assets → factory-assets}/connectors/flow/engine.js.map +0 -0
  525. /package/dist/{base-assets → factory-assets}/connectors/flow/index.d.ts +0 -0
  526. /package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js.map +0 -0
  527. /package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.js.map +0 -0
  528. /package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.js.map +0 -0
  529. /package/dist/{base-assets → factory-assets}/connectors/flow.d.ts +0 -0
  530. /package/dist/{base-assets → factory-assets}/connectors/flow.js.map +0 -0
  531. /package/dist/{base-assets → factory-assets}/connectors/git.d.ts +0 -0
  532. /package/dist/{base-assets → factory-assets}/connectors/git.js.map +0 -0
  533. /package/dist/{base-assets → factory-assets}/connectors/gmail.d.ts +0 -0
  534. /package/dist/{base-assets → factory-assets}/connectors/gmail.js.map +0 -0
  535. /package/dist/{base-assets → factory-assets}/connectors/googledrive.d.ts +0 -0
  536. /package/dist/{base-assets → factory-assets}/connectors/googledrive.js.map +0 -0
  537. /package/dist/{base-assets → factory-assets}/connectors/local.d.ts +0 -0
  538. /package/dist/{base-assets → factory-assets}/connectors/local.js.map +0 -0
  539. /package/dist/{base-assets → factory-assets}/connectors/mattermost.d.ts +0 -0
  540. /package/dist/{base-assets → factory-assets}/connectors/mattermost.js.map +0 -0
  541. /package/dist/{base-assets → factory-assets}/connectors/memory.d.ts +0 -0
  542. /package/dist/{base-assets → factory-assets}/connectors/memory.js.map +0 -0
  543. /package/dist/{base-assets → factory-assets}/connectors/minio.d.ts +0 -0
  544. /package/dist/{base-assets → factory-assets}/connectors/minio.js.map +0 -0
  545. /package/dist/{base-assets → factory-assets}/connectors/postgres.d.ts +0 -0
  546. /package/dist/{base-assets → factory-assets}/connectors/postgres.js.map +0 -0
  547. /package/dist/{base-assets → factory-assets}/connectors/s3.d.ts +0 -0
  548. /package/dist/{base-assets → factory-assets}/connectors/s3.js.map +0 -0
  549. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.d.ts +0 -0
  550. /package/dist/{base-assets → factory-assets}/connectors/sharepoint.js.map +0 -0
  551. /package/dist/{base-assets → factory-assets}/connectors/sqlite.d.ts +0 -0
  552. /package/dist/{base-assets → factory-assets}/connectors/sqlite.js.map +0 -0
  553. /package/dist/{base-assets → factory-assets}/connectors/static-server.d.ts +0 -0
  554. /package/dist/{base-assets → factory-assets}/connectors/static-server.js.map +0 -0
  555. /package/dist/{base-assets → factory-assets}/connectors/tunnel.d.ts +0 -0
  556. /package/dist/{base-assets → factory-assets}/connectors/tunnel.js.map +0 -0
  557. /package/dist/{base-assets → factory-assets}/connectors/webdav.d.ts +0 -0
  558. /package/dist/{base-assets → factory-assets}/connectors/webdav.js.map +0 -0
  559. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.d.ts +0 -0
  560. /package/dist/{base-assets → factory-assets}/connectors/xstate-store.js.map +0 -0
  561. /package/dist/{base-assets → factory-assets}/connectors/xstate.d.ts +0 -0
  562. /package/dist/{base-assets → factory-assets}/connectors/xstate.js.map +0 -0
@@ -1,13 +1,14 @@
1
- import { pluginRegistry } from '../chunk-6E6PKKAD.js';
2
- import { portableSpawnSync, portableSpawn } from '../chunk-XVL22AWE.js';
3
- import '../chunk-K5GBV4SA.js';
4
- import '../chunk-KLNL7QHN.js';
5
- import '../chunk-UD4ZLXGS.js';
6
- import '../chunk-3QTZWPGH.js';
7
- import '../chunk-GL45UNVS.js';
8
- import '../chunk-WIAHJOMG.js';
1
+ import { makeDeployHandle, pluginRegistry } from '../chunk-6E6PKKAD.js';
2
+ import { portableSpawnSync, portableSpawn } from '../chunk-M4KLIEIJ.js';
3
+ import '../chunk-FWHOU3CX.js';
4
+ import '../chunk-3QQSSRYN.js';
5
+ import '../chunk-IERB3UXJ.js';
6
+ import '../chunk-2FS4FPZ7.js';
7
+ import '../chunk-IEJ5IOC3.js';
9
8
  import '../chunk-JKNWJ64A.js';
10
9
  import '../chunk-O4JH3KUE.js';
10
+ import '../chunk-K5GBV4SA.js';
11
+ import '../chunk-ZAP2BDHG.js';
11
12
  import '../chunk-24UIWON4.js';
12
13
  import '../chunk-NSBPE2FW.js';
13
14
  import * as z from 'zod';
@@ -164,37 +165,28 @@ async function isRunning(bin, containerId) {
164
165
  const [exitCode, stdout] = await Promise.all([proc.exited, readStream(proc.stdout)]);
165
166
  return exitCode === 0 && stdout.trim() === "true";
166
167
  }
167
- function buildHandle(bin, payload, config, ctx, ready) {
168
- let state = "starting";
169
- let followProc = null;
170
- return {
168
+ function startLogStream(bin, containerId) {
169
+ const buffer = new LineBuffer();
170
+ const proc = portableSpawn([bin, "logs", "--follow", containerId]);
171
+ void pumpLines(proc.stdout, buffer);
172
+ void pumpLines(proc.stderr, buffer);
173
+ return { buffer, proc };
174
+ }
175
+ function buildHandle(bin, payload, config, ctx, logStream, ready) {
176
+ return makeDeployHandle({
171
177
  wsUrl: `ws://${config.bind}:${payload.hostPort}`,
172
- get state() {
173
- return state;
174
- },
178
+ ctx,
175
179
  payload,
176
- async waitReady(timeoutMs) {
177
- try {
178
- await ready();
179
- state = "ready";
180
- } catch (err) {
181
- state = "errored";
182
- throw err;
183
- }
184
- },
180
+ initialState: "starting",
181
+ defaultReadyTimeoutMs: DEFAULT_READY_TIMEOUT_MS,
182
+ ready,
185
183
  async health() {
186
184
  const healthy = await isRunning(bin, payload.containerId);
187
185
  return healthy ? { healthy } : { healthy, detail: `container ${payload.containerId} not running` };
188
186
  },
189
187
  async *logs(opts) {
190
- const buffer = new LineBuffer();
191
- const args = ["logs"];
192
- if (opts?.follow) args.push("--follow");
193
- followProc = portableSpawn([bin, ...args, payload.containerId]);
194
- void pumpLines(followProc.stdout, buffer);
195
- void pumpLines(followProc.stderr, buffer);
188
+ const { buffer } = logStream;
196
189
  const since = opts?.sinceMs ?? 0;
197
- if (!opts?.follow) await followProc.exited;
198
190
  for (const l of buffer.since(since)) yield l;
199
191
  if (!opts?.follow) return;
200
192
  const queue = [];
@@ -215,16 +207,13 @@ function buildHandle(bin, payload, config, ctx, ready) {
215
207
  }
216
208
  } finally {
217
209
  unsub();
218
- followProc?.kill("SIGTERM");
219
210
  }
220
211
  },
221
212
  async stop() {
222
- state = "stopping";
223
- followProc?.kill("SIGTERM");
213
+ logStream.proc.kill("SIGTERM");
224
214
  portableSpawnSync([bin, "rm", "-f", payload.containerId]);
225
- state = "stopped";
226
215
  }
227
- };
216
+ });
228
217
  }
229
218
  function makeContainerDeployTarget(bin) {
230
219
  const payloadSchema = payloadSchemaFor(bin);
@@ -276,21 +265,11 @@ function makeContainerDeployTarget(bin) {
276
265
  const containerId = runRes.stdout.trim();
277
266
  log.info("container started", { runtime: bin, containerId, hostPort });
278
267
  const payload = { containerId, hostPort, runtime: bin, bind: config.bind };
279
- const ready = async () => {
280
- const buffer = new LineBuffer();
281
- const logProc = portableSpawn([bin, "logs", "--follow", containerId]);
282
- void pumpLines(logProc.stdout, buffer);
283
- void pumpLines(logProc.stderr, buffer);
284
- try {
285
- await waitForLine(buffer, pattern, {
286
- timeoutMs: DEFAULT_READY_TIMEOUT_MS,
287
- signal: ctx.signal
288
- });
289
- } finally {
290
- logProc.kill("SIGTERM");
291
- }
268
+ const logStream = startLogStream(bin, containerId);
269
+ const ready = async (timeoutMs, signal) => {
270
+ await waitForLine(logStream.buffer, pattern, { timeoutMs, signal });
292
271
  };
293
- return buildHandle(bin, payload, config, ctx, ready);
272
+ return buildHandle(bin, payload, config, ctx, logStream, ready);
294
273
  },
295
274
  async restore(payload, ctx) {
296
275
  const log = ctx.log;
@@ -298,11 +277,13 @@ function makeContainerDeployTarget(bin) {
298
277
  throw new Error(`${bin} container ${payload.containerId} is not running`);
299
278
  }
300
279
  log.info("re-attached to container", { runtime: bin, containerId: payload.containerId });
280
+ const logStream = startLogStream(bin, payload.containerId);
301
281
  return buildHandle(
302
282
  bin,
303
283
  payload,
304
284
  { bind: payload.bind},
305
285
  ctx,
286
+ logStream,
306
287
  async () => {
307
288
  }
308
289
  );
@@ -315,6 +296,7 @@ var dockerDeployTarget = makeContainerDeployTarget("docker");
315
296
 
316
297
  // deploy/src/targets/process-handle.ts
317
298
  function pidAlive(pid) {
299
+ if (pid <= 0) return false;
318
300
  try {
319
301
  process.kill(pid, 0);
320
302
  return true;
@@ -329,23 +311,14 @@ function spawnProcess(command, args, opts) {
329
311
  void pumpLines(proc.stderr, buffer);
330
312
  return { proc, buffer };
331
313
  }
332
- function buildProcessHandle(payload, ctx, ready, proc) {
333
- let state = proc ? "starting" : "ready";
334
- return {
314
+ function buildProcessHandle(payload, ctx, ready, proc, defaultReadyTimeoutMs) {
315
+ return makeDeployHandle({
335
316
  wsUrl: `ws://127.0.0.1:${payload.port}`,
336
- get state() {
337
- return state;
338
- },
317
+ ctx,
339
318
  payload,
340
- async waitReady(timeoutMs) {
341
- try {
342
- await ready();
343
- state = "ready";
344
- } catch (err) {
345
- state = "errored";
346
- throw err;
347
- }
348
- },
319
+ initialState: proc ? "starting" : "ready",
320
+ defaultReadyTimeoutMs,
321
+ ready,
349
322
  async health() {
350
323
  const healthy = pidAlive(payload.pid);
351
324
  return healthy ? { healthy } : { healthy, detail: `pid ${payload.pid} not alive` };
@@ -376,16 +349,14 @@ function buildProcessHandle(payload, ctx, ready, proc) {
376
349
  }
377
350
  },
378
351
  async stop() {
379
- state = "stopping";
380
352
  if (pidAlive(payload.pid)) {
381
353
  try {
382
354
  process.kill(payload.pid, "SIGTERM");
383
355
  } catch {
384
356
  }
385
357
  }
386
- state = "stopped";
387
358
  }
388
- };
359
+ });
389
360
  }
390
361
 
391
362
  // deploy/src/targets/local.ts
@@ -431,13 +402,13 @@ var localDeployTarget = {
431
402
  cwd,
432
403
  env: { ...process.env, ...ctx.env, ...config.env }
433
404
  });
405
+ if (!spawned.proc.pid || spawned.proc.pid <= 0) {
406
+ throw new Error("failed to spawn local process");
407
+ }
434
408
  log.info("local process spawned", { pid: spawned.proc.pid, port, command });
435
409
  const payload = { pid: spawned.proc.pid, port, cwd };
436
- const ready = () => waitForLine(spawned.buffer, pattern, {
437
- timeoutMs: DEFAULT_READY_TIMEOUT_MS2,
438
- signal: ctx.signal
439
- });
440
- return buildProcessHandle(payload, ctx, ready, spawned);
410
+ const ready = (timeoutMs, signal) => waitForLine(spawned.buffer, pattern, { timeoutMs, signal });
411
+ return buildProcessHandle(payload, ctx, ready, spawned, DEFAULT_READY_TIMEOUT_MS2);
441
412
  },
442
413
  async restore(payload, ctx) {
443
414
  const log = ctx.log;
@@ -446,7 +417,7 @@ var localDeployTarget = {
446
417
  }
447
418
  log.info("re-attached to local process", { pid: payload.pid, port: payload.port });
448
419
  return buildProcessHandle(payload, ctx, async () => {
449
- }, null);
420
+ }, null, DEFAULT_READY_TIMEOUT_MS2);
450
421
  }
451
422
  };
452
423
  var nixConfigSchema = z.object({
@@ -497,6 +468,9 @@ var nixDeployTarget = {
497
468
  cwd,
498
469
  env: { ...process.env, ...ctx.env, ...config.env }
499
470
  });
471
+ if (!spawned.proc.pid || spawned.proc.pid <= 0) {
472
+ throw new Error("failed to spawn nix shell");
473
+ }
500
474
  log.info("nix shell spawned", {
501
475
  pid: spawned.proc.pid,
502
476
  port,
@@ -504,11 +478,8 @@ var nixDeployTarget = {
504
478
  stackAttr: config.stackAttr
505
479
  });
506
480
  const payload = { pid: spawned.proc.pid, port };
507
- const ready = () => waitForLine(spawned.buffer, pattern, {
508
- timeoutMs: DEFAULT_READY_TIMEOUT_MS3,
509
- signal: ctx.signal
510
- });
511
- return buildProcessHandle(payload, ctx, ready, spawned);
481
+ const ready = (timeoutMs, signal) => waitForLine(spawned.buffer, pattern, { timeoutMs, signal });
482
+ return buildProcessHandle(payload, ctx, ready, spawned, DEFAULT_READY_TIMEOUT_MS3);
512
483
  },
513
484
  async restore(payload, ctx) {
514
485
  const log = ctx.log;
@@ -517,7 +488,7 @@ var nixDeployTarget = {
517
488
  }
518
489
  log.info("re-attached to nix shell", { pid: payload.pid, port: payload.port });
519
490
  return buildProcessHandle(payload, ctx, async () => {
520
- }, null);
491
+ }, null, DEFAULT_READY_TIMEOUT_MS3);
521
492
  }
522
493
  };
523
494
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../deploy/src/targets/port.ts","../../deploy/src/targets/stream-lines.ts","../../deploy/src/targets/container-runtime.ts","../../deploy/src/targets/docker.ts","../../deploy/src/targets/process-handle.ts","../../deploy/src/targets/local.ts","../../deploy/src/targets/nix.ts","../../deploy/src/targets/podman.ts","../../deploy/src/handle-store.ts","../../deploy/src/index.ts"],"names":["z2","DEFAULT_READY_PATTERN","DEFAULT_READY_TIMEOUT_MS","require","resolvePath","z3","z4","dirname"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Free-port allocation for deploy targets.\n *\n * `connectors/src/port-pool.ts` exists but its `PortPool` is a stateful\n * range-allocator scoped to the connectors package; deploy targets just need a\n * single OS-assigned ephemeral port, so a small inline finder is the right fit.\n */\n\nimport { createServer } from \"node:net\";\n\n/** Bind to port 0, read the OS-assigned port, release it, and return it. */\nexport function allocateFreePort(host = \"127.0.0.1\"): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const addr = server.address();\n if (addr === null || typeof addr === \"string\") {\n server.close();\n reject(new Error(\"could not determine allocated port\"));\n return;\n }\n const { port } = addr;\n server.close(() => resolve(port));\n });\n });\n}\n","/**\n * Shared line-buffering helpers for deploy targets.\n *\n * Both the local target (subprocess stdout) and the container runtimes\n * (`<bin> logs`) read text off a web `ReadableStream<Uint8Array>` and need the\n * same UTF-8 decode + newline-split logic, plus a timestamped ring buffer so\n * `DeployHandle.logs()` can replay what was already seen.\n */\n\n/** One buffered log line with the wall-clock time it was observed. */\nexport interface BufferedLine {\n ts: number;\n line: string;\n}\n\n/**\n * Bounded FIFO of decoded lines. Drives both the readiness watcher and\n * `logs()` replay; the cap keeps a long-running process from growing unbounded.\n */\nexport class LineBuffer {\n private readonly lines: BufferedLine[] = [];\n private readonly waiters = new Set<(line: BufferedLine) => void>();\n\n constructor(private readonly max = 1000) {}\n\n push(line: string): void {\n const entry: BufferedLine = { ts: Date.now(), line };\n this.lines.push(entry);\n if (this.lines.length > this.max) this.lines.shift();\n for (const w of this.waiters) w(entry);\n }\n\n /** Snapshot of buffered lines at or after `sinceMs` (epoch millis). */\n since(sinceMs = 0): BufferedLine[] {\n return this.lines.filter((l) => l.ts >= sinceMs);\n }\n\n /** Subscribe to future pushes; returns an unsubscribe fn. */\n subscribe(fn: (line: BufferedLine) => void): () => void {\n this.waiters.add(fn);\n return () => this.waiters.delete(fn);\n }\n}\n\n/**\n * Pump a byte stream into a {@link LineBuffer}, splitting on `\\n`. Resolves when\n * the stream ends. Errors (e.g. the process being killed mid-read) are\n * swallowed — a dead stream just means no more lines.\n */\nexport async function pumpLines(\n stream: ReadableStream<Uint8Array>,\n buffer: LineBuffer,\n): Promise<void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n pending += decoder.decode(value, { stream: true });\n let idx = pending.indexOf(\"\\n\");\n while (idx !== -1) {\n buffer.push(pending.slice(0, idx));\n pending = pending.slice(idx + 1);\n idx = pending.indexOf(\"\\n\");\n }\n }\n } catch {\n // Stream torn down (process killed) — nothing more to read.\n } finally {\n if (pending.length > 0) buffer.push(pending);\n reader.releaseLock();\n }\n}\n\n/**\n * Resolve once a buffered line matches `pattern`, reject on timeout or abort.\n * Checks already-buffered lines first so a fast-printing process never races\n * the subscription.\n */\nexport function waitForLine(\n buffer: LineBuffer,\n pattern: RegExp,\n opts: { timeoutMs: number; signal: AbortSignal },\n): Promise<void> {\n for (const { line } of buffer.since(0)) {\n if (pattern.test(line)) return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n unsub();\n opts.signal.removeEventListener(\"abort\", onAbort);\n fn();\n };\n const unsub = buffer.subscribe(({ line }) => {\n if (pattern.test(line)) finish(resolve);\n });\n const onAbort = () => finish(() => reject(new Error(\"aborted while waiting for ready line\")));\n const timer = setTimeout(\n () =>\n finish(() =>\n reject(new Error(`timed out after ${opts.timeoutMs}ms waiting for ready line`)),\n ),\n opts.timeoutMs,\n );\n if (opts.signal.aborted) onAbort();\n else opts.signal.addEventListener(\"abort\", onAbort);\n });\n}\n","/**\n * Shared docker/podman deploy target, parameterized by binary name.\n *\n * docker and podman expose the same CLI surface for the run/inspect/logs/rm\n * verbs this target needs, so one implementation backs both\n * (`makeContainerDeployTarget(\"docker\" | \"podman\")`). `tlsTermination: \"none\"`\n * means loopback-only: a zod refinement rejects a non-loopback `bind` until tls\n * config lands (locked decision #12).\n */\n\nimport { type PortableSubprocess, portableSpawn, portableSpawnSync } from \"@skaile/workspaces/core\";\nimport type { DeployContext, DeployHandle, DeployTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { LineBuffer, pumpLines, waitForLine } from \"./stream-lines.js\";\n\ntype ContainerBin = \"docker\" | \"podman\";\n\nconst LOOPBACK_BINDS = new Set([\"127.0.0.1\", \"localhost\", \"::1\"]);\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 60_000;\n\nconst containerConfigSchema = z\n .object({\n image: z.string(),\n port: z.number().int().positive().optional(),\n bind: z.string().default(\"127.0.0.1\"),\n mounts: z.array(z.string()).default([]),\n env: z.record(z.string(), z.string()).default({}),\n network: z.string().optional(),\n pullPolicy: z.enum([\"always\", \"if-missing\", \"never\"]).default(\"if-missing\"),\n // \"local\" only — this target runs a prebuilt image and has no in-provider builder.\n // The full buildStrategySchema (local/remote/managed) lives in plugin-registry for the provider-* packages that implement remote builds.\n buildStrategy: z.literal(\"local\").default(\"local\"),\n containerPort: z.number().int().positive().optional(),\n readyPattern: z.string().optional(),\n })\n .strict()\n .refine((c) => LOOPBACK_BINDS.has(c.bind), {\n message: \"non-loopback bind requires tls config (not yet supported); use a loopback bind\",\n path: [\"bind\"],\n });\n\ntype ContainerConfig = z.infer<typeof containerConfigSchema>;\n\nfunction payloadSchemaFor(bin: ContainerBin) {\n return z.object({\n containerId: z.string(),\n hostPort: z.number(),\n runtime: z.enum([\"docker\", \"podman\"]).refine((r) => r === bin, {\n message: `runtime mismatch: handle belongs to ${bin}`,\n }),\n // Older handles predate `bind`; default to loopback so restore stays valid.\n bind: z.string().default(\"127.0.0.1\"),\n });\n}\n\ntype ContainerPayload = {\n containerId: string;\n hostPort: number;\n runtime: ContainerBin;\n bind: string;\n};\n\nfunction pullFlag(policy: ContainerConfig[\"pullPolicy\"]): string[] {\n // `docker run --pull` takes always|missing|never; map our \"if-missing\".\n const mapped = policy === \"if-missing\" ? \"missing\" : policy;\n return [\"--pull\", mapped];\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let out = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) out += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n return out + decoder.decode();\n}\n\n/**\n * True when `<bin> inspect` reports the container in a running state.\n *\n * Async (over `portableSpawn` + `await exited`) so the inspect round-trip stays\n * off the event loop — `health()` / `restore()` poll this without freezing log\n * pumps or other connections.\n */\nasync function isRunning(bin: ContainerBin, containerId: string): Promise<boolean> {\n const proc = portableSpawn([bin, \"inspect\", \"-f\", \"{{.State.Running}}\", containerId]);\n const [exitCode, stdout] = await Promise.all([proc.exited, readStream(proc.stdout)]);\n return exitCode === 0 && stdout.trim() === \"true\";\n}\n\n// @TODO(buildHandle dup): same DeployHandle wrapper as the other 4 deploy\n// targets — see the makeDeployHandle factory note in provider-fly/target.ts.\nfunction buildHandle(\n bin: ContainerBin,\n payload: ContainerPayload,\n config: Pick<ContainerConfig, \"bind\" | \"readyPattern\">,\n ctx: DeployContext,\n ready: () => Promise<void>,\n): DeployHandle<ContainerPayload> {\n let state: DeployHandle[\"state\"] = \"starting\";\n let followProc: PortableSubprocess | null = null;\n return {\n wsUrl: `ws://${config.bind}:${payload.hostPort}`,\n get state() {\n return state;\n },\n payload,\n async waitReady(timeoutMs?: number) {\n try {\n await ready();\n state = \"ready\";\n } catch (err) {\n state = \"errored\";\n throw err;\n }\n void timeoutMs;\n },\n async health() {\n const healthy = await isRunning(bin, payload.containerId);\n return healthy\n ? { healthy }\n : { healthy, detail: `container ${payload.containerId} not running` };\n },\n async *logs(opts) {\n const buffer = new LineBuffer();\n const args = [\"logs\"];\n if (opts?.follow) args.push(\"--follow\");\n followProc = portableSpawn([bin, ...args, payload.containerId]);\n void pumpLines(followProc.stdout, buffer);\n void pumpLines(followProc.stderr, buffer);\n const since = opts?.sinceMs ?? 0;\n // Give the snapshot read a tick to drain non-follow output.\n if (!opts?.follow) await followProc.exited;\n for (const l of buffer.since(since)) yield l;\n if (!opts?.follow) return;\n const queue: { ts: number; line: string }[] = [];\n let notify: (() => void) | null = null;\n const unsub = buffer.subscribe((l) => {\n queue.push(l);\n notify?.();\n });\n try {\n while (!ctx.signal.aborted) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n notify = r;\n });\n notify = null;\n }\n while (queue.length > 0) yield queue.shift() as { ts: number; line: string };\n }\n } finally {\n unsub();\n followProc?.kill(\"SIGTERM\");\n }\n },\n async stop() {\n state = \"stopping\";\n followProc?.kill(\"SIGTERM\");\n // `rm -f` removes a running or stopped container and is a no-op (nonzero\n // exit, ignored) when the container is already gone — idempotent.\n portableSpawnSync([bin, \"rm\", \"-f\", payload.containerId]);\n state = \"stopped\";\n },\n };\n}\n\n/** Build a docker/podman deploy target backed by `bin`. */\nexport function makeContainerDeployTarget(\n bin: ContainerBin,\n): DeployTarget<ContainerConfig, ContainerPayload> {\n const payloadSchema = payloadSchemaFor(bin) as unknown as z.ZodType<ContainerPayload>;\n return {\n id: bin,\n displayName: bin === \"docker\" ? \"Docker container\" : \"Podman container\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: containerConfigSchema as unknown as z.ZodType<ContainerConfig>,\n payloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const hostPort = config.port ?? (await allocateFreePort(config.bind));\n const containerPort = config.containerPort ?? hostPort;\n const name = `skaile-ws-${ctx.workspaceId}`;\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n const args = [\n bin,\n \"run\",\n \"-d\",\n \"--name\",\n name,\n \"-p\",\n `${config.bind}:${hostPort}:${containerPort}`,\n ...pullFlag(config.pullPolicy),\n ];\n if (config.network) args.push(\"--network\", config.network);\n // Generic per-session injection from the host (DeployContext). `config.*`\n // is the target's own static policy and wins over the generic channel.\n for (const [k, v] of Object.entries(ctx.env)) args.push(\"-e\", `${k}=${v}`);\n for (const [k, v] of Object.entries(ctx.labels ?? {})) args.push(\"--label\", `${k}=${v}`);\n for (const m of ctx.mounts ?? []) {\n args.push(\"-v\", `${m.host}:${m.container}${m.ro ? \":ro\" : \"\"}`);\n }\n if (ctx.resources?.cpuNanos !== undefined) {\n args.push(\"--cpus\", String(ctx.resources.cpuNanos / 1e9));\n }\n if (ctx.resources?.memoryBytes !== undefined) {\n args.push(\"--memory\", String(ctx.resources.memoryBytes));\n }\n if (ctx.resources?.pidsLimit !== undefined) {\n args.push(\"--pids-limit\", String(ctx.resources.pidsLimit));\n }\n for (const [k, v] of Object.entries(config.env)) args.push(\"-e\", `${k}=${v}`);\n for (const m of config.mounts) args.push(\"-v\", m);\n args.push(config.image);\n\n const runRes = portableSpawnSync(args);\n if (runRes.exitCode !== 0) {\n throw new Error(`${bin} run failed: ${runRes.stderr.trim() || runRes.stdout.trim()}`);\n }\n const containerId = runRes.stdout.trim();\n log.info(\"container started\", { runtime: bin, containerId, hostPort });\n\n const payload: ContainerPayload = { containerId, hostPort, runtime: bin, bind: config.bind };\n const ready = async () => {\n // Poll logs for the ready line; fall back to a running-state check so a\n // ready image that never prints the marker still resolves.\n // @TODO(duplicate log stream): this spawns a second `<bin> logs --follow`\n // + throwaway LineBuffer just for readiness, on top of the one handle.logs()\n // spawns. Pump one shared `<bin> logs --follow` into a single LineBuffer at\n // create() time and have both waitReady and logs() read from it.\n const buffer = new LineBuffer();\n const logProc = portableSpawn([bin, \"logs\", \"--follow\", containerId]);\n void pumpLines(logProc.stdout, buffer);\n void pumpLines(logProc.stderr, buffer);\n try {\n await waitForLine(buffer, pattern, {\n timeoutMs: DEFAULT_READY_TIMEOUT_MS,\n signal: ctx.signal,\n });\n } finally {\n logProc.kill(\"SIGTERM\");\n }\n };\n return buildHandle(bin, payload, config, ctx, ready);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!(await isRunning(bin, payload.containerId))) {\n throw new Error(`${bin} container ${payload.containerId} is not running`);\n }\n log.info(\"re-attached to container\", { runtime: bin, containerId: payload.containerId });\n return buildHandle(\n bin,\n payload,\n { bind: payload.bind, readyPattern: undefined },\n ctx,\n async () => {},\n );\n },\n };\n}\n","/** `dockerDeployTarget` — the shared container runtime bound to the `docker` bin. */\n\nimport { makeContainerDeployTarget } from \"./container-runtime.js\";\n\nexport const dockerDeployTarget = makeContainerDeployTarget(\"docker\");\n","/**\n * Shared child-process `DeployHandle` plumbing for the loopback process targets\n * (`local`, `nix`). Both stand a workspace up as a host child process reached\n * over `ws://127.0.0.1:<port>`; the only differences are the command they spawn\n * and the config they accept. The handle lifecycle (ready → health via pid\n * liveness → buffered logs → SIGTERM stop) is identical, so it lives here once.\n */\n\nimport { type PortableSubprocess, portableSpawn } from \"@skaile/workspaces/core\";\nimport type { DeployContext, DeployHandle } from \"@skaile/workspaces/plugin-registry\";\nimport { LineBuffer, pumpLines } from \"./stream-lines.js\";\n\n/** Minimum payload a process target persists to re-attach on restore. */\nexport interface ProcessPayload {\n pid: number;\n port: number;\n}\n\n/** A spawned child plus the buffer its stdout/stderr are pumped into. */\nexport interface SpawnedProcess {\n proc: PortableSubprocess;\n buffer: LineBuffer;\n}\n\n/** True when a pid is alive (signal 0 probes without delivering a signal). */\nexport function pidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Spawn `command args` and pump both stdout and stderr into one LineBuffer. */\nexport function spawnProcess(\n command: string,\n args: string[],\n opts: { cwd: string; env: Record<string, string | undefined> },\n): SpawnedProcess {\n const proc = portableSpawn([command, ...args], { cwd: opts.cwd, env: opts.env });\n const buffer = new LineBuffer();\n void pumpLines(proc.stdout, buffer);\n void pumpLines(proc.stderr, buffer);\n return { proc, buffer };\n}\n\n/**\n * Build the `DeployHandle` for a process target. `proc` is `null` for a restored\n * handle (re-attached by pid — no live stream, so `logs()` yields nothing and\n * `waitReady()` is a no-op).\n */\nexport function buildProcessHandle<P extends ProcessPayload>(\n payload: P,\n ctx: DeployContext,\n ready: () => Promise<void>,\n proc: SpawnedProcess | null,\n): DeployHandle<P> {\n let state: DeployHandle[\"state\"] = proc ? \"starting\" : \"ready\";\n return {\n wsUrl: `ws://127.0.0.1:${payload.port}`,\n get state() {\n return state;\n },\n payload,\n async waitReady(timeoutMs?: number) {\n try {\n await ready();\n state = \"ready\";\n } catch (err) {\n state = \"errored\";\n throw err;\n }\n // `timeoutMs` is honoured inside `ready()` via the config-default timeout;\n // the param stays in the signature for contract parity.\n void timeoutMs;\n },\n async health() {\n const healthy = pidAlive(payload.pid);\n return healthy ? { healthy } : { healthy, detail: `pid ${payload.pid} not alive` };\n },\n async *logs(opts) {\n if (!proc) return; // a restored handle re-attaches by pid; it has no stream.\n const since = opts?.sinceMs ?? 0;\n for (const l of proc.buffer.since(since)) yield l;\n if (!opts?.follow) return;\n const queue: { ts: number; line: string }[] = [];\n let notify: (() => void) | null = null;\n const unsub = proc.buffer.subscribe((l) => {\n queue.push(l);\n notify?.();\n });\n try {\n while (!ctx.signal.aborted) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n notify = r;\n });\n notify = null;\n }\n while (queue.length > 0) yield queue.shift() as { ts: number; line: string };\n }\n } finally {\n unsub();\n }\n },\n async stop() {\n state = \"stopping\";\n if (pidAlive(payload.pid)) {\n try {\n process.kill(payload.pid, \"SIGTERM\");\n } catch {\n // Already gone between the check and the kill — idempotent.\n }\n }\n state = \"stopped\";\n },\n };\n}\n","/**\n * `localDeployTarget` — stand a workspace up as a local child process and reach\n * it over `ws://127.0.0.1:<port>`. `tlsTermination: \"none\"` (loopback only).\n *\n * The `command` / `args` / `readyPattern` config fields exist so the target is\n * testable hermetically: a test points them at a mock server instead of a real\n * `skaile serve`. Defaults resolve the `skaile` bin from this package and run\n * `skaile serve --port <port>`.\n */\n\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve as resolvePath } from \"node:path\";\nimport type { DeployTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { buildProcessHandle, pidAlive, spawnProcess } from \"./process-handle.js\";\nimport { waitForLine } from \"./stream-lines.js\";\n\nconst localConfigSchema = z\n .object({\n port: z.number().int().positive().optional(),\n env: z.record(z.string(), z.string()).optional(),\n cwd: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n // `skaile serve` emits structured logs rather than a single banner; the\n // ws:// URL line is the most stable readiness marker.\n readyPattern: z.string().optional(),\n })\n .strict()\n .default({});\n\ntype LocalConfig = z.infer<typeof localConfigSchema>;\n\nconst localPayloadSchema = z.object({\n pid: z.number(),\n port: z.number(),\n cwd: z.string(),\n});\n\ntype LocalPayload = z.infer<typeof localPayloadSchema>;\n\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/** Resolve the `skaile` bin shipped by this package, for the default command. */\nfunction resolveSkaileBin(): string {\n const require = createRequire(import.meta.url);\n const pkgPath = require.resolve(\"@skaile/workspaces/package.json\");\n const pkg = require(\"@skaile/workspaces/package.json\") as { bin?: Record<string, string> };\n const rel = pkg.bin?.skaile ?? \"dist/cli/index.js\";\n return resolvePath(dirname(pkgPath), rel);\n}\n\n/** Built-in target that runs the workspace as a local child process. */\nexport const localDeployTarget: DeployTarget<LocalConfig, LocalPayload> = {\n id: \"local\",\n displayName: \"Local process\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: localConfigSchema as unknown as z.ZodType<LocalConfig>,\n payloadSchema: localPayloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const port = config.port ?? (await allocateFreePort());\n const cwd = config.cwd ?? process.cwd();\n const command = config.command ?? resolveSkaileBin();\n const args = config.args ?? [\"serve\", \"--port\", String(port)];\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n // `ctx.env` is the host-injected per-session env; `config.env` overrides it.\n const spawned = spawnProcess(command, args, {\n cwd,\n env: { ...process.env, ...ctx.env, ...config.env },\n });\n log.info(\"local process spawned\", { pid: spawned.proc.pid, port, command });\n\n const payload: LocalPayload = { pid: spawned.proc.pid, port, cwd };\n const ready = () =>\n waitForLine(spawned.buffer, pattern, {\n timeoutMs: DEFAULT_READY_TIMEOUT_MS,\n signal: ctx.signal,\n });\n return buildProcessHandle(payload, ctx, ready, spawned);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!pidAlive(payload.pid)) {\n throw new Error(`local deploy pid ${payload.pid} is no longer alive`);\n }\n log.info(\"re-attached to local process\", { pid: payload.pid, port: payload.port });\n // Re-attached handle is already running; readiness is a no-op.\n return buildProcessHandle(payload, ctx, async () => {}, null);\n },\n};\n","/**\n * `nixDeployTarget` — stand a workspace up inside a `nix shell` and reach it over\n * `ws://127.0.0.1:<port>`. `tlsTermination: \"none\"` (loopback only).\n *\n * Generic on purpose: it resolves a flake stack attr and runs `skaile serve`\n * inside it, nothing more. Platform-specific deployment policy (store binds,\n * apparmor, fleet) stays in the host's own custom target — this built-in only\n * knows `flakeRef` + `stackAttr`. `nixBin` exists as a hermetic-test seam, the\n * same role `command` plays for the local target.\n */\n\nimport type { DeployTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { buildProcessHandle, pidAlive, spawnProcess } from \"./process-handle.js\";\nimport { waitForLine } from \"./stream-lines.js\";\n\nconst nixConfigSchema = z\n .object({\n /** Flake reference holding the stack, e.g. `/etc/skaile/flake` or `github:org/repo`. */\n flakeRef: z.string(),\n /** Attr selected out of the flake, e.g. `stacks.default`. */\n stackAttr: z.string(),\n port: z.number().int().positive().optional(),\n env: z.record(z.string(), z.string()).optional(),\n cwd: z.string().optional(),\n readyPattern: z.string().optional(),\n /** Override the `nix` binary — for hermetic tests only. */\n nixBin: z.string().optional(),\n })\n .strict();\n\ntype NixConfig = z.infer<typeof nixConfigSchema>;\n\nconst nixPayloadSchema = z.object({\n pid: z.number(),\n port: z.number(),\n});\n\ntype NixPayload = z.infer<typeof nixPayloadSchema>;\n\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 60_000;\n\n/**\n * Build the `nix shell … --command skaile serve --port <port>` argv. Pure and\n * exported so the arg contract can be unit-tested without spawning nix.\n */\nexport function buildNixArgs(\n config: Pick<NixConfig, \"flakeRef\" | \"stackAttr\">,\n port: number,\n): string[] {\n return [\n \"shell\",\n \"--offline\",\n `${config.flakeRef}#${config.stackAttr}`,\n \"--command\",\n \"skaile\",\n \"serve\",\n \"--port\",\n String(port),\n ];\n}\n\n/** Built-in target that runs the workspace inside a `nix shell`. */\nexport const nixDeployTarget: DeployTarget<NixConfig, NixPayload> = {\n id: \"nix\",\n displayName: \"Nix shell\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: nixConfigSchema as unknown as z.ZodType<NixConfig>,\n payloadSchema: nixPayloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const port = config.port ?? (await allocateFreePort());\n const cwd = config.cwd ?? process.cwd();\n const bin = config.nixBin ?? \"nix\";\n const args = buildNixArgs(config, port);\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n const spawned = spawnProcess(bin, args, {\n cwd,\n env: { ...process.env, ...ctx.env, ...config.env },\n });\n log.info(\"nix shell spawned\", {\n pid: spawned.proc.pid,\n port,\n flakeRef: config.flakeRef,\n stackAttr: config.stackAttr,\n });\n\n const payload: NixPayload = { pid: spawned.proc.pid, port };\n const ready = () =>\n waitForLine(spawned.buffer, pattern, {\n timeoutMs: DEFAULT_READY_TIMEOUT_MS,\n signal: ctx.signal,\n });\n return buildProcessHandle(payload, ctx, ready, spawned);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!pidAlive(payload.pid)) {\n throw new Error(`nix deploy pid ${payload.pid} is no longer alive`);\n }\n log.info(\"re-attached to nix shell\", { pid: payload.pid, port: payload.port });\n return buildProcessHandle(payload, ctx, async () => {}, null);\n },\n};\n","/** `podmanDeployTarget` — the shared container runtime bound to the `podman` bin. */\n\nimport { makeContainerDeployTarget } from \"./container-runtime.js\";\n\nexport const podmanDeployTarget = makeContainerDeployTarget(\"podman\");\n","/**\n * Registry-owned persistence for the detach handle at\n * `<project>/.skaile/deploy/handle.json` (locked decision #13).\n *\n * The file is a `{ targetId, payload }` envelope: `targetId` selects which\n * `DeployTarget` to look up, `payload` is that target's opaque restore slice.\n * The store never interprets `payload` — it only validates the envelope shape.\n */\n\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport * as z from \"zod\";\n\n/** Parsed detach-handle envelope. `payload` is the target's opaque restore slice. */\nexport interface StoredHandle {\n targetId: string;\n payload: unknown;\n}\n\nconst storedHandleSchema = z.object({\n targetId: z.string().min(1),\n payload: z.unknown(),\n});\n\n/** Absolute path to the detach-handle file for a project. */\nexport function handlePath(projectDir: string): string {\n return join(projectDir, \".skaile\", \"deploy\", \"handle.json\");\n}\n\n/** Write the detach handle, creating `.skaile/deploy/` if missing. */\nexport async function writeHandle(\n projectDir: string,\n targetId: string,\n payload: unknown,\n): Promise<void> {\n const path = handlePath(projectDir);\n await mkdir(dirname(path), { recursive: true });\n const envelope: StoredHandle = { targetId, payload };\n await writeFile(path, `${JSON.stringify(envelope, null, 2)}\\n`, \"utf8\");\n}\n\n/** Read + validate the detach handle. Returns null when absent or malformed. */\nexport async function readHandle(projectDir: string): Promise<StoredHandle | null> {\n let raw: string;\n try {\n raw = await readFile(handlePath(projectDir), \"utf8\");\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n const result = storedHandleSchema.safeParse(parsed);\n return result.success ? result.data : null;\n}\n\n/** Remove the detach handle. Idempotent — a missing file is not an error. */\nexport async function clearHandle(projectDir: string): Promise<void> {\n await rm(handlePath(projectDir), { force: true });\n}\n","/**\n * `@skaile/workspaces/deploy` — built-in deploy targets + the detach-handle store.\n *\n * Ships the three loopback-only built-ins (local, docker, podman),\n * `registerBuiltinDeployTargets()` to load them into a `PluginRegistry`, and the\n * `.skaile/deploy/handle.json` read/write/restore API. Cloud targets (fly,\n * vercel-sandbox, k8s) ship as separate packages that self-register.\n */\n\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport { dockerDeployTarget } from \"./targets/docker.js\";\nimport { localDeployTarget } from \"./targets/local.js\";\nimport { nixDeployTarget } from \"./targets/nix.js\";\nimport { podmanDeployTarget } from \"./targets/podman.js\";\n\nexport {\n clearHandle,\n handlePath,\n readHandle,\n type StoredHandle,\n writeHandle,\n} from \"./handle-store.js\";\nexport { makeContainerDeployTarget } from \"./targets/container-runtime.js\";\nexport { dockerDeployTarget } from \"./targets/docker.js\";\nexport { localDeployTarget } from \"./targets/local.js\";\nexport { buildNixArgs, nixDeployTarget } from \"./targets/nix.js\";\nexport { podmanDeployTarget } from \"./targets/podman.js\";\n\n/**\n * Register the built-in deploy targets into `registry` (the process-wide\n * `pluginRegistry` by default). Idempotent — an id already present is skipped,\n * so calling this from multiple CLI entrypoints is safe.\n */\nexport function registerBuiltinDeployTargets(registry: PluginRegistry = pluginRegistry): void {\n for (const t of [localDeployTarget, dockerDeployTarget, podmanDeployTarget, nixDeployTarget]) {\n if (!registry.get(\"deployTarget\", t.id)) registry.register(\"deployTarget\", t);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../deploy/src/targets/port.ts","../../deploy/src/targets/stream-lines.ts","../../deploy/src/targets/container-runtime.ts","../../deploy/src/targets/docker.ts","../../deploy/src/targets/process-handle.ts","../../deploy/src/targets/local.ts","../../deploy/src/targets/nix.ts","../../deploy/src/targets/podman.ts","../../deploy/src/handle-store.ts","../../deploy/src/index.ts"],"names":["z2","DEFAULT_READY_PATTERN","DEFAULT_READY_TIMEOUT_MS","require","resolvePath","z3","z4","dirname"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Free-port allocation for deploy targets.\n *\n * `connectors/src/port-pool.ts` exists but its `PortPool` is a stateful\n * range-allocator scoped to the connectors package; deploy targets just need a\n * single OS-assigned ephemeral port, so a small inline finder is the right fit.\n */\n\nimport { createServer } from \"node:net\";\n\n/** Bind to port 0, read the OS-assigned port, release it, and return it. */\nexport function allocateFreePort(host = \"127.0.0.1\"): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const addr = server.address();\n if (addr === null || typeof addr === \"string\") {\n server.close();\n reject(new Error(\"could not determine allocated port\"));\n return;\n }\n const { port } = addr;\n server.close(() => resolve(port));\n });\n });\n}\n","/**\n * Shared line-buffering helpers for deploy targets.\n *\n * Both the local target (subprocess stdout) and the container runtimes\n * (`<bin> logs`) read text off a web `ReadableStream<Uint8Array>` and need the\n * same UTF-8 decode + newline-split logic, plus a timestamped ring buffer so\n * `DeployHandle.logs()` can replay what was already seen.\n */\n\n/** One buffered log line with the wall-clock time it was observed. */\nexport interface BufferedLine {\n ts: number;\n line: string;\n}\n\n/**\n * Bounded FIFO of decoded lines. Drives both the readiness watcher and\n * `logs()` replay; the cap keeps a long-running process from growing unbounded.\n */\nexport class LineBuffer {\n private readonly lines: BufferedLine[] = [];\n private readonly waiters = new Set<(line: BufferedLine) => void>();\n\n constructor(private readonly max = 1000) {}\n\n push(line: string): void {\n const entry: BufferedLine = { ts: Date.now(), line };\n this.lines.push(entry);\n if (this.lines.length > this.max) this.lines.shift();\n for (const w of this.waiters) w(entry);\n }\n\n /** Snapshot of buffered lines at or after `sinceMs` (epoch millis). */\n since(sinceMs = 0): BufferedLine[] {\n return this.lines.filter((l) => l.ts >= sinceMs);\n }\n\n /** Subscribe to future pushes; returns an unsubscribe fn. */\n subscribe(fn: (line: BufferedLine) => void): () => void {\n this.waiters.add(fn);\n return () => this.waiters.delete(fn);\n }\n}\n\n/**\n * Pump a byte stream into a {@link LineBuffer}, splitting on `\\n`. Resolves when\n * the stream ends. Errors (e.g. the process being killed mid-read) are\n * swallowed — a dead stream just means no more lines.\n */\nexport async function pumpLines(\n stream: ReadableStream<Uint8Array>,\n buffer: LineBuffer,\n): Promise<void> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let pending = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n pending += decoder.decode(value, { stream: true });\n let idx = pending.indexOf(\"\\n\");\n while (idx !== -1) {\n buffer.push(pending.slice(0, idx));\n pending = pending.slice(idx + 1);\n idx = pending.indexOf(\"\\n\");\n }\n }\n } catch {\n // Stream torn down (process killed) — nothing more to read.\n } finally {\n if (pending.length > 0) buffer.push(pending);\n reader.releaseLock();\n }\n}\n\n/**\n * Resolve once a buffered line matches `pattern`, reject on timeout or abort.\n * Checks already-buffered lines first so a fast-printing process never races\n * the subscription.\n */\nexport function waitForLine(\n buffer: LineBuffer,\n pattern: RegExp,\n opts: { timeoutMs: number; signal: AbortSignal },\n): Promise<void> {\n for (const { line } of buffer.since(0)) {\n if (pattern.test(line)) return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n unsub();\n opts.signal.removeEventListener(\"abort\", onAbort);\n fn();\n };\n const unsub = buffer.subscribe(({ line }) => {\n if (pattern.test(line)) finish(resolve);\n });\n const onAbort = () => finish(() => reject(new Error(\"aborted while waiting for ready line\")));\n const timer = setTimeout(\n () =>\n finish(() =>\n reject(new Error(`timed out after ${opts.timeoutMs}ms waiting for ready line`)),\n ),\n opts.timeoutMs,\n );\n if (opts.signal.aborted) onAbort();\n else opts.signal.addEventListener(\"abort\", onAbort);\n });\n}\n","/**\n * Shared docker/podman deploy target, parameterized by binary name.\n *\n * docker and podman expose the same CLI surface for the run/inspect/logs/rm\n * verbs this target needs, so one implementation backs both\n * (`makeContainerDeployTarget(\"docker\" | \"podman\")`). `tlsTermination: \"none\"`\n * means loopback-only: a zod refinement rejects a non-loopback `bind` until tls\n * config lands (locked decision #12).\n */\n\nimport { type PortableSubprocess, portableSpawn, portableSpawnSync } from \"@skaile/workspaces/core\";\nimport {\n type DeployContext,\n type DeployHandle,\n type DeployTarget,\n makeDeployHandle,\n} from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { LineBuffer, pumpLines, waitForLine } from \"./stream-lines.js\";\n\ntype ContainerBin = \"docker\" | \"podman\";\n\nconst LOOPBACK_BINDS = new Set([\"127.0.0.1\", \"localhost\", \"::1\"]);\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 60_000;\n\nconst containerConfigSchema = z\n .object({\n image: z.string(),\n port: z.number().int().positive().optional(),\n bind: z.string().default(\"127.0.0.1\"),\n mounts: z.array(z.string()).default([]),\n env: z.record(z.string(), z.string()).default({}),\n network: z.string().optional(),\n pullPolicy: z.enum([\"always\", \"if-missing\", \"never\"]).default(\"if-missing\"),\n // \"local\" only — this target runs a prebuilt image and has no in-provider builder.\n // The full buildStrategySchema (local/remote/managed) lives in plugin-registry for the provider-* packages that implement remote builds.\n buildStrategy: z.literal(\"local\").default(\"local\"),\n containerPort: z.number().int().positive().optional(),\n readyPattern: z.string().optional(),\n })\n .strict()\n .refine((c) => LOOPBACK_BINDS.has(c.bind), {\n message: \"non-loopback bind requires tls config (not yet supported); use a loopback bind\",\n path: [\"bind\"],\n });\n\ntype ContainerConfig = z.infer<typeof containerConfigSchema>;\n\nfunction payloadSchemaFor(bin: ContainerBin) {\n return z.object({\n containerId: z.string(),\n hostPort: z.number(),\n runtime: z.enum([\"docker\", \"podman\"]).refine((r) => r === bin, {\n message: `runtime mismatch: handle belongs to ${bin}`,\n }),\n // Older handles predate `bind`; default to loopback so restore stays valid.\n bind: z.string().default(\"127.0.0.1\"),\n });\n}\n\ntype ContainerPayload = {\n containerId: string;\n hostPort: number;\n runtime: ContainerBin;\n bind: string;\n};\n\nfunction pullFlag(policy: ContainerConfig[\"pullPolicy\"]): string[] {\n // `docker run --pull` takes always|missing|never; map our \"if-missing\".\n const mapped = policy === \"if-missing\" ? \"missing\" : policy;\n return [\"--pull\", mapped];\n}\n\nasync function readStream(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let out = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) out += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n return out + decoder.decode();\n}\n\n/**\n * True when `<bin> inspect` reports the container in a running state.\n *\n * Async (over `portableSpawn` + `await exited`) so the inspect round-trip stays\n * off the event loop — `health()` / `restore()` poll this without freezing log\n * pumps or other connections.\n */\nasync function isRunning(bin: ContainerBin, containerId: string): Promise<boolean> {\n const proc = portableSpawn([bin, \"inspect\", \"-f\", \"{{.State.Running}}\", containerId]);\n const [exitCode, stdout] = await Promise.all([proc.exited, readStream(proc.stdout)]);\n return exitCode === 0 && stdout.trim() === \"true\";\n}\n\n/** The single `<bin> logs --follow` stream that backs both readiness and `logs()`. */\ninterface LogStream {\n buffer: LineBuffer;\n proc: PortableSubprocess;\n}\n\n/**\n * Spawn one shared `<bin> logs --follow` and pump it into a single\n * {@link LineBuffer}. Both `waitReady` (readiness marker) and `logs()` (replay +\n * tail) read from this one buffer, so the stream is decoded/split exactly once.\n */\nfunction startLogStream(bin: ContainerBin, containerId: string): LogStream {\n const buffer = new LineBuffer();\n const proc = portableSpawn([bin, \"logs\", \"--follow\", containerId]);\n void pumpLines(proc.stdout, buffer);\n void pumpLines(proc.stderr, buffer);\n return { buffer, proc };\n}\n\n/**\n * Build the `DeployHandle` for a container via the shared {@link makeDeployHandle}\n * factory. The factory drives the state transitions; the seams here only do the\n * container-specific work (inspect for health, follow `logs`, `rm -f` on stop).\n */\nfunction buildHandle(\n bin: ContainerBin,\n payload: ContainerPayload,\n config: Pick<ContainerConfig, \"bind\" | \"readyPattern\">,\n ctx: DeployContext,\n logStream: LogStream,\n ready: (timeoutMs: number, signal: AbortSignal) => Promise<void>,\n): DeployHandle<ContainerPayload> {\n return makeDeployHandle<ContainerPayload>({\n wsUrl: `ws://${config.bind}:${payload.hostPort}`,\n ctx,\n payload,\n initialState: \"starting\",\n defaultReadyTimeoutMs: DEFAULT_READY_TIMEOUT_MS,\n ready,\n async health() {\n const healthy = await isRunning(bin, payload.containerId);\n return healthy\n ? { healthy }\n : { healthy, detail: `container ${payload.containerId} not running` };\n },\n async *logs(opts) {\n // Read off the one shared follow stream — no second `<bin> logs` spawn.\n // `since` replays buffered history; follow then tails new pushes.\n const { buffer } = logStream;\n const since = opts?.sinceMs ?? 0;\n for (const l of buffer.since(since)) yield l;\n if (!opts?.follow) return;\n const queue: { ts: number; line: string }[] = [];\n let notify: (() => void) | null = null;\n const unsub = buffer.subscribe((l) => {\n queue.push(l);\n notify?.();\n });\n try {\n while (!ctx.signal.aborted) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n notify = r;\n });\n notify = null;\n }\n while (queue.length > 0) yield queue.shift() as { ts: number; line: string };\n }\n } finally {\n // Detach this consumer only; the shared stream lives until stop().\n unsub();\n }\n },\n async stop() {\n logStream.proc.kill(\"SIGTERM\");\n // `rm -f` removes a running or stopped container and is a no-op (nonzero\n // exit, ignored) when the container is already gone — idempotent.\n portableSpawnSync([bin, \"rm\", \"-f\", payload.containerId]);\n },\n });\n}\n\n/** Build a docker/podman deploy target backed by `bin`. */\nexport function makeContainerDeployTarget(\n bin: ContainerBin,\n): DeployTarget<ContainerConfig, ContainerPayload> {\n const payloadSchema = payloadSchemaFor(bin) as unknown as z.ZodType<ContainerPayload>;\n return {\n id: bin,\n displayName: bin === \"docker\" ? \"Docker container\" : \"Podman container\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: containerConfigSchema as unknown as z.ZodType<ContainerConfig>,\n payloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const hostPort = config.port ?? (await allocateFreePort(config.bind));\n const containerPort = config.containerPort ?? hostPort;\n const name = `skaile-ws-${ctx.workspaceId}`;\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n const args = [\n bin,\n \"run\",\n \"-d\",\n \"--name\",\n name,\n \"-p\",\n `${config.bind}:${hostPort}:${containerPort}`,\n ...pullFlag(config.pullPolicy),\n ];\n if (config.network) args.push(\"--network\", config.network);\n // Generic per-session injection from the host (DeployContext). `config.*`\n // is the target's own static policy and wins over the generic channel.\n for (const [k, v] of Object.entries(ctx.env)) args.push(\"-e\", `${k}=${v}`);\n for (const [k, v] of Object.entries(ctx.labels ?? {})) args.push(\"--label\", `${k}=${v}`);\n for (const m of ctx.mounts ?? []) {\n args.push(\"-v\", `${m.host}:${m.container}${m.ro ? \":ro\" : \"\"}`);\n }\n if (ctx.resources?.cpuNanos !== undefined) {\n args.push(\"--cpus\", String(ctx.resources.cpuNanos / 1e9));\n }\n if (ctx.resources?.memoryBytes !== undefined) {\n args.push(\"--memory\", String(ctx.resources.memoryBytes));\n }\n if (ctx.resources?.pidsLimit !== undefined) {\n args.push(\"--pids-limit\", String(ctx.resources.pidsLimit));\n }\n for (const [k, v] of Object.entries(config.env)) args.push(\"-e\", `${k}=${v}`);\n for (const m of config.mounts) args.push(\"-v\", m);\n args.push(config.image);\n\n const runRes = portableSpawnSync(args);\n if (runRes.exitCode !== 0) {\n throw new Error(`${bin} run failed: ${runRes.stderr.trim() || runRes.stdout.trim()}`);\n }\n const containerId = runRes.stdout.trim();\n log.info(\"container started\", { runtime: bin, containerId, hostPort });\n\n const payload: ContainerPayload = { containerId, hostPort, runtime: bin, bind: config.bind };\n // One shared follow stream feeds both readiness and logs() (see startLogStream).\n const logStream = startLogStream(bin, containerId);\n const ready = async (timeoutMs: number, signal: AbortSignal) => {\n await waitForLine(logStream.buffer, pattern, { timeoutMs, signal });\n };\n return buildHandle(bin, payload, config, ctx, logStream, ready);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!(await isRunning(bin, payload.containerId))) {\n throw new Error(`${bin} container ${payload.containerId} is not running`);\n }\n log.info(\"re-attached to container\", { runtime: bin, containerId: payload.containerId });\n const logStream = startLogStream(bin, payload.containerId);\n return buildHandle(\n bin,\n payload,\n { bind: payload.bind, readyPattern: undefined },\n ctx,\n logStream,\n async () => {},\n );\n },\n };\n}\n","/** `dockerDeployTarget` — the shared container runtime bound to the `docker` bin. */\n\nimport { makeContainerDeployTarget } from \"./container-runtime.js\";\n\nexport const dockerDeployTarget = makeContainerDeployTarget(\"docker\");\n","/**\n * Shared child-process `DeployHandle` plumbing for the loopback process targets\n * (`local`, `nix`). Both stand a workspace up as a host child process reached\n * over `ws://127.0.0.1:<port>`; the only differences are the command they spawn\n * and the config they accept. The handle lifecycle (ready → health via pid\n * liveness → buffered logs → SIGTERM stop) is identical, so it lives here once.\n */\n\nimport { type PortableSubprocess, portableSpawn } from \"@skaile/workspaces/core\";\nimport {\n type DeployContext,\n type DeployHandle,\n makeDeployHandle,\n} from \"@skaile/workspaces/plugin-registry\";\nimport { LineBuffer, pumpLines } from \"./stream-lines.js\";\n\n/** Minimum payload a process target persists to re-attach on restore. */\nexport interface ProcessPayload {\n pid: number;\n port: number;\n}\n\n/** A spawned child plus the buffer its stdout/stderr are pumped into. */\nexport interface SpawnedProcess {\n proc: PortableSubprocess;\n buffer: LineBuffer;\n}\n\n/** True when a pid is alive (signal 0 probes without delivering a signal). */\nexport function pidAlive(pid: number): boolean {\n // Reject pid <= 0 — kill(0/-1, …) targets process groups, never a single\n // process, so it must not count as \"alive\" (and stop() must not signal it).\n if (pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Spawn `command args` and pump both stdout and stderr into one LineBuffer. */\nexport function spawnProcess(\n command: string,\n args: string[],\n opts: { cwd: string; env: Record<string, string | undefined> },\n): SpawnedProcess {\n const proc = portableSpawn([command, ...args], { cwd: opts.cwd, env: opts.env });\n const buffer = new LineBuffer();\n void pumpLines(proc.stdout, buffer);\n void pumpLines(proc.stderr, buffer);\n return { proc, buffer };\n}\n\n/**\n * Build the `DeployHandle` for a process target via the shared\n * {@link makeDeployHandle} factory. `proc` is `null` for a restored handle\n * (re-attached by pid — no live stream, so `logs()` yields nothing and the\n * handle starts already `ready`). `defaultReadyTimeoutMs` is the timeout\n * `ready` gets when `waitReady()` is called without one.\n */\nexport function buildProcessHandle<P extends ProcessPayload>(\n payload: P,\n ctx: DeployContext,\n ready: (timeoutMs: number, signal: AbortSignal) => Promise<void>,\n proc: SpawnedProcess | null,\n defaultReadyTimeoutMs: number,\n): DeployHandle<P> {\n return makeDeployHandle<P>({\n wsUrl: `ws://127.0.0.1:${payload.port}`,\n ctx,\n payload,\n initialState: proc ? \"starting\" : \"ready\",\n defaultReadyTimeoutMs,\n ready,\n async health() {\n const healthy = pidAlive(payload.pid);\n return healthy ? { healthy } : { healthy, detail: `pid ${payload.pid} not alive` };\n },\n async *logs(opts) {\n if (!proc) return; // a restored handle re-attaches by pid; it has no stream.\n const since = opts?.sinceMs ?? 0;\n for (const l of proc.buffer.since(since)) yield l;\n if (!opts?.follow) return;\n const queue: { ts: number; line: string }[] = [];\n let notify: (() => void) | null = null;\n const unsub = proc.buffer.subscribe((l) => {\n queue.push(l);\n notify?.();\n });\n try {\n while (!ctx.signal.aborted) {\n if (queue.length === 0) {\n await new Promise<void>((r) => {\n notify = r;\n });\n notify = null;\n }\n while (queue.length > 0) yield queue.shift() as { ts: number; line: string };\n }\n } finally {\n unsub();\n }\n },\n async stop() {\n if (pidAlive(payload.pid)) {\n try {\n process.kill(payload.pid, \"SIGTERM\");\n } catch {\n // Already gone between the check and the kill — idempotent.\n }\n }\n },\n });\n}\n","/**\n * `localDeployTarget` — stand a workspace up as a local child process and reach\n * it over `ws://127.0.0.1:<port>`. `tlsTermination: \"none\"` (loopback only).\n *\n * The `command` / `args` / `readyPattern` config fields exist so the target is\n * testable hermetically: a test points them at a mock server instead of a real\n * `skaile serve`. Defaults resolve the `skaile` bin from this package and run\n * `skaile serve --port <port>`.\n */\n\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve as resolvePath } from \"node:path\";\nimport type { DeployTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { buildProcessHandle, pidAlive, spawnProcess } from \"./process-handle.js\";\nimport { waitForLine } from \"./stream-lines.js\";\n\nconst localConfigSchema = z\n .object({\n port: z.number().int().positive().optional(),\n env: z.record(z.string(), z.string()).optional(),\n cwd: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n // `skaile serve` emits structured logs rather than a single banner; the\n // ws:// URL line is the most stable readiness marker.\n readyPattern: z.string().optional(),\n })\n .strict()\n .default({});\n\ntype LocalConfig = z.infer<typeof localConfigSchema>;\n\nconst localPayloadSchema = z.object({\n pid: z.number(),\n port: z.number(),\n cwd: z.string(),\n});\n\ntype LocalPayload = z.infer<typeof localPayloadSchema>;\n\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/** Resolve the `skaile` bin shipped by this package, for the default command. */\nfunction resolveSkaileBin(): string {\n const require = createRequire(import.meta.url);\n const pkgPath = require.resolve(\"@skaile/workspaces/package.json\");\n const pkg = require(\"@skaile/workspaces/package.json\") as { bin?: Record<string, string> };\n const rel = pkg.bin?.skaile ?? \"dist/cli/index.js\";\n return resolvePath(dirname(pkgPath), rel);\n}\n\n/** Built-in target that runs the workspace as a local child process. */\nexport const localDeployTarget: DeployTarget<LocalConfig, LocalPayload> = {\n id: \"local\",\n displayName: \"Local process\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: localConfigSchema as unknown as z.ZodType<LocalConfig>,\n payloadSchema: localPayloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const port = config.port ?? (await allocateFreePort());\n const cwd = config.cwd ?? process.cwd();\n const command = config.command ?? resolveSkaileBin();\n const args = config.args ?? [\"serve\", \"--port\", String(port)];\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n // `ctx.env` is the host-injected per-session env; `config.env` overrides it.\n const spawned = spawnProcess(command, args, {\n cwd,\n env: { ...process.env, ...ctx.env, ...config.env },\n });\n // portableSpawn returns pid -1 on spawn failure; a -1 pid would later turn\n // process.kill(pid) into a kill(-1) broadcast to every process we own.\n if (!spawned.proc.pid || spawned.proc.pid <= 0) {\n throw new Error(\"failed to spawn local process\");\n }\n log.info(\"local process spawned\", { pid: spawned.proc.pid, port, command });\n\n const payload: LocalPayload = { pid: spawned.proc.pid, port, cwd };\n const ready = (timeoutMs: number, signal: AbortSignal) =>\n waitForLine(spawned.buffer, pattern, { timeoutMs, signal });\n return buildProcessHandle(payload, ctx, ready, spawned, DEFAULT_READY_TIMEOUT_MS);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!pidAlive(payload.pid)) {\n throw new Error(`local deploy pid ${payload.pid} is no longer alive`);\n }\n log.info(\"re-attached to local process\", { pid: payload.pid, port: payload.port });\n // Re-attached handle is already running; readiness is a no-op.\n return buildProcessHandle(payload, ctx, async () => {}, null, DEFAULT_READY_TIMEOUT_MS);\n },\n};\n","/**\n * `nixDeployTarget` — stand a workspace up inside a `nix shell` and reach it over\n * `ws://127.0.0.1:<port>`. `tlsTermination: \"none\"` (loopback only).\n *\n * Generic on purpose: it resolves a flake stack attr and runs `skaile serve`\n * inside it, nothing more. Platform-specific deployment policy (store binds,\n * apparmor, fleet) stays in the host's own custom target — this built-in only\n * knows `flakeRef` + `stackAttr`. `nixBin` exists as a hermetic-test seam, the\n * same role `command` plays for the local target.\n */\n\nimport type { DeployTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\nimport { allocateFreePort } from \"./port.js\";\nimport { buildProcessHandle, pidAlive, spawnProcess } from \"./process-handle.js\";\nimport { waitForLine } from \"./stream-lines.js\";\n\nconst nixConfigSchema = z\n .object({\n /** Flake reference holding the stack, e.g. `/etc/skaile/flake` or `github:org/repo`. */\n flakeRef: z.string(),\n /** Attr selected out of the flake, e.g. `stacks.default`. */\n stackAttr: z.string(),\n port: z.number().int().positive().optional(),\n env: z.record(z.string(), z.string()).optional(),\n cwd: z.string().optional(),\n readyPattern: z.string().optional(),\n /** Override the `nix` binary — for hermetic tests only. */\n nixBin: z.string().optional(),\n })\n .strict();\n\ntype NixConfig = z.infer<typeof nixConfigSchema>;\n\nconst nixPayloadSchema = z.object({\n pid: z.number(),\n port: z.number(),\n});\n\ntype NixPayload = z.infer<typeof nixPayloadSchema>;\n\nconst DEFAULT_READY_PATTERN = \"ws://\";\nconst DEFAULT_READY_TIMEOUT_MS = 60_000;\n\n/**\n * Build the `nix shell … --command skaile serve --port <port>` argv. Pure and\n * exported so the arg contract can be unit-tested without spawning nix.\n */\nexport function buildNixArgs(\n config: Pick<NixConfig, \"flakeRef\" | \"stackAttr\">,\n port: number,\n): string[] {\n return [\n \"shell\",\n \"--offline\",\n `${config.flakeRef}#${config.stackAttr}`,\n \"--command\",\n \"skaile\",\n \"serve\",\n \"--port\",\n String(port),\n ];\n}\n\n/** Built-in target that runs the workspace inside a `nix shell`. */\nexport const nixDeployTarget: DeployTarget<NixConfig, NixPayload> = {\n id: \"nix\",\n displayName: \"Nix shell\",\n apiVersion: 1,\n tlsTermination: \"none\",\n configSchema: nixConfigSchema as unknown as z.ZodType<NixConfig>,\n payloadSchema: nixPayloadSchema,\n\n async create(config, ctx) {\n const log = ctx.log;\n const port = config.port ?? (await allocateFreePort());\n const cwd = config.cwd ?? process.cwd();\n const bin = config.nixBin ?? \"nix\";\n const args = buildNixArgs(config, port);\n const pattern = new RegExp(config.readyPattern ?? DEFAULT_READY_PATTERN);\n\n const spawned = spawnProcess(bin, args, {\n cwd,\n env: { ...process.env, ...ctx.env, ...config.env },\n });\n // portableSpawn returns pid -1 on spawn failure; a -1 pid would later turn\n // process.kill(pid) into a kill(-1) broadcast to every process we own.\n if (!spawned.proc.pid || spawned.proc.pid <= 0) {\n throw new Error(\"failed to spawn nix shell\");\n }\n log.info(\"nix shell spawned\", {\n pid: spawned.proc.pid,\n port,\n flakeRef: config.flakeRef,\n stackAttr: config.stackAttr,\n });\n\n const payload: NixPayload = { pid: spawned.proc.pid, port };\n const ready = (timeoutMs: number, signal: AbortSignal) =>\n waitForLine(spawned.buffer, pattern, { timeoutMs, signal });\n return buildProcessHandle(payload, ctx, ready, spawned, DEFAULT_READY_TIMEOUT_MS);\n },\n\n async restore(payload, ctx) {\n const log = ctx.log;\n if (!pidAlive(payload.pid)) {\n throw new Error(`nix deploy pid ${payload.pid} is no longer alive`);\n }\n log.info(\"re-attached to nix shell\", { pid: payload.pid, port: payload.port });\n return buildProcessHandle(payload, ctx, async () => {}, null, DEFAULT_READY_TIMEOUT_MS);\n },\n};\n","/** `podmanDeployTarget` — the shared container runtime bound to the `podman` bin. */\n\nimport { makeContainerDeployTarget } from \"./container-runtime.js\";\n\nexport const podmanDeployTarget = makeContainerDeployTarget(\"podman\");\n","/**\n * Registry-owned persistence for the detach handle at\n * `<project>/.skaile/deploy/handle.json` (locked decision #13).\n *\n * The file is a `{ targetId, payload }` envelope: `targetId` selects which\n * `DeployTarget` to look up, `payload` is that target's opaque restore slice.\n * The store never interprets `payload` — it only validates the envelope shape.\n */\n\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport * as z from \"zod\";\n\n/** Parsed detach-handle envelope. `payload` is the target's opaque restore slice. */\nexport interface StoredHandle {\n targetId: string;\n payload: unknown;\n}\n\nconst storedHandleSchema = z.object({\n targetId: z.string().min(1),\n payload: z.unknown(),\n});\n\n/** Absolute path to the detach-handle file for a project. */\nexport function handlePath(projectDir: string): string {\n return join(projectDir, \".skaile\", \"deploy\", \"handle.json\");\n}\n\n/** Write the detach handle, creating `.skaile/deploy/` if missing. */\nexport async function writeHandle(\n projectDir: string,\n targetId: string,\n payload: unknown,\n): Promise<void> {\n const path = handlePath(projectDir);\n await mkdir(dirname(path), { recursive: true });\n const envelope: StoredHandle = { targetId, payload };\n await writeFile(path, `${JSON.stringify(envelope, null, 2)}\\n`, \"utf8\");\n}\n\n/** Read + validate the detach handle. Returns null when absent or malformed. */\nexport async function readHandle(projectDir: string): Promise<StoredHandle | null> {\n let raw: string;\n try {\n raw = await readFile(handlePath(projectDir), \"utf8\");\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n const result = storedHandleSchema.safeParse(parsed);\n return result.success ? result.data : null;\n}\n\n/** Remove the detach handle. Idempotent — a missing file is not an error. */\nexport async function clearHandle(projectDir: string): Promise<void> {\n await rm(handlePath(projectDir), { force: true });\n}\n","/**\n * `@skaile/workspaces/deploy` — built-in deploy targets + the detach-handle store.\n *\n * Ships the three loopback-only built-ins (local, docker, podman),\n * `registerBuiltinDeployTargets()` to load them into a `PluginRegistry`, and the\n * `.skaile/deploy/handle.json` read/write/restore API. Cloud targets (fly,\n * vercel-sandbox, k8s) ship as separate packages that self-register.\n */\n\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport { dockerDeployTarget } from \"./targets/docker.js\";\nimport { localDeployTarget } from \"./targets/local.js\";\nimport { nixDeployTarget } from \"./targets/nix.js\";\nimport { podmanDeployTarget } from \"./targets/podman.js\";\n\nexport {\n clearHandle,\n handlePath,\n readHandle,\n type StoredHandle,\n writeHandle,\n} from \"./handle-store.js\";\nexport { makeContainerDeployTarget } from \"./targets/container-runtime.js\";\nexport { dockerDeployTarget } from \"./targets/docker.js\";\nexport { localDeployTarget } from \"./targets/local.js\";\nexport { buildNixArgs, nixDeployTarget } from \"./targets/nix.js\";\nexport { podmanDeployTarget } from \"./targets/podman.js\";\n\n/**\n * Register the built-in deploy targets into `registry` (the process-wide\n * `pluginRegistry` by default). Idempotent — an id already present is skipped,\n * so calling this from multiple CLI entrypoints is safe.\n */\nexport function registerBuiltinDeployTargets(registry: PluginRegistry = pluginRegistry): void {\n for (const t of [localDeployTarget, dockerDeployTarget, podmanDeployTarget, nixDeployTarget]) {\n if (!registry.get(\"deployTarget\", t.id)) registry.register(\"deployTarget\", t);\n }\n}\n"]}
@@ -7,7 +7,7 @@
7
7
  * means loopback-only: a zod refinement rejects a non-loopback `bind` until tls
8
8
  * config lands (locked decision #12).
9
9
  */
10
- import type { DeployTarget } from "@skaile/workspaces/plugin-registry";
10
+ import { type DeployTarget } from "@skaile/workspaces/plugin-registry";
11
11
  import * as z from "zod";
12
12
  type ContainerBin = "docker" | "podman";
13
13
  declare const containerConfigSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"container-runtime.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/container-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAA+B,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAMxC,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;kBAmBvB,CAAC;AAEL,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAc7D,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAkHF,2DAA2D;AAC3D,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,YAAY,GAChB,YAAY,CAAC,eAAe,EAAE,gBAAgB,CAAC,CA8FjD"}
1
+ {"version":3,"file":"container-runtime.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/container-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,KAAK,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAMxC,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;kBAmBvB,CAAC;AAEL,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAc7D,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAuHF,2DAA2D;AAC3D,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,YAAY,GAChB,YAAY,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAiFjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,QAAA,MAAM,iBAAiB;;;;;;;mBAYT,CAAC;AAEf,KAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;iBAItB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAcvD,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAyCrE,CAAC"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/local.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,QAAA,MAAM,iBAAiB;;;;;;;mBAYT,CAAC;AAEf,KAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAErD,QAAA,MAAM,kBAAkB;;;;iBAItB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAcvD,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CA2CrE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nix.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/nix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,QAAA,MAAM,eAAe;;;;;;;;kBAaV,CAAC;AAEZ,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAEjD,QAAA,MAAM,gBAAgB;;;iBAGpB,CAAC;AAEH,KAAK,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAKnD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC,EACjD,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,CAWV;AAED,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CA4C/D,CAAC"}
1
+ {"version":3,"file":"nix.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/nix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAKzB,QAAA,MAAM,eAAe;;;;;;;;kBAaV,CAAC;AAEZ,KAAK,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAEjD,QAAA,MAAM,gBAAgB;;;iBAGpB,CAAC;AAEH,KAAK,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAKnD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC,EACjD,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,CAWV;AAED,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CA8C/D,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * liveness → buffered logs → SIGTERM stop) is identical, so it lives here once.
7
7
  */
8
8
  import { type PortableSubprocess } from "@skaile/workspaces/core";
9
- import type { DeployContext, DeployHandle } from "@skaile/workspaces/plugin-registry";
9
+ import { type DeployContext, type DeployHandle } from "@skaile/workspaces/plugin-registry";
10
10
  import { LineBuffer } from "./stream-lines.js";
11
11
  /** Minimum payload a process target persists to re-attach on restore. */
12
12
  export interface ProcessPayload {
@@ -26,9 +26,11 @@ export declare function spawnProcess(command: string, args: string[], opts: {
26
26
  env: Record<string, string | undefined>;
27
27
  }): SpawnedProcess;
28
28
  /**
29
- * Build the `DeployHandle` for a process target. `proc` is `null` for a restored
30
- * handle (re-attached by pid no live stream, so `logs()` yields nothing and
31
- * `waitReady()` is a no-op).
29
+ * Build the `DeployHandle` for a process target via the shared
30
+ * {@link makeDeployHandle} factory. `proc` is `null` for a restored handle
31
+ * (re-attached by pid — no live stream, so `logs()` yields nothing and the
32
+ * handle starts already `ready`). `defaultReadyTimeoutMs` is the timeout
33
+ * `ready` gets when `waitReady()` is called without one.
32
34
  */
33
- export declare function buildProcessHandle<P extends ProcessPayload>(payload: P, ctx: DeployContext, ready: () => Promise<void>, proc: SpawnedProcess | null): DeployHandle<P>;
35
+ export declare function buildProcessHandle<P extends ProcessPayload>(payload: P, ctx: DeployContext, ready: (timeoutMs: number, signal: AbortSignal) => Promise<void>, proc: SpawnedProcess | null, defaultReadyTimeoutMs: number): DeployHandle<P>;
34
36
  //# sourceMappingURL=process-handle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-handle.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/process-handle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAE1D,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO7C;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,GAC7D,cAAc,CAMhB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,cAAc,EACzD,OAAO,EAAE,CAAC,EACV,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC1B,IAAI,EAAE,cAAc,GAAG,IAAI,GAC1B,YAAY,CAAC,CAAC,CAAC,CA6DjB"}
1
+ {"version":3,"file":"process-handle.d.ts","sourceRoot":"","sources":["../../../../deploy/src/targets/process-handle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAE1D,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU7C;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,GAC7D,cAAc,CAMhB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,cAAc,EACzD,OAAO,EAAE,CAAC,EACV,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAChE,IAAI,EAAE,cAAc,GAAG,IAAI,EAC3B,qBAAqB,EAAE,MAAM,GAC5B,YAAY,CAAC,CAAC,CAAC,CA+CjB"}
@@ -1,8 +1,9 @@
1
- export { AssetKindRegistry, BUILTIN_PROVIDERS, SEMVER_RE, SourceConfigSchema, VERSION, agentProvider, buildRequiresGraph, computeDeterministicHash, computeDeterministicHashDetailed, connectorProvider, contractProvider, createDefaultRegistry, detectCycles, discoverAssetsInTree, discoverAssetsInTreeEntries, discoverFromManifest, extractRequires, isExcludedDevPath, isManifestMode, loadMergedSourceConfig, loadSourceConfig, mcpServerProvider, mergeSourceConfigs, parseSourceConfig, personaProvider, presetProvider, promptProvider, rulesetProvider, skillProvider, validateSourceConfig } from '../chunk-KT3CK26V.js';
1
+ export { AssetKindRegistry, BUILTIN_PROVIDERS, SEMVER_RE, SourceConfigSchema, VERSION, agentProvider, buildRequiresGraph, computeDeterministicHash, computeDeterministicHashDetailed, connectorProvider, contractProvider, createDefaultRegistry, decodeManifestSourceConfig, detectCycles, discoverAssetsInTree, discoverAssetsInTreeEntries, discoverFromManifest, extractRequires, isExcludedDevPath, isManifestMode, loadMergedSourceConfig, loadSourceConfig, manifestToSourceConfig, mcpServerProvider, mergeSourceConfigs, parseSourceConfig, personaProvider, presetProvider, promptProvider, readManifestSourceConfig, rulesetProvider, skillProvider, validateSourceConfig } from '../chunk-JIQLLZ65.js';
2
2
  import '../chunk-OKRUTSG7.js';
3
- import '../chunk-GL45UNVS.js';
4
- import '../chunk-WIAHJOMG.js';
5
- import '../chunk-NELZIQ2E.js';
3
+ import '../chunk-IERB3UXJ.js';
4
+ import '../chunk-2FS4FPZ7.js';
5
+ import '../chunk-IEJ5IOC3.js';
6
+ import '../chunk-QDJKE557.js';
6
7
  import '../chunk-NSBPE2FW.js';
7
8
  //# sourceMappingURL=index.js.map
8
9
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Author-shipped inventory discovery.
3
3
  *
4
- * When a `.skaile-source.yaml` declares `version: 2` and an `assets:` block,
5
- * discovery uses the inventory verbatim. No glob walk, no AI enrichment.
4
+ * When a `skaile.manifest.yaml` (adapted to a `version: 2` source config via
5
+ * `manifestToSourceConfig`) carries an `assets:` block, discovery uses the
6
+ * inventory verbatim. No glob walk, no AI enrichment.
6
7
  * Per-entry verification:
7
8
  *
8
9
  * - Each `files[]` entry exists on disk → hard error otherwise
@@ -1 +1 @@
1
- {"version":3,"file":"discover-manifest.d.ts","sourceRoot":"","sources":["../../../discovery/src/discover-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGrE,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,eAAe,CAAC;AAMtE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,cAAc,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,UAAQ,GACjB,eAAe,CA4BjB"}
1
+ {"version":3,"file":"discover-manifest.d.ts","sourceRoot":"","sources":["../../../discovery/src/discover-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGrE,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,eAAe,CAAC;AAMtE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,cAAc,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,UAAU,UAAQ,GACjB,eAAe,CA4BjB"}
@@ -41,11 +41,11 @@ export interface DiscoveredAsset {
41
41
  requires: RequiresEdge[];
42
42
  }
43
43
  export interface DiscoveryOptions {
44
- /** Optional .skaile-source.yaml config for publisher resolution. */
44
+ /** Optional source config (adapted from `skaile.manifest.yaml`) for publisher resolution. */
45
45
  sourceConfig?: SourceConfig;
46
46
  /**
47
47
  * Optional sidecar directory (e.g. `~/.skaile/sources/<slug>/`) carrying a
48
- * local overlay `.skaile-source.yaml`. When set and `sourceConfig` is
48
+ * local overlay `skaile.manifest.yaml`. When set and `sourceConfig` is
49
49
  * `undefined`, the helper loads the base in-repo config from `rootPath` and
50
50
  * merges the sidecar overlay on top. When both `sourceConfig` and
51
51
  * `sidecarPath` are set, the explicit `sourceConfig` wins (the caller is