@mysten-incubation/devstack 0.0.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 (833) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +94 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  4. package/dist/api/define-capabilities.d.mts +25 -0
  5. package/dist/api/define-capabilities.mjs +19 -0
  6. package/dist/api/define-capabilities.mjs.map +1 -0
  7. package/dist/api/define-devstack-with.d.mts +41 -0
  8. package/dist/api/define-devstack-with.mjs +24 -0
  9. package/dist/api/define-devstack-with.mjs.map +1 -0
  10. package/dist/api/define-devstack.d.mts +62 -0
  11. package/dist/api/define-devstack.mjs +108 -0
  12. package/dist/api/define-devstack.mjs.map +1 -0
  13. package/dist/api/define-plugin.d.mts +1 -0
  14. package/dist/api/inference-network.mjs +122 -0
  15. package/dist/api/inference-network.mjs.map +1 -0
  16. package/dist/api/mode-narrowed-factory.d.mts +26 -0
  17. package/dist/api/mode-narrowed-factory.mjs +8 -0
  18. package/dist/api/mode-narrowed-factory.mjs.map +1 -0
  19. package/dist/api/plugin-errors.mjs +10 -0
  20. package/dist/api/plugin-errors.mjs.map +1 -0
  21. package/dist/api/run-stack.d.mts +82 -0
  22. package/dist/api/run-stack.mjs +127 -0
  23. package/dist/api/run-stack.mjs.map +1 -0
  24. package/dist/build-integrations/playwright/config.d.mts +92 -0
  25. package/dist/build-integrations/playwright/config.mjs +71 -0
  26. package/dist/build-integrations/playwright/config.mjs.map +1 -0
  27. package/dist/build-integrations/playwright/errors.d.mts +82 -0
  28. package/dist/build-integrations/playwright/errors.mjs +43 -0
  29. package/dist/build-integrations/playwright/errors.mjs.map +1 -0
  30. package/dist/build-integrations/playwright/global-setup.d.mts +64 -0
  31. package/dist/build-integrations/playwright/global-setup.mjs +44 -0
  32. package/dist/build-integrations/playwright/global-setup.mjs.map +1 -0
  33. package/dist/build-integrations/playwright/index.d.mts +6 -0
  34. package/dist/build-integrations/playwright/index.mjs +6 -0
  35. package/dist/build-integrations/playwright/stack-context.d.mts +95 -0
  36. package/dist/build-integrations/playwright/stack-context.mjs +277 -0
  37. package/dist/build-integrations/playwright/stack-context.mjs.map +1 -0
  38. package/dist/build-integrations/playwright/wallet-context.d.mts +87 -0
  39. package/dist/build-integrations/playwright/wallet-context.mjs +148 -0
  40. package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -0
  41. package/dist/build-integrations/runtime/cold-start-url.d.mts +67 -0
  42. package/dist/build-integrations/runtime/cold-start-url.mjs +56 -0
  43. package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -0
  44. package/dist/build-integrations/runtime/dapp-kit-slot.mjs +10 -0
  45. package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -0
  46. package/dist/build-integrations/runtime/discover.d.mts +78 -0
  47. package/dist/build-integrations/runtime/discover.mjs +124 -0
  48. package/dist/build-integrations/runtime/discover.mjs.map +1 -0
  49. package/dist/build-integrations/runtime/endpoint-registry.d.mts +26 -0
  50. package/dist/build-integrations/runtime/endpoint-registry.mjs +41 -0
  51. package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -0
  52. package/dist/build-integrations/runtime/errors.d.mts +64 -0
  53. package/dist/build-integrations/runtime/errors.mjs +51 -0
  54. package/dist/build-integrations/runtime/errors.mjs.map +1 -0
  55. package/dist/build-integrations/runtime/index.d.mts +7 -0
  56. package/dist/build-integrations/runtime/index.mjs +6 -0
  57. package/dist/build-integrations/runtime/read-stack-context.d.mts +38 -0
  58. package/dist/build-integrations/runtime/read-stack-context.mjs +130 -0
  59. package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -0
  60. package/dist/build-integrations/runtime/stack-context.d.mts +53 -0
  61. package/dist/build-integrations/vitest/config.d.mts +62 -0
  62. package/dist/build-integrations/vitest/config.mjs +80 -0
  63. package/dist/build-integrations/vitest/config.mjs.map +1 -0
  64. package/dist/build-integrations/vitest/env.d.mts +48 -0
  65. package/dist/build-integrations/vitest/env.mjs +50 -0
  66. package/dist/build-integrations/vitest/env.mjs.map +1 -0
  67. package/dist/build-integrations/vitest/errors.d.mts +44 -0
  68. package/dist/build-integrations/vitest/errors.mjs +18 -0
  69. package/dist/build-integrations/vitest/errors.mjs.map +1 -0
  70. package/dist/build-integrations/vitest/index.d.mts +6 -0
  71. package/dist/build-integrations/vitest/index.mjs +6 -0
  72. package/dist/build-integrations/vitest/setup.d.mts +53 -0
  73. package/dist/build-integrations/vitest/setup.mjs +56 -0
  74. package/dist/build-integrations/vitest/setup.mjs.map +1 -0
  75. package/dist/build-integrations/vitest/stack-context.d.mts +58 -0
  76. package/dist/build-integrations/vitest/stack-context.mjs +67 -0
  77. package/dist/build-integrations/vitest/stack-context.mjs.map +1 -0
  78. package/dist/cli/main.d.mts +5 -0
  79. package/dist/cli/main.mjs +586 -0
  80. package/dist/cli/main.mjs.map +1 -0
  81. package/dist/cli/prune-direct.mjs +216 -0
  82. package/dist/cli/prune-direct.mjs.map +1 -0
  83. package/dist/cli/snapshot-reader.mjs +73 -0
  84. package/dist/cli/snapshot-reader.mjs.map +1 -0
  85. package/dist/cli/up-lifecycle.mjs +28 -0
  86. package/dist/cli/up-lifecycle.mjs.map +1 -0
  87. package/dist/contracts/capability-decl.d.mts +42 -0
  88. package/dist/contracts/chain-probe.d.mts +26 -0
  89. package/dist/contracts/chain-probe.mjs +8 -0
  90. package/dist/contracts/chain-probe.mjs.map +1 -0
  91. package/dist/contracts/codegenable.d.mts +43 -0
  92. package/dist/contracts/container-runtime.d.mts +245 -0
  93. package/dist/contracts/liveness-classifier.d.mts +19 -0
  94. package/dist/contracts/network-resolver.d.mts +15 -0
  95. package/dist/contracts/network-resolver.mjs +7 -0
  96. package/dist/contracts/network-resolver.mjs.map +1 -0
  97. package/dist/contracts/projection.d.mts +15 -0
  98. package/dist/contracts/routable.d.mts +53 -0
  99. package/dist/contracts/snapshotable.d.mts +39 -0
  100. package/dist/contracts/strategy-contributor.d.mts +26 -0
  101. package/dist/index.d.mts +89 -0
  102. package/dist/index.mjs +37 -0
  103. package/dist/orchestrators/codegen/bindings.d.mts +2 -0
  104. package/dist/orchestrators/codegen/bindings.mjs +340 -0
  105. package/dist/orchestrators/codegen/bindings.mjs.map +1 -0
  106. package/dist/orchestrators/codegen/emit.mjs +56 -0
  107. package/dist/orchestrators/codegen/emit.mjs.map +1 -0
  108. package/dist/orchestrators/codegen/errors.d.mts +1 -0
  109. package/dist/orchestrators/codegen/errors.mjs +66 -0
  110. package/dist/orchestrators/codegen/errors.mjs.map +1 -0
  111. package/dist/orchestrators/codegen/extras.mjs +16 -0
  112. package/dist/orchestrators/codegen/extras.mjs.map +1 -0
  113. package/dist/orchestrators/codegen/format.mjs +109 -0
  114. package/dist/orchestrators/codegen/format.mjs.map +1 -0
  115. package/dist/orchestrators/codegen/gitignore.mjs +67 -0
  116. package/dist/orchestrators/codegen/gitignore.mjs.map +1 -0
  117. package/dist/orchestrators/codegen/paths.d.mts +1 -0
  118. package/dist/orchestrators/codegen/paths.mjs +33 -0
  119. package/dist/orchestrators/codegen/paths.mjs.map +1 -0
  120. package/dist/orchestrators/codegen/permissions.mjs +6 -0
  121. package/dist/orchestrators/codegen/permissions.mjs.map +1 -0
  122. package/dist/orchestrators/codegen/service.d.mts +1 -0
  123. package/dist/orchestrators/codegen/service.mjs +276 -0
  124. package/dist/orchestrators/codegen/service.mjs.map +1 -0
  125. package/dist/orchestrators/router/cleanup.mjs +58 -0
  126. package/dist/orchestrators/router/cleanup.mjs.map +1 -0
  127. package/dist/orchestrators/router/cors.mjs +31 -0
  128. package/dist/orchestrators/router/cors.mjs.map +1 -0
  129. package/dist/orchestrators/router/entrypoints.d.mts +1 -0
  130. package/dist/orchestrators/router/entrypoints.mjs +80 -0
  131. package/dist/orchestrators/router/entrypoints.mjs.map +1 -0
  132. package/dist/orchestrators/router/errors.d.mts +1 -0
  133. package/dist/orchestrators/router/errors.mjs +103 -0
  134. package/dist/orchestrators/router/errors.mjs.map +1 -0
  135. package/dist/orchestrators/router/file-provider.d.mts +1 -0
  136. package/dist/orchestrators/router/file-provider.mjs +320 -0
  137. package/dist/orchestrators/router/file-provider.mjs.map +1 -0
  138. package/dist/orchestrators/router/hostname.d.mts +1 -0
  139. package/dist/orchestrators/router/hostname.mjs +107 -0
  140. package/dist/orchestrators/router/hostname.mjs.map +1 -0
  141. package/dist/orchestrators/router/index.d.mts +1 -0
  142. package/dist/orchestrators/router/profile.d.mts +1 -0
  143. package/dist/orchestrators/router/profile.mjs +109 -0
  144. package/dist/orchestrators/router/profile.mjs.map +1 -0
  145. package/dist/orchestrators/router/service.d.mts +3 -0
  146. package/dist/orchestrators/router/service.mjs +421 -0
  147. package/dist/orchestrators/router/service.mjs.map +1 -0
  148. package/dist/orchestrators/router/traefik-container.d.mts +1 -0
  149. package/dist/orchestrators/router/traefik-container.mjs +229 -0
  150. package/dist/orchestrators/router/traefik-container.mjs.map +1 -0
  151. package/dist/orchestrators/runtime-composition.d.mts +10 -0
  152. package/dist/orchestrators/runtime-composition.mjs +168 -0
  153. package/dist/orchestrators/runtime-composition.mjs.map +1 -0
  154. package/dist/orchestrators/snapshot/capture.d.mts +1 -0
  155. package/dist/orchestrators/snapshot/capture.mjs +350 -0
  156. package/dist/orchestrators/snapshot/capture.mjs.map +1 -0
  157. package/dist/orchestrators/snapshot/descriptor.d.mts +1 -0
  158. package/dist/orchestrators/snapshot/descriptor.mjs +109 -0
  159. package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -0
  160. package/dist/orchestrators/snapshot/identity-guard.d.mts +1 -0
  161. package/dist/orchestrators/snapshot/identity-guard.mjs +132 -0
  162. package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -0
  163. package/dist/orchestrators/snapshot/image-bundle-tags.mjs +207 -0
  164. package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -0
  165. package/dist/orchestrators/snapshot/index.d.mts +1 -0
  166. package/dist/orchestrators/snapshot/integrity.d.mts +1 -0
  167. package/dist/orchestrators/snapshot/integrity.mjs +74 -0
  168. package/dist/orchestrators/snapshot/integrity.mjs.map +1 -0
  169. package/dist/orchestrators/snapshot/prune.d.mts +1 -0
  170. package/dist/orchestrators/snapshot/prune.mjs +110 -0
  171. package/dist/orchestrators/snapshot/prune.mjs.map +1 -0
  172. package/dist/orchestrators/snapshot/restore.d.mts +1 -0
  173. package/dist/orchestrators/snapshot/restore.mjs +404 -0
  174. package/dist/orchestrators/snapshot/restore.mjs.map +1 -0
  175. package/dist/orchestrators/snapshot/service.d.mts +1 -0
  176. package/dist/orchestrators/snapshot/service.mjs +296 -0
  177. package/dist/orchestrators/snapshot/service.mjs.map +1 -0
  178. package/dist/orchestrators/snapshot/state-document.mjs +18 -0
  179. package/dist/orchestrators/snapshot/state-document.mjs.map +1 -0
  180. package/dist/orchestrators/snapshot/wipe.d.mts +1 -0
  181. package/dist/orchestrators/snapshot/wipe.mjs +59 -0
  182. package/dist/orchestrators/snapshot/wipe.mjs.map +1 -0
  183. package/dist/plugins/account/codegen.d.mts +12 -0
  184. package/dist/plugins/account/codegen.mjs +22 -0
  185. package/dist/plugins/account/codegen.mjs.map +1 -0
  186. package/dist/plugins/account/errors.d.mts +44 -0
  187. package/dist/plugins/account/errors.mjs +16 -0
  188. package/dist/plugins/account/errors.mjs.map +1 -0
  189. package/dist/plugins/account/funding.d.mts +94 -0
  190. package/dist/plugins/account/funding.mjs +199 -0
  191. package/dist/plugins/account/funding.mjs.map +1 -0
  192. package/dist/plugins/account/index.d.mts +54 -0
  193. package/dist/plugins/account/index.mjs +151 -0
  194. package/dist/plugins/account/index.mjs.map +1 -0
  195. package/dist/plugins/account/keypair.d.mts +32 -0
  196. package/dist/plugins/account/keypair.mjs +99 -0
  197. package/dist/plugins/account/keypair.mjs.map +1 -0
  198. package/dist/plugins/account/lease.mjs +21 -0
  199. package/dist/plugins/account/lease.mjs.map +1 -0
  200. package/dist/plugins/account/registry.d.mts +33 -0
  201. package/dist/plugins/account/registry.mjs +36 -0
  202. package/dist/plugins/account/registry.mjs.map +1 -0
  203. package/dist/plugins/account/service.d.mts +104 -0
  204. package/dist/plugins/account/service.mjs +405 -0
  205. package/dist/plugins/account/service.mjs.map +1 -0
  206. package/dist/plugins/account/snapshot.mjs +33 -0
  207. package/dist/plugins/account/snapshot.mjs.map +1 -0
  208. package/dist/plugins/account/variants/env.mjs +24 -0
  209. package/dist/plugins/account/variants/env.mjs.map +1 -0
  210. package/dist/plugins/account/variants/ephemeral.mjs +72 -0
  211. package/dist/plugins/account/variants/ephemeral.mjs.map +1 -0
  212. package/dist/plugins/account/variants/impersonate.d.mts +16 -0
  213. package/dist/plugins/account/variants/impersonate.mjs +48 -0
  214. package/dist/plugins/account/variants/impersonate.mjs.map +1 -0
  215. package/dist/plugins/account/variants/inline.mjs +13 -0
  216. package/dist/plugins/account/variants/inline.mjs.map +1 -0
  217. package/dist/plugins/account/variants/keystore.mjs +93 -0
  218. package/dist/plugins/account/variants/keystore.mjs.map +1 -0
  219. package/dist/plugins/account/variants/signer.mjs +31 -0
  220. package/dist/plugins/account/variants/signer.mjs.map +1 -0
  221. package/dist/plugins/action/build-context.d.mts +41 -0
  222. package/dist/plugins/action/discriminator.d.mts +20 -0
  223. package/dist/plugins/action/discriminator.mjs +13 -0
  224. package/dist/plugins/action/discriminator.mjs.map +1 -0
  225. package/dist/plugins/action/errors.d.mts +31 -0
  226. package/dist/plugins/action/errors.mjs +13 -0
  227. package/dist/plugins/action/errors.mjs.map +1 -0
  228. package/dist/plugins/action/execute.d.mts +2 -0
  229. package/dist/plugins/action/execute.mjs +145 -0
  230. package/dist/plugins/action/execute.mjs.map +1 -0
  231. package/dist/plugins/action/index.d.mts +56 -0
  232. package/dist/plugins/action/index.mjs +82 -0
  233. package/dist/plugins/action/index.mjs.map +1 -0
  234. package/dist/plugins/action/service.d.mts +26 -0
  235. package/dist/plugins/action/service.mjs +84 -0
  236. package/dist/plugins/action/service.mjs.map +1 -0
  237. package/dist/plugins/coin/address-resolution.d.mts +34 -0
  238. package/dist/plugins/coin/address-resolution.mjs +80 -0
  239. package/dist/plugins/coin/address-resolution.mjs.map +1 -0
  240. package/dist/plugins/coin/codegen.d.mts +16 -0
  241. package/dist/plugins/coin/codegen.mjs +21 -0
  242. package/dist/plugins/coin/codegen.mjs.map +1 -0
  243. package/dist/plugins/coin/discovery.d.mts +26 -0
  244. package/dist/plugins/coin/discovery.mjs +112 -0
  245. package/dist/plugins/coin/discovery.mjs.map +1 -0
  246. package/dist/plugins/coin/errors.d.mts +48 -0
  247. package/dist/plugins/coin/errors.mjs +13 -0
  248. package/dist/plugins/coin/errors.mjs.map +1 -0
  249. package/dist/plugins/coin/index.d.mts +95 -0
  250. package/dist/plugins/coin/index.mjs +172 -0
  251. package/dist/plugins/coin/index.mjs.map +1 -0
  252. package/dist/plugins/coin/metadata.d.mts +15 -0
  253. package/dist/plugins/coin/metadata.mjs +99 -0
  254. package/dist/plugins/coin/metadata.mjs.map +1 -0
  255. package/dist/plugins/coin/mint.d.mts +34 -0
  256. package/dist/plugins/coin/mint.mjs +164 -0
  257. package/dist/plugins/coin/mint.mjs.map +1 -0
  258. package/dist/plugins/coin/registry.d.mts +1 -0
  259. package/dist/plugins/coin/registry.mjs +37 -0
  260. package/dist/plugins/coin/registry.mjs.map +1 -0
  261. package/dist/plugins/coin/service.d.mts +47 -0
  262. package/dist/plugins/coin/service.mjs +51 -0
  263. package/dist/plugins/coin/service.mjs.map +1 -0
  264. package/dist/plugins/coin/snapshot.mjs +19 -0
  265. package/dist/plugins/coin/snapshot.mjs.map +1 -0
  266. package/dist/plugins/coin/type-strings.mjs +49 -0
  267. package/dist/plugins/coin/type-strings.mjs.map +1 -0
  268. package/dist/plugins/deepbook/codegen.d.mts +39 -0
  269. package/dist/plugins/deepbook/codegen.mjs +15 -0
  270. package/dist/plugins/deepbook/codegen.mjs.map +1 -0
  271. package/dist/plugins/deepbook/deploy.mjs +437 -0
  272. package/dist/plugins/deepbook/deploy.mjs.map +1 -0
  273. package/dist/plugins/deepbook/errors.d.mts +29 -0
  274. package/dist/plugins/deepbook/errors.mjs +26 -0
  275. package/dist/plugins/deepbook/errors.mjs.map +1 -0
  276. package/dist/plugins/deepbook/faucet-strategy.d.mts +8 -0
  277. package/dist/plugins/deepbook/faucet-strategy.mjs +81 -0
  278. package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -0
  279. package/dist/plugins/deepbook/index.d.mts +171 -0
  280. package/dist/plugins/deepbook/index.mjs +359 -0
  281. package/dist/plugins/deepbook/index.mjs.map +1 -0
  282. package/dist/plugins/deepbook/plugin-key.mjs +7 -0
  283. package/dist/plugins/deepbook/plugin-key.mjs.map +1 -0
  284. package/dist/plugins/deepbook/pyth/index.mjs +226 -0
  285. package/dist/plugins/deepbook/pyth/index.mjs.map +1 -0
  286. package/dist/plugins/deepbook/routable.mjs +21 -0
  287. package/dist/plugins/deepbook/routable.mjs.map +1 -0
  288. package/dist/plugins/deepbook/snapshot.mjs +49 -0
  289. package/dist/plugins/deepbook/snapshot.mjs.map +1 -0
  290. package/dist/plugins/deepbook/types.d.mts +125 -0
  291. package/dist/plugins/deepbook/types.mjs +12 -0
  292. package/dist/plugins/deepbook/types.mjs.map +1 -0
  293. package/dist/plugins/faucet/dispatcher.d.mts +9 -0
  294. package/dist/plugins/faucet/dispatcher.mjs +13 -0
  295. package/dist/plugins/faucet/dispatcher.mjs.map +1 -0
  296. package/dist/plugins/faucet/errors.d.mts +86 -0
  297. package/dist/plugins/faucet/errors.mjs +19 -0
  298. package/dist/plugins/faucet/errors.mjs.map +1 -0
  299. package/dist/plugins/faucet/http.mjs +127 -0
  300. package/dist/plugins/faucet/http.mjs.map +1 -0
  301. package/dist/plugins/faucet/index.d.mts +43 -0
  302. package/dist/plugins/faucet/index.mjs +42 -0
  303. package/dist/plugins/faucet/index.mjs.map +1 -0
  304. package/dist/plugins/faucet/service.d.mts +20 -0
  305. package/dist/plugins/faucet/strategies/sui-local.d.mts +23 -0
  306. package/dist/plugins/faucet/strategies/sui-local.mjs +29 -0
  307. package/dist/plugins/faucet/strategies/sui-local.mjs.map +1 -0
  308. package/dist/plugins/host-service/errors.d.mts +27 -0
  309. package/dist/plugins/host-service/errors.mjs +14 -0
  310. package/dist/plugins/host-service/errors.mjs.map +1 -0
  311. package/dist/plugins/host-service/index.d.mts +10 -0
  312. package/dist/plugins/host-service/index.mjs +48 -0
  313. package/dist/plugins/host-service/index.mjs.map +1 -0
  314. package/dist/plugins/host-service/routable.mjs +24 -0
  315. package/dist/plugins/host-service/routable.mjs.map +1 -0
  316. package/dist/plugins/host-service/service.d.mts +49 -0
  317. package/dist/plugins/host-service/service.mjs +375 -0
  318. package/dist/plugins/host-service/service.mjs.map +1 -0
  319. package/dist/plugins/package/build.d.mts +1 -0
  320. package/dist/plugins/package/build.mjs +24 -0
  321. package/dist/plugins/package/build.mjs.map +1 -0
  322. package/dist/plugins/package/codegen.d.mts +19 -0
  323. package/dist/plugins/package/codegen.mjs +41 -0
  324. package/dist/plugins/package/codegen.mjs.map +1 -0
  325. package/dist/plugins/package/dep-resolution.mjs +10 -0
  326. package/dist/plugins/package/dep-resolution.mjs.map +1 -0
  327. package/dist/plugins/package/errors.d.mts +34 -0
  328. package/dist/plugins/package/errors.mjs +13 -0
  329. package/dist/plugins/package/errors.mjs.map +1 -0
  330. package/dist/plugins/package/index.d.mts +109 -0
  331. package/dist/plugins/package/index.mjs +207 -0
  332. package/dist/plugins/package/index.mjs.map +1 -0
  333. package/dist/plugins/package/mode-known.mjs +41 -0
  334. package/dist/plugins/package/mode-known.mjs.map +1 -0
  335. package/dist/plugins/package/mode-local.d.mts +1 -0
  336. package/dist/plugins/package/mode-local.mjs +183 -0
  337. package/dist/plugins/package/mode-local.mjs.map +1 -0
  338. package/dist/plugins/package/publish-executor.mjs +202 -0
  339. package/dist/plugins/package/publish-executor.mjs.map +1 -0
  340. package/dist/plugins/package/publish-output.d.mts +28 -0
  341. package/dist/plugins/package/publish-output.mjs +45 -0
  342. package/dist/plugins/package/publish-output.mjs.map +1 -0
  343. package/dist/plugins/package/registry.d.mts +25 -0
  344. package/dist/plugins/package/registry.mjs +30 -0
  345. package/dist/plugins/package/registry.mjs.map +1 -0
  346. package/dist/plugins/package/service.mjs +20 -0
  347. package/dist/plugins/package/service.mjs.map +1 -0
  348. package/dist/plugins/package/snapshot.mjs +25 -0
  349. package/dist/plugins/package/snapshot.mjs.map +1 -0
  350. package/dist/plugins/postgres/codegen.mjs +42 -0
  351. package/dist/plugins/postgres/codegen.mjs.map +1 -0
  352. package/dist/plugins/postgres/connection.d.mts +33 -0
  353. package/dist/plugins/postgres/connection.mjs +19 -0
  354. package/dist/plugins/postgres/connection.mjs.map +1 -0
  355. package/dist/plugins/postgres/db-ensure.mjs +100 -0
  356. package/dist/plugins/postgres/db-ensure.mjs.map +1 -0
  357. package/dist/plugins/postgres/errors.d.mts +55 -0
  358. package/dist/plugins/postgres/errors.mjs +29 -0
  359. package/dist/plugins/postgres/errors.mjs.map +1 -0
  360. package/dist/plugins/postgres/index.d.mts +37 -0
  361. package/dist/plugins/postgres/index.mjs +75 -0
  362. package/dist/plugins/postgres/index.mjs.map +1 -0
  363. package/dist/plugins/postgres/routable.mjs +33 -0
  364. package/dist/plugins/postgres/routable.mjs.map +1 -0
  365. package/dist/plugins/postgres/service.d.mts +50 -0
  366. package/dist/plugins/postgres/service.mjs +145 -0
  367. package/dist/plugins/postgres/service.mjs.map +1 -0
  368. package/dist/plugins/postgres/snapshot.d.mts +1 -0
  369. package/dist/plugins/postgres/snapshot.mjs +32 -0
  370. package/dist/plugins/postgres/snapshot.mjs.map +1 -0
  371. package/dist/plugins/router-entrypoints.mjs +21 -0
  372. package/dist/plugins/router-entrypoints.mjs.map +1 -0
  373. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +59 -0
  374. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -0
  375. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +132 -0
  376. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -0
  377. package/dist/plugins/seal/codegen.d.mts +19 -0
  378. package/dist/plugins/seal/codegen.mjs +16 -0
  379. package/dist/plugins/seal/codegen.mjs.map +1 -0
  380. package/dist/plugins/seal/config-render.mjs +82 -0
  381. package/dist/plugins/seal/config-render.mjs.map +1 -0
  382. package/dist/plugins/seal/deploy.mjs +198 -0
  383. package/dist/plugins/seal/deploy.mjs.map +1 -0
  384. package/dist/plugins/seal/errors.d.mts +52 -0
  385. package/dist/plugins/seal/errors.mjs +19 -0
  386. package/dist/plugins/seal/errors.mjs.map +1 -0
  387. package/dist/plugins/seal/index.d.mts +161 -0
  388. package/dist/plugins/seal/index.mjs +235 -0
  389. package/dist/plugins/seal/index.mjs.map +1 -0
  390. package/dist/plugins/seal/key-manager.d.mts +22 -0
  391. package/dist/plugins/seal/key-manager.mjs +22 -0
  392. package/dist/plugins/seal/key-manager.mjs.map +1 -0
  393. package/dist/plugins/seal/key-server.mjs +175 -0
  394. package/dist/plugins/seal/key-server.mjs.map +1 -0
  395. package/dist/plugins/seal/keygen.mjs +96 -0
  396. package/dist/plugins/seal/keygen.mjs.map +1 -0
  397. package/dist/plugins/seal/mode/fork-known.d.mts +8 -0
  398. package/dist/plugins/seal/mode/fork-known.mjs +23 -0
  399. package/dist/plugins/seal/mode/fork-known.mjs.map +1 -0
  400. package/dist/plugins/seal/mode/live.d.mts +18 -0
  401. package/dist/plugins/seal/mode/live.mjs +64 -0
  402. package/dist/plugins/seal/mode/live.mjs.map +1 -0
  403. package/dist/plugins/seal/mode/local-keygen.mjs +180 -0
  404. package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -0
  405. package/dist/plugins/seal/plugin-key.mjs +7 -0
  406. package/dist/plugins/seal/plugin-key.mjs.map +1 -0
  407. package/dist/plugins/seal/registry-publish.d.mts +43 -0
  408. package/dist/plugins/seal/registry-publish.mjs +9 -0
  409. package/dist/plugins/seal/registry-publish.mjs.map +1 -0
  410. package/dist/plugins/seal/routable.mjs +57 -0
  411. package/dist/plugins/seal/routable.mjs.map +1 -0
  412. package/dist/plugins/seal/service.mjs +17 -0
  413. package/dist/plugins/seal/service.mjs.map +1 -0
  414. package/dist/plugins/seal/snapshot.mjs +51 -0
  415. package/dist/plugins/seal/snapshot.mjs.map +1 -0
  416. package/dist/plugins/sui/auto-tick.mjs +45 -0
  417. package/dist/plugins/sui/auto-tick.mjs.map +1 -0
  418. package/dist/plugins/sui/chain-build-container.d.mts +1 -0
  419. package/dist/plugins/sui/chain-probe.d.mts +85 -0
  420. package/dist/plugins/sui/chain-probe.mjs +104 -0
  421. package/dist/plugins/sui/chain-probe.mjs.map +1 -0
  422. package/dist/plugins/sui/codegen.d.mts +14 -0
  423. package/dist/plugins/sui/codegen.mjs +26 -0
  424. package/dist/plugins/sui/codegen.mjs.map +1 -0
  425. package/dist/plugins/sui/errors.d.mts +74 -0
  426. package/dist/plugins/sui/errors.mjs +28 -0
  427. package/dist/plugins/sui/errors.mjs.map +1 -0
  428. package/dist/plugins/sui/fork-orchestration.mjs +24 -0
  429. package/dist/plugins/sui/fork-orchestration.mjs.map +1 -0
  430. package/dist/plugins/sui/fork-transaction.mjs +96 -0
  431. package/dist/plugins/sui/fork-transaction.mjs.map +1 -0
  432. package/dist/plugins/sui/index.d.mts +318 -0
  433. package/dist/plugins/sui/index.mjs +182 -0
  434. package/dist/plugins/sui/index.mjs.map +1 -0
  435. package/dist/plugins/sui/mode/external.mjs +60 -0
  436. package/dist/plugins/sui/mode/external.mjs.map +1 -0
  437. package/dist/plugins/sui/mode/fork.mjs +283 -0
  438. package/dist/plugins/sui/mode/fork.mjs.map +1 -0
  439. package/dist/plugins/sui/mode/live.mjs +103 -0
  440. package/dist/plugins/sui/mode/live.mjs.map +1 -0
  441. package/dist/plugins/sui/mode/local.mjs +293 -0
  442. package/dist/plugins/sui/mode/local.mjs.map +1 -0
  443. package/dist/plugins/sui/mode/shared-boot.mjs +254 -0
  444. package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -0
  445. package/dist/plugins/sui/mode/shared.d.mts +103 -0
  446. package/dist/plugins/sui/mode/shared.mjs +12 -0
  447. package/dist/plugins/sui/mode/shared.mjs.map +1 -0
  448. package/dist/plugins/sui/mode/spec.d.mts +94 -0
  449. package/dist/plugins/sui/network-resolver.d.mts +23 -0
  450. package/dist/plugins/sui/routable.mjs +88 -0
  451. package/dist/plugins/sui/routable.mjs.map +1 -0
  452. package/dist/plugins/sui/seed-objects.d.mts +18 -0
  453. package/dist/plugins/sui/seed-objects.mjs +25 -0
  454. package/dist/plugins/sui/seed-objects.mjs.map +1 -0
  455. package/dist/plugins/sui/service.mjs +38 -0
  456. package/dist/plugins/sui/service.mjs.map +1 -0
  457. package/dist/plugins/sui/snapshot.mjs +53 -0
  458. package/dist/plugins/sui/snapshot.mjs.map +1 -0
  459. package/dist/plugins/wallet/codegen.d.mts +33 -0
  460. package/dist/plugins/wallet/codegen.mjs +34 -0
  461. package/dist/plugins/wallet/codegen.mjs.map +1 -0
  462. package/dist/plugins/wallet/errors.d.mts +66 -0
  463. package/dist/plugins/wallet/errors.mjs +16 -0
  464. package/dist/plugins/wallet/errors.mjs.map +1 -0
  465. package/dist/plugins/wallet/index.d.mts +63 -0
  466. package/dist/plugins/wallet/index.mjs +126 -0
  467. package/dist/plugins/wallet/index.mjs.map +1 -0
  468. package/dist/plugins/wallet/origin-policy.d.mts +1 -0
  469. package/dist/plugins/wallet/origin-policy.mjs +65 -0
  470. package/dist/plugins/wallet/origin-policy.mjs.map +1 -0
  471. package/dist/plugins/wallet/pairing.d.mts +11 -0
  472. package/dist/plugins/wallet/pairing.mjs +125 -0
  473. package/dist/plugins/wallet/pairing.mjs.map +1 -0
  474. package/dist/plugins/wallet/protocol.d.mts +1 -0
  475. package/dist/plugins/wallet/protocol.mjs +96 -0
  476. package/dist/plugins/wallet/protocol.mjs.map +1 -0
  477. package/dist/plugins/wallet/routable.mjs +32 -0
  478. package/dist/plugins/wallet/routable.mjs.map +1 -0
  479. package/dist/plugins/wallet/server.d.mts +12 -0
  480. package/dist/plugins/wallet/server.mjs +317 -0
  481. package/dist/plugins/wallet/server.mjs.map +1 -0
  482. package/dist/plugins/wallet/service.d.mts +68 -0
  483. package/dist/plugins/wallet/service.mjs +97 -0
  484. package/dist/plugins/wallet/service.mjs.map +1 -0
  485. package/dist/plugins/wallet/snapshot.d.mts +1 -0
  486. package/dist/plugins/wallet/snapshot.mjs +14 -0
  487. package/dist/plugins/wallet/snapshot.mjs.map +1 -0
  488. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +42 -0
  489. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -0
  490. package/dist/plugins/walrus/codegen.d.mts +38 -0
  491. package/dist/plugins/walrus/codegen.mjs +34 -0
  492. package/dist/plugins/walrus/codegen.mjs.map +1 -0
  493. package/dist/plugins/walrus/deploy-paths.mjs +14 -0
  494. package/dist/plugins/walrus/deploy-paths.mjs.map +1 -0
  495. package/dist/plugins/walrus/deploy.d.mts +1 -0
  496. package/dist/plugins/walrus/deploy.mjs +224 -0
  497. package/dist/plugins/walrus/deploy.mjs.map +1 -0
  498. package/dist/plugins/walrus/errors.d.mts +38 -0
  499. package/dist/plugins/walrus/errors.mjs +26 -0
  500. package/dist/plugins/walrus/errors.mjs.map +1 -0
  501. package/dist/plugins/walrus/faucet-strategy.d.mts +12 -0
  502. package/dist/plugins/walrus/faucet-strategy.mjs +62 -0
  503. package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -0
  504. package/dist/plugins/walrus/index.d.mts +177 -0
  505. package/dist/plugins/walrus/index.mjs +284 -0
  506. package/dist/plugins/walrus/index.mjs.map +1 -0
  507. package/dist/plugins/walrus/mode/known-deploy.d.mts +25 -0
  508. package/dist/plugins/walrus/mode/known-deploy.mjs +71 -0
  509. package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -0
  510. package/dist/plugins/walrus/mode/local-cluster.d.mts +34 -0
  511. package/dist/plugins/walrus/mode/local-cluster.mjs +153 -0
  512. package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -0
  513. package/dist/plugins/walrus/plugin-key.mjs +7 -0
  514. package/dist/plugins/walrus/plugin-key.mjs.map +1 -0
  515. package/dist/plugins/walrus/registry-publish.d.mts +24 -0
  516. package/dist/plugins/walrus/registry-publish.mjs +7 -0
  517. package/dist/plugins/walrus/registry-publish.mjs.map +1 -0
  518. package/dist/plugins/walrus/routable.mjs +99 -0
  519. package/dist/plugins/walrus/routable.mjs.map +1 -0
  520. package/dist/plugins/walrus/service.mjs +20 -0
  521. package/dist/plugins/walrus/service.mjs.map +1 -0
  522. package/dist/plugins/walrus/snapshot.mjs +53 -0
  523. package/dist/plugins/walrus/snapshot.mjs.map +1 -0
  524. package/dist/plugins/walrus/storage-nodes.d.mts +15 -0
  525. package/dist/plugins/walrus/storage-nodes.mjs +154 -0
  526. package/dist/plugins/walrus/storage-nodes.mjs.map +1 -0
  527. package/dist/plugins/walrus/wal-swap.d.mts +2 -0
  528. package/dist/plugins/walrus/wal-swap.mjs +58 -0
  529. package/dist/plugins/walrus/wal-swap.mjs.map +1 -0
  530. package/dist/primitives/artifact-publisher.d.mts +12 -0
  531. package/dist/primitives/cache.d.mts +1 -0
  532. package/dist/runtime/built-in-plugin-layers.mjs +49 -0
  533. package/dist/runtime/built-in-plugin-layers.mjs.map +1 -0
  534. package/dist/runtime/docker/client.d.mts +2 -0
  535. package/dist/runtime/docker/client.mjs +54 -0
  536. package/dist/runtime/docker/client.mjs.map +1 -0
  537. package/dist/runtime/docker/container.d.mts +1 -0
  538. package/dist/runtime/docker/container.mjs +562 -0
  539. package/dist/runtime/docker/container.mjs.map +1 -0
  540. package/dist/runtime/docker/errors.d.mts +1 -0
  541. package/dist/runtime/docker/errors.mjs +187 -0
  542. package/dist/runtime/docker/errors.mjs.map +1 -0
  543. package/dist/runtime/docker/exec.d.mts +1 -0
  544. package/dist/runtime/docker/exec.mjs +63 -0
  545. package/dist/runtime/docker/exec.mjs.map +1 -0
  546. package/dist/runtime/docker/image.d.mts +1 -0
  547. package/dist/runtime/docker/image.mjs +278 -0
  548. package/dist/runtime/docker/image.mjs.map +1 -0
  549. package/dist/runtime/docker/index.d.mts +1 -0
  550. package/dist/runtime/docker/inventory.d.mts +1 -0
  551. package/dist/runtime/docker/inventory.mjs +167 -0
  552. package/dist/runtime/docker/inventory.mjs.map +1 -0
  553. package/dist/runtime/docker/labels.d.mts +1 -0
  554. package/dist/runtime/docker/labels.mjs +97 -0
  555. package/dist/runtime/docker/labels.mjs.map +1 -0
  556. package/dist/runtime/docker/logs.d.mts +1 -0
  557. package/dist/runtime/docker/logs.mjs +34 -0
  558. package/dist/runtime/docker/logs.mjs.map +1 -0
  559. package/dist/runtime/docker/network.d.mts +1 -0
  560. package/dist/runtime/docker/network.mjs +168 -0
  561. package/dist/runtime/docker/network.mjs.map +1 -0
  562. package/dist/runtime/docker/service.d.mts +9 -0
  563. package/dist/runtime/docker/service.mjs +266 -0
  564. package/dist/runtime/docker/service.mjs.map +1 -0
  565. package/dist/runtime/docker/sweep.d.mts +1 -0
  566. package/dist/runtime/docker/sweep.mjs +220 -0
  567. package/dist/runtime/docker/sweep.mjs.map +1 -0
  568. package/dist/runtime/docker/volume.d.mts +1 -0
  569. package/dist/runtime/docker/volume.mjs +24 -0
  570. package/dist/runtime/docker/volume.mjs.map +1 -0
  571. package/dist/runtime/docker/wrap.d.mts +1 -0
  572. package/dist/runtime/docker/wrap.mjs +131 -0
  573. package/dist/runtime/docker/wrap.mjs.map +1 -0
  574. package/dist/substrate/brand.d.mts +24 -0
  575. package/dist/substrate/brand.mjs +14 -0
  576. package/dist/substrate/brand.mjs.map +1 -0
  577. package/dist/substrate/cross-process.d.mts +1 -0
  578. package/dist/substrate/cross-process.mjs +28 -0
  579. package/dist/substrate/cross-process.mjs.map +1 -0
  580. package/dist/substrate/events.d.mts +117 -0
  581. package/dist/substrate/identity.d.mts +13 -0
  582. package/dist/substrate/lifecycle.d.mts +12 -0
  583. package/dist/substrate/manifest.d.mts +39 -0
  584. package/dist/substrate/manifest.mjs +33 -0
  585. package/dist/substrate/manifest.mjs.map +1 -0
  586. package/dist/substrate/network.d.mts +34 -0
  587. package/dist/substrate/options.d.mts +23 -0
  588. package/dist/substrate/plugin.d.mts +101 -0
  589. package/dist/substrate/plugin.mjs +61 -0
  590. package/dist/substrate/plugin.mjs.map +1 -0
  591. package/dist/substrate/projection.d.mts +100 -0
  592. package/dist/substrate/runtime/artifact-publisher/index.mjs +76 -0
  593. package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -0
  594. package/dist/substrate/runtime/atomic-write.mjs +106 -0
  595. package/dist/substrate/runtime/atomic-write.mjs.map +1 -0
  596. package/dist/substrate/runtime/cache/index.d.mts +1 -0
  597. package/dist/substrate/runtime/cache/schema.d.mts +1 -0
  598. package/dist/substrate/runtime/cache/schema.mjs +22 -0
  599. package/dist/substrate/runtime/cache/schema.mjs.map +1 -0
  600. package/dist/substrate/runtime/cache/service.d.mts +1 -0
  601. package/dist/substrate/runtime/cache/service.mjs +89 -0
  602. package/dist/substrate/runtime/cache/service.mjs.map +1 -0
  603. package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -0
  604. package/dist/substrate/runtime/capability-sinks/layer.d.mts +1 -0
  605. package/dist/substrate/runtime/capability-sinks/layer.mjs +31 -0
  606. package/dist/substrate/runtime/capability-sinks/layer.mjs.map +1 -0
  607. package/dist/substrate/runtime/capability-sinks/service.d.mts +36 -0
  608. package/dist/substrate/runtime/capability-sinks/service.mjs +74 -0
  609. package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -0
  610. package/dist/substrate/runtime/config-validation.d.mts +38 -0
  611. package/dist/substrate/runtime/config-validation.mjs +137 -0
  612. package/dist/substrate/runtime/config-validation.mjs.map +1 -0
  613. package/dist/substrate/runtime/context-helpers.mjs +32 -0
  614. package/dist/substrate/runtime/context-helpers.mjs.map +1 -0
  615. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +128 -0
  616. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -0
  617. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +136 -0
  618. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -0
  619. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +49 -0
  620. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -0
  621. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +9 -0
  622. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -0
  623. package/dist/substrate/runtime/cross-process/liveness.mjs +119 -0
  624. package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -0
  625. package/dist/substrate/runtime/cross-process/roster.mjs +275 -0
  626. package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -0
  627. package/dist/substrate/runtime/cross-process/snapshot-reservation.d.mts +1 -0
  628. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +117 -0
  629. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -0
  630. package/dist/substrate/runtime/cross-process/stack-lock.d.mts +1 -0
  631. package/dist/substrate/runtime/cross-process/stack-lock.mjs +142 -0
  632. package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -0
  633. package/dist/substrate/runtime/current-plugin.mjs +15 -0
  634. package/dist/substrate/runtime/current-plugin.mjs.map +1 -0
  635. package/dist/substrate/runtime/errors.d.mts +1 -0
  636. package/dist/substrate/runtime/errors.mjs +76 -0
  637. package/dist/substrate/runtime/errors.mjs.map +1 -0
  638. package/dist/substrate/runtime/host-tree-tar/index.mjs +364 -0
  639. package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -0
  640. package/dist/substrate/runtime/http-probe.d.mts +35 -0
  641. package/dist/substrate/runtime/http-probe.mjs +65 -0
  642. package/dist/substrate/runtime/http-probe.mjs.map +1 -0
  643. package/dist/substrate/runtime/lease-broker/index.d.mts +1 -0
  644. package/dist/substrate/runtime/lease-broker/service.d.mts +64 -0
  645. package/dist/substrate/runtime/lease-broker/service.mjs +155 -0
  646. package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -0
  647. package/dist/substrate/runtime/lifecycle/dep-graph.d.mts +1 -0
  648. package/dist/substrate/runtime/lifecycle/dep-graph.mjs +138 -0
  649. package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -0
  650. package/dist/substrate/runtime/lifecycle/index.d.mts +1 -0
  651. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +31 -0
  652. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -0
  653. package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -0
  654. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +133 -0
  655. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -0
  656. package/dist/substrate/runtime/lifecycle/ready-gate.d.mts +1 -0
  657. package/dist/substrate/runtime/lifecycle/ready-gate.mjs +34 -0
  658. package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -0
  659. package/dist/substrate/runtime/lifecycle/selective-restart.d.mts +1 -0
  660. package/dist/substrate/runtime/lifecycle/selective-restart.mjs +43 -0
  661. package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -0
  662. package/dist/substrate/runtime/lifecycle/signals.d.mts +1 -0
  663. package/dist/substrate/runtime/lifecycle/signals.mjs +64 -0
  664. package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -0
  665. package/dist/substrate/runtime/lifecycle/state-machine.d.mts +1 -0
  666. package/dist/substrate/runtime/lifecycle/state-machine.mjs +38 -0
  667. package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -0
  668. package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -0
  669. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +27 -0
  670. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -0
  671. package/dist/substrate/runtime/managed-container.d.mts +30 -0
  672. package/dist/substrate/runtime/managed-container.mjs +32 -0
  673. package/dist/substrate/runtime/managed-container.mjs.map +1 -0
  674. package/dist/substrate/runtime/manifest/manifest.mjs +73 -0
  675. package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -0
  676. package/dist/substrate/runtime/mode-errors.d.mts +36 -0
  677. package/dist/substrate/runtime/observability/cascade-formatter.d.mts +1 -0
  678. package/dist/substrate/runtime/observability/cascade-formatter.mjs +135 -0
  679. package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -0
  680. package/dist/substrate/runtime/observability/formatter-registry.d.mts +1 -0
  681. package/dist/substrate/runtime/observability/formatter-registry.mjs +65 -0
  682. package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -0
  683. package/dist/substrate/runtime/observability/index.d.mts +3 -0
  684. package/dist/substrate/runtime/observability/logger.d.mts +58 -0
  685. package/dist/substrate/runtime/observability/logger.mjs +89 -0
  686. package/dist/substrate/runtime/observability/logger.mjs.map +1 -0
  687. package/dist/substrate/runtime/observability/pretty-error.d.mts +1 -0
  688. package/dist/substrate/runtime/observability/pretty-error.mjs +119 -0
  689. package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -0
  690. package/dist/substrate/runtime/observability/process-lines.d.mts +31 -0
  691. package/dist/substrate/runtime/observability/process-lines.mjs +40 -0
  692. package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -0
  693. package/dist/substrate/runtime/observability/redaction.d.mts +28 -0
  694. package/dist/substrate/runtime/observability/redaction.mjs +45 -0
  695. package/dist/substrate/runtime/observability/redaction.mjs.map +1 -0
  696. package/dist/substrate/runtime/observability/spans.d.mts +1 -0
  697. package/dist/substrate/runtime/observability/spans.mjs +87 -0
  698. package/dist/substrate/runtime/observability/spans.mjs.map +1 -0
  699. package/dist/substrate/runtime/observability/subprocess-capture.d.mts +2 -0
  700. package/dist/substrate/runtime/observability/subprocess-capture.mjs +82 -0
  701. package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -0
  702. package/dist/substrate/runtime/paths.d.mts +17 -0
  703. package/dist/substrate/runtime/paths.mjs +61 -0
  704. package/dist/substrate/runtime/paths.mjs.map +1 -0
  705. package/dist/substrate/runtime/port-broker/index.d.mts +1 -0
  706. package/dist/substrate/runtime/port-broker/service.d.mts +1 -0
  707. package/dist/substrate/runtime/port-broker/service.mjs +319 -0
  708. package/dist/substrate/runtime/port-broker/service.mjs.map +1 -0
  709. package/dist/substrate/runtime/post-acquire-tasks.d.mts +1 -0
  710. package/dist/substrate/runtime/post-acquire-tasks.mjs +34 -0
  711. package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -0
  712. package/dist/substrate/runtime/probes.d.mts +51 -0
  713. package/dist/substrate/runtime/probes.mjs +84 -0
  714. package/dist/substrate/runtime/probes.mjs.map +1 -0
  715. package/dist/substrate/runtime/process-supervisor.d.mts +57 -0
  716. package/dist/substrate/runtime/process-supervisor.mjs +73 -0
  717. package/dist/substrate/runtime/process-supervisor.mjs.map +1 -0
  718. package/dist/substrate/runtime/projection/operational-endpoints.mjs +44 -0
  719. package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -0
  720. package/dist/substrate/runtime/projection/persisted.mjs +195 -0
  721. package/dist/substrate/runtime/projection/persisted.mjs.map +1 -0
  722. package/dist/substrate/runtime/projection/state-ref.mjs +48 -0
  723. package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -0
  724. package/dist/substrate/runtime/projection/update.mjs +200 -0
  725. package/dist/substrate/runtime/projection/update.mjs.map +1 -0
  726. package/dist/substrate/runtime/retry-policy.d.mts +18 -0
  727. package/dist/substrate/runtime/retry-policy.mjs +16 -0
  728. package/dist/substrate/runtime/retry-policy.mjs.map +1 -0
  729. package/dist/substrate/runtime/run.mjs +86 -0
  730. package/dist/substrate/runtime/run.mjs.map +1 -0
  731. package/dist/substrate/runtime/runtime-decode.d.mts +32 -0
  732. package/dist/substrate/runtime/runtime-decode.mjs +53 -0
  733. package/dist/substrate/runtime/runtime-decode.mjs.map +1 -0
  734. package/dist/substrate/runtime/scoped-http-server.mjs +36 -0
  735. package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -0
  736. package/dist/substrate/runtime/scoped-ref-map/service.mjs +83 -0
  737. package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -0
  738. package/dist/substrate/runtime/stage-and-swap/index.d.mts +1 -0
  739. package/dist/substrate/runtime/stage-and-swap/index.mjs +131 -0
  740. package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -0
  741. package/dist/substrate/runtime/state-store/schema.mjs +36 -0
  742. package/dist/substrate/runtime/state-store/schema.mjs.map +1 -0
  743. package/dist/substrate/runtime/strategy-registry/chain-probe-for.d.mts +1 -0
  744. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +22 -0
  745. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -0
  746. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.d.mts +1 -0
  747. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +30 -0
  748. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +1 -0
  749. package/dist/substrate/runtime/strategy-registry/index.d.mts +1 -0
  750. package/dist/substrate/runtime/strategy-registry/service.d.mts +1 -0
  751. package/dist/substrate/runtime/strategy-registry/service.mjs +67 -0
  752. package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -0
  753. package/dist/substrate/runtime/sui-execute/index.d.mts +11 -0
  754. package/dist/substrate/runtime/sui-execute/index.mjs +144 -0
  755. package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -0
  756. package/dist/substrate/runtime/sui-move-build/index.d.mts +1 -0
  757. package/dist/substrate/runtime/sui-move-build/index.mjs +283 -0
  758. package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -0
  759. package/dist/substrate/runtime/supervisor.d.mts +1 -0
  760. package/dist/substrate/runtime/supervisor.mjs +831 -0
  761. package/dist/substrate/runtime/supervisor.mjs.map +1 -0
  762. package/dist/surfaces/cli/command-tree.mjs +276 -0
  763. package/dist/surfaces/cli/command-tree.mjs.map +1 -0
  764. package/dist/surfaces/cli/commands/config.mjs +31 -0
  765. package/dist/surfaces/cli/commands/config.mjs.map +1 -0
  766. package/dist/surfaces/cli/commands/confirm-node.mjs +26 -0
  767. package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -0
  768. package/dist/surfaces/cli/commands/confirm.mjs +26 -0
  769. package/dist/surfaces/cli/commands/confirm.mjs.map +1 -0
  770. package/dist/surfaces/cli/commands/doctor-probes.mjs +452 -0
  771. package/dist/surfaces/cli/commands/doctor-probes.mjs.map +1 -0
  772. package/dist/surfaces/cli/commands/doctor.mjs +38 -0
  773. package/dist/surfaces/cli/commands/doctor.mjs.map +1 -0
  774. package/dist/surfaces/cli/commands/prune-picker.mjs +347 -0
  775. package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -0
  776. package/dist/surfaces/cli/commands/prune.mjs +178 -0
  777. package/dist/surfaces/cli/commands/prune.mjs.map +1 -0
  778. package/dist/surfaces/cli/commands/snapshot.mjs +141 -0
  779. package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -0
  780. package/dist/surfaces/cli/commands/status.mjs +95 -0
  781. package/dist/surfaces/cli/commands/status.mjs.map +1 -0
  782. package/dist/surfaces/cli/commands/supervisor-presence.mjs +33 -0
  783. package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -0
  784. package/dist/surfaces/cli/commands/wipe.mjs +28 -0
  785. package/dist/surfaces/cli/commands/wipe.mjs.map +1 -0
  786. package/dist/surfaces/cli/envelope.mjs +43 -0
  787. package/dist/surfaces/cli/envelope.mjs.map +1 -0
  788. package/dist/surfaces/cli/errors.mjs +110 -0
  789. package/dist/surfaces/cli/errors.mjs.map +1 -0
  790. package/dist/surfaces/cli/flags.mjs +56 -0
  791. package/dist/surfaces/cli/flags.mjs.map +1 -0
  792. package/dist/surfaces/cli/index.mjs +418 -0
  793. package/dist/surfaces/cli/index.mjs.map +1 -0
  794. package/dist/surfaces/cli/output.mjs +115 -0
  795. package/dist/surfaces/cli/output.mjs.map +1 -0
  796. package/dist/surfaces/cli/sysexits.mjs +139 -0
  797. package/dist/surfaces/cli/sysexits.mjs.map +1 -0
  798. package/dist/surfaces/tui/app.mjs +104 -0
  799. package/dist/surfaces/tui/app.mjs.map +1 -0
  800. package/dist/surfaces/tui/dashboard.mjs +261 -0
  801. package/dist/surfaces/tui/dashboard.mjs.map +1 -0
  802. package/dist/surfaces/tui/display-derivation.mjs +395 -0
  803. package/dist/surfaces/tui/display-derivation.mjs.map +1 -0
  804. package/dist/surfaces/tui/errors.mjs +11 -0
  805. package/dist/surfaces/tui/errors.mjs.map +1 -0
  806. package/dist/surfaces/tui/event-log.mjs +155 -0
  807. package/dist/surfaces/tui/event-log.mjs.map +1 -0
  808. package/dist/surfaces/tui/heartbeat.mjs +33 -0
  809. package/dist/surfaces/tui/heartbeat.mjs.map +1 -0
  810. package/dist/surfaces/tui/index.mjs +50 -0
  811. package/dist/surfaces/tui/index.mjs.map +1 -0
  812. package/dist/surfaces/tui/input.mjs +104 -0
  813. package/dist/surfaces/tui/input.mjs.map +1 -0
  814. package/dist/surfaces/tui/mode-detect.mjs +32 -0
  815. package/dist/surfaces/tui/mode-detect.mjs.map +1 -0
  816. package/dist/surfaces/tui/mount-ink.mjs +31 -0
  817. package/dist/surfaces/tui/mount-ink.mjs.map +1 -0
  818. package/dist/surfaces/tui/plain-renderer.mjs +170 -0
  819. package/dist/surfaces/tui/plain-renderer.mjs.map +1 -0
  820. package/dist/surfaces/tui/resource-table.mjs +507 -0
  821. package/dist/surfaces/tui/resource-table.mjs.map +1 -0
  822. package/images/_shared/signal-forward.sh +77 -0
  823. package/images/postgres/Dockerfile +32 -0
  824. package/images/seal/Dockerfile +68 -0
  825. package/images/seal/entrypoint.sh +65 -0
  826. package/images/sui/Dockerfile +73 -0
  827. package/images/sui/entrypoint.sh +244 -0
  828. package/images/sui-fork/Dockerfile +53 -0
  829. package/images/sui-fork/entrypoint.sh +51 -0
  830. package/images/walrus/Dockerfile +122 -0
  831. package/images/walrus/deploy-walrus.sh +305 -0
  832. package/images/walrus/run-walrus.sh +53 -0
  833. package/package.json +94 -0
@@ -0,0 +1,319 @@
1
+ import { RuntimeRoot } from "../paths.mjs";
2
+ import { RosterHolderSchema } from "../../cross-process.mjs";
3
+ import { checkHolderLiveness, ownHolder } from "../cross-process/liveness.mjs";
4
+ import { PortBrokerError } from "../errors.mjs";
5
+ import { decodeJsonTextSync } from "../runtime-decode.mjs";
6
+ import { Context, Effect, Layer, Ref, Schema } from "effect";
7
+ import { randomUUID } from "node:crypto";
8
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
9
+ import { createServer } from "node:net";
10
+ import { dirname, join } from "node:path";
11
+ //#region src/substrate/runtime/port-broker/service.ts
12
+ /** Allocation kind — drives the search-window starting port. Plugins
13
+ * pass a literal so a `wallet` allocation and a `rpc` allocation
14
+ * never collide on the same starting point.
15
+ *
16
+ * Extend `PORT_RANGES` below to add a new kind. The literal type is
17
+ * closed deliberately — agnostic-naming would invite plugins to
18
+ * freelance kinds (and overlap window starts unintentionally).
19
+ *
20
+ * Today's windows are sized for "tens of plugins per stack" with
21
+ * parallel-stack overhead headroom. Each window is 1000 ports; that's
22
+ * more than enough for any realistic in-process devstack, and the
23
+ * forward-scan only ever crosses a window boundary if EVERY port in
24
+ * the window is taken (effectively never on dev machines). */
25
+ const PORT_KINDS = [
26
+ "wallet",
27
+ "http",
28
+ "rpc",
29
+ "misc"
30
+ ];
31
+ /** Sequential search window per kind. The broker tries `preferredPort`
32
+ * first (if given), then `[start, start + window)` in order. */
33
+ const PORT_RANGES = {
34
+ wallet: {
35
+ start: 39200,
36
+ window: 1e3
37
+ },
38
+ http: {
39
+ start: 5e4,
40
+ window: 1e3
41
+ },
42
+ rpc: {
43
+ start: 51e3,
44
+ window: 1e3
45
+ },
46
+ misc: {
47
+ start: 52e3,
48
+ window: 1e3
49
+ }
50
+ };
51
+ const PORT_RESERVATION_VERSION = 1;
52
+ const PortReservationDocSchema = Schema.Struct({
53
+ version: Schema.Literal(PORT_RESERVATION_VERSION),
54
+ port: Schema.Number,
55
+ kind: Schema.Literals(PORT_KINDS),
56
+ ownerId: Schema.String,
57
+ holder: RosterHolderSchema
58
+ });
59
+ const portReservationPath = (root, port) => join(root, "port-locks", `${port}.json`);
60
+ const parseReservationDoc = (raw) => {
61
+ try {
62
+ return decodeJsonTextSync(PortReservationDocSchema, raw, {
63
+ source: "port reservation",
64
+ mkError: (issue) => issue
65
+ });
66
+ } catch {
67
+ return null;
68
+ }
69
+ };
70
+ const tryWriteReservationSync = (path, doc) => {
71
+ try {
72
+ mkdirSync(dirname(path), { recursive: true });
73
+ writeFileSync(path, `${JSON.stringify(doc)}\n`, {
74
+ flag: "wx",
75
+ mode: 384
76
+ });
77
+ return { _tag: "written" };
78
+ } catch (cause) {
79
+ if (cause.code !== "EEXIST") return {
80
+ _tag: "failed",
81
+ cause
82
+ };
83
+ if (!existsSync(path)) return { _tag: "race" };
84
+ try {
85
+ return {
86
+ _tag: "exists",
87
+ doc: parseReservationDoc(readFileSync(path, "utf8"))
88
+ };
89
+ } catch {
90
+ return {
91
+ _tag: "exists",
92
+ doc: null
93
+ };
94
+ }
95
+ }
96
+ };
97
+ const unlinkReservationIfOwnerSync = (path, ownerId) => {
98
+ try {
99
+ if (parseReservationDoc(readFileSync(path, "utf8"))?.ownerId === ownerId) unlinkSync(path);
100
+ } catch {}
101
+ };
102
+ const reclaimReservationIfOwnerSync = (path, ownerId) => {
103
+ try {
104
+ if (parseReservationDoc(readFileSync(path, "utf8"))?.ownerId !== ownerId) return false;
105
+ unlinkSync(path);
106
+ return true;
107
+ } catch {
108
+ return false;
109
+ }
110
+ };
111
+ const acquirePortReservation = (root, port, kind) => Effect.gen(function* () {
112
+ const path = portReservationPath(root, port);
113
+ const ownerId = `${process.pid}-${randomUUID().slice(0, 8)}`;
114
+ const doc = {
115
+ version: PORT_RESERVATION_VERSION,
116
+ port,
117
+ kind,
118
+ ownerId,
119
+ holder: ownHolder()
120
+ };
121
+ while (true) {
122
+ const attempt = tryWriteReservationSync(path, doc);
123
+ if (attempt._tag === "written") return {
124
+ _tag: "acquired",
125
+ reservation: {
126
+ path,
127
+ ownerId,
128
+ release: Effect.sync(() => unlinkReservationIfOwnerSync(path, ownerId))
129
+ }
130
+ };
131
+ if (attempt._tag === "race") continue;
132
+ if (attempt._tag === "failed") return {
133
+ _tag: "failed",
134
+ detail: `port reservation ${path} could not be written`,
135
+ cause: attempt.cause
136
+ };
137
+ if (attempt.doc === null) return { _tag: "busy" };
138
+ if ((yield* checkHolderLiveness(attempt.doc.holder).pipe(Effect.catch(() => Effect.succeed("alive")))) === "alive") return { _tag: "busy" };
139
+ if (!reclaimReservationIfOwnerSync(path, attempt.doc.ownerId)) return { _tag: "busy" };
140
+ }
141
+ });
142
+ var PortBrokerService = class extends Context.Service()("@devstack-rewrite/substrate/PortBroker") {};
143
+ /**
144
+ * Layer that materializes one `PortBroker` per stack scope.
145
+ *
146
+ * The broker's state lives in a `Ref` captured by the Layer's
147
+ * `Effect.gen`; closing the Layer's scope drops every allocation.
148
+ * Parallel stacks each get their own broker (Layer-driven), and they
149
+ * coordinate cross-process via runtime-root reservation files plus the
150
+ * kernel's bind table — never via shared in-process state.
151
+ */
152
+ const layerPortBroker = Layer.effect(PortBrokerService, Effect.gen(function* () {
153
+ const reservationRoot = (yield* RuntimeRoot).root;
154
+ const state = yield* Ref.make(/* @__PURE__ */ new Map());
155
+ const tryReserve = (port, kind, owner) => Ref.modify(state, (current) => {
156
+ if (current.has(port)) return [false, current];
157
+ const next = new Map(current);
158
+ next.set(port, {
159
+ kind,
160
+ owner
161
+ });
162
+ return [true, next];
163
+ });
164
+ const drop = (port) => Ref.update(state, (current) => {
165
+ if (!current.has(port)) return current;
166
+ const next = new Map(current);
167
+ next.delete(port);
168
+ return next;
169
+ });
170
+ const allocate = (opts) => Effect.gen(function* () {
171
+ const range = PORT_RANGES[opts.kind];
172
+ const owner = opts.kind;
173
+ const probeHost = opts.probeHost ?? "127.0.0.1";
174
+ if (opts.preferredPort !== void 0) {
175
+ if (!(yield* tryReserve(opts.preferredPort, opts.kind, owner))) return yield* Effect.fail(new PortBrokerError({
176
+ reason: "preferred-busy",
177
+ detail: `preferred port ${opts.preferredPort} (${opts.kind}) is already held by another allocation in this stack`
178
+ }));
179
+ const reservation = yield* acquirePortReservation(reservationRoot, opts.preferredPort, opts.kind);
180
+ if (reservation._tag === "busy") yield* drop(opts.preferredPort);
181
+ else if (reservation._tag === "failed") {
182
+ yield* drop(opts.preferredPort);
183
+ return yield* Effect.fail(new PortBrokerError({
184
+ reason: "reservation-failed",
185
+ detail: reservation.detail,
186
+ cause: reservation.cause
187
+ }));
188
+ } else {
189
+ const ok = yield* probePort(opts.preferredPort, probeHost);
190
+ if (ok._tag === "ok") return yield* finishAllocation(opts.preferredPort, opts.kind, drop, reservation.reservation);
191
+ yield* reservation.reservation.release;
192
+ yield* drop(opts.preferredPort);
193
+ if (ok._tag === "probe-failed") return yield* Effect.fail(new PortBrokerError({
194
+ reason: "bind-probe-failed",
195
+ detail: `bind probe on preferred port ${opts.preferredPort} (${opts.kind}, host=${probeHost}) failed with non-EADDRINUSE error`,
196
+ cause: ok.cause
197
+ }));
198
+ }
199
+ }
200
+ for (let p = range.start; p < range.start + range.window; p++) {
201
+ if (!(yield* tryReserve(p, opts.kind, owner))) continue;
202
+ const reservation = yield* acquirePortReservation(reservationRoot, p, opts.kind);
203
+ if (reservation._tag === "busy") {
204
+ yield* drop(p);
205
+ continue;
206
+ }
207
+ if (reservation._tag === "failed") {
208
+ yield* drop(p);
209
+ return yield* Effect.fail(new PortBrokerError({
210
+ reason: "reservation-failed",
211
+ detail: reservation.detail,
212
+ cause: reservation.cause
213
+ }));
214
+ }
215
+ const ok = yield* probePort(p, probeHost);
216
+ if (ok._tag === "ok") return yield* finishAllocation(p, opts.kind, drop, reservation.reservation);
217
+ yield* reservation.reservation.release;
218
+ yield* drop(p);
219
+ if (ok._tag === "probe-failed") return yield* Effect.fail(new PortBrokerError({
220
+ reason: "bind-probe-failed",
221
+ detail: `bind probe on port ${p} (${opts.kind}, host=${probeHost}) failed with non-EADDRINUSE error`,
222
+ cause: ok.cause
223
+ }));
224
+ }
225
+ return yield* Effect.fail(new PortBrokerError({
226
+ reason: "no-free-port",
227
+ detail: `no free port found in [${range.start}, ${range.start + range.window}) for kind '${opts.kind}'`
228
+ }));
229
+ }).pipe(Effect.withSpan("substrate.portBroker.allocate", { attributes: {
230
+ kind: opts.kind,
231
+ preferredPort: opts.preferredPort ?? -1,
232
+ probeHost: opts.probeHost ?? "127.0.0.1"
233
+ } }));
234
+ const finishAllocation = (port, kind, dropFn, reservation) => Effect.gen(function* () {
235
+ const release = Effect.all([dropFn(port), reservation.release], { discard: true });
236
+ yield* Effect.addFinalizer(() => release.pipe(Effect.uninterruptible));
237
+ yield* Effect.annotateCurrentSpan({
238
+ "portBroker.port": port,
239
+ "portBroker.kind": kind
240
+ });
241
+ yield* Effect.logDebug(`port-broker allocated ${port} (kind=${kind})`);
242
+ return {
243
+ port,
244
+ kind,
245
+ release
246
+ };
247
+ });
248
+ return PortBrokerService.of({ allocate });
249
+ }));
250
+ /**
251
+ * Bind a transient `net.Server` on `<host>:<port>` and close it.
252
+ * The OS atomically rejects with `EADDRINUSE` if another process
253
+ * already holds the port — that's our cross-process collision check.
254
+ *
255
+ * The default probe is loopback-only because the wallet binds
256
+ * loopback. Docker-backed callers pass `0.0.0.0`; on Docker Desktop,
257
+ * binding a transient Node server on `0.0.0.0` does not always reject
258
+ * ports already held on `127.0.0.1`, even though Docker's publish step
259
+ * will reject them. Wildcard probes therefore check loopback as well.
260
+ *
261
+ * Race window: between the probe-close and the caller's real `listen`,
262
+ * a non-devstack process could still grab the port. Devstack peers are
263
+ * blocked by the reservation file until the allocation scope releases.
264
+ */
265
+ const probePort = (port, host) => host === "0.0.0.0" ? Effect.gen(function* () {
266
+ const loopback = yield* probeSinglePort(port, "127.0.0.1");
267
+ if (loopback._tag !== "ok") return loopback;
268
+ return yield* probeSinglePort(port, host);
269
+ }).pipe(Effect.withSpan("substrate.portBroker.probe", { attributes: {
270
+ host,
271
+ port
272
+ } })) : probeSinglePort(port, host).pipe(Effect.withSpan("substrate.portBroker.probe", { attributes: {
273
+ host,
274
+ port
275
+ } }));
276
+ const probeSinglePort = (port, host) => Effect.callback((resume) => {
277
+ let settled = false;
278
+ let server = null;
279
+ const settle = (r) => {
280
+ if (settled) return;
281
+ settled = true;
282
+ resume(Effect.succeed(r));
283
+ };
284
+ try {
285
+ server = createServer();
286
+ server.unref();
287
+ const onError = (err) => {
288
+ const code = err.code ?? "";
289
+ if (code === "EADDRINUSE" || code === "EACCES") settle({ _tag: "in-use" });
290
+ else settle({
291
+ _tag: "probe-failed",
292
+ cause: err
293
+ });
294
+ try {
295
+ server?.close();
296
+ } catch {}
297
+ };
298
+ server.once("error", onError);
299
+ server.listen(port, host, () => {
300
+ const addr = server?.address();
301
+ const ok = addr !== null && addr.port === port;
302
+ server?.close(() => {
303
+ settle(ok ? { _tag: "ok" } : { _tag: "in-use" });
304
+ });
305
+ });
306
+ } catch (cause) {
307
+ settle({
308
+ _tag: "probe-failed",
309
+ cause
310
+ });
311
+ try {
312
+ server?.close();
313
+ } catch {}
314
+ }
315
+ });
316
+ //#endregion
317
+ export { PortBrokerService, layerPortBroker };
318
+
319
+ //# sourceMappingURL=service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.mjs","names":["createNetServer"],"sources":["../../../../src/substrate/runtime/port-broker/service.ts"],"sourcesContent":["// Port broker — substrate-level service.\n//\n// Architecture (`notes/redesign/architecture.md` § \"What's collapsed\"):\n// resource broker for host ports. Plugins that need to bind a host\n// HTTP server (wallet) or publish a container port on the host (Sui)\n// yield this service and call\n// `allocate({...})`. The broker:\n//\n// 1. Tracks in-process allocations in a `Ref<Map<port, Holder>>` so\n// two sibling plugins in the same stack don't both pick the same\n// port between bind-probe and `server.listen`.\n// 2. Claims a runtime-root scoped port reservation file before the\n// bind probe. This closes the cross-process probe→listen race:\n// two independent `devstack apply` processes sharing a state dir\n// cannot both choose the same candidate while neither real server\n// is listening yet.\n// 3. Verifies kernel-level availability by binding a transient\n// `net.Server` on the candidate port and closing it.\n// The OS's `EADDRINUSE` remains the final collision check for\n// non-devstack processes and stale reservation gaps.\n// 4. Releases on scope close. The broker hands back a `release`\n// Effect AND installs a scope finalizer; the architecture's\n// \"scope-local, never module-level\" invariant is honoured by\n// construction (the Layer is scope-local, the entries die with\n// the scope).\n//\n// \"Kind-window\" sequential search: each `kind` has its own starting\n// port and window size (`PORT_RANGES`). The broker scans forward from\n// `start` up to `start + window` (and from `preferredPort` if\n// supplied) until a probe succeeds.\n//\n// Cross-process safety: the reservation file is scoped to the runtime\n// root, not the stack root, because host ports are machine-global. The\n// stack-scoped supervisor lock serializes acquires of the SAME stack;\n// these reservation files serialize host-port choices across DIFFERENT\n// stacks and apps that share a state dir.\n\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport {\n\tcreateServer as createNetServer,\n\ttype AddressInfo,\n\ttype Server as NetServer,\n} from 'node:net';\nimport { dirname, join } from 'node:path';\n\nimport { Context, Effect, Layer, Ref, Schema, Scope } from 'effect';\n\nimport { RosterHolderSchema, type RosterHolder } from '../../cross-process.ts';\nimport { checkHolderLiveness, ownHolder } from '../cross-process/liveness.ts';\nimport { PortBrokerError } from '../errors.ts';\nimport { RuntimeRoot } from '../paths.ts';\nimport { decodeJsonTextSync } from '../runtime-decode.ts';\n\n// ----------------------------------------------------------------------\n// Public shape\n// ----------------------------------------------------------------------\n\n/** Allocation kind — drives the search-window starting port. Plugins\n * pass a literal so a `wallet` allocation and a `rpc` allocation\n * never collide on the same starting point.\n *\n * Extend `PORT_RANGES` below to add a new kind. The literal type is\n * closed deliberately — agnostic-naming would invite plugins to\n * freelance kinds (and overlap window starts unintentionally).\n *\n * Today's windows are sized for \"tens of plugins per stack\" with\n * parallel-stack overhead headroom. Each window is 1000 ports; that's\n * more than enough for any realistic in-process devstack, and the\n * forward-scan only ever crosses a window boundary if EVERY port in\n * the window is taken (effectively never on dev machines). */\nconst PORT_KINDS = ['wallet', 'http', 'rpc', 'misc'] as const;\n\nexport type PortKind = (typeof PORT_KINDS)[number];\n\n/** Host interface used by the transient bind probe. Callers binding a\n * real server on loopback should use the default. Callers that hand\n * the port to Docker's all-interface publish path should pass\n * `'0.0.0.0'` so the probe asks the same kernel question. */\nexport type PortProbeHost = '127.0.0.1' | '0.0.0.0';\n\n/** Sequential search window per kind. The broker tries `preferredPort`\n * first (if given), then `[start, start + window)` in order. */\nconst PORT_RANGES: Readonly<Record<PortKind, { readonly start: number; readonly window: number }>> =\n\t{\n\t\t// 39200 — chosen to land between the wallet's legacy 39082 default\n\t\t// (still functional via `preferredPort`) and the high ephemeral\n\t\t// range. Stays clear of common dev-server defaults (3000-5173, 8000-\n\t\t// 8080) so a sibling Vite / Next.js process on the host doesn't\n\t\t// accidentally collide on the first probe.\n\t\twallet: { start: 39200, window: 1000 },\n\t\t// 50000 — well clear of postgres (5432), redis (6379), and the\n\t\t// Vite/Next dev-server cluster. Used by any plugin that just wants\n\t\t// \"a free HTTP port\".\n\t\thttp: { start: 50000, window: 1000 },\n\t\t// 51000 — reserved for RPC-shaped servers (graphql, custom RPC).\n\t\t// Kept distinct from `http` so the kind-window discrimination\n\t\t// surfaces in `ss -ltnp` listings during diagnosis.\n\t\trpc: { start: 51000, window: 1000 },\n\t\t// 52000 — escape hatch for plugins that don't fit the typed kinds.\n\t\tmisc: { start: 52000, window: 1000 },\n\t};\n\n/** Input to `allocate`. */\nexport interface AllocateOptions {\n\t/** Optional caller hint. The broker tries this FIRST; if the port is\n\t * already held in-process the call FAILS with\n\t * `reason: 'preferred-busy'` (the caller asked specifically for\n\t * this port and got an obvious collision). If the bind-probe fails\n\t * with EADDRINUSE the broker falls through to the kind-window\n\t * scan — preferred is a HINT for the kernel-collision case, but a\n\t * HARD CHOICE against in-process collision. */\n\treadonly preferredPort?: number;\n\t/** Interface to bind during the kernel probe. Defaults to\n\t * `127.0.0.1`, matching host-loopback servers such as the wallet.\n\t * Docker `-p host:container` publishes on all interfaces, so\n\t * Docker-backed callers pass `0.0.0.0`. */\n\treadonly probeHost?: PortProbeHost;\n\t/** Allocation kind — drives the search window when no preferred is\n\t * supplied (or when preferred is taken at the kernel level). */\n\treadonly kind: PortKind;\n}\n\n/** Successful allocation. `release` is provided in addition to the\n * scope finalizer so tests / orchestrators can drive release\n * explicitly without unwinding the whole scope. Calling `release`\n * twice is a no-op. */\nexport interface AllocatedPort {\n\treadonly port: number;\n\treadonly kind: PortKind;\n\treadonly release: Effect.Effect<void>;\n}\n\n/** Service shape — what plugins yield from Context. */\nexport interface PortBroker {\n\t/**\n\t * Allocate a port for `kind`. The returned port is exclusive within\n\t * THIS process (the broker's `Ref` map) and best-effort-exclusive\n\t * across devstack processes that share a runtime root (port\n\t * reservation file), then verified against the kernel bind table\n\t * on `probeHost`.\n\t *\n\t * Scope-bound release: the broker installs a finalizer on the\n\t * surrounding scope; callers can additionally invoke\n\t * `result.release` explicitly.\n\t *\n\t * Failures (`PortBrokerError`):\n\t * - `preferred-busy` — caller's `preferredPort` is held by another\n\t * in-process allocation on the same stack.\n\t * - `no-free-port` — the kind window was exhausted without a\n\t * probe-pass candidate.\n\t * - `bind-probe-failed` — non-EADDRINUSE error from the OS bind\n\t * probe (EACCES on a privileged port etc.).\n\t * - `reservation-failed` — port reservation file IO failed.\n\t */\n\treadonly allocate: (\n\t\topts: AllocateOptions,\n\t) => Effect.Effect<AllocatedPort, PortBrokerError, Scope.Scope>;\n}\n\n// ----------------------------------------------------------------------\n// Internal state\n// ----------------------------------------------------------------------\n\n/** In-process holder for a port. Carries the kind for diagnostics\n * (e.g. surfaced in `no-free-port` errors). The `owner` is a\n * free-form caller string used for log lines and the future cause\n * walker; today every caller passes the literal `kind`. */\ninterface Holder {\n\treadonly kind: PortKind;\n\treadonly owner: string;\n}\n\ntype State = ReadonlyMap<number, Holder>;\n\nconst PORT_RESERVATION_VERSION = 1 as const;\n\nconst PortReservationDocSchema = Schema.Struct({\n\tversion: Schema.Literal(PORT_RESERVATION_VERSION),\n\tport: Schema.Number,\n\tkind: Schema.Literals(PORT_KINDS),\n\townerId: Schema.String,\n\tholder: RosterHolderSchema,\n});\n\ntype PortReservationDoc = Schema.Schema.Type<typeof PortReservationDocSchema>;\n\ninterface PortReservation {\n\treadonly path: string;\n\treadonly ownerId: string;\n\treadonly release: Effect.Effect<void>;\n}\n\ntype ReservationAttempt =\n\t| { readonly _tag: 'acquired'; readonly reservation: PortReservation }\n\t| { readonly _tag: 'busy' }\n\t| { readonly _tag: 'failed'; readonly detail: string; readonly cause: unknown };\n\ntype ReservationWriteAttempt =\n\t| { readonly _tag: 'written' }\n\t| { readonly _tag: 'race' }\n\t| { readonly _tag: 'exists'; readonly doc: PortReservationDoc | null }\n\t| { readonly _tag: 'failed'; readonly cause: unknown };\n\nconst portReservationPath = (root: string, port: number): string =>\n\tjoin(root, 'port-locks', `${port}.json`);\n\nconst parseReservationDoc = (raw: string): PortReservationDoc | null => {\n\ttry {\n\t\treturn decodeJsonTextSync(PortReservationDocSchema, raw, {\n\t\t\tsource: 'port reservation',\n\t\t\tmkError: (issue) => issue,\n\t\t});\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nconst tryWriteReservationSync = (\n\tpath: string,\n\tdoc: PortReservationDoc,\n): ReservationWriteAttempt => {\n\ttry {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\twriteFileSync(path, `${JSON.stringify(doc)}\\n`, { flag: 'wx', mode: 0o600 });\n\t\treturn { _tag: 'written' };\n\t} catch (cause) {\n\t\tconst code = (cause as NodeJS.ErrnoException).code;\n\t\tif (code !== 'EEXIST') return { _tag: 'failed', cause };\n\t\tif (!existsSync(path)) return { _tag: 'race' };\n\t\ttry {\n\t\t\treturn { _tag: 'exists', doc: parseReservationDoc(readFileSync(path, 'utf8')) };\n\t\t} catch {\n\t\t\treturn { _tag: 'exists', doc: null };\n\t\t}\n\t}\n};\n\nconst unlinkReservationIfOwnerSync = (path: string, ownerId: string): void => {\n\ttry {\n\t\tconst doc = parseReservationDoc(readFileSync(path, 'utf8'));\n\t\tif (doc?.ownerId === ownerId) {\n\t\t\tunlinkSync(path);\n\t\t}\n\t} catch {\n\t\t// Missing or unreadable: release is best-effort. A peer never\n\t\t// reclaims unreadable reservations; it simply skips that port.\n\t}\n};\n\nconst reclaimReservationIfOwnerSync = (path: string, ownerId: string): boolean => {\n\ttry {\n\t\tconst doc = parseReservationDoc(readFileSync(path, 'utf8'));\n\t\tif (doc?.ownerId !== ownerId) return false;\n\t\tunlinkSync(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nconst acquirePortReservation = (\n\troot: string,\n\tport: number,\n\tkind: PortKind,\n): Effect.Effect<ReservationAttempt> =>\n\tEffect.gen(function* () {\n\t\tconst path = portReservationPath(root, port);\n\t\tconst ownerId = `${process.pid}-${randomUUID().slice(0, 8)}`;\n\t\tconst holder: RosterHolder = ownHolder();\n\t\tconst doc: PortReservationDoc = {\n\t\t\tversion: PORT_RESERVATION_VERSION,\n\t\t\tport,\n\t\t\tkind,\n\t\t\townerId,\n\t\t\tholder,\n\t\t};\n\n\t\twhile (true) {\n\t\t\tconst attempt = tryWriteReservationSync(path, doc);\n\t\t\tif (attempt._tag === 'written') {\n\t\t\t\treturn {\n\t\t\t\t\t_tag: 'acquired',\n\t\t\t\t\treservation: {\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\townerId,\n\t\t\t\t\t\trelease: Effect.sync(() => unlinkReservationIfOwnerSync(path, ownerId)),\n\t\t\t\t\t},\n\t\t\t\t} as const;\n\t\t\t}\n\t\t\tif (attempt._tag === 'race') continue;\n\t\t\tif (attempt._tag === 'failed') {\n\t\t\t\treturn {\n\t\t\t\t\t_tag: 'failed',\n\t\t\t\t\tdetail: `port reservation ${path} could not be written`,\n\t\t\t\t\tcause: attempt.cause,\n\t\t\t\t} as const;\n\t\t\t}\n\t\t\tif (attempt.doc === null) return { _tag: 'busy' } as const;\n\n\t\t\tconst liveness = yield* checkHolderLiveness(attempt.doc.holder).pipe(\n\t\t\t\tEffect.catch(() => Effect.succeed('alive' as const)),\n\t\t\t);\n\t\t\tif (liveness === 'alive') return { _tag: 'busy' } as const;\n\t\t\tif (!reclaimReservationIfOwnerSync(path, attempt.doc.ownerId)) {\n\t\t\t\treturn { _tag: 'busy' } as const;\n\t\t\t}\n\t\t}\n\t});\n\n// ----------------------------------------------------------------------\n// Service tag + Layer\n// ----------------------------------------------------------------------\n\nexport class PortBrokerService extends Context.Service<PortBrokerService, PortBroker>()(\n\t'@devstack-rewrite/substrate/PortBroker',\n) {}\n\n/**\n * Layer that materializes one `PortBroker` per stack scope.\n *\n * The broker's state lives in a `Ref` captured by the Layer's\n * `Effect.gen`; closing the Layer's scope drops every allocation.\n * Parallel stacks each get their own broker (Layer-driven), and they\n * coordinate cross-process via runtime-root reservation files plus the\n * kernel's bind table — never via shared in-process state.\n */\nexport const layerPortBroker: Layer.Layer<PortBrokerService, never, RuntimeRoot> = Layer.effect(\n\tPortBrokerService,\n\tEffect.gen(function* () {\n\t\tconst runtimeRoot = yield* RuntimeRoot;\n\t\tconst reservationRoot = runtimeRoot.root;\n\t\tconst state = yield* Ref.make<State>(new Map());\n\n\t\tconst tryReserve = (port: number, kind: PortKind, owner: string): Effect.Effect<boolean> =>\n\t\t\tRef.modify<State, boolean>(state, (current) => {\n\t\t\t\tif (current.has(port)) return [false, current];\n\t\t\t\tconst next = new Map(current);\n\t\t\t\tnext.set(port, { kind, owner });\n\t\t\t\treturn [true, next];\n\t\t\t});\n\n\t\tconst drop = (port: number): Effect.Effect<void> =>\n\t\t\tRef.update(state, (current) => {\n\t\t\t\tif (!current.has(port)) return current;\n\t\t\t\tconst next = new Map(current);\n\t\t\t\tnext.delete(port);\n\t\t\t\treturn next;\n\t\t\t});\n\n\t\tconst allocate: PortBroker['allocate'] = (opts) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst range = PORT_RANGES[opts.kind];\n\t\t\t\tconst owner = opts.kind;\n\t\t\t\tconst probeHost = opts.probeHost ?? '127.0.0.1';\n\n\t\t\t\t// 1. Preferred-port path. The broker honours `preferredPort`\n\t\t\t\t// as a strong hint, but refuses in-process collisions\n\t\t\t\t// (architecture §6: same-stack siblings MUST NOT trample).\n\t\t\t\tif (opts.preferredPort !== undefined) {\n\t\t\t\t\tconst reserved = yield* tryReserve(opts.preferredPort, opts.kind, owner);\n\t\t\t\t\tif (!reserved) {\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\t\t\treason: 'preferred-busy',\n\t\t\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\t\t`preferred port ${opts.preferredPort} (${opts.kind}) is ` +\n\t\t\t\t\t\t\t\t\t`already held by another allocation in this stack`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Kernel-level probe. If a foreign process holds the\n\t\t\t\t\t// port, drop our reservation and FALL THROUGH to the\n\t\t\t\t\t// kind-window scan — the caller's preferred was a HINT\n\t\t\t\t\t// for cross-process collisions.\n\t\t\t\t\tconst reservation = yield* acquirePortReservation(\n\t\t\t\t\t\treservationRoot,\n\t\t\t\t\t\topts.preferredPort,\n\t\t\t\t\t\topts.kind,\n\t\t\t\t\t);\n\t\t\t\t\tif (reservation._tag === 'busy') {\n\t\t\t\t\t\tyield* drop(opts.preferredPort);\n\t\t\t\t\t} else if (reservation._tag === 'failed') {\n\t\t\t\t\t\tyield* drop(opts.preferredPort);\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\t\t\treason: 'reservation-failed',\n\t\t\t\t\t\t\t\tdetail: reservation.detail,\n\t\t\t\t\t\t\t\tcause: reservation.cause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst ok = yield* probePort(opts.preferredPort, probeHost);\n\t\t\t\t\t\tif (ok._tag === 'ok') {\n\t\t\t\t\t\t\treturn yield* finishAllocation(\n\t\t\t\t\t\t\t\topts.preferredPort,\n\t\t\t\t\t\t\t\topts.kind,\n\t\t\t\t\t\t\t\tdrop,\n\t\t\t\t\t\t\t\treservation.reservation,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tyield* reservation.reservation.release;\n\t\t\t\t\t\tyield* drop(opts.preferredPort);\n\t\t\t\t\t\tif (ok._tag === 'probe-failed') {\n\t\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\t\t\t\treason: 'bind-probe-failed',\n\t\t\t\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\t\t\t`bind probe on preferred port ${opts.preferredPort} ` +\n\t\t\t\t\t\t\t\t\t\t`(${opts.kind}, host=${probeHost}) failed with non-EADDRINUSE error`,\n\t\t\t\t\t\t\t\t\tcause: ok.cause,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// `ok._tag === 'in-use'` — fall through to scan.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 2. Forward-scan the kind window.\n\t\t\t\tfor (let p = range.start; p < range.start + range.window; p++) {\n\t\t\t\t\tconst reserved = yield* tryReserve(p, opts.kind, owner);\n\t\t\t\t\tif (!reserved) continue;\n\t\t\t\t\tconst reservation = yield* acquirePortReservation(reservationRoot, p, opts.kind);\n\t\t\t\t\tif (reservation._tag === 'busy') {\n\t\t\t\t\t\tyield* drop(p);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (reservation._tag === 'failed') {\n\t\t\t\t\t\tyield* drop(p);\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\t\t\treason: 'reservation-failed',\n\t\t\t\t\t\t\t\tdetail: reservation.detail,\n\t\t\t\t\t\t\t\tcause: reservation.cause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst ok = yield* probePort(p, probeHost);\n\t\t\t\t\tif (ok._tag === 'ok') {\n\t\t\t\t\t\treturn yield* finishAllocation(p, opts.kind, drop, reservation.reservation);\n\t\t\t\t\t}\n\t\t\t\t\tyield* reservation.reservation.release;\n\t\t\t\t\tyield* drop(p);\n\t\t\t\t\tif (ok._tag === 'probe-failed') {\n\t\t\t\t\t\t// A privileged port (EACCES) in the middle of the\n\t\t\t\t\t\t// window is unrecoverable for this kind. Surface\n\t\t\t\t\t\t// immediately rather than thrash the whole window.\n\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\t\t\treason: 'bind-probe-failed',\n\t\t\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t\t\t`bind probe on port ${p} (${opts.kind}, host=${probeHost}) failed ` +\n\t\t\t\t\t\t\t\t\t`with non-EADDRINUSE error`,\n\t\t\t\t\t\t\t\tcause: ok.cause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// In-use → next candidate.\n\t\t\t\t}\n\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew PortBrokerError({\n\t\t\t\t\t\treason: 'no-free-port',\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\t`no free port found in [${range.start}, ` +\n\t\t\t\t\t\t\t`${range.start + range.window}) for kind '${opts.kind}'`,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(\n\t\t\t\tEffect.withSpan('substrate.portBroker.allocate', {\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tkind: opts.kind,\n\t\t\t\t\t\tpreferredPort: opts.preferredPort ?? -1,\n\t\t\t\t\t\tprobeHost: opts.probeHost ?? '127.0.0.1',\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\tconst finishAllocation = (\n\t\t\tport: number,\n\t\t\tkind: PortKind,\n\t\t\tdropFn: (p: number) => Effect.Effect<void>,\n\t\t\treservation: PortReservation,\n\t\t): Effect.Effect<AllocatedPort, never, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\t// Scope finalizer — drops the entry when the surrounding\n\t\t\t\t// scope closes. Uninterruptible so a Ctrl-C double-tap\n\t\t\t\t// doesn't leave the entry dangling in the broker's Ref.\n\t\t\t\tconst release = Effect.all([dropFn(port), reservation.release], {\n\t\t\t\t\tdiscard: true,\n\t\t\t\t});\n\t\t\t\tyield* Effect.addFinalizer(() => release.pipe(Effect.uninterruptible));\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'portBroker.port': port,\n\t\t\t\t\t'portBroker.kind': kind,\n\t\t\t\t});\n\t\t\t\tyield* Effect.logDebug(`port-broker allocated ${port} (kind=${kind})`);\n\t\t\t\treturn {\n\t\t\t\t\tport,\n\t\t\t\t\tkind,\n\t\t\t\t\trelease,\n\t\t\t\t} satisfies AllocatedPort;\n\t\t\t});\n\n\t\treturn PortBrokerService.of({ allocate });\n\t}),\n);\n\n// ----------------------------------------------------------------------\n// Kernel-level bind probe\n// ----------------------------------------------------------------------\n\n/** Probe result. `'in-use'` is the recoverable case (try the next\n * port); `'probe-failed'` is the unrecoverable case (caller's\n * problem — surface). */\ntype ProbeResult =\n\t| { readonly _tag: 'ok' }\n\t| { readonly _tag: 'in-use' }\n\t| { readonly _tag: 'probe-failed'; readonly cause: unknown };\n\n/**\n * Bind a transient `net.Server` on `<host>:<port>` and close it.\n * The OS atomically rejects with `EADDRINUSE` if another process\n * already holds the port — that's our cross-process collision check.\n *\n * The default probe is loopback-only because the wallet binds\n * loopback. Docker-backed callers pass `0.0.0.0`; on Docker Desktop,\n * binding a transient Node server on `0.0.0.0` does not always reject\n * ports already held on `127.0.0.1`, even though Docker's publish step\n * will reject them. Wildcard probes therefore check loopback as well.\n *\n * Race window: between the probe-close and the caller's real `listen`,\n * a non-devstack process could still grab the port. Devstack peers are\n * blocked by the reservation file until the allocation scope releases.\n */\nconst probePort = (port: number, host: PortProbeHost): Effect.Effect<ProbeResult> =>\n\thost === '0.0.0.0'\n\t\t? Effect.gen(function* () {\n\t\t\t\tconst loopback = yield* probeSinglePort(port, '127.0.0.1');\n\t\t\t\tif (loopback._tag !== 'ok') return loopback;\n\t\t\t\treturn yield* probeSinglePort(port, host);\n\t\t\t}).pipe(Effect.withSpan('substrate.portBroker.probe', { attributes: { host, port } }))\n\t\t: probeSinglePort(port, host).pipe(\n\t\t\t\tEffect.withSpan('substrate.portBroker.probe', { attributes: { host, port } }),\n\t\t\t);\n\nconst probeSinglePort = (port: number, host: PortProbeHost): Effect.Effect<ProbeResult> =>\n\tEffect.callback<ProbeResult>((resume) => {\n\t\tlet settled = false;\n\t\tlet server: NetServer | null = null;\n\t\tconst settle = (r: ProbeResult): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tresume(Effect.succeed(r));\n\t\t};\n\t\ttry {\n\t\t\tserver = createNetServer();\n\t\t\tserver.unref();\n\t\t\tconst onError = (err: NodeJS.ErrnoException): void => {\n\t\t\t\tconst code = err.code ?? '';\n\t\t\t\tif (code === 'EADDRINUSE' || code === 'EACCES') {\n\t\t\t\t\t// EACCES on these hosts is exotic but treat as in-use\n\t\t\t\t\t// for non-privileged ports (our windows start at\n\t\t\t\t\t// 39200, well above 1024). Surfaces as probe-failed\n\t\t\t\t\t// only if it persists for every port in the window.\n\t\t\t\t\tsettle({ _tag: 'in-use' });\n\t\t\t\t} else {\n\t\t\t\t\tsettle({ _tag: 'probe-failed', cause: err });\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tserver?.close();\n\t\t\t\t} catch {\n\t\t\t\t\t/* defensive */\n\t\t\t\t}\n\t\t\t};\n\t\t\tserver.once('error', onError);\n\t\t\tserver.listen(port, host, () => {\n\t\t\t\t// Verify the OS actually gave us THIS port (defensive —\n\t\t\t\t// asking for a specific port shouldn't ever surprise\n\t\t\t\t// us, but `address()` is the source of truth).\n\t\t\t\tconst addr = server?.address() as AddressInfo | null;\n\t\t\t\tconst ok = addr !== null && addr.port === port;\n\t\t\t\tserver?.close(() => {\n\t\t\t\t\tsettle(ok ? { _tag: 'ok' } : { _tag: 'in-use' });\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tsettle({ _tag: 'probe-failed', cause });\n\t\t\ttry {\n\t\t\t\tserver?.close();\n\t\t\t} catch {\n\t\t\t\t/* defensive */\n\t\t\t}\n\t\t}\n\t});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import { Context, Effect, Layer, Scope } from "effect";
@@ -0,0 +1,34 @@
1
+ import { Context, Data, Effect, Layer, Ref, Scope } from "effect";
2
+ //#region src/substrate/runtime/post-acquire-tasks.ts
3
+ var PostAcquireTaskFailed = class extends Data.TaggedError("PostAcquireTaskFailed") {};
4
+ var PostAcquireTasksService = class extends Context.Service()("@devstack-rewrite/substrate/PostAcquireTasks") {};
5
+ const layerPostAcquireTasks = Layer.effect(PostAcquireTasksService, Effect.gen(function* () {
6
+ const tasksRef = yield* Ref.make([]);
7
+ const register = (task) => Effect.gen(function* () {
8
+ const scope = yield* Effect.scope;
9
+ const id = Symbol(task.label);
10
+ const registered = {
11
+ ...task,
12
+ id,
13
+ scope
14
+ };
15
+ yield* Ref.update(tasksRef, (tasks) => [...tasks, registered]);
16
+ yield* Effect.addFinalizer(() => Ref.update(tasksRef, (tasks) => tasks.filter((candidate) => candidate.id !== id)));
17
+ });
18
+ const runAll = Effect.gen(function* () {
19
+ const tasks = yield* Ref.get(tasksRef);
20
+ for (const task of tasks) yield* Scope.provide(task.run, task.scope).pipe(Effect.mapError((cause) => new PostAcquireTaskFailed({
21
+ pluginKey: task.pluginKey,
22
+ label: task.label,
23
+ cause
24
+ })));
25
+ });
26
+ return PostAcquireTasksService.of({
27
+ register,
28
+ runAll
29
+ });
30
+ }));
31
+ //#endregion
32
+ export { PostAcquireTaskFailed, PostAcquireTasksService, layerPostAcquireTasks };
33
+
34
+ //# sourceMappingURL=post-acquire-tasks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-acquire-tasks.mjs","names":[],"sources":["../../../src/substrate/runtime/post-acquire-tasks.ts"],"sourcesContent":["import { Context, Data, Effect, Layer, Ref, Scope } from 'effect';\n\nimport type { PluginKey } from '../brand.ts';\n\nexport interface PostAcquireTask {\n\treadonly pluginKey: PluginKey;\n\treadonly label: string;\n\treadonly run: Effect.Effect<void, unknown, Scope.Scope>;\n}\n\nexport class PostAcquireTaskFailed extends Data.TaggedError('PostAcquireTaskFailed')<{\n\treadonly pluginKey: PluginKey;\n\treadonly label: string;\n\treadonly cause: unknown;\n}> {}\n\nexport interface PostAcquireTasksShape {\n\treadonly register: (task: PostAcquireTask) => Effect.Effect<void, never, Scope.Scope>;\n\treadonly runAll: Effect.Effect<void, PostAcquireTaskFailed, never>;\n}\n\nexport class PostAcquireTasksService extends Context.Service<\n\tPostAcquireTasksService,\n\tPostAcquireTasksShape\n>()('@devstack-rewrite/substrate/PostAcquireTasks') {}\n\ninterface RegisteredPostAcquireTask extends PostAcquireTask {\n\treadonly id: symbol;\n\treadonly scope: Scope.Scope;\n}\n\nexport const layerPostAcquireTasks: Layer.Layer<PostAcquireTasksService> = Layer.effect(\n\tPostAcquireTasksService,\n\tEffect.gen(function* () {\n\t\tconst tasksRef = yield* Ref.make<ReadonlyArray<RegisteredPostAcquireTask>>([]);\n\n\t\tconst register = (task: PostAcquireTask): Effect.Effect<void, never, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst scope = yield* Effect.scope;\n\t\t\t\tconst id = Symbol(task.label);\n\t\t\t\tconst registered: RegisteredPostAcquireTask = { ...task, id, scope };\n\t\t\t\tyield* Ref.update(tasksRef, (tasks) => [...tasks, registered]);\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(tasksRef, (tasks) => tasks.filter((candidate) => candidate.id !== id)),\n\t\t\t\t);\n\t\t\t});\n\n\t\tconst runAll: Effect.Effect<void, PostAcquireTaskFailed, never> = Effect.gen(function* () {\n\t\t\tconst tasks = yield* Ref.get(tasksRef);\n\t\t\tfor (const task of tasks) {\n\t\t\t\tyield* Scope.provide(task.run, task.scope).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\tnew PostAcquireTaskFailed({\n\t\t\t\t\t\t\t\tpluginKey: task.pluginKey,\n\t\t\t\t\t\t\t\tlabel: task.label,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn PostAcquireTasksService.of({ register, runAll });\n\t}),\n);\n"],"mappings":";;AAUA,IAAa,wBAAb,cAA2C,KAAK,YAAY,wBAAwB,CAIjF;AAOH,IAAa,0BAAb,cAA6C,QAAQ,SAGlD,CAAC,+CAA+C,CAAC;AAOpD,MAAa,wBAA8D,MAAM,OAChF,yBACA,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,IAAI,KAA+C,EAAE,CAAC;CAE9E,MAAM,YAAY,SACjB,OAAO,IAAI,aAAa;EACvB,MAAM,QAAQ,OAAO,OAAO;EAC5B,MAAM,KAAK,OAAO,KAAK,MAAM;EAC7B,MAAM,aAAwC;GAAE,GAAG;GAAM;GAAI;GAAO;AACpE,SAAO,IAAI,OAAO,WAAW,UAAU,CAAC,GAAG,OAAO,WAAW,CAAC;AAC9D,SAAO,OAAO,mBACb,IAAI,OAAO,WAAW,UAAU,MAAM,QAAQ,cAAc,UAAU,OAAO,GAAG,CAAC,CACjF;GACA;CAEH,MAAM,SAA4D,OAAO,IAAI,aAAa;EACzF,MAAM,QAAQ,OAAO,IAAI,IAAI,SAAS;AACtC,OAAK,MAAM,QAAQ,MAClB,QAAO,MAAM,QAAQ,KAAK,KAAK,KAAK,MAAM,CAAC,KAC1C,OAAO,UACL,UACA,IAAI,sBAAsB;GACzB,WAAW,KAAK;GAChB,OAAO,KAAK;GACZ;GACA,CAAC,CACH,CACD;GAED;AAEF,QAAO,wBAAwB,GAAG;EAAE;EAAU;EAAQ,CAAC;EACtD,CACF"}
@@ -0,0 +1,51 @@
1
+ import { Effect } from "effect";
2
+ import * as _$effect_Types0 from "effect/Types";
3
+ import * as _$effect_Cause0 from "effect/Cause";
4
+
5
+ //#region src/substrate/runtime/probes.d.ts
6
+ declare namespace probes_d_exports {
7
+ export { ExitCodeProbeResult, ProbeAttemptResult, ProbeAttemptTimeoutError, ProbeOptions, ProbeTimeoutError, exitCodeProbeResult, waitForProbe };
8
+ }
9
+ type ProbeAttemptResult = void | boolean | {
10
+ readonly ready: boolean;
11
+ readonly detail?: unknown;
12
+ };
13
+ interface ProbeOptions<E = unknown, R = never> {
14
+ readonly label: string;
15
+ readonly timeoutMs: number;
16
+ readonly intervalMs?: number;
17
+ readonly attemptTimeoutMs?: number;
18
+ readonly probe: () => Effect.Effect<ProbeAttemptResult, E, R>;
19
+ readonly isRetryableError?: (error: E) => boolean;
20
+ }
21
+ declare const ProbeAttemptTimeoutError_base: new <A extends Record<string, any> = {}>(args: _$effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => _$effect_Cause0.YieldableError & {
22
+ readonly _tag: "ProbeAttemptTimeoutError";
23
+ } & Readonly<A>;
24
+ declare class ProbeAttemptTimeoutError extends ProbeAttemptTimeoutError_base<{
25
+ readonly label: string;
26
+ readonly attemptTimeoutMs: number;
27
+ readonly message: string;
28
+ }> {}
29
+ declare const ProbeTimeoutError_base: new <A extends Record<string, any> = {}>(args: _$effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => _$effect_Cause0.YieldableError & {
30
+ readonly _tag: "ProbeTimeoutError";
31
+ } & Readonly<A>;
32
+ declare class ProbeTimeoutError extends ProbeTimeoutError_base<{
33
+ readonly label: string;
34
+ readonly timeoutMs: number;
35
+ readonly intervalMs: number;
36
+ readonly attemptTimeoutMs?: number;
37
+ readonly attempts: number;
38
+ readonly message: string;
39
+ readonly lastError?: unknown;
40
+ readonly lastNotReady?: unknown;
41
+ }> {}
42
+ declare const waitForProbe: <E, R = never>(options: ProbeOptions<E, R>) => Effect.Effect<void, E | ProbeTimeoutError, R>;
43
+ interface ExitCodeProbeResult {
44
+ readonly exitCode: number;
45
+ readonly stdout?: string;
46
+ readonly stderr?: string;
47
+ }
48
+ declare const exitCodeProbeResult: (result: ExitCodeProbeResult) => ProbeAttemptResult;
49
+ //#endregion
50
+ export { probes_d_exports };
51
+ //# sourceMappingURL=probes.d.mts.map
@@ -0,0 +1,84 @@
1
+ import { __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
2
+ import { Data, Duration, Effect } from "effect";
3
+ //#region src/substrate/runtime/probes.ts
4
+ var probes_exports = /* @__PURE__ */ __exportAll({
5
+ ProbeAttemptTimeoutError: () => ProbeAttemptTimeoutError,
6
+ ProbeTimeoutError: () => ProbeTimeoutError,
7
+ exitCodeProbeResult: () => exitCodeProbeResult,
8
+ waitForProbe: () => waitForProbe
9
+ });
10
+ var ProbeAttemptTimeoutError = class extends Data.TaggedError("ProbeAttemptTimeoutError") {};
11
+ var ProbeTimeoutError = class extends Data.TaggedError("ProbeTimeoutError") {};
12
+ const DEFAULT_INTERVAL_MS = 250;
13
+ const normalizeAttempt = (result) => {
14
+ if (result === void 0 || result === true) return { ready: true };
15
+ if (result === false) return { ready: false };
16
+ return result;
17
+ };
18
+ const withAttemptTimeout = (effect, options) => {
19
+ if (options.attemptTimeoutMs === void 0) return effect;
20
+ const timeoutMs = Math.max(1, Math.min(options.attemptTimeoutMs, options.remainingMs));
21
+ return effect.pipe(Effect.timeoutOrElse({
22
+ duration: Duration.millis(timeoutMs),
23
+ orElse: () => Effect.fail(new ProbeAttemptTimeoutError({
24
+ label: options.label,
25
+ attemptTimeoutMs: timeoutMs,
26
+ message: `Probe ${options.label} attempt did not complete within ${timeoutMs}ms`
27
+ }))
28
+ }));
29
+ };
30
+ const waitForProbe = (options) => Effect.gen(function* () {
31
+ const timeoutMs = options.timeoutMs;
32
+ const intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
33
+ const deadline = Date.now() + timeoutMs;
34
+ let attempts = 0;
35
+ let lastError;
36
+ let lastNotReady;
37
+ for (;;) {
38
+ const remainingMs = deadline - Date.now();
39
+ if (remainingMs <= 0) return yield* Effect.fail(new ProbeTimeoutError({
40
+ label: options.label,
41
+ timeoutMs,
42
+ intervalMs,
43
+ ...options.attemptTimeoutMs === void 0 ? {} : { attemptTimeoutMs: options.attemptTimeoutMs },
44
+ attempts,
45
+ message: `Probe ${options.label} did not become ready within ${timeoutMs}ms`,
46
+ ...lastError === void 0 ? {} : { lastError },
47
+ ...lastNotReady === void 0 ? {} : { lastNotReady }
48
+ }));
49
+ attempts += 1;
50
+ if (yield* withAttemptTimeout(options.probe(), {
51
+ label: options.label,
52
+ attemptTimeoutMs: options.attemptTimeoutMs,
53
+ remainingMs
54
+ }).pipe(Effect.matchEffect({
55
+ onFailure: (error) => {
56
+ if (!(error instanceof ProbeAttemptTimeoutError) && options.isRetryableError?.(error) === false) return Effect.fail(error);
57
+ lastError = error;
58
+ return Effect.succeed(false);
59
+ },
60
+ onSuccess: (result) => {
61
+ const normalized = normalizeAttempt(result);
62
+ if (!normalized.ready) lastNotReady = normalized.detail ?? false;
63
+ return Effect.succeed(normalized.ready);
64
+ }
65
+ }))) return;
66
+ const sleepMs = Math.min(intervalMs, Math.max(1, deadline - Date.now()));
67
+ yield* Effect.sleep(Duration.millis(sleepMs));
68
+ }
69
+ });
70
+ const exitCodeProbeResult = (result) => {
71
+ if (result.exitCode === 0) return true;
72
+ return {
73
+ ready: false,
74
+ detail: {
75
+ exitCode: result.exitCode,
76
+ ...result.stdout === void 0 ? {} : { stdout: result.stdout },
77
+ ...result.stderr === void 0 ? {} : { stderr: result.stderr }
78
+ }
79
+ };
80
+ };
81
+ //#endregion
82
+ export { ProbeTimeoutError, exitCodeProbeResult, probes_exports, waitForProbe };
83
+
84
+ //# sourceMappingURL=probes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.mjs","names":[],"sources":["../../../src/substrate/runtime/probes.ts"],"sourcesContent":["import { Data, Duration, Effect } from 'effect';\n\nexport type ProbeAttemptResult =\n\t| void\n\t| boolean\n\t| {\n\t\t\treadonly ready: boolean;\n\t\t\treadonly detail?: unknown;\n\t };\n\nexport interface ProbeOptions<E = unknown, R = never> {\n\treadonly label: string;\n\treadonly timeoutMs: number;\n\treadonly intervalMs?: number;\n\treadonly attemptTimeoutMs?: number;\n\treadonly probe: () => Effect.Effect<ProbeAttemptResult, E, R>;\n\treadonly isRetryableError?: (error: E) => boolean;\n}\n\nexport class ProbeAttemptTimeoutError extends Data.TaggedError('ProbeAttemptTimeoutError')<{\n\treadonly label: string;\n\treadonly attemptTimeoutMs: number;\n\treadonly message: string;\n}> {}\n\nexport class ProbeTimeoutError extends Data.TaggedError('ProbeTimeoutError')<{\n\treadonly label: string;\n\treadonly timeoutMs: number;\n\treadonly intervalMs: number;\n\treadonly attemptTimeoutMs?: number;\n\treadonly attempts: number;\n\treadonly message: string;\n\treadonly lastError?: unknown;\n\treadonly lastNotReady?: unknown;\n}> {}\n\nconst DEFAULT_INTERVAL_MS = 250;\n\nconst normalizeAttempt = (\n\tresult: ProbeAttemptResult,\n): { readonly ready: boolean; readonly detail?: unknown } => {\n\tif (result === undefined || result === true) return { ready: true };\n\tif (result === false) return { ready: false };\n\treturn result;\n};\n\nconst withAttemptTimeout = <A, E, R>(\n\teffect: Effect.Effect<A, E, R>,\n\toptions: {\n\t\treadonly label: string;\n\t\treadonly attemptTimeoutMs?: number;\n\t\treadonly remainingMs: number;\n\t},\n): Effect.Effect<A, E | ProbeAttemptTimeoutError, R> => {\n\tif (options.attemptTimeoutMs === undefined) return effect;\n\tconst timeoutMs = Math.max(1, Math.min(options.attemptTimeoutMs, options.remainingMs));\n\treturn effect.pipe(\n\t\tEffect.timeoutOrElse({\n\t\t\tduration: Duration.millis(timeoutMs),\n\t\t\torElse: () =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tnew ProbeAttemptTimeoutError({\n\t\t\t\t\t\tlabel: options.label,\n\t\t\t\t\t\tattemptTimeoutMs: timeoutMs,\n\t\t\t\t\t\tmessage: `Probe ${options.label} attempt did not complete within ${timeoutMs}ms`,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t}),\n\t);\n};\n\nexport const waitForProbe = <E, R = never>(\n\toptions: ProbeOptions<E, R>,\n): Effect.Effect<void, E | ProbeTimeoutError, R> =>\n\tEffect.gen(function* () {\n\t\tconst timeoutMs = options.timeoutMs;\n\t\tconst intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;\n\t\tconst started = Date.now();\n\t\tconst deadline = started + timeoutMs;\n\t\tlet attempts = 0;\n\t\tlet lastError: unknown;\n\t\tlet lastNotReady: unknown;\n\n\t\tfor (;;) {\n\t\t\tconst remainingMs = deadline - Date.now();\n\t\t\tif (remainingMs <= 0) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew ProbeTimeoutError({\n\t\t\t\t\t\tlabel: options.label,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\tintervalMs,\n\t\t\t\t\t\t...(options.attemptTimeoutMs === undefined\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: { attemptTimeoutMs: options.attemptTimeoutMs }),\n\t\t\t\t\t\tattempts,\n\t\t\t\t\t\tmessage: `Probe ${options.label} did not become ready within ${timeoutMs}ms`,\n\t\t\t\t\t\t...(lastError === undefined ? {} : { lastError }),\n\t\t\t\t\t\t...(lastNotReady === undefined ? {} : { lastNotReady }),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tattempts += 1;\n\t\t\tconst ready = yield* withAttemptTimeout(options.probe(), {\n\t\t\t\tlabel: options.label,\n\t\t\t\tattemptTimeoutMs: options.attemptTimeoutMs,\n\t\t\t\tremainingMs,\n\t\t\t}).pipe(\n\t\t\t\tEffect.matchEffect({\n\t\t\t\t\tonFailure: (error) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!(error instanceof ProbeAttemptTimeoutError) &&\n\t\t\t\t\t\t\toptions.isRetryableError?.(error as E) === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn Effect.fail(error as E);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastError = error;\n\t\t\t\t\t\treturn Effect.succeed(false);\n\t\t\t\t\t},\n\t\t\t\t\tonSuccess: (result) => {\n\t\t\t\t\t\tconst normalized = normalizeAttempt(result);\n\t\t\t\t\t\tif (!normalized.ready) lastNotReady = normalized.detail ?? false;\n\t\t\t\t\t\treturn Effect.succeed(normalized.ready);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (ready) return;\n\n\t\t\tconst sleepMs = Math.min(intervalMs, Math.max(1, deadline - Date.now()));\n\t\t\tyield* Effect.sleep(Duration.millis(sleepMs));\n\t\t}\n\t});\n\nexport interface ExitCodeProbeResult {\n\treadonly exitCode: number;\n\treadonly stdout?: string;\n\treadonly stderr?: string;\n}\n\nexport const exitCodeProbeResult = (result: ExitCodeProbeResult): ProbeAttemptResult => {\n\tif (result.exitCode === 0) return true;\n\treturn {\n\t\tready: false,\n\t\tdetail: {\n\t\t\texitCode: result.exitCode,\n\t\t\t...(result.stdout === undefined ? {} : { stdout: result.stdout }),\n\t\t\t...(result.stderr === undefined ? {} : { stderr: result.stderr }),\n\t\t},\n\t};\n};\n"],"mappings":";;;;;;;;;AAmBA,IAAa,2BAAb,cAA8C,KAAK,YAAY,2BAA2B,CAIvF;AAEH,IAAa,oBAAb,cAAuC,KAAK,YAAY,oBAAoB,CASzE;AAEH,MAAM,sBAAsB;AAE5B,MAAM,oBACL,WAC4D;AAC5D,KAAI,WAAW,KAAA,KAAa,WAAW,KAAM,QAAO,EAAE,OAAO,MAAM;AACnE,KAAI,WAAW,MAAO,QAAO,EAAE,OAAO,OAAO;AAC7C,QAAO;;AAGR,MAAM,sBACL,QACA,YAKuD;AACvD,KAAI,QAAQ,qBAAqB,KAAA,EAAW,QAAO;CACnD,MAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,kBAAkB,QAAQ,YAAY,CAAC;AACtF,QAAO,OAAO,KACb,OAAO,cAAc;EACpB,UAAU,SAAS,OAAO,UAAU;EACpC,cACC,OAAO,KACN,IAAI,yBAAyB;GAC5B,OAAO,QAAQ;GACf,kBAAkB;GAClB,SAAS,SAAS,QAAQ,MAAM,mCAAmC,UAAU;GAC7E,CAAC,CACF;EACF,CAAC,CACF;;AAGF,MAAa,gBACZ,YAEA,OAAO,IAAI,aAAa;CACvB,MAAM,YAAY,QAAQ;CAC1B,MAAM,aAAa,QAAQ,cAAc;CAEzC,MAAM,WADU,KAAK,KACG,GAAG;CAC3B,IAAI,WAAW;CACf,IAAI;CACJ,IAAI;AAEJ,UAAS;EACR,MAAM,cAAc,WAAW,KAAK,KAAK;AACzC,MAAI,eAAe,EAClB,QAAO,OAAO,OAAO,KACpB,IAAI,kBAAkB;GACrB,OAAO,QAAQ;GACf;GACA;GACA,GAAI,QAAQ,qBAAqB,KAAA,IAC9B,EAAE,GACF,EAAE,kBAAkB,QAAQ,kBAAkB;GACjD;GACA,SAAS,SAAS,QAAQ,MAAM,+BAA+B,UAAU;GACzE,GAAI,cAAc,KAAA,IAAY,EAAE,GAAG,EAAE,WAAW;GAChD,GAAI,iBAAiB,KAAA,IAAY,EAAE,GAAG,EAAE,cAAc;GACtD,CAAC,CACF;AAGF,cAAY;AAwBZ,MAAI,OAvBiB,mBAAmB,QAAQ,OAAO,EAAE;GACxD,OAAO,QAAQ;GACf,kBAAkB,QAAQ;GAC1B;GACA,CAAC,CAAC,KACF,OAAO,YAAY;GAClB,YAAY,UAAU;AACrB,QACC,EAAE,iBAAiB,6BACnB,QAAQ,mBAAmB,MAAW,KAAK,MAE3C,QAAO,OAAO,KAAK,MAAW;AAE/B,gBAAY;AACZ,WAAO,OAAO,QAAQ,MAAM;;GAE7B,YAAY,WAAW;IACtB,MAAM,aAAa,iBAAiB,OAAO;AAC3C,QAAI,CAAC,WAAW,MAAO,gBAAe,WAAW,UAAU;AAC3D,WAAO,OAAO,QAAQ,WAAW,MAAM;;GAExC,CAAC,CACF,CACU;EAEX,MAAM,UAAU,KAAK,IAAI,YAAY,KAAK,IAAI,GAAG,WAAW,KAAK,KAAK,CAAC,CAAC;AACxE,SAAO,OAAO,MAAM,SAAS,OAAO,QAAQ,CAAC;;EAE7C;AAQH,MAAa,uBAAuB,WAAoD;AACvF,KAAI,OAAO,aAAa,EAAG,QAAO;AAClC,QAAO;EACN,OAAO;EACP,QAAQ;GACP,UAAU,OAAO;GACjB,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ,OAAO,QAAQ;GAChE,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ,OAAO,QAAQ;GAChE;EACD"}
@@ -0,0 +1,57 @@
1
+ import { Effect } from "effect";
2
+ import { Readable } from "node:stream";
3
+
4
+ //#region src/substrate/runtime/process-supervisor.d.ts
5
+ declare namespace process_supervisor_d_exports {
6
+ export { AwaitManagedProcessReadyOptions, ManagedProcessChild, ManagedProcessExitStatus, ManagedProcessSpawnOptions, ManagedProcessSpawner, TerminateManagedProcessOptions, awaitManagedProcessReady, awaitProcessExit, describeProcessExitStatus, getProcessExitStatus, nodeProcessSpawner, onceProcessError, onceProcessExit, terminateManagedProcess, waitForProcessExitOrTimeout };
7
+ }
8
+ interface ManagedProcessExitStatus {
9
+ readonly code: number | null;
10
+ readonly signal: NodeJS.Signals | null;
11
+ }
12
+ interface ManagedProcessChild {
13
+ readonly pid?: number;
14
+ readonly stdout?: Readable | null;
15
+ readonly stderr?: Readable | null;
16
+ readonly exitCode?: number | null;
17
+ readonly signalCode?: NodeJS.Signals | null;
18
+ kill(signal?: NodeJS.Signals): boolean;
19
+ on(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
20
+ on(event: 'error', listener: (cause: Error) => void): this;
21
+ once(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
22
+ once(event: 'error', listener: (cause: Error) => void): this;
23
+ off(event: 'exit', listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
24
+ off(event: 'error', listener: (cause: Error) => void): this;
25
+ }
26
+ interface ManagedProcessSpawnOptions {
27
+ readonly cwd: string;
28
+ readonly env: NodeJS.ProcessEnv;
29
+ readonly stdio: 'pipe';
30
+ readonly detached?: boolean;
31
+ }
32
+ type ManagedProcessSpawner = (command: string, args: ReadonlyArray<string>, options: ManagedProcessSpawnOptions) => ManagedProcessChild;
33
+ declare const nodeProcessSpawner: ManagedProcessSpawner;
34
+ declare const describeProcessExitStatus: (status: ManagedProcessExitStatus) => string;
35
+ declare const onceProcessExit: (child: ManagedProcessChild) => Promise<ManagedProcessExitStatus>;
36
+ declare const getProcessExitStatus: (child: ManagedProcessChild) => ManagedProcessExitStatus | null;
37
+ declare const awaitProcessExit: (child: ManagedProcessChild) => Promise<ManagedProcessExitStatus>;
38
+ declare const onceProcessError: (child: ManagedProcessChild) => Promise<unknown>;
39
+ declare const waitForProcessExitOrTimeout: (child: ManagedProcessChild, timeoutMs: number) => Promise<ManagedProcessExitStatus | null>;
40
+ interface TerminateManagedProcessOptions {
41
+ readonly graceMs: number;
42
+ readonly killTimeoutMs?: number;
43
+ readonly processGroup?: boolean;
44
+ readonly onEscalate?: () => Effect.Effect<void>;
45
+ }
46
+ declare const terminateManagedProcess: (child: ManagedProcessChild, options: TerminateManagedProcessOptions) => Effect.Effect<void>;
47
+ interface AwaitManagedProcessReadyOptions<E, R = never> {
48
+ readonly ready: Effect.Effect<void, E, R>;
49
+ readonly exit: Promise<ManagedProcessExitStatus>;
50
+ readonly processError: Promise<unknown>;
51
+ readonly onExitBeforeReady: (status: ManagedProcessExitStatus) => E;
52
+ readonly onProcessErrorBeforeReady: (cause: unknown) => E;
53
+ }
54
+ declare const awaitManagedProcessReady: <E, R = never>(options: AwaitManagedProcessReadyOptions<E, R>) => Effect.Effect<void, E, R>;
55
+ //#endregion
56
+ export { process_supervisor_d_exports };
57
+ //# sourceMappingURL=process-supervisor.d.mts.map