@skaile/workspaces 5.11.0 → 5.13.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 (472) hide show
  1. package/CHANGELOG.md +193 -0
  2. package/README.md +4 -4
  3. package/dist/{asset-feeds-CXGQIDFR.js → asset-feeds-ALMTHLPV.js} +26 -23
  4. package/dist/asset-feeds-ALMTHLPV.js.map +1 -0
  5. package/dist/asset-manager/catalog-deployer.js +10 -10
  6. package/dist/asset-manager/fragments.js +1 -1
  7. package/dist/asset-manager/index.js +18 -18
  8. package/dist/asset-manager/installer.js +13 -13
  9. package/dist/asset-manager/renderers.js +11 -11
  10. package/dist/asset-manager/src/fragments.d.ts +5 -0
  11. package/dist/asset-manager/src/fragments.d.ts.map +1 -1
  12. package/dist/asset-manager/src/index.d.ts +140 -12
  13. package/dist/asset-manager/src/index.d.ts.map +1 -1
  14. package/dist/asset-manager/src/install-agent.d.ts +9 -1
  15. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  16. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  17. package/dist/asset-manager/src/renderers.d.ts +5 -0
  18. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  19. package/dist/bridge/drivers/claude-sdk.js +21 -16
  20. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  21. package/dist/bridge/drivers/codex.js +101 -29
  22. package/dist/bridge/drivers/codex.js.map +1 -1
  23. package/dist/bridge/drivers/continue.js +12 -12
  24. package/dist/bridge/drivers/echo.js +2 -2
  25. package/dist/bridge/drivers/gemini.js +7 -7
  26. package/dist/bridge/drivers/goose.js +12 -12
  27. package/dist/bridge/drivers/omp.js +135 -33
  28. package/dist/bridge/drivers/omp.js.map +1 -1
  29. package/dist/bridge/drivers/opencode.js +12 -12
  30. package/dist/bridge/drivers/qwen.js +7 -7
  31. package/dist/bridge/index.js +14 -14
  32. package/dist/bridge/src/codex/config-toml.d.ts +16 -3
  33. package/dist/bridge/src/codex/config-toml.d.ts.map +1 -1
  34. package/dist/bridge/src/codex/managed-driver.d.ts.map +1 -1
  35. package/dist/bridge/src/drivers/claude-sdk.d.ts +1 -1
  36. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  37. package/dist/bridge/src/drivers/codex.d.ts +6 -0
  38. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  39. package/dist/bridge/src/drivers/omp-models-yml.d.ts +32 -0
  40. package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
  41. package/dist/bridge/src/drivers/omp.d.ts +29 -6
  42. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  43. package/dist/bridge/src/provider-materialize/credential-env.d.ts +15 -0
  44. package/dist/bridge/src/provider-materialize/credential-env.d.ts.map +1 -1
  45. package/dist/{chunk-T42WRQ4O.js → chunk-2BIESC6S.js} +3 -3
  46. package/dist/{chunk-T42WRQ4O.js.map → chunk-2BIESC6S.js.map} +1 -1
  47. package/dist/{chunk-CPWLNZGJ.js → chunk-4DLQESIY.js} +3 -3
  48. package/dist/{chunk-CPWLNZGJ.js.map → chunk-4DLQESIY.js.map} +1 -1
  49. package/dist/{chunk-HZXUXHIV.js → chunk-4L4R5LV3.js} +89 -12
  50. package/dist/chunk-4L4R5LV3.js.map +1 -0
  51. package/dist/{chunk-CAHB6MHA.js → chunk-4NJ3QQHZ.js} +5 -5
  52. package/dist/{chunk-CAHB6MHA.js.map → chunk-4NJ3QQHZ.js.map} +1 -1
  53. package/dist/{chunk-ZCAJZ4B2.js → chunk-57SF6W6E.js} +147 -4
  54. package/dist/chunk-57SF6W6E.js.map +1 -0
  55. package/dist/{chunk-FH7W6TJ4.js → chunk-5FYOM4RF.js} +106 -25
  56. package/dist/chunk-5FYOM4RF.js.map +1 -0
  57. package/dist/{chunk-R7NHYEJF.js → chunk-5SKVCMRC.js} +15 -7
  58. package/dist/chunk-5SKVCMRC.js.map +1 -0
  59. package/dist/{chunk-CJERAGFY.js → chunk-6GICC4RJ.js} +44 -13
  60. package/dist/chunk-6GICC4RJ.js.map +1 -0
  61. package/dist/{chunk-G4FFOV3N.js → chunk-6JKIOPT3.js} +4 -4
  62. package/dist/{chunk-G4FFOV3N.js.map → chunk-6JKIOPT3.js.map} +1 -1
  63. package/dist/{chunk-T7CTHHG7.js → chunk-6NQDDCIL.js} +3 -3
  64. package/dist/{chunk-T7CTHHG7.js.map → chunk-6NQDDCIL.js.map} +1 -1
  65. package/dist/{chunk-XUSALIEI.js → chunk-7SMP4GNW.js} +6 -6
  66. package/dist/{chunk-XUSALIEI.js.map → chunk-7SMP4GNW.js.map} +1 -1
  67. package/dist/{chunk-Y3HTGHJC.js → chunk-AHCI4V5L.js} +3 -3
  68. package/dist/{chunk-Y3HTGHJC.js.map → chunk-AHCI4V5L.js.map} +1 -1
  69. package/dist/{chunk-M3B6EIJD.js → chunk-B7CZYFB2.js} +4 -4
  70. package/dist/{chunk-M3B6EIJD.js.map → chunk-B7CZYFB2.js.map} +1 -1
  71. package/dist/{chunk-PBBPZYVG.js → chunk-BF422IDP.js} +112 -46
  72. package/dist/chunk-BF422IDP.js.map +1 -0
  73. package/dist/{chunk-47U4GZ4M.js → chunk-BVJU2GKE.js} +20 -3
  74. package/dist/chunk-BVJU2GKE.js.map +1 -0
  75. package/dist/{chunk-PMECEZK3.js → chunk-D54T2F54.js} +5 -4
  76. package/dist/chunk-D54T2F54.js.map +1 -0
  77. package/dist/{chunk-2F5AWQX5.js → chunk-DKGEV6SQ.js} +192 -42
  78. package/dist/chunk-DKGEV6SQ.js.map +1 -0
  79. package/dist/{chunk-DALV4HHP.js → chunk-DKXNKFKP.js} +3 -2
  80. package/dist/{chunk-DALV4HHP.js.map → chunk-DKXNKFKP.js.map} +1 -1
  81. package/dist/chunk-FB3NREF7.js +649 -0
  82. package/dist/chunk-FB3NREF7.js.map +1 -0
  83. package/dist/{chunk-QZNJOHN6.js → chunk-FHDK3BFD.js} +3 -3
  84. package/dist/{chunk-QZNJOHN6.js.map → chunk-FHDK3BFD.js.map} +1 -1
  85. package/dist/{chunk-3SM2DL2T.js → chunk-GMDSRSGI.js} +21 -11
  86. package/dist/chunk-GMDSRSGI.js.map +1 -0
  87. package/dist/chunk-H5U7LNTJ.js +122 -0
  88. package/dist/chunk-H5U7LNTJ.js.map +1 -0
  89. package/dist/{chunk-VLTQGE2E.js → chunk-HBZD3MIW.js} +269 -81
  90. package/dist/chunk-HBZD3MIW.js.map +1 -0
  91. package/dist/{chunk-S3O3GKB7.js → chunk-HWGYJMME.js} +4 -4
  92. package/dist/{chunk-S3O3GKB7.js.map → chunk-HWGYJMME.js.map} +1 -1
  93. package/dist/{chunk-CPSIPIX7.js → chunk-IG5LZ3WU.js} +8 -6
  94. package/dist/chunk-IG5LZ3WU.js.map +1 -0
  95. package/dist/{chunk-ZPWTOUTK.js → chunk-IY5E7Y5W.js} +61 -8
  96. package/dist/chunk-IY5E7Y5W.js.map +1 -0
  97. package/dist/{chunk-6O2X3GPW.js → chunk-J4DB5G36.js} +7 -5
  98. package/dist/chunk-J4DB5G36.js.map +1 -0
  99. package/dist/{chunk-BNMZVPYA.js → chunk-J4OYIYFQ.js} +2 -2
  100. package/dist/{chunk-BNMZVPYA.js.map → chunk-J4OYIYFQ.js.map} +1 -1
  101. package/dist/{chunk-ALEYHUC5.js → chunk-L3ZGYSWY.js} +182 -41
  102. package/dist/chunk-L3ZGYSWY.js.map +1 -0
  103. package/dist/{chunk-SBSA3IQA.js → chunk-M3P4BYRK.js} +49 -14
  104. package/dist/chunk-M3P4BYRK.js.map +1 -0
  105. package/dist/{chunk-IER3KIPH.js → chunk-NDUYFYJB.js} +5 -5
  106. package/dist/{chunk-IER3KIPH.js.map → chunk-NDUYFYJB.js.map} +1 -1
  107. package/dist/{chunk-CGYEHQOX.js → chunk-NOA6EJXE.js} +11 -2
  108. package/dist/chunk-NOA6EJXE.js.map +1 -0
  109. package/dist/{chunk-J4RBUFGM.js → chunk-NVO6WECE.js} +9 -8
  110. package/dist/chunk-NVO6WECE.js.map +1 -0
  111. package/dist/{chunk-OBYKJB4U.js → chunk-O2SYFJWP.js} +79 -5
  112. package/dist/chunk-O2SYFJWP.js.map +1 -0
  113. package/dist/{chunk-5LKOAX7I.js → chunk-OQ5MKDS3.js} +21 -5
  114. package/dist/chunk-OQ5MKDS3.js.map +1 -0
  115. package/dist/{chunk-NWDSLXOX.js → chunk-PHRNUTSG.js} +118 -118
  116. package/dist/chunk-PHRNUTSG.js.map +1 -0
  117. package/dist/chunk-PN44DOGP.js +345 -0
  118. package/dist/chunk-PN44DOGP.js.map +1 -0
  119. package/dist/{chunk-COH6FQAG.js → chunk-PXDWTJ3P.js} +5 -5
  120. package/dist/{chunk-COH6FQAG.js.map → chunk-PXDWTJ3P.js.map} +1 -1
  121. package/dist/{chunk-GV4DZ6MT.js → chunk-PYTTF754.js} +22 -6
  122. package/dist/chunk-PYTTF754.js.map +1 -0
  123. package/dist/chunk-PZOO7L26.js +64 -0
  124. package/dist/chunk-PZOO7L26.js.map +1 -0
  125. package/dist/{chunk-EDYHEMJA.js → chunk-QO7CR3KB.js} +10 -5
  126. package/dist/chunk-QO7CR3KB.js.map +1 -0
  127. package/dist/{chunk-XDKH7XSA.js → chunk-R6QHJEHE.js} +5 -5
  128. package/dist/{chunk-XDKH7XSA.js.map → chunk-R6QHJEHE.js.map} +1 -1
  129. package/dist/chunk-U27JRO5L.js +13 -0
  130. package/dist/chunk-U27JRO5L.js.map +1 -0
  131. package/dist/{chunk-X77SUM4P.js → chunk-USHB5KEY.js} +3 -3
  132. package/dist/{chunk-X77SUM4P.js.map → chunk-USHB5KEY.js.map} +1 -1
  133. package/dist/{chunk-QVFAS5IO.js → chunk-V5JHD4I2.js} +3 -3
  134. package/dist/{chunk-QVFAS5IO.js.map → chunk-V5JHD4I2.js.map} +1 -1
  135. package/dist/{chunk-PQFHMQHQ.js → chunk-VLBIME5L.js} +6 -6
  136. package/dist/{chunk-PQFHMQHQ.js.map → chunk-VLBIME5L.js.map} +1 -1
  137. package/dist/{chunk-D3B36CYC.js → chunk-X3RMRJNR.js} +4 -3
  138. package/dist/chunk-X3RMRJNR.js.map +1 -0
  139. package/dist/{chunk-TCHRMVTO.js → chunk-XBYSURMK.js} +4 -4
  140. package/dist/{chunk-TCHRMVTO.js.map → chunk-XBYSURMK.js.map} +1 -1
  141. package/dist/{chunk-MZG34MBZ.js → chunk-XJYBCDY2.js} +3 -3
  142. package/dist/{chunk-MZG34MBZ.js.map → chunk-XJYBCDY2.js.map} +1 -1
  143. package/dist/{chunk-4A4OD24G.js → chunk-Y4Z7LGSH.js} +9 -9
  144. package/dist/{chunk-4A4OD24G.js.map → chunk-Y4Z7LGSH.js.map} +1 -1
  145. package/dist/{chunk-DZMNFCWB.js → chunk-Y7WKXPWS.js} +816 -143
  146. package/dist/chunk-Y7WKXPWS.js.map +1 -0
  147. package/dist/{chunk-HCEVNYSH.js → chunk-YTZFSKWL.js} +3 -3
  148. package/dist/{chunk-HCEVNYSH.js.map → chunk-YTZFSKWL.js.map} +1 -1
  149. package/dist/{chunk-WSBKB4CJ.js → chunk-ZSMMX3JD.js} +167 -25
  150. package/dist/chunk-ZSMMX3JD.js.map +1 -0
  151. package/dist/{chunk-GCHPUTA3.js → chunk-ZU24LWBI.js} +3 -3
  152. package/dist/{chunk-GCHPUTA3.js.map → chunk-ZU24LWBI.js.map} +1 -1
  153. package/dist/cli/index.js +1427 -605
  154. package/dist/cli/index.js.map +1 -1
  155. package/dist/cli/src/agent-checks.d.ts +40 -0
  156. package/dist/cli/src/agent-checks.d.ts.map +1 -0
  157. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  158. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  159. package/dist/cli/src/commands/catalog-cmd.d.ts.map +1 -1
  160. package/dist/cli/src/commands/catalog.d.ts +26 -0
  161. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  162. package/dist/cli/src/commands/config.d.ts.map +1 -1
  163. package/dist/cli/src/commands/diff.d.ts +1 -1
  164. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  165. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  166. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  167. package/dist/cli/src/commands/library-index.d.ts +10 -0
  168. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  169. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  170. package/dist/cli/src/commands/mcp-server.d.ts +1 -1
  171. package/dist/cli/src/commands/migrate-assets.d.ts +2 -1
  172. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  173. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  174. package/dist/cli/src/commands/plugin/claude-code.d.ts +1 -1
  175. package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
  176. package/dist/cli/src/commands/plugin/types.d.ts +3 -1
  177. package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
  178. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  179. package/dist/cli/src/commands/preset-apply.d.ts.map +1 -1
  180. package/dist/cli/src/commands/project.d.ts +8 -0
  181. package/dist/cli/src/commands/project.d.ts.map +1 -1
  182. package/dist/cli/src/commands/publish-core.d.ts +5 -0
  183. package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
  184. package/dist/cli/src/commands/run.d.ts +11 -1
  185. package/dist/cli/src/commands/run.d.ts.map +1 -1
  186. package/dist/cli/src/commands/serve-preflight.d.ts +23 -0
  187. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -0
  188. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  189. package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
  190. package/dist/cli/src/commands/source-manifest.d.ts +1 -0
  191. package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
  192. package/dist/cli/src/commands/source.d.ts +9 -1
  193. package/dist/cli/src/commands/source.d.ts.map +1 -1
  194. package/dist/cli/src/commands/store.d.ts.map +1 -1
  195. package/dist/cli/src/commands/tree.d.ts.map +1 -1
  196. package/dist/cli/src/commands/update.d.ts.map +1 -1
  197. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  198. package/dist/cli/src/commands/validate.d.ts +3 -2
  199. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  200. package/dist/cli/src/commands/why.d.ts.map +1 -1
  201. package/dist/cli/src/curated-manifests.d.ts +21 -0
  202. package/dist/cli/src/curated-manifests.d.ts.map +1 -0
  203. package/dist/cli/src/driver-error.d.ts +7 -0
  204. package/dist/cli/src/driver-error.d.ts.map +1 -1
  205. package/dist/cli/src/helpers.d.ts +6 -0
  206. package/dist/cli/src/helpers.d.ts.map +1 -1
  207. package/dist/cli/src/index-busy.d.ts +8 -0
  208. package/dist/cli/src/index-busy.d.ts.map +1 -0
  209. package/dist/cli/src/plugin-store/index.d.ts +1 -1
  210. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  211. package/dist/cli/src/plugin-store/paths.d.ts +7 -3
  212. package/dist/cli/src/plugin-store/paths.d.ts.map +1 -1
  213. package/dist/cli/src/plugin-store/reconcile.d.ts +24 -4
  214. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  215. package/dist/cli/src/skill-checks.d.ts +27 -3
  216. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  217. package/dist/cli/src/store-addable.d.ts +17 -0
  218. package/dist/cli/src/store-addable.d.ts.map +1 -0
  219. package/dist/connectors/config.js +6 -6
  220. package/dist/connectors/index.js +18 -18
  221. package/dist/connectors/src/config.d.ts.map +1 -1
  222. package/dist/{connectors-4QWAKPHB.js → connectors-GFKMKAXV.js} +21 -21
  223. package/dist/{connectors-4QWAKPHB.js.map → connectors-GFKMKAXV.js.map} +1 -1
  224. package/dist/core/driver-targets.js +1 -1
  225. package/dist/core/index.js +9 -9
  226. package/dist/core/logging.js +1 -1
  227. package/dist/core/manifest.js +2 -2
  228. package/dist/core/models.js +1 -1
  229. package/dist/core/publish-manifest.js +4 -2
  230. package/dist/core/ref.js +1 -1
  231. package/dist/core/runtime-assets.js +6 -6
  232. package/dist/core/src/agent-instances.d.ts +5 -0
  233. package/dist/core/src/agent-instances.d.ts.map +1 -1
  234. package/dist/core/src/driver-targets.d.ts.map +1 -1
  235. package/dist/core/src/index.d.ts +6 -5
  236. package/dist/core/src/index.d.ts.map +1 -1
  237. package/dist/core/src/lock.d.ts +15 -5
  238. package/dist/core/src/lock.d.ts.map +1 -1
  239. package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
  240. package/dist/core/src/manifest.d.ts +14 -3
  241. package/dist/core/src/manifest.d.ts.map +1 -1
  242. package/dist/core/src/models.d.ts +11 -3
  243. package/dist/core/src/models.d.ts.map +1 -1
  244. package/dist/core/src/package-manager.d.ts +19 -0
  245. package/dist/core/src/package-manager.d.ts.map +1 -0
  246. package/dist/core/src/publish-manifest.d.ts +38 -1
  247. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  248. package/dist/core/src/repo-manager.d.ts +19 -3
  249. package/dist/core/src/repo-manager.d.ts.map +1 -1
  250. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  251. package/dist/core/src/settings.d.ts +26 -6
  252. package/dist/core/src/settings.d.ts.map +1 -1
  253. package/dist/core/src/store.d.ts +4 -0
  254. package/dist/core/src/store.d.ts.map +1 -1
  255. package/dist/core/src/walker.d.ts +8 -1
  256. package/dist/core/src/walker.d.ts.map +1 -1
  257. package/dist/core/src/workspace-config.d.ts +24 -2
  258. package/dist/core/src/workspace-config.d.ts.map +1 -1
  259. package/dist/core/store.js +2 -2
  260. package/dist/core/workspace-config.js +5 -5
  261. package/dist/deploy/index.js +9 -9
  262. package/dist/discovery/index.js +5 -5
  263. package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
  264. package/dist/discovery/src/source-config.d.ts +5 -3
  265. package/dist/discovery/src/source-config.d.ts.map +1 -1
  266. package/dist/{ensure-sources-2RONZKCU.js → ensure-sources-VUKHL65L.js} +21 -21
  267. package/dist/{ensure-sources-2RONZKCU.js.map → ensure-sources-VUKHL65L.js.map} +1 -1
  268. package/dist/factory-assets/README.md +1 -1
  269. package/dist/factory-assets/connectors/box.js +18 -18
  270. package/dist/factory-assets/connectors/deploy.js +18 -18
  271. package/dist/factory-assets/connectors/devserver.js +18 -18
  272. package/dist/factory-assets/connectors/flow/adapter.js +18 -18
  273. package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
  274. package/dist/factory-assets/connectors/flow/contract.js +1 -1
  275. package/dist/factory-assets/connectors/flow/engine.js +11 -11
  276. package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
  277. package/dist/factory-assets/connectors/flow/run-flow.js +20 -20
  278. package/dist/factory-assets/connectors/flow.js +18 -18
  279. package/dist/factory-assets/connectors/git.js +18 -18
  280. package/dist/factory-assets/connectors/gmail.js +18 -18
  281. package/dist/factory-assets/connectors/googledrive.js +18 -18
  282. package/dist/factory-assets/connectors/local.js +18 -18
  283. package/dist/factory-assets/connectors/mattermost.js +18 -18
  284. package/dist/factory-assets/connectors/memory.js +18 -18
  285. package/dist/factory-assets/connectors/minio.js +18 -18
  286. package/dist/factory-assets/connectors/postgres.js +18 -18
  287. package/dist/factory-assets/connectors/s3.js +18 -18
  288. package/dist/factory-assets/connectors/sharepoint.js +18 -18
  289. package/dist/factory-assets/connectors/sqlite.js +18 -18
  290. package/dist/factory-assets/connectors/static-server.js +18 -18
  291. package/dist/factory-assets/connectors/tunnel.js +18 -18
  292. package/dist/factory-assets/connectors/webdav.js +18 -18
  293. package/dist/factory-assets/connectors/xstate-store.js +18 -18
  294. package/dist/factory-assets/connectors/xstate.js +18 -18
  295. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +10 -8
  296. package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +15 -11
  297. package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +12 -9
  298. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +2 -2
  299. package/dist/flows-A4YALSZY.js +26 -0
  300. package/dist/{flows-EQF2CH4U.js.map → flows-A4YALSZY.js.map} +1 -1
  301. package/dist/helpers-53XZW7KF.js +34 -0
  302. package/dist/{helpers-CFK6YP6R.js.map → helpers-53XZW7KF.js.map} +1 -1
  303. package/dist/library/index.js +14 -14
  304. package/dist/library/install.js +6 -4
  305. package/dist/library/src/index.d.ts +2 -2
  306. package/dist/library/src/index.d.ts.map +1 -1
  307. package/dist/library/src/install/source-fetch-github.d.ts.map +1 -1
  308. package/dist/library/src/local/db.d.ts +2 -0
  309. package/dist/library/src/local/db.d.ts.map +1 -1
  310. package/dist/library/src/local/library-manager.d.ts +5 -0
  311. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  312. package/dist/library/src/local/library.d.ts +5 -3
  313. package/dist/library/src/local/library.d.ts.map +1 -1
  314. package/dist/library/src/local/local-catalog-source.d.ts +6 -0
  315. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  316. package/dist/library/src/local/store-paths.d.ts +9 -0
  317. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  318. package/dist/library/src/manifest-writer.d.ts +1 -1
  319. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  320. package/dist/library/src/remote/index.d.ts +1 -1
  321. package/dist/library/src/remote/index.d.ts.map +1 -1
  322. package/dist/library/src/remote/remote-catalog-source.d.ts +17 -0
  323. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  324. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  325. package/dist/library/src/user-library.d.ts +2 -0
  326. package/dist/library/src/user-library.d.ts.map +1 -1
  327. package/dist/{library-publish-53UTB3MB.js → library-publish-FFIPWIRM.js} +50 -39
  328. package/dist/library-publish-FFIPWIRM.js.map +1 -0
  329. package/dist/open-library-PZAT3TJA.js +40 -0
  330. package/dist/{open-library-BOSPJVID.js.map → open-library-PZAT3TJA.js.map} +1 -1
  331. package/dist/open-registry-W46UXZ3I.js +32 -0
  332. package/dist/{open-registry-4FI7HKET.js.map → open-registry-W46UXZ3I.js.map} +1 -1
  333. package/dist/paths-KKY3NSBZ.js +22 -0
  334. package/dist/{paths-SUS4S4YT.js.map → paths-KKY3NSBZ.js.map} +1 -1
  335. package/dist/plugin-store-CK7YWRIC.js +227 -0
  336. package/dist/plugin-store-CK7YWRIC.js.map +1 -0
  337. package/dist/plugins/src/catalog-source.d.ts +6 -0
  338. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  339. package/dist/project-EZUH7PUJ.js +79 -0
  340. package/dist/{project-I55A4O2T.js.map → project-EZUH7PUJ.js.map} +1 -1
  341. package/dist/resolver/index.js +10 -10
  342. package/dist/runner/index.js +35 -35
  343. package/dist/runner/src/agent.d.ts.map +1 -1
  344. package/dist/runner/src/agents/in-process-host.d.ts.map +1 -1
  345. package/dist/runner/src/composition/index.d.ts +2 -1
  346. package/dist/runner/src/composition/index.d.ts.map +1 -1
  347. package/dist/runner/src/composition/prompt-sections.d.ts +20 -5
  348. package/dist/runner/src/composition/prompt-sections.d.ts.map +1 -1
  349. package/dist/runner/src/composition/resolve.d.ts +10 -1
  350. package/dist/runner/src/composition/resolve.d.ts.map +1 -1
  351. package/dist/runner/src/composition/verify.d.ts +29 -0
  352. package/dist/runner/src/composition/verify.d.ts.map +1 -0
  353. package/dist/runner/src/credential-notice.d.ts +14 -0
  354. package/dist/runner/src/credential-notice.d.ts.map +1 -0
  355. package/dist/runner/src/environment.d.ts.map +1 -1
  356. package/dist/runner/src/final-text.d.ts +17 -0
  357. package/dist/runner/src/final-text.d.ts.map +1 -0
  358. package/dist/runner/src/index.d.ts +2 -0
  359. package/dist/runner/src/index.d.ts.map +1 -1
  360. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  361. package/dist/runner/src/serve.d.ts +13 -0
  362. package/dist/runner/src/serve.d.ts.map +1 -1
  363. package/dist/runner/src/session-builder.d.ts.map +1 -1
  364. package/dist/runner/src/session.d.ts +2 -0
  365. package/dist/runner/src/session.d.ts.map +1 -1
  366. package/dist/runner/src/ws-auth-warning.d.ts +17 -0
  367. package/dist/runner/src/ws-auth-warning.d.ts.map +1 -0
  368. package/dist/sdk/asset-manager.js +18 -18
  369. package/dist/sdk/bridge.js +14 -14
  370. package/dist/sdk/core.js +9 -9
  371. package/dist/sdk/flow.js +11 -11
  372. package/dist/sdk/index.js +38 -36
  373. package/dist/sdk/index.js.map +1 -1
  374. package/dist/sdk/resolver.js +10 -10
  375. package/dist/sdk/runner.js +35 -35
  376. package/dist/sdk/src/local-runtime.d.ts.map +1 -1
  377. package/dist/sdk/transport/ws/client.js +1 -1
  378. package/dist/sdk/transport/ws/server.js +1 -1
  379. package/dist/sdk/transport/ws.js +2 -2
  380. package/dist/sdk/transport.js +2 -2
  381. package/dist/serve-preflight-F7MYF747.js +64 -0
  382. package/dist/serve-preflight-F7MYF747.js.map +1 -0
  383. package/dist/{setup-7DQJKHUI.js → setup-L632QIHV.js} +26 -26
  384. package/dist/{setup-7DQJKHUI.js.map → setup-L632QIHV.js.map} +1 -1
  385. package/dist/skills-OY3Y5GKA.js +26 -0
  386. package/dist/{skills-NUEN5NDX.js.map → skills-OY3Y5GKA.js.map} +1 -1
  387. package/dist/source-36FHMN5V.js +42 -0
  388. package/dist/{source-G2LV5LVD.js.map → source-36FHMN5V.js.map} +1 -1
  389. package/dist/source-fetch-github-PIO6EMMF.js +4 -0
  390. package/dist/{source-fetch-github-QN4LLTL5.js.map → source-fetch-github-PIO6EMMF.js.map} +1 -1
  391. package/dist/{source-manifest-publish-6RM7SWLZ.js → source-manifest-publish-NIXJSJ22.js} +30 -28
  392. package/dist/source-manifest-publish-NIXJSJ22.js.map +1 -0
  393. package/dist/transport/index.js +2 -2
  394. package/dist/transport/src/ws/client.d.ts +6 -0
  395. package/dist/transport/src/ws/client.d.ts.map +1 -1
  396. package/dist/transport/src/ws/server.d.ts +4 -0
  397. package/dist/transport/src/ws/server.d.ts.map +1 -1
  398. package/dist/transport/ws/client.js +1 -1
  399. package/dist/transport/ws/server.js +1 -1
  400. package/dist/transport/ws.js +2 -2
  401. package/dist/tui/index.js +77 -50
  402. package/dist/tui/index.js.map +1 -1
  403. package/dist/tui/src/repl-session.d.ts +1 -1
  404. package/dist/tui/src/repl-session.d.ts.map +1 -1
  405. package/dist/tui/src/repl.d.ts +3 -0
  406. package/dist/tui/src/repl.d.ts.map +1 -1
  407. package/dist/types/manifests.js +1 -1
  408. package/dist/types/src/lifecycle.d.ts +2 -1
  409. package/dist/types/src/lifecycle.d.ts.map +1 -1
  410. package/dist/types/src/manifests/agent-composition.d.ts +20 -0
  411. package/dist/types/src/manifests/agent-composition.d.ts.map +1 -1
  412. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  413. package/dist/types/src/manifests/cron.d.ts +15 -0
  414. package/dist/types/src/manifests/cron.d.ts.map +1 -0
  415. package/dist/types/src/manifests/index.d.ts +3 -2
  416. package/dist/types/src/manifests/index.d.ts.map +1 -1
  417. package/dist/types/src/manifests/preset.d.ts +6 -1
  418. package/dist/types/src/manifests/preset.d.ts.map +1 -1
  419. package/dist/workspace-plugin/adapters/mcp.js +25 -25
  420. package/dist/workspace-plugin/adapters/omp.js +106 -51
  421. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  422. package/dist/workspace-plugin/index.js +2 -2
  423. package/dist/workspace-plugin/src/adapters/claude-code.d.ts.map +1 -1
  424. package/dist/workspace-plugin/src/adapters/omp.d.ts +11 -2
  425. package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
  426. package/package.json +1 -1
  427. package/dist/asset-feeds-CXGQIDFR.js.map +0 -1
  428. package/dist/chunk-2F5AWQX5.js.map +0 -1
  429. package/dist/chunk-3SM2DL2T.js.map +0 -1
  430. package/dist/chunk-47U4GZ4M.js.map +0 -1
  431. package/dist/chunk-5LKOAX7I.js.map +0 -1
  432. package/dist/chunk-6O2X3GPW.js.map +0 -1
  433. package/dist/chunk-ALEYHUC5.js.map +0 -1
  434. package/dist/chunk-CGYEHQOX.js.map +0 -1
  435. package/dist/chunk-CJERAGFY.js.map +0 -1
  436. package/dist/chunk-CPSIPIX7.js.map +0 -1
  437. package/dist/chunk-D3B36CYC.js.map +0 -1
  438. package/dist/chunk-DZMNFCWB.js.map +0 -1
  439. package/dist/chunk-EDYHEMJA.js.map +0 -1
  440. package/dist/chunk-FH7W6TJ4.js.map +0 -1
  441. package/dist/chunk-GV4DZ6MT.js.map +0 -1
  442. package/dist/chunk-HZXUXHIV.js.map +0 -1
  443. package/dist/chunk-J4RBUFGM.js.map +0 -1
  444. package/dist/chunk-NWDSLXOX.js.map +0 -1
  445. package/dist/chunk-OBYKJB4U.js.map +0 -1
  446. package/dist/chunk-PBBPZYVG.js.map +0 -1
  447. package/dist/chunk-PMECEZK3.js.map +0 -1
  448. package/dist/chunk-R7FOF242.js +0 -59
  449. package/dist/chunk-R7FOF242.js.map +0 -1
  450. package/dist/chunk-R7NHYEJF.js.map +0 -1
  451. package/dist/chunk-RYYLMBA2.js +0 -392
  452. package/dist/chunk-RYYLMBA2.js.map +0 -1
  453. package/dist/chunk-SBSA3IQA.js.map +0 -1
  454. package/dist/chunk-VLTQGE2E.js.map +0 -1
  455. package/dist/chunk-WSBKB4CJ.js.map +0 -1
  456. package/dist/chunk-YOH2L76X.js +0 -505
  457. package/dist/chunk-YOH2L76X.js.map +0 -1
  458. package/dist/chunk-ZCAJZ4B2.js.map +0 -1
  459. package/dist/chunk-ZPWTOUTK.js.map +0 -1
  460. package/dist/flows-EQF2CH4U.js +0 -26
  461. package/dist/helpers-CFK6YP6R.js +0 -34
  462. package/dist/library-publish-53UTB3MB.js.map +0 -1
  463. package/dist/open-library-BOSPJVID.js +0 -40
  464. package/dist/open-registry-4FI7HKET.js +0 -32
  465. package/dist/paths-SUS4S4YT.js +0 -22
  466. package/dist/plugin-store-AGQDMING.js +0 -149
  467. package/dist/plugin-store-AGQDMING.js.map +0 -1
  468. package/dist/project-I55A4O2T.js +0 -41
  469. package/dist/skills-NUEN5NDX.js +0 -26
  470. package/dist/source-G2LV5LVD.js +0 -41
  471. package/dist/source-fetch-github-QN4LLTL5.js +0 -4
  472. package/dist/source-manifest-publish-6RM7SWLZ.js.map +0 -1
@@ -3,6 +3,7 @@ import { encodeBearerSubprotocol } from './chunk-32NA4TVC.js';
3
3
  // transport/src/ws/client.ts
4
4
  var DEFAULT_RECONNECT_MAX_ATTEMPTS = 5;
5
5
  var DEFAULT_RECONNECT_BASE_MS = 1e3;
6
+ var CLOSE_REPLACED = 4001;
6
7
  var DEFAULT_RECONNECT_MAX_MS = 3e4;
7
8
  var DEFAULT_HEARTBEAT_MS = 3e4;
8
9
  var DEFAULT_MAX_MISSED_PONGS = 2;
@@ -106,7 +107,13 @@ var WebSocketClientTransport = class {
106
107
  const failConnect = (message) => {
107
108
  if (settled) return;
108
109
  settled = true;
109
- reject(new Error(message));
110
+ if (!isInitial) {
111
+ reject(new Error(message));
112
+ return;
113
+ }
114
+ void this.explainRefusal().then((reason) => {
115
+ reject(new Error(reason ? `${message}: ${reason}` : message));
116
+ });
110
117
  };
111
118
  const timeout = setTimeout(() => {
112
119
  if (settled) return;
@@ -137,7 +144,7 @@ var WebSocketClientTransport = class {
137
144
  }
138
145
  });
139
146
  let closeHandled = false;
140
- const handleClose = (code) => {
147
+ const handleClose = (code, reason = "") => {
141
148
  if (closeHandled) return;
142
149
  closeHandled = true;
143
150
  clearTimeout(timeout);
@@ -146,6 +153,13 @@ var WebSocketClientTransport = class {
146
153
  for (const handler of this.disconnectHandlers) {
147
154
  handler();
148
155
  }
156
+ if (code === CLOSE_REPLACED && opened && !this.intentionalClose) {
157
+ const message = `This connection was replaced by another client (close code ${CLOSE_REPLACED}${reason ? `, "${reason}"` : ""}). The server serves one client at a time, so this client does not reconnect.`;
158
+ this.log(`[ws-client] ${message}`);
159
+ const event = { type: "error", message, fatal: false, category: "config" };
160
+ for (const handler of this.messageHandlers) handler(event);
161
+ return;
162
+ }
149
163
  if (!opened) {
150
164
  failConnect(`Connection to ${this.url} closed before open (code=${code})`);
151
165
  if (!isInitial && !this.intentionalClose && code !== 1e3) {
@@ -157,13 +171,73 @@ var WebSocketClientTransport = class {
157
171
  this.scheduleReconnect();
158
172
  }
159
173
  };
160
- ws.addEventListener("close", (event) => handleClose(event.code));
174
+ ws.addEventListener("close", (event) => handleClose(event.code, event.reason));
161
175
  ws.addEventListener("error", () => {
162
176
  clearTimeout(timeout);
163
177
  if (!opened) failConnect(`Connection to ${this.url} failed before open`);
164
178
  });
165
179
  });
166
180
  }
181
+ /**
182
+ * After a refused handshake, repeat the upgrade request over `node:http` and report the
183
+ * status line the server answered with. Resolves `undefined` when nothing useful is
184
+ * learned (a browser has no `node:http`; the server accepted this time).
185
+ */
186
+ async explainRefusal() {
187
+ if (typeof process === "undefined" || !process.versions?.node) return void 0;
188
+ try {
189
+ const url = new URL(this.url);
190
+ const secure = url.protocol === "wss:";
191
+ const specifier = secure ? "node:https" : "node:http";
192
+ const lib = await import(
193
+ /* @vite-ignore */
194
+ /* webpackIgnore: true */
195
+ specifier
196
+ );
197
+ return await new Promise((resolve) => {
198
+ const req = lib.request(
199
+ {
200
+ host: url.hostname,
201
+ port: url.port || (secure ? 443 : 80),
202
+ path: `${url.pathname}${url.search}`,
203
+ method: "GET",
204
+ timeout: 3e3,
205
+ headers: {
206
+ Connection: "Upgrade",
207
+ Upgrade: "websocket",
208
+ "Sec-WebSocket-Version": "13",
209
+ "Sec-WebSocket-Key": "c2thaWxlLXByb2JlLWtleQ==",
210
+ ...this.subprotocols.length > 0 ? { "Sec-WebSocket-Protocol": this.subprotocols.join(", ") } : {}
211
+ },
212
+ ...this.tls ? { ca: this.tls.ca } : {}
213
+ },
214
+ (res) => {
215
+ res.resume();
216
+ const status = `HTTP ${res.statusCode} ${res.statusMessage ?? ""}`.trim();
217
+ if (res.statusCode === 401) {
218
+ resolve(
219
+ this.subprotocols.length > 0 ? `${status} (the server did not accept the token passed as \`auth\`)` : `${status} (the server requires a token: pass \`auth\`; \`skaile serve\` reads SKAILE_WS_AUTH_TOKEN)`
220
+ );
221
+ } else {
222
+ resolve(status);
223
+ }
224
+ }
225
+ );
226
+ req.on("upgrade", (_res, socket) => {
227
+ socket.destroy();
228
+ resolve(void 0);
229
+ });
230
+ req.on("timeout", () => {
231
+ req.destroy();
232
+ resolve(void 0);
233
+ });
234
+ req.on("error", (err) => resolve(err.code));
235
+ req.end();
236
+ });
237
+ } catch {
238
+ return void 0;
239
+ }
240
+ }
167
241
  createSocket() {
168
242
  if (this.tls) {
169
243
  const { ca } = this.tls;
@@ -241,5 +315,5 @@ var WebSocketClientTransport = class {
241
315
  };
242
316
 
243
317
  export { WebSocketClientTransport };
244
- //# sourceMappingURL=chunk-OBYKJB4U.js.map
245
- //# sourceMappingURL=chunk-OBYKJB4U.js.map
318
+ //# sourceMappingURL=chunk-O2SYFJWP.js.map
319
+ //# sourceMappingURL=chunk-O2SYFJWP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../transport/src/ws/client.ts"],"names":[],"mappings":"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","file":"chunk-O2SYFJWP.js","sourcesContent":["/**\n * WebSocketClientTransport — connects to a skaile serve WebSocket server.\n *\n * Handles connection, reconnection with exponential backoff, heartbeat,\n * and JSON serialization. Implements ClientTransport from @skaile/workspaces/types.\n */\n\nimport type * as nodeHttp from \"node:http\";\nimport type { AgentCommand, AgentEvent, ClientTransport } from \"@skaile/workspaces/types\";\nimport { encodeBearerSubprotocol } from \"./auth.js\";\n\nconst DEFAULT_RECONNECT_MAX_ATTEMPTS = 5;\nconst DEFAULT_RECONNECT_BASE_MS = 1_000;\n/** Close code the server sends the older client when a newer one connects (see the server). */\nconst CLOSE_REPLACED = 4001;\nconst DEFAULT_RECONNECT_MAX_MS = 30_000;\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_MISSED_PONGS = 2;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 10_000;\n\n/**\n * Options for {@link WebSocketClientTransport}.\n *\n * @param url - WebSocket server URL to connect to (e.g. `ws://localhost:8080`).\n * @param reconnect - Exponential-backoff reconnect policy. Defaults: 5 attempts, 1s base, 30s max.\n * @param heartbeatMs - Interval in milliseconds between WebSocket ping frames. Default: 30 000.\n * @param maxMissedPongs - Heartbeat ticks a socket may go without a pong (or any\n * inbound message) before it is judged dead and terminated, so a half-open\n * connection reaches the reconnect path. Default: 2, i.e. detection within\n * 3 x `heartbeatMs`. `0` disables the deadline. Only applies where the socket\n * exposes ping and pong (Bun, and the `ws` package used for a `tls` dial under\n * Node); Node's global WebSocket and browsers expose neither.\n * @param connectTimeoutMs - Maximum time in milliseconds to wait for the initial handshake. Default: 10 000.\n * @param onLog - Optional callback for internal log lines (connection state, errors).\n * @param auth - Optional bearer token sent via the WebSocket subprotocol; must\n * match the server's `authToken` or the handshake is rejected with HTTP 401.\n * @param tls - Optional per-connection TLS settings for a `wss://` URL. `ca`\n * (PEM) replaces the default trust store for this connection only, so the\n * server certificate must chain to it. Server-side runtimes only: Bun passes\n * it to its native `WebSocket`, Node dials through the `ws` package (the\n * global WebSocket takes no CA). Unset, the dial is exactly as before.\n *\n * @docLink packages/transport/dev-guide#websocket-client-transport\n */\nexport interface WebSocketClientOptions {\n url: string;\n reconnect?: {\n maxAttempts?: number;\n baseMs?: number;\n maxMs?: number;\n };\n heartbeatMs?: number;\n maxMissedPongs?: number;\n connectTimeoutMs?: number;\n onLog?: (line: string) => void;\n auth?: string;\n tls?: {\n ca: string | string[];\n };\n}\n\n/**\n * Optional members a server-side socket may carry beyond the browser API: Bun's\n * native WebSocket has `ping`/`terminate` and a `pong` event; the `ws` package\n * has `ping`/`terminate` and reports pongs only through `on(\"pong\")`.\n */\ntype PingCapableSocket = WebSocket & {\n ping?: () => void;\n terminate?: () => void;\n on?: (event: \"pong\", listener: () => void) => void;\n};\n\n/** The `ws` package's WebSocket constructor, as far as this client uses it. */\ntype WsPackageCtor = new (\n url: string,\n protocols: string[],\n options: { ca: string | string[] },\n) => WebSocket;\n\nconst isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\n\n/**\n * Load the `ws` package only when a CA pin needs it under Node, so the client\n * subpath keeps no static `ws` import (browser bundles never reach this). The\n * variable specifier keeps bundlers from inlining it.\n */\nasync function loadWsPackage(): Promise<WsPackageCtor> {\n if (typeof process === \"undefined\") {\n throw new Error(\"WebSocketClientTransport `tls` is supported under Node and Bun only\");\n }\n const specifier = \"ws\";\n const mod = (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as {\n WebSocket?: WsPackageCtor;\n default?: WsPackageCtor;\n };\n const ctor = mod.WebSocket ?? mod.default;\n if (!ctor) throw new Error(\"the ws package exports no WebSocket constructor\");\n return ctor;\n}\n\n/**\n * `ClientTransport` implementation that connects to a skaile agent server over WebSocket.\n *\n * Uses the browser-standard `WebSocket` API so it works in both Bun and browser\n * environments. On an unintentional disconnect it automatically retries with\n * exponential backoff (default: 5 attempts, 1s base, 30s max). A periodic ping\n * keeps the connection alive through NAT and load-balancer idle timeouts. All\n * `AgentCommand` / `AgentEvent` messages are JSON-serialised on the wire.\n *\n * @example\n * ```ts\n * const transport = new WebSocketClientTransport({ url: 'ws://localhost:8080' });\n * await transport.connect();\n * transport.send({ type: 'prompt', prompt: 'Hello' });\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-client-transport\n */\nexport class WebSocketClientTransport implements ClientTransport {\n private ws: WebSocket | null = null;\n private readonly url: string;\n private readonly reconnectConfig: Required<NonNullable<WebSocketClientOptions[\"reconnect\"]>>;\n private readonly heartbeatMs: number;\n private readonly maxMissedPongs: number;\n private readonly connectTimeoutMs: number;\n private readonly log: (line: string) => void;\n private readonly subprotocols: string[];\n private readonly tls: WebSocketClientOptions[\"tls\"];\n /** Loaded on the first connect when {@link tls} is set under Node. */\n private wsPackage: WsPackageCtor | null = null;\n\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempts = 0;\n private intentionalClose = false;\n\n private readonly messageHandlers = new Set<(event: AgentEvent) => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketClientOptions) {\n this.url = options.url;\n this.reconnectConfig = {\n maxAttempts: options.reconnect?.maxAttempts ?? DEFAULT_RECONNECT_MAX_ATTEMPTS,\n baseMs: options.reconnect?.baseMs ?? DEFAULT_RECONNECT_BASE_MS,\n maxMs: options.reconnect?.maxMs ?? DEFAULT_RECONNECT_MAX_MS,\n };\n this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;\n this.connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n this.log = options.onLog ?? (() => {});\n this.subprotocols = options.auth ? [encodeBearerSubprotocol(options.auth)] : [];\n this.tls = options.tls;\n }\n\n async connect(): Promise<void> {\n this.intentionalClose = false;\n this.reconnectAttempts = 0;\n if (this.tls && !isBun && !this.wsPackage) this.wsPackage = await loadWsPackage();\n return this.doConnect(true);\n }\n\n async disconnect(): Promise<void> {\n this.intentionalClose = true;\n this.clearHeartbeat();\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, \"Client disconnect\");\n }\n this.ws = null;\n }\n }\n\n send(command: AgentCommand): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log(\"[ws-client] cannot send: not connected\");\n return;\n }\n this.ws.send(JSON.stringify(command));\n }\n\n onMessage(handler: (event: AgentEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private doConnect(isInitial = false): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.log(`[ws-client] connecting to ${this.url}`);\n\n const ws = this.createSocket();\n this.ws = ws;\n /** Pings this socket sent since its last pong or inbound message. */\n const liveness = { missed: 0 };\n\n // Settle the connect promise exactly once. A close or error that arrives\n // before `open` is a handshake/connect failure (e.g. a rejected auth\n // upgrade, code 401, or a refused port) — reject so the caller sees it\n // instead of hanging until the connect timeout.\n let settled = false;\n let opened = false;\n const failConnect = (message: string) => {\n if (settled) return;\n settled = true;\n // The WebSocket API hides why a handshake was refused (no status, no body), so ask\n // the server once more, plainly, for the status it answers the upgrade with. Only on\n // the first connect: a probe the server accepts is a real client to it (it would evict\n // the connected one and drain the replay buffer into the probe), and background\n // reconnect attempts have no caller waiting for the reason.\n if (!isInitial) {\n reject(new Error(message));\n return;\n }\n void this.explainRefusal().then((reason) => {\n reject(new Error(reason ? `${message}: ${reason}` : message));\n });\n };\n\n const timeout = setTimeout(() => {\n if (settled) return;\n // Reject with the timeout reason first, then close — closing may\n // synchronously fire the `close` handler, whose `failConnect` is then a\n // no-op thanks to the `settled` guard (preserves the timeout message).\n settled = true;\n reject(new Error(`Connection timeout to ${this.url}`));\n ws.close();\n }, this.connectTimeoutMs);\n\n ws.addEventListener(\"open\", () => {\n clearTimeout(timeout);\n opened = true;\n this.log(\"[ws-client] connected\");\n this.reconnectAttempts = 0;\n // A socket orphaned by disconnect() or a newer dial must not take over\n // the heartbeat of the current one.\n if (this.ws === ws) this.startHeartbeat(ws, liveness, () => handleClose(1006));\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n ws.addEventListener(\"message\", (event) => {\n liveness.missed = 0;\n try {\n const data = JSON.parse(String(event.data)) as AgentEvent;\n for (const handler of this.messageHandlers) {\n handler(data);\n }\n } catch {\n this.log(\"[ws-client] failed to parse message\");\n }\n });\n\n // Runs once per socket, from its `close` event or from the pong deadline,\n // whichever comes first: `terminate()` closes synchronously in Bun but\n // later in the `ws` package, so the second caller must be a no-op.\n let closeHandled = false;\n const handleClose = (code: number, reason = \"\") => {\n if (closeHandled) return;\n closeHandled = true;\n clearTimeout(timeout);\n if (this.ws === ws) this.clearHeartbeat();\n this.log(`[ws-client] disconnected (code=${code})`);\n\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n\n // Close code 4001: the server serves one client and a newer one took over. Say so\n // instead of going quiet, and do not reconnect: that would evict the new owner in turn.\n if (code === CLOSE_REPLACED && opened && !this.intentionalClose) {\n const message = `This connection was replaced by another client (close code ${CLOSE_REPLACED}${reason ? `, \"${reason}\"` : \"\"}). The server serves one client at a time, so this client does not reconnect.`;\n this.log(`[ws-client] ${message}`);\n const event: AgentEvent = { type: \"error\", message, fatal: false, category: \"config\" };\n for (const handler of this.messageHandlers) handler(event);\n return;\n }\n\n // Closed before ever opening == connect failure. Reject the pending\n // connect; only background (reconnect) attempts chain another retry —\n // an initial connect failure is surfaced to the caller, who owns retry.\n if (!opened) {\n failConnect(`Connection to ${this.url} closed before open (code=${code})`);\n if (!isInitial && !this.intentionalClose && code !== 1000) {\n this.scheduleReconnect();\n }\n return;\n }\n\n if (!this.intentionalClose && code !== 1000) {\n this.scheduleReconnect();\n }\n };\n ws.addEventListener(\"close\", (event) => handleClose(event.code, event.reason));\n\n ws.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n // A pre-open error is a connect failure; reject now. The close event\n // (which usually follows) is idempotent via the `settled` guard.\n if (!opened) failConnect(`Connection to ${this.url} failed before open`);\n });\n });\n }\n\n /**\n * After a refused handshake, repeat the upgrade request over `node:http` and report the\n * status line the server answered with. Resolves `undefined` when nothing useful is\n * learned (a browser has no `node:http`; the server accepted this time).\n */\n private async explainRefusal(): Promise<string | undefined> {\n if (typeof process === \"undefined\" || !process.versions?.node) return undefined;\n try {\n const url = new URL(this.url);\n const secure = url.protocol === \"wss:\";\n // Variable specifier: bundlers must not pull `node:http` into browser builds.\n const specifier = secure ? \"node:https\" : \"node:http\";\n const lib = (await import(\n /* @vite-ignore */ /* webpackIgnore: true */ specifier\n )) as typeof nodeHttp;\n return await new Promise<string | undefined>((resolve) => {\n const req = lib.request(\n {\n host: url.hostname,\n port: url.port || (secure ? 443 : 80),\n path: `${url.pathname}${url.search}`,\n method: \"GET\",\n timeout: 3_000,\n headers: {\n Connection: \"Upgrade\",\n Upgrade: \"websocket\",\n \"Sec-WebSocket-Version\": \"13\",\n \"Sec-WebSocket-Key\": \"c2thaWxlLXByb2JlLWtleQ==\",\n ...(this.subprotocols.length > 0\n ? { \"Sec-WebSocket-Protocol\": this.subprotocols.join(\", \") }\n : {}),\n },\n ...(this.tls ? { ca: this.tls.ca } : {}),\n },\n (res) => {\n res.resume();\n const status = `HTTP ${res.statusCode} ${res.statusMessage ?? \"\"}`.trim();\n if (res.statusCode === 401) {\n resolve(\n this.subprotocols.length > 0\n ? `${status} (the server did not accept the token passed as \\`auth\\`)`\n : `${status} (the server requires a token: pass \\`auth\\`; \\`skaile serve\\` reads SKAILE_WS_AUTH_TOKEN)`,\n );\n } else {\n resolve(status);\n }\n },\n );\n req.on(\"upgrade\", (_res, socket) => {\n socket.destroy();\n resolve(undefined);\n });\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(undefined);\n });\n req.on(\"error\", (err: NodeJS.ErrnoException) => resolve(err.code));\n req.end();\n });\n } catch {\n return undefined;\n }\n }\n\n private createSocket(): WebSocket {\n if (this.tls) {\n const { ca } = this.tls;\n if (isBun) {\n // Bun's WebSocket takes an options object in place of the protocols.\n const init = { protocols: this.subprotocols, tls: { ca } };\n return new WebSocket(this.url, init as unknown as string[]);\n }\n if (!this.wsPackage) throw new Error(\"ws package not loaded before a pinned dial\");\n return new this.wsPackage(this.url, this.subprotocols, { ca });\n }\n // Pass the bearer subprotocol when auth is configured; an empty list keeps\n // the no-auth handshake byte-identical to before.\n return this.subprotocols.length > 0\n ? new WebSocket(this.url, this.subprotocols)\n : new WebSocket(this.url);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts) {\n this.log(`[ws-client] giving up reconnect after ${this.reconnectAttempts} attempts`);\n return;\n }\n\n this.reconnectAttempts++;\n const delay = Math.min(\n this.reconnectConfig.baseMs * 2 ** (this.reconnectAttempts - 1),\n this.reconnectConfig.maxMs,\n );\n this.log(`[ws-client] reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.intentionalClose) return;\n this.doConnect().catch(() => {\n // doConnect rejection triggers another close → scheduleReconnect cycle\n });\n }, delay);\n }\n\n /**\n * Ping every {@link heartbeatMs} and, where the socket reports pongs, give up\n * on it after {@link maxMissedPongs} unanswered ticks. A path that dies\n * without a FIN leaves the socket OPEN forever; terminating it here is what\n * lets {@link scheduleReconnect} run. `onDead` settles the close at once\n * because a terminated socket's own close event can arrive late.\n */\n private startHeartbeat(ws: WebSocket, liveness: { missed: number }, onDead: () => void): void {\n this.clearHeartbeat();\n const socket = ws as PingCapableSocket;\n const canPing = typeof socket.ping === \"function\";\n const markAlive = () => {\n liveness.missed = 0;\n };\n if (canPing && typeof socket.on === \"function\") socket.on(\"pong\", markAlive);\n else if (canPing) ws.addEventListener(\"pong\" as keyof WebSocketEventMap, markAlive);\n const judge = canPing && this.maxMissedPongs > 0;\n\n this.heartbeatTimer = setInterval(() => {\n if (ws.readyState !== WebSocket.OPEN) return;\n if (judge && liveness.missed >= this.maxMissedPongs) {\n this.log(\n `[ws-client] no pong for ${liveness.missed} heartbeats of ${this.heartbeatMs}ms; terminating ${this.url}`,\n );\n this.clearHeartbeat();\n try {\n if (typeof socket.terminate === \"function\") socket.terminate();\n else ws.close();\n } catch {\n // already gone\n }\n onDead();\n return;\n }\n try {\n socket.ping?.();\n if (judge) liveness.missed++;\n } catch {\n // A runtime whose ping throws cannot be judged on pongs either.\n }\n }, this.heartbeatMs);\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n}\n"]}
@@ -34,6 +34,7 @@ var WebSocketServerTransport = class {
34
34
  activeClient = null;
35
35
  port;
36
36
  log;
37
+ host;
37
38
  authToken;
38
39
  heartbeatMs;
39
40
  maxMissedPongs;
@@ -43,6 +44,7 @@ var WebSocketServerTransport = class {
43
44
  constructor(options) {
44
45
  this.port = options.port;
45
46
  this.log = options.onLog ?? console.log;
47
+ this.host = options.host;
46
48
  this.authToken = options.authToken;
47
49
  this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;
48
50
  this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;
@@ -75,22 +77,36 @@ var WebSocketServerTransport = class {
75
77
  try {
76
78
  await new Promise((resolve, reject) => {
77
79
  httpServer.once("error", reject);
78
- httpServer.listen(this.port, () => {
80
+ const onBound = () => {
79
81
  httpServer.off("error", reject);
80
82
  resolve();
81
- });
83
+ };
84
+ if (this.host) httpServer.listen(this.port, this.host, onBound);
85
+ else httpServer.listen(this.port, onBound);
82
86
  });
83
87
  } catch (err) {
84
88
  wss.close();
85
89
  this.wss = null;
86
90
  this.httpServer = null;
91
+ if (err instanceof Error && "code" in err && err.code === "EADDRINUSE") {
92
+ const where = this.host ? `${this.host}:${this.port}` : `port ${this.port}`;
93
+ throw Object.assign(
94
+ new Error(
95
+ `${where} is already in use: another process listens there. Pick another port.`
96
+ ),
97
+ { code: "EADDRINUSE" }
98
+ );
99
+ }
87
100
  throw err;
88
101
  } finally {
89
102
  wss.off("error", swallowBindError);
90
103
  }
91
104
  const addr = httpServer.address();
92
105
  const boundPort = typeof addr === "object" && addr ? addr.port : this.port;
93
- this.log(`[ws-server] listening on port ${boundPort}`);
106
+ const bind = this.host ?? "all interfaces";
107
+ this.log(
108
+ `[ws-server] listening on port ${boundPort} (${bind}; ${this.authToken ? "token required" : "no authentication"})`
109
+ );
94
110
  }
95
111
  handleConnection(ws) {
96
112
  if (this.activeClient) {
@@ -239,5 +255,5 @@ var WebSocketServerTransport = class {
239
255
  };
240
256
 
241
257
  export { WebSocketServerTransport };
242
- //# sourceMappingURL=chunk-5LKOAX7I.js.map
243
- //# sourceMappingURL=chunk-5LKOAX7I.js.map
258
+ //# sourceMappingURL=chunk-OQ5MKDS3.js.map
259
+ //# sourceMappingURL=chunk-OQ5MKDS3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../transport/src/ws/server.ts"],"names":[],"mappings":"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","file":"chunk-OQ5MKDS3.js","sourcesContent":["/**\n * WebSocketServerTransport — `ws`-based WebSocket server.\n *\n * Accepts one client at a time. Implements ServerTransport from @skaile/workspaces/types.\n * Built on the `ws` package + `node:http`, both of which run under Node and Bun.\n */\n\nimport { createServer, type Server as HttpServer } from \"node:http\";\nimport type { AgentCommand, AgentEvent, ServerTransport } from \"@skaile/workspaces/types\";\nimport { type WebSocket, WebSocketServer } from \"ws\";\nimport { decodeBearerFromHeader, tokensEqual } from \"./auth.js\";\n\n/**\n * Options for {@link WebSocketServerTransport}.\n *\n * @param port - TCP port to bind to; `0` picks a free port (read it back via `boundPort`).\n * @param onLog - Optional callback for internal log lines (client connect/disconnect events).\n * @param host - Address to bind. Default: every interface (Node's unspecified address).\n * `127.0.0.1` accepts local clients only.\n * @param authToken - When set, every upgrade must present this token via the\n * `skaile-bearer.<base64url>` subprotocol or the handshake is rejected with\n * HTTP 401. When unset, no auth is enforced (back-compatible default).\n * @param heartbeatMs - Interval in milliseconds between pings to the active\n * client. Default: 30 000.\n * @param maxMissedPongs - Heartbeat ticks the client may go without a pong (or\n * any inbound frame) before its socket is terminated, so a client lost behind a\n * dead path (no FIN) fires `onDisconnect` instead of swallowing every event\n * sent to it. Default: 2, i.e. detection within 3 x `heartbeatMs`. `0` turns\n * the heartbeat off. Every WebSocket client answers pings on its own.\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport interface WebSocketServerOptions {\n port: number;\n host?: string;\n onLog?: (line: string) => void;\n authToken?: string;\n heartbeatMs?: number;\n maxMissedPongs?: number;\n}\n\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_MISSED_PONGS = 2;\n\n/**\n * Shape-validate a `session_init` frame at ingress before forwarding to the\n * runner. Protocol v3 requires the deterministic bootstrap envelope to carry\n * an identity tuple, a semver-shaped `protocolVersion`, a resolved config\n * object, and a `credentials` map keyed by `mounts` / `connectors`. Frames\n * that fail the guard are rejected on the wire so the runner never sees a\n * malformed boot envelope.\n *\n * Returns `null` when the frame is well-formed, or a human-readable reason\n * when it should be rejected.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"SessionInitCommand schema\".\n *\n * @internal\n */\nfunction validateSessionInitShape(cmd: Record<string, unknown>): string | null {\n if (cmd.type !== \"session_init\") return \"type must be 'session_init'\";\n\n const identity = cmd.identity as Record<string, unknown> | undefined;\n if (!identity || typeof identity !== \"object\" || Array.isArray(identity)) {\n return \"identity must be an object\";\n }\n if (typeof identity.containerId !== \"string\") return \"identity.containerId must be a string\";\n if (typeof identity.sessionId !== \"string\") return \"identity.sessionId must be a string\";\n if (typeof identity.projectId !== \"string\") return \"identity.projectId must be a string\";\n\n const protocolVersion = cmd.protocolVersion as Record<string, unknown> | undefined;\n if (!protocolVersion || typeof protocolVersion !== \"object\" || Array.isArray(protocolVersion)) {\n return \"protocolVersion must be an object\";\n }\n if (typeof protocolVersion.major !== \"number\") return \"protocolVersion.major must be a number\";\n if (typeof protocolVersion.minor !== \"number\") return \"protocolVersion.minor must be a number\";\n if (typeof protocolVersion.patch !== \"number\") return \"protocolVersion.patch must be a number\";\n\n if (\n !cmd.resolvedConfig ||\n typeof cmd.resolvedConfig !== \"object\" ||\n Array.isArray(cmd.resolvedConfig)\n ) {\n return \"resolvedConfig must be an object\";\n }\n\n if (!cmd.credentials || typeof cmd.credentials !== \"object\" || Array.isArray(cmd.credentials)) {\n return \"credentials must be an object\";\n }\n\n return null;\n}\n\n/**\n * `ServerTransport` implementation backed by the `ws` package on top of a\n * `node:http` server.\n *\n * Enforces a single-client policy: if a new connection arrives while a client is\n * already connected, the stale connection is closed with code 4001 and replaced.\n * Incoming frames are parsed as JSON `AgentCommand` messages and fanned out to\n * registered `onCommand` handlers; outgoing `AgentEvent` objects are JSON-serialised\n * before sending. Call `listen()` to start accepting connections and `close()` to\n * shut down cleanly — `close()` terminates the active socket immediately rather\n * than keeping the event loop alive.\n *\n * @example\n * ```ts\n * const server = new WebSocketServerTransport({ port: 8080 });\n * await server.listen();\n * server.onCommand((cmd) => console.log(cmd));\n * server.send({ type: 'agent_end' });\n * await server.close();\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport class WebSocketServerTransport implements ServerTransport {\n private httpServer: HttpServer | null = null;\n private wss: WebSocketServer | null = null;\n private activeClient: WebSocket | null = null;\n private readonly port: number;\n private readonly log: (line: string) => void;\n private readonly host?: string;\n private readonly authToken?: string;\n private readonly heartbeatMs: number;\n private readonly maxMissedPongs: number;\n\n private readonly commandHandlers = new Set<(command: AgentCommand) => void>();\n private readonly connectHandlers = new Set<() => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketServerOptions) {\n this.port = options.port;\n this.log = options.onLog ?? console.log;\n this.host = options.host;\n this.authToken = options.authToken;\n this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;\n }\n\n /** Start the server and accept connections. */\n async listen(): Promise<void> {\n const httpServer = createServer((_req, res) => {\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"skaile agent server\");\n });\n // When an auth token is configured, reject the upgrade at handshake time\n // (HTTP 401) unless the client presents the matching bearer subprotocol.\n // Rejecting here — before `connection` — keeps unauthenticated sockets from\n // ever reaching the command handlers.\n const expected = this.authToken;\n const wss = new WebSocketServer({\n server: httpServer,\n verifyClient: expected\n ? (info, cb) => {\n const presented = decodeBearerFromHeader(info.req.headers[\"sec-websocket-protocol\"]);\n if (presented !== null && tokensEqual(presented, expected)) {\n cb(true);\n } else {\n this.log(\"[ws-server] rejecting unauthenticated upgrade\");\n cb(false, 401, \"Unauthorized\");\n }\n }\n : undefined,\n });\n wss.on(\"connection\", (ws) => this.handleConnection(ws));\n // `ws` re-emits the http server's errors on `wss`; unhandled during the bind,\n // that throws before the reject below runs and `listen()` hangs. Scoped to the\n // bind so a post-startup server error still surfaces loudly.\n const swallowBindError = () => {};\n wss.on(\"error\", swallowBindError);\n this.httpServer = httpServer;\n this.wss = wss;\n\n try {\n await new Promise<void>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n const onBound = () => {\n httpServer.off(\"error\", reject);\n resolve();\n };\n if (this.host) httpServer.listen(this.port, this.host, onBound);\n else httpServer.listen(this.port, onBound);\n });\n } catch (err) {\n wss.close();\n this.wss = null;\n this.httpServer = null;\n if (err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\") {\n const where = this.host ? `${this.host}:${this.port}` : `port ${this.port}`;\n throw Object.assign(\n new Error(\n `${where} is already in use: another process listens there. Pick another port.`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n throw err;\n } finally {\n wss.off(\"error\", swallowBindError);\n }\n\n const addr = httpServer.address();\n const boundPort = typeof addr === \"object\" && addr ? addr.port : this.port;\n const bind = this.host ?? \"all interfaces\";\n this.log(\n `[ws-server] listening on port ${boundPort} (${bind}; ${this.authToken ? \"token required\" : \"no authentication\"})`,\n );\n }\n\n private handleConnection(ws: WebSocket): void {\n if (this.activeClient) {\n // Close the stale connection instead of rejecting the new one.\n // This handles the race where waitForWsReady's probe hasn't\n // fully disconnected before the real gateway client connects.\n this.log(\"[ws-server] replacing previous connection\");\n try {\n this.activeClient.close(4001, \"Replaced by new connection\");\n } catch {\n // already closed\n }\n }\n this.log(\"[ws-server] client connected\");\n this.activeClient = ws;\n for (const handler of this.connectHandlers) {\n handler();\n }\n\n const stopHeartbeat = this.startHeartbeat(ws);\n\n ws.on(\"message\", (data) => {\n try {\n const parsed = JSON.parse(String(data)) as Record<string, unknown>;\n // Protocol v3: shape-validate `session_init` at ingress so the\n // runner never receives a malformed boot envelope. Other command\n // shapes pass through unchanged — invalid `AgentCommand`s surface\n // through the existing per-command handlers in serve.ts.\n if (parsed && typeof parsed === \"object\" && parsed.type === \"session_init\") {\n const reason = validateSessionInitShape(parsed);\n if (reason !== null) {\n this.log(`[ws-server] rejecting invalid session_init: ${reason}`);\n this.sendRaw({\n type: \"error\",\n message: `Invalid session_init: ${reason}`,\n fatal: false,\n });\n return;\n }\n }\n const cmd = parsed as unknown as AgentCommand;\n for (const handler of this.commandHandlers) {\n handler(cmd);\n }\n } catch (err) {\n this.sendRaw({\n type: \"error\",\n message: `Invalid message: ${err instanceof Error ? err.message : String(err)}`,\n fatal: false,\n });\n }\n });\n\n ws.on(\"close\", () => {\n stopHeartbeat();\n this.log(\"[ws-server] client disconnected\");\n if (this.activeClient === ws) {\n this.activeClient = null;\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n }\n });\n }\n\n /**\n * Ping `ws` every {@link heartbeatMs}; terminate it after\n * {@link maxMissedPongs} unanswered ticks. `terminate()` makes `ws` emit\n * `close`, which runs the normal disconnect path. Returns the stop function.\n */\n private startHeartbeat(ws: WebSocket): () => void {\n if (this.maxMissedPongs <= 0) return () => {};\n let missed = 0;\n const markAlive = () => {\n missed = 0;\n };\n ws.on(\"pong\", markAlive);\n ws.on(\"message\", markAlive);\n const timer = setInterval(() => {\n if (ws.readyState !== ws.OPEN) return;\n if (missed >= this.maxMissedPongs) {\n this.log(\n `[ws-server] no pong for ${missed} heartbeats of ${this.heartbeatMs}ms; terminating client`,\n );\n clearInterval(timer);\n ws.terminate();\n return;\n }\n missed++;\n try {\n ws.ping();\n } catch {\n // socket closing underneath us; the close event cleans up\n }\n }, this.heartbeatMs);\n timer.unref?.();\n return () => clearInterval(timer);\n }\n\n /**\n * Stop the server.\n *\n * Terminates the active socket immediately — otherwise a still-connected\n * client would keep the event loop alive and block process shutdown.\n */\n async close(): Promise<void> {\n try {\n this.activeClient?.terminate();\n } catch {\n // already closed\n }\n this.activeClient = null;\n this.wss?.close();\n this.wss = null;\n const httpServer = this.httpServer;\n this.httpServer = null;\n if (httpServer) {\n httpServer.closeAllConnections();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n }\n }\n\n send(event: AgentEvent): void {\n this.sendRaw(event);\n }\n\n onCommand(handler: (command: AgentCommand) => void): () => void {\n this.commandHandlers.add(handler);\n return () => {\n this.commandHandlers.delete(handler);\n };\n }\n\n onConnect(handler: () => void): () => void {\n this.connectHandlers.add(handler);\n return () => {\n this.connectHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.activeClient !== null;\n }\n\n /** The port actually bound by `listen()` (resolves `port: 0`); `undefined` when not listening. */\n get boundPort(): number | undefined {\n const addr = this.httpServer?.address();\n return typeof addr === \"object\" && addr ? addr.port : undefined;\n }\n\n private sendRaw(data: unknown): void {\n try {\n const client = this.activeClient;\n if (client && client.readyState === 1) {\n client.send(JSON.stringify(data));\n }\n } catch {\n // Silently ignore send failures\n }\n }\n}\n"]}
@@ -1,103 +1,11 @@
1
1
  import { CODEX_NATIVE_STATE_FORMAT, CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
2
- import { openSqlite } from './chunk-DALV4HHP.js';
2
+ import { openSqlite } from './chunk-DKXNKFKP.js';
3
3
  import { registryEntries, isEntryEnabled, parseCredentialRef } from './chunk-MJHSLODD.js';
4
- import { lstatSync, realpathSync, existsSync, chmodSync, rmSync, writeFileSync, renameSync, mkdirSync, readdirSync, readFileSync } from 'fs';
5
- import { isAbsolute, resolve, dirname, join, relative } from 'path';
6
4
  import * as z from 'zod';
7
5
  import { createHash } from 'crypto';
6
+ import { realpathSync, existsSync, lstatSync, chmodSync, rmSync, writeFileSync, renameSync, mkdirSync, readdirSync, readFileSync } from 'fs';
7
+ import { isAbsolute, join, resolve, dirname, relative } from 'path';
8
8
 
9
- var invalid = () => new Error("AI_PROFILE_INVALID");
10
- var record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
11
- var within = (child, parent) => {
12
- const rel = relative(parent, child);
13
- return rel === "" || !rel.startsWith("../") && rel !== ".." && !isAbsolute(rel);
14
- };
15
- var hasControl = (path) => [...path].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);
16
- var directory = (path) => {
17
- if (!isAbsolute(path) || hasControl(path)) throw invalid();
18
- const stat = lstatSync(path);
19
- if (!stat.isDirectory() || stat.isSymbolicLink()) throw invalid();
20
- return realpathSync(path);
21
- };
22
- function prepareNativePolicy(input) {
23
- const cwd = directory(input.cwd);
24
- const privateRoot = directory(input.privateRoot);
25
- const privateDirectory = directory(input.privateDirectory);
26
- if (within(cwd, privateRoot) || within(privateRoot, cwd) || !within(privateDirectory, privateRoot) || privateDirectory === privateRoot || input.sandboxMode !== "read-only" && input.sandboxMode !== "workspace-write")
27
- throw invalid();
28
- const stat = lstatSync(privateRoot);
29
- if (stat.mode & 63 || process.getuid && stat.uid !== 0 && stat.uid !== process.getuid())
30
- throw invalid();
31
- const filesystem = Object.freeze({
32
- [cwd]: input.sandboxMode === "workspace-write" ? "write" : "read",
33
- [privateRoot]: "deny"
34
- });
35
- const config = Object.freeze({
36
- default_permissions: "managed",
37
- features: Object.freeze({ use_legacy_landlock: false }),
38
- permissions: Object.freeze({
39
- managed: Object.freeze({
40
- extends: ":read-only",
41
- filesystem,
42
- network: Object.freeze({ enabled: false })
43
- })
44
- })
45
- });
46
- const profile = `{ managed = { extends = ":read-only", filesystem = { ${Object.entries(filesystem).map(([path, access]) => `${JSON.stringify(path)} = ${JSON.stringify(access)}`).join(", ")} }, network = { enabled = false } } }`;
47
- const policy = Object.freeze({
48
- config,
49
- cliArgs: Object.freeze([
50
- "-c",
51
- 'default_permissions="managed"',
52
- "-c",
53
- "features.use_legacy_landlock=false",
54
- "-c",
55
- `permissions=${profile}`
56
- ])
57
- });
58
- prepared.set(policy, { cwd, privateRoot, writable: input.sandboxMode === "workspace-write" });
59
- return policy;
60
- }
61
- var prepared = /* @__PURE__ */ new WeakMap();
62
- var active = /* @__PURE__ */ new WeakMap();
63
- function activateNativeApprovalPolicy(policy, response, signal) {
64
- const binding = prepared.get(policy);
65
- if (!binding || signal.aborted || !record(response) || !record(response.thread) || typeof response.thread.id !== "string" || !response.thread.id || response.cwd !== binding.cwd || !record(response.activePermissionProfile) || response.activePermissionProfile.id !== "managed" || response.activePermissionProfile.extends !== ":read-only")
66
- throw invalid();
67
- const token = Object.freeze({});
68
- active.set(token, { ...binding, threadId: response.thread.id, signal });
69
- return token;
70
- }
71
- function isNativeApprovalPolicyActive(policy, threadId) {
72
- if (!record(policy)) return false;
73
- const binding = active.get(policy);
74
- return Boolean(binding && !binding.signal.aborted && binding.threadId === threadId);
75
- }
76
- function allowsNativeApprovalPath(policy, path, access) {
77
- if (!policy) return false;
78
- const binding = active.get(policy);
79
- if (!binding || binding.signal.aborted || !isAbsolute(path) || hasControl(path) || access !== "read" && access !== "write" || access === "write" && !binding.writable)
80
- return false;
81
- try {
82
- let existing = resolve(path);
83
- const suffix = [];
84
- while (true) {
85
- try {
86
- lstatSync(existing);
87
- break;
88
- } catch (error) {
89
- if (error.code !== "ENOENT" || dirname(existing) === existing)
90
- return false;
91
- suffix.unshift(existing.slice(dirname(existing).length + 1));
92
- existing = dirname(existing);
93
- }
94
- }
95
- const canonical = resolve(realpathSync(existing), ...suffix);
96
- return within(canonical, binding.cwd) && !within(canonical, binding.privateRoot);
97
- } catch {
98
- return false;
99
- }
100
- }
101
9
  var identifier = z.string().min(1).max(4096);
102
10
  var timestamp = z.iso.datetime({ offset: true });
103
11
  var common = {
@@ -177,31 +85,31 @@ function managedCodexRegistryViolation(registry) {
177
85
  return `entry '${id}' resolves its credential outside the control plane; managed codex admits only a 'platform:' reference`;
178
86
  return void 0;
179
87
  }
180
- var invalid2 = () => new Error("AI_PROFILE_INVALID");
181
- var within2 = (path, root) => {
88
+ var invalid = () => new Error("AI_PROFILE_INVALID");
89
+ var within = (path, root) => {
182
90
  const rel = relative(root, path);
183
91
  return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
184
92
  };
185
- function directory2(path) {
93
+ function directory(path) {
186
94
  if (!existsSync(path)) mkdirSync(path, { mode: 448 });
187
95
  const stat = lstatSync(path);
188
- if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 63) throw invalid2();
96
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 63) throw invalid();
189
97
  }
190
98
  function readRegular(path, limit) {
191
99
  const stat = lstatSync(path);
192
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > limit) throw invalid2();
100
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > limit) throw invalid();
193
101
  return readFileSync(path);
194
102
  }
195
103
  function prepareCodexInstance(config, options, credential) {
196
104
  if (!isAbsolute(options.privateDirectory) || !isAbsolute(config.cwd) || !config.sessionId)
197
- throw invalid2();
198
- directory2(options.privateDirectory);
105
+ throw invalid();
106
+ directory(options.privateDirectory);
199
107
  const root = realpathSync(options.privateDirectory);
200
108
  const cwd = realpathSync(config.cwd);
201
- if (within2(root, cwd) || within2(cwd, root)) throw invalid2();
109
+ if (within(root, cwd) || within(cwd, root)) throw invalid();
202
110
  const lock = join(root, ".active");
203
111
  const leasePath = join(root, "lease.db");
204
- if (existsSync(leasePath) && !lstatSync(leasePath).isFile()) throw invalid2();
112
+ if (existsSync(leasePath) && !lstatSync(leasePath).isFile()) throw invalid();
205
113
  const lease = openSqlite(leasePath);
206
114
  try {
207
115
  lease.exec("PRAGMA busy_timeout=0; BEGIN EXCLUSIVE");
@@ -233,9 +141,9 @@ function prepareCodexInstance(config, options, credential) {
233
141
  })
234
142
  ).digest("hex");
235
143
  const slots = join(root, CODEX_NATIVE_STATE_FORMAT);
236
- directory2(slots);
144
+ directory(slots);
237
145
  const stateRoot = join(slots, key);
238
- directory2(stateRoot);
146
+ directory(stateRoot);
239
147
  for (const name of ["instructions.new", "binding.new"])
240
148
  rmSync(join(stateRoot, name), { force: true });
241
149
  const bindingPath = join(stateRoot, "binding.json");
@@ -255,10 +163,10 @@ function prepareCodexInstance(config, options, credential) {
255
163
  }
256
164
  const home = join(stateRoot, "home");
257
165
  if (config.resumeSessionId && !existsSync(home)) throw new CodexNativeStateUnavailable();
258
- directory2(home);
259
- for (const subdir of ["config", "cache", "data", "tmp"]) directory2(join(home, subdir));
166
+ directory(home);
167
+ for (const subdir of ["config", "cache", "data", "tmp"]) directory(join(home, subdir));
260
168
  if (["auth.json", ".credentials.json"].some((name) => existsSync(join(home, name))))
261
- throw invalid2();
169
+ throw invalid();
262
170
  const instructionFile = join(stateRoot, "instructions.md");
263
171
  const instructions = [
264
172
  ...(options.instructionFiles ?? []).map(
@@ -273,24 +181,24 @@ function prepareCodexInstance(config, options, credential) {
273
181
  if (!options.skillsDirectory && existsSync(target)) rmSync(target, { recursive: true });
274
182
  if (options.skillsDirectory) {
275
183
  const source = realpathSync(options.skillsDirectory);
276
- if (within2(target, source) || within2(source, target)) throw invalid2();
184
+ if (within(target, source) || within(source, target)) throw invalid();
277
185
  if (existsSync(target)) rmSync(target, { recursive: true });
278
186
  let files = 0;
279
187
  let entries = 0;
280
188
  let bytes = 0;
281
189
  const copy = (source2, destination) => {
282
- if (++entries > 1024) throw invalid2();
283
- if (lstatSync(source2).isSymbolicLink()) throw invalid2();
190
+ if (++entries > 1024) throw invalid();
191
+ if (lstatSync(source2).isSymbolicLink()) throw invalid();
284
192
  mkdirSync(destination, { mode: 448 });
285
193
  for (const entry of readdirSync(source2, { withFileTypes: true })) {
286
194
  const src = join(source2, entry.name);
287
195
  const dst = join(destination, entry.name);
288
- if (entry.isSymbolicLink()) throw invalid2();
196
+ if (entry.isSymbolicLink()) throw invalid();
289
197
  if (entry.isDirectory()) copy(src, dst);
290
198
  else {
291
199
  const content = readRegular(src, 1024 * 1024);
292
200
  bytes += content.byteLength;
293
- if (++files > 512 || bytes > 8 * 1024 * 1024) throw invalid2();
201
+ if (++files > 512 || bytes > 8 * 1024 * 1024) throw invalid();
294
202
  writeFileSync(dst, content, { mode: 384, flag: "wx" });
295
203
  }
296
204
  }
@@ -298,7 +206,7 @@ function prepareCodexInstance(config, options, credential) {
298
206
  copy(options.skillsDirectory, target);
299
207
  }
300
208
  const bindThread = (threadId) => {
301
- if (!threadId || threadId.length > 4096) throw invalid2();
209
+ if (!threadId || threadId.length > 4096) throw invalid();
302
210
  const next = join(stateRoot, "binding.new");
303
211
  writeFileSync(next, JSON.stringify({ format: CODEX_NATIVE_STATE_FORMAT, key, threadId }), {
304
212
  mode: 384,
@@ -340,7 +248,7 @@ function codexInstanceEnvironment(input, home) {
340
248
  "NO_PROXY"
341
249
  ]);
342
250
  if (!input || Object.entries(input).some(([key, value]) => !allowed.has(key) || typeof value !== "string"))
343
- throw invalid2();
251
+ throw invalid();
344
252
  return {
345
253
  ...input,
346
254
  HOME: home,
@@ -351,7 +259,99 @@ function codexInstanceEnvironment(input, home) {
351
259
  TMPDIR: join(home, "tmp")
352
260
  };
353
261
  }
262
+ var invalid2 = () => new Error("AI_PROFILE_INVALID");
263
+ var record = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
264
+ var within2 = (child, parent) => {
265
+ const rel = relative(parent, child);
266
+ return rel === "" || !rel.startsWith("../") && rel !== ".." && !isAbsolute(rel);
267
+ };
268
+ var hasControl = (path) => [...path].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127);
269
+ var directory2 = (path) => {
270
+ if (!isAbsolute(path) || hasControl(path)) throw invalid2();
271
+ const stat = lstatSync(path);
272
+ if (!stat.isDirectory() || stat.isSymbolicLink()) throw invalid2();
273
+ return realpathSync(path);
274
+ };
275
+ function prepareNativePolicy(input) {
276
+ const cwd = directory2(input.cwd);
277
+ const privateRoot = directory2(input.privateRoot);
278
+ const privateDirectory = directory2(input.privateDirectory);
279
+ if (within2(cwd, privateRoot) || within2(privateRoot, cwd) || !within2(privateDirectory, privateRoot) || privateDirectory === privateRoot || input.sandboxMode !== "read-only" && input.sandboxMode !== "workspace-write")
280
+ throw invalid2();
281
+ const stat = lstatSync(privateRoot);
282
+ if (stat.mode & 63 || process.getuid && stat.uid !== 0 && stat.uid !== process.getuid())
283
+ throw invalid2();
284
+ const filesystem = Object.freeze({
285
+ [cwd]: input.sandboxMode === "workspace-write" ? "write" : "read",
286
+ [privateRoot]: "deny"
287
+ });
288
+ const config = Object.freeze({
289
+ default_permissions: "managed",
290
+ features: Object.freeze({ use_legacy_landlock: false }),
291
+ permissions: Object.freeze({
292
+ managed: Object.freeze({
293
+ extends: ":read-only",
294
+ filesystem,
295
+ network: Object.freeze({ enabled: false })
296
+ })
297
+ })
298
+ });
299
+ const profile = `{ managed = { extends = ":read-only", filesystem = { ${Object.entries(filesystem).map(([path, access]) => `${JSON.stringify(path)} = ${JSON.stringify(access)}`).join(", ")} }, network = { enabled = false } } }`;
300
+ const policy = Object.freeze({
301
+ config,
302
+ cliArgs: Object.freeze([
303
+ "-c",
304
+ 'default_permissions="managed"',
305
+ "-c",
306
+ "features.use_legacy_landlock=false",
307
+ "-c",
308
+ `permissions=${profile}`
309
+ ])
310
+ });
311
+ prepared.set(policy, { cwd, privateRoot, writable: input.sandboxMode === "workspace-write" });
312
+ return policy;
313
+ }
314
+ var prepared = /* @__PURE__ */ new WeakMap();
315
+ var active = /* @__PURE__ */ new WeakMap();
316
+ function activateNativeApprovalPolicy(policy, response, signal) {
317
+ const binding = prepared.get(policy);
318
+ if (!binding || signal.aborted || !record(response) || !record(response.thread) || typeof response.thread.id !== "string" || !response.thread.id || response.cwd !== binding.cwd || !record(response.activePermissionProfile) || response.activePermissionProfile.id !== "managed" || response.activePermissionProfile.extends !== ":read-only")
319
+ throw invalid2();
320
+ const token = Object.freeze({});
321
+ active.set(token, { ...binding, threadId: response.thread.id, signal });
322
+ return token;
323
+ }
324
+ function isNativeApprovalPolicyActive(policy, threadId) {
325
+ if (!record(policy)) return false;
326
+ const binding = active.get(policy);
327
+ return Boolean(binding && !binding.signal.aborted && binding.threadId === threadId);
328
+ }
329
+ function allowsNativeApprovalPath(policy, path, access) {
330
+ if (!policy) return false;
331
+ const binding = active.get(policy);
332
+ if (!binding || binding.signal.aborted || !isAbsolute(path) || hasControl(path) || access !== "read" && access !== "write" || access === "write" && !binding.writable)
333
+ return false;
334
+ try {
335
+ let existing = resolve(path);
336
+ const suffix = [];
337
+ while (true) {
338
+ try {
339
+ lstatSync(existing);
340
+ break;
341
+ } catch (error) {
342
+ if (error.code !== "ENOENT" || dirname(existing) === existing)
343
+ return false;
344
+ suffix.unshift(existing.slice(dirname(existing).length + 1));
345
+ existing = dirname(existing);
346
+ }
347
+ }
348
+ const canonical = resolve(realpathSync(existing), ...suffix);
349
+ return within2(canonical, binding.cwd) && !within2(canonical, binding.privateRoot);
350
+ } catch {
351
+ return false;
352
+ }
353
+ }
354
354
 
355
355
  export { activateNativeApprovalPolicy, allowsNativeApprovalPath, codexInstanceEnvironment, isNativeApprovalPolicyActive, managedCodexRegistryViolation, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult, prepareCodexInstance, prepareNativePolicy };
356
- //# sourceMappingURL=chunk-NWDSLXOX.js.map
357
- //# sourceMappingURL=chunk-NWDSLXOX.js.map
356
+ //# sourceMappingURL=chunk-PHRNUTSG.js.map
357
+ //# sourceMappingURL=chunk-PHRNUTSG.js.map