@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 @@
1
+ {"version":3,"file":"prune.mjs","names":[],"sources":["../../../src/orchestrators/snapshot/prune.ts"],"sourcesContent":["// Prune — label-scoped orphan sweep.\n//\n// Architecture § 4 / Decision §10: plugins emit `LivenessClassifier`\n// decls; the L3 prune orchestrator dispatches to them with the\n// registry-persisted hints and reaps anything classified `abandoned`.\n//\n// This module is the snapshot-orchestrator-side of prune: sweeping\n// snapshot-byproduct images, snapshot-catalog directories that lost\n// their owning stack, and cache entries whose chainId is no longer\n// referenced anywhere.\n//\n// The substrate-wide registry prune (engine resources / stack\n// roster) is a sibling orchestrator and lives elsewhere; this file\n// is scoped to snapshot adjacent artifacts.\n\nimport { Effect, FileSystem, Schema } from 'effect';\n\nimport type {\n\tLivenessClassification,\n\tLivenessClassifierDecl,\n\tLivenessHints,\n} from '../../contracts/liveness-classifier.ts';\nimport type { ContainerRuntime } from '../../contracts/container-runtime.ts';\nimport { SnapshotMetadataSchema, type SnapshotMetadata } from './descriptor.ts';\nimport { SNAPSHOTS_DIR_NAME } from './wipe.ts';\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\nexport class PrunePhaseError extends Schema.TaggedErrorClass<PrunePhaseError>()(\n\t'SnapshotPrunePhaseError',\n\t{\n\t\tphase: Schema.Literals([\n\t\t\t'enumerate-catalog',\n\t\t\t'read-meta',\n\t\t\t'classify',\n\t\t\t'sweep-images',\n\t\t\t'sweep-directories',\n\t\t]),\n\t\tdetail: Schema.String,\n\t\tcause: Schema.optional(Schema.Defect),\n\t},\n) {}\n\nconst failPhase =\n\t(\n\t\tphase: PrunePhaseError['phase'],\n\t\tdetail: string,\n\t): ((cause: unknown) => Effect.Effect<never, PrunePhaseError>) =>\n\t(cause) =>\n\t\tEffect.fail(new PrunePhaseError({ phase, detail, cause }));\n\n// -----------------------------------------------------------------------------\n// Inputs\n// -----------------------------------------------------------------------------\n\n/** Per-classifier dispatch entry — the L3 prune orchestrator hands\n * the classifier the persisted hints for one snapshot artifact /\n * cache entry / etc., and the classifier returns `'alive' | 'dormant'\n * | 'stale' | 'abandoned'`. */\nexport interface ClassifierDispatch {\n\treadonly plugin: string;\n\treadonly decl: LivenessClassifierDecl;\n}\n\nexport interface PruneInputs {\n\t/** Stack root containing the `snapshots/` catalog. */\n\treadonly stackRoot: string;\n\t/** Filter for managed image cleanup. */\n\treadonly imageLabelFilter: { readonly app: string; readonly stack: string };\n\t/** Classifiers contributed by plugins — same set the L3 prune\n\t * orchestrator dispatches to. Iterated in declaration order; the\n\t * first non-`alive` classification wins. */\n\treadonly classifiers: ReadonlyArray<ClassifierDispatch>;\n\treadonly runtime: ContainerRuntime;\n}\n\nexport interface PruneResult {\n\treadonly inspected: number;\n\treadonly reaped: ReadonlyArray<{\n\t\treadonly id: string;\n\t\treadonly classification: LivenessClassification;\n\t}>;\n\treadonly imagesSwept: number;\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nconst readMetaOpt = (\n\tdir: string,\n): Effect.Effect<SnapshotMetadata | null, PrunePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst path = `${dir}/meta.json`;\n\t\tconst exists = yield* fs.exists(path).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (!exists) return null;\n\t\tconst text = yield* fs\n\t\t\t.readFileString(path)\n\t\t\t.pipe(Effect.catch(failPhase('read-meta', `read ${path} failed`)));\n\t\tconst raw = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\tcatch: () => null,\n\t\t}).pipe(Effect.catch(() => Effect.succeed(null)));\n\t\tif (raw === null) return null;\n\t\treturn yield* Schema.decodeUnknownEffect(SnapshotMetadataSchema)(raw).pipe(\n\t\t\tEffect.catch(() => Effect.succeed(null)),\n\t\t);\n\t});\n\n/** Build the hints document a classifier consumes. Snapshot prune is\n * age- + identity-based by default; plugin-specific hints flow\n * through `pluginHints`. */\nconst hintsFor = (meta: SnapshotMetadata): LivenessHints => ({\n\theartbeatAt: meta.createdAt,\n\tclaimPid: null,\n\tclaimStartTime: null,\n\tpluginHints: {\n\t\tsnapshotId: meta.id,\n\t\tidentity: meta.identity,\n\t\tparticipants: meta.participants,\n\t},\n});\n\n// -----------------------------------------------------------------------------\n// Top-level prune\n// -----------------------------------------------------------------------------\n\n/**\n * Walk the snapshot catalog, dispatch each artifact's hints through\n * the contributed classifiers, and reap anything classified\n * `abandoned`. Concurrent sweeps over the same catalog are not\n * supported (caller holds `snapshot.reservation` or `stack.lock`).\n *\n * Also removes managed images via the runtime adapter's label-filtered\n * image cleanup.\n */\nexport const runPrune = (\n\tinputs: PruneInputs,\n): Effect.Effect<PruneResult, PrunePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.snapshot.phase': 'prune',\n\t\t});\n\t\tconst catalogDir = `${inputs.stackRoot}/${SNAPSHOTS_DIR_NAME}`;\n\t\tconst catalogExists = yield* fs\n\t\t\t.exists(catalogDir)\n\t\t\t.pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (!catalogExists) {\n\t\t\treturn { inspected: 0, reaped: [], imagesSwept: 0 } satisfies PruneResult;\n\t\t}\n\t\tconst ids = yield* fs\n\t\t\t.readDirectory(catalogDir)\n\t\t\t.pipe(Effect.catch(failPhase('enumerate-catalog', `readdir ${catalogDir} failed`)));\n\n\t\tconst reaped: Array<{ id: string; classification: LivenessClassification }> = [];\n\t\tfor (const id of ids) {\n\t\t\tconst dir = `${catalogDir}/${id}`;\n\t\t\tconst meta = yield* readMetaOpt(dir);\n\t\t\t// Partial artifacts (no meta) — classify as `abandoned` by\n\t\t\t// convention. The catalog list already hides them; reaping\n\t\t\t// is just freeing the disk slot.\n\t\t\tif (meta === null) {\n\t\t\t\tyield* fs\n\t\t\t\t\t.remove(dir, { recursive: true, force: true })\n\t\t\t\t\t.pipe(Effect.catch(failPhase('sweep-directories', `remove ${dir} failed`)));\n\t\t\t\treaped.push({ id, classification: 'abandoned' });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst hints = hintsFor(meta);\n\t\t\tlet classification: LivenessClassification = 'alive';\n\t\t\tfor (const { decl } of inputs.classifiers) {\n\t\t\t\tconst c = yield* decl\n\t\t\t\t\t.classify(hints)\n\t\t\t\t\t.pipe(Effect.catch(() => Effect.succeed('alive' as LivenessClassification)));\n\t\t\t\tif (c !== 'alive') {\n\t\t\t\t\tclassification = c;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (classification === 'abandoned') {\n\t\t\t\tyield* fs\n\t\t\t\t\t.remove(dir, { recursive: true, force: true })\n\t\t\t\t\t.pipe(Effect.catch(failPhase('sweep-directories', `remove ${dir} failed`)));\n\t\t\t\treaped.push({ id, classification });\n\t\t\t}\n\t\t}\n\n\t\t// Sweep snapshot-byproduct images via the runtime adapter's\n\t\t// label-scoped image cleanup. Architecture § Decision §8 —\n\t\t// committed snapshot images accumulate; the orchestrator GCs\n\t\t// alongside catalog prune.\n\t\tconst imagesSwept = yield* inputs.runtime\n\t\t\t.removeManagedImages(inputs.imageLabelFilter)\n\t\t\t.pipe(Effect.catch(failPhase('sweep-images', `image sweep failed`)));\n\n\t\treturn {\n\t\t\tinspected: ids.length,\n\t\t\treaped,\n\t\t\timagesSwept,\n\t\t} satisfies PruneResult;\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.prune'));\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import { Effect, FileSystem, Schema } from "effect";
@@ -0,0 +1,404 @@
1
+ import { HostTreeTarError, untarHostTree, validateHostTreeTarEntries } from "../../substrate/runtime/host-tree-tar/index.mjs";
2
+ import { ContributionDocSchema, SnapshotLayout, SnapshotMetadataSchema, containerImagesBundlePath, contributionPath, isRestorableContainerImageName, isSafeSnapshotPathSegment, isSafeSnapshotRelativePath, parseSnapshotId } from "./descriptor.mjs";
3
+ import { readImageBundleTags, verifyImageBundleTags } from "./image-bundle-tags.mjs";
4
+ import { verifyArtifactIntegrity } from "./integrity.mjs";
5
+ import { mergeContributions, runIdentityGuard, runRuntimeIdentityGuard } from "./identity-guard.mjs";
6
+ import { readSnapshotStateDocument, writeSnapshotStateDocument } from "./state-document.mjs";
7
+ import { SNAPSHOTS_DIR_NAME } from "./wipe.mjs";
8
+ import { stageAndSwap } from "../../substrate/runtime/stage-and-swap/index.mjs";
9
+ import { runtimeControlLockPathForStackRoot } from "../../substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs";
10
+ import { COMMAND_CHANNEL_COMMANDS_FILE_NAME, COMMAND_CHANNEL_EVENTS_FILE_NAME } from "../../substrate/runtime/cross-process/command-channel/channel.mjs";
11
+ import { Effect, Exit, FileSystem, Schema, Stream } from "effect";
12
+ import { randomUUID } from "node:crypto";
13
+ //#region src/orchestrators/snapshot/restore.ts
14
+ /** Tagged failure during a restore step. Phase discriminates the
15
+ * failing step so the user-facing message can point at it. */
16
+ var RestorePhaseError = class extends Schema.TaggedErrorClass()("SnapshotRestorePhaseError", {
17
+ phase: Schema.Literals([
18
+ "read-meta",
19
+ "meta-corrupt",
20
+ "meta-absent",
21
+ "read-state",
22
+ "read-contribution",
23
+ "read-integrity",
24
+ "verify-integrity",
25
+ "preflight",
26
+ "pre-restore-hook",
27
+ "untar-host-tree",
28
+ "load-image",
29
+ "retag-image",
30
+ "expand-state",
31
+ "post-restore-hook",
32
+ "pre-cleanup",
33
+ "write-restore-pending",
34
+ "clear-restore-pending",
35
+ "missing-subtree-fatal"
36
+ ]),
37
+ plugin: Schema.optional(Schema.String),
38
+ detail: Schema.String,
39
+ cause: Schema.optional(Schema.Defect)
40
+ }) {};
41
+ const failPhase = (phase, detail, plugin) => (cause) => Effect.fail(new RestorePhaseError({
42
+ phase,
43
+ plugin,
44
+ detail,
45
+ cause
46
+ }));
47
+ const failRestore = (phase, detail, plugin) => Effect.fail(new RestorePhaseError({
48
+ phase,
49
+ plugin,
50
+ detail
51
+ }));
52
+ const failImageBundleTagScan = (phase, plugin) => (cause) => Effect.fail(new RestorePhaseError({
53
+ phase,
54
+ plugin,
55
+ detail: cause.detail,
56
+ cause
57
+ }));
58
+ const readMeta = (artifactDir, expectedId) => Effect.gen(function* () {
59
+ const fs = yield* FileSystem.FileSystem;
60
+ const path = `${artifactDir}/${SnapshotLayout.metaFile}`;
61
+ if (!(yield* fs.exists(path).pipe(Effect.catch(() => Effect.succeed(false))))) return yield* Effect.fail(new RestorePhaseError({
62
+ phase: "meta-absent",
63
+ detail: `snapshot meta.json not found at ${path}`
64
+ }));
65
+ const text = yield* fs.readFileString(path).pipe(Effect.catch(failPhase("read-meta", `read meta.json failed at ${path}`)));
66
+ const raw = yield* Effect.try({
67
+ try: () => JSON.parse(text),
68
+ catch: (cause) => new RestorePhaseError({
69
+ phase: "meta-corrupt",
70
+ detail: `meta.json is not valid JSON at ${path}`,
71
+ cause
72
+ })
73
+ });
74
+ const meta = yield* Schema.decodeUnknownEffect(SnapshotMetadataSchema)(raw).pipe(Effect.catch((cause) => Effect.fail(new RestorePhaseError({
75
+ phase: "meta-corrupt",
76
+ detail: `meta.json failed schema decode at ${path}`,
77
+ cause
78
+ }))));
79
+ const parsedId = parseSnapshotId(meta.id);
80
+ if (parsedId === null) return yield* failRestore("meta-corrupt", `meta.json contains an unsafe snapshot id: ${meta.id}`);
81
+ if (parsedId !== expectedId) return yield* failRestore("meta-corrupt", `meta.json id ${meta.id} does not match requested snapshot id ${expectedId}`);
82
+ return meta;
83
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.read-meta"));
84
+ const verifyIntegrity = (artifactDir) => verifyArtifactIntegrity(artifactDir).pipe(Effect.catch((cause) => Effect.fail(new RestorePhaseError({
85
+ phase: cause instanceof Error && cause.message.includes(SnapshotLayout.integrityFile) ? "read-integrity" : "verify-integrity",
86
+ detail: cause instanceof Error ? cause.message : `snapshot integrity failed`,
87
+ cause
88
+ }))));
89
+ /** Restore must discard the current writable layer even when the live
90
+ * supervisor still holds a claim for the container. This is
91
+ * intentionally separate from orphan sweep, which skips claimed
92
+ * containers by design. */
93
+ const removeCapturedContainers = (meta, runtime, runtimeIdentity) => Effect.gen(function* () {
94
+ for (const captured of meta.containers) yield* runtime.removeManagedContainers({
95
+ app: runtimeIdentity.app,
96
+ stack: runtimeIdentity.stack,
97
+ plugin: captured.plugin,
98
+ role: captured.role
99
+ }).pipe(Effect.catch(failPhase("pre-cleanup", `remove managed containers for ${captured.plugin}/${captured.role} failed`, captured.plugin)));
100
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.remove-containers"));
101
+ const RESTORE_PENDING_FILE_NAME = "snapshot.restore-pending.json";
102
+ Schema.Struct({
103
+ version: Schema.Literal(1),
104
+ snapshotId: Schema.String,
105
+ artifactDir: Schema.String,
106
+ app: Schema.String,
107
+ stack: Schema.String,
108
+ network: Schema.String,
109
+ containers: Schema.Array(Schema.Struct({
110
+ plugin: Schema.String,
111
+ role: Schema.String,
112
+ targetImageName: Schema.String,
113
+ stagedImageTag: Schema.String
114
+ }))
115
+ });
116
+ const loadedBundleTags = (bundle) => {
117
+ const tags = /* @__PURE__ */ new Set();
118
+ for (const ref of bundle.refs) if (ref.tag !== void 0) tags.add(ref.tag);
119
+ return tags;
120
+ };
121
+ const mintRestoreStagingTag = () => `devstack-snapshot:restore-${randomUUID().replaceAll("-", "").slice(0, 24)}`;
122
+ const writeRestorePendingMarker = (args) => {
123
+ if (args.stagedImages.length === 0) return Effect.void;
124
+ const doc = {
125
+ version: 1,
126
+ snapshotId: args.meta.id,
127
+ artifactDir: args.artifactDir,
128
+ app: args.meta.app,
129
+ stack: args.meta.stack,
130
+ network: args.meta.network,
131
+ containers: args.stagedImages.map((image) => ({
132
+ plugin: image.captured.plugin,
133
+ role: image.captured.role,
134
+ targetImageName: image.captured.imageName,
135
+ stagedImageTag: image.stagedImageTag
136
+ }))
137
+ };
138
+ return Effect.gen(function* () {
139
+ yield* (yield* FileSystem.FileSystem).writeFileString(`${args.runtimeRoot}/${RESTORE_PENDING_FILE_NAME}`, `${JSON.stringify(doc, null, 2)}\n`).pipe(Effect.catch(failPhase("write-restore-pending", `write ${RESTORE_PENDING_FILE_NAME} failed`)));
140
+ });
141
+ };
142
+ const clearRestorePendingMarker = (runtimeRoot) => Effect.gen(function* () {
143
+ yield* (yield* FileSystem.FileSystem).remove(`${runtimeRoot}/${RESTORE_PENDING_FILE_NAME}`, { force: true }).pipe(Effect.catch(failPhase("clear-restore-pending", `remove ${RESTORE_PENDING_FILE_NAME} failed`)));
144
+ });
145
+ const requirePathSegment = (kind, value, plugin) => isSafeSnapshotPathSegment(value) ? Effect.void : failRestore("preflight", `unsafe snapshot ${kind} path segment: ${value}`, plugin);
146
+ const requireReadableNonEmptyFile = (path, phase, detail, plugin) => Effect.gen(function* () {
147
+ const fs = yield* FileSystem.FileSystem;
148
+ if ((yield* fs.stat(path).pipe(Effect.catch(failPhase(phase, `${detail}: stat failed at ${path}`, plugin)))).size === 0n) return yield* failRestore(phase, `${detail}: empty file at ${path}`, plugin);
149
+ yield* Stream.runDrain(fs.stream(path).pipe(Stream.take(1))).pipe(Effect.catch(failPhase(phase, `${detail}: read failed at ${path}`, plugin)));
150
+ });
151
+ const preflightCapturedContainer = (captured, artifactDir) => Effect.gen(function* () {
152
+ yield* requirePathSegment("plugin", captured.plugin, captured.plugin);
153
+ yield* requirePathSegment("role", captured.role, captured.plugin);
154
+ if (!isSafeSnapshotRelativePath(captured.tarPath)) return yield* failRestore("preflight", `unsafe container image tar path: ${captured.tarPath}`, captured.plugin);
155
+ const expectedTarPath = containerImagesBundlePath();
156
+ if (captured.tarPath !== expectedTarPath) return yield* failRestore("preflight", `container image tar path ${captured.tarPath} does not match canonical bundle ${expectedTarPath}`, captured.plugin);
157
+ if (!isRestorableContainerImageName(captured.imageName)) return yield* failRestore("preflight", `container imageName is not a restorable Docker tag destination: ${captured.imageName}`, captured.plugin);
158
+ if (!isRestorableContainerImageName(captured.snapshotTag)) return yield* failRestore("preflight", `container snapshotTag is not a restorable Docker tag source: ${captured.snapshotTag}`, captured.plugin);
159
+ yield* requireReadableNonEmptyFile(`${artifactDir}/${captured.tarPath}`, "load-image", "container image tar is required", captured.plugin);
160
+ });
161
+ const preflightContributionDoc = (pluginKey, artifactDir) => Effect.gen(function* () {
162
+ const path = `${artifactDir}/${contributionPath(pluginKey)}`;
163
+ const text = yield* (yield* FileSystem.FileSystem).readFileString(path).pipe(Effect.catch(failPhase("read-contribution", `read contribution doc failed at ${path}`, pluginKey)));
164
+ const raw = yield* Effect.try({
165
+ try: () => JSON.parse(text),
166
+ catch: (cause) => new RestorePhaseError({
167
+ phase: "read-contribution",
168
+ plugin: pluginKey,
169
+ detail: `contribution doc is not valid JSON at ${path}`,
170
+ cause
171
+ })
172
+ });
173
+ const decoded = yield* Schema.decodeUnknownEffect(ContributionDocSchema)(raw).pipe(Effect.catch((cause) => Effect.fail(new RestorePhaseError({
174
+ phase: "read-contribution",
175
+ plugin: pluginKey,
176
+ detail: `contribution doc failed schema decode at ${path}`,
177
+ cause
178
+ }))));
179
+ if (decoded.plugin !== pluginKey) return yield* failRestore("read-contribution", `contribution doc plugin ${decoded.plugin} does not match ${pluginKey}`, pluginKey);
180
+ });
181
+ const preflightArtifact = (meta, artifactDir) => Effect.gen(function* () {
182
+ const fs = yield* FileSystem.FileSystem;
183
+ const seenSnapshotTags = /* @__PURE__ */ new Map();
184
+ for (const captured of meta.containers) {
185
+ yield* preflightCapturedContainer(captured, artifactDir);
186
+ const previous = seenSnapshotTags.get(captured.snapshotTag);
187
+ if (previous !== void 0) return yield* failRestore("preflight", `duplicate container snapshotTag ${captured.snapshotTag} for ${previous.plugin}/${previous.role} and ${captured.plugin}/${captured.role}`, captured.plugin);
188
+ seenSnapshotTags.set(captured.snapshotTag, captured);
189
+ }
190
+ for (const pluginKey of meta.participants) yield* preflightContributionDoc(pluginKey, artifactDir);
191
+ const statePath = `${artifactDir}/${SnapshotLayout.stateFile}`;
192
+ if (yield* fs.exists(statePath).pipe(Effect.catch(() => Effect.succeed(false)))) yield* readSnapshotStateDocument(statePath).pipe(Effect.catch(failPhase("read-state", `state.json failed schema validation`)));
193
+ if (meta.hostTreeIncluded) {
194
+ const tarPath = `${artifactDir}/${SnapshotLayout.hostTreeTar}`;
195
+ yield* requireReadableNonEmptyFile(tarPath, "untar-host-tree", "host-tree tar is required");
196
+ yield* validateHostTreeTarEntries(fs.stream(tarPath).pipe(Stream.mapError((cause) => new HostTreeTarError({
197
+ stage: "entry-validation",
198
+ operation: "untar",
199
+ detail: `read host-tree tar failed at ${tarPath}`,
200
+ cause
201
+ })))).pipe(Effect.catch(failPhase("untar-host-tree", `host-tree tar entry validation failed`)));
202
+ }
203
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.preflight"));
204
+ const loadImageBundle = (tarPath, artifactDir, runtime, expectedSnapshotTags) => Effect.gen(function* () {
205
+ const fs = yield* FileSystem.FileSystem;
206
+ const fullTarPath = `${artifactDir}/${tarPath}`;
207
+ if (!(yield* fs.exists(fullTarPath).pipe(Effect.catch(() => Effect.succeed(false))))) return yield* Effect.fail(new RestorePhaseError({
208
+ phase: "load-image",
209
+ detail: `container image bundle absent at ${fullTarPath}`
210
+ }));
211
+ yield* verifyImageBundleTags(tarPath, yield* readImageBundleTags(fullTarPath, tarPath).pipe(Effect.catch(failImageBundleTagScan("load-image"))), expectedSnapshotTags).pipe(Effect.catch(failImageBundleTagScan("load-image")));
212
+ const loaded = yield* runtime.loadImage(fs.stream(fullTarPath)).pipe(Effect.catch(failPhase("load-image", `load container image bundle from ${fullTarPath} failed`)));
213
+ const loadedTags = loadedBundleTags(loaded);
214
+ const missing = expectedSnapshotTags.filter((tag) => !loadedTags.has(tag));
215
+ if (missing.length > 0) return yield* failRestore("load-image", `container image bundle ${tarPath} did not load expected snapshot tags: ${missing.join(", ")}`);
216
+ const refsByTag = /* @__PURE__ */ new Map();
217
+ for (const ref of loaded.refs) {
218
+ if (ref.tag === void 0 || !expectedSnapshotTags.includes(ref.tag)) continue;
219
+ if (refsByTag.has(ref.tag)) return yield* failRestore("load-image", `container image bundle ${tarPath} loaded duplicate snapshot tag ${ref.tag}`);
220
+ refsByTag.set(ref.tag, ref);
221
+ }
222
+ return refsByTag;
223
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.load-image-bundle"));
224
+ const expectedSnapshotTagsByBundle = (containers) => {
225
+ const byBundle = /* @__PURE__ */ new Map();
226
+ for (const captured of containers) {
227
+ const tags = byBundle.get(captured.tarPath);
228
+ if (tags === void 0) byBundle.set(captured.tarPath, [captured.snapshotTag]);
229
+ else tags.push(captured.snapshotTag);
230
+ }
231
+ return byBundle;
232
+ };
233
+ const stageLoadedImage = (captured, loadedRef, runtime, registerStagedImage) => Effect.gen(function* () {
234
+ const stagedImageTag = mintRestoreStagingTag();
235
+ const stagedImage = {
236
+ captured,
237
+ stagedRef: {
238
+ digest: loadedRef.digest,
239
+ tag: stagedImageTag
240
+ },
241
+ stagedImageTag
242
+ };
243
+ yield* registerStagedImage(stagedImage);
244
+ yield* runtime.tagImage(loadedRef, stagedImageTag, { removeSourceAfterTag: true }).pipe(Effect.catch(failPhase("retag-image", `tag restored image ${captured.snapshotTag} as staging ref ${stagedImageTag} failed`, captured.plugin)));
245
+ return stagedImage;
246
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.stage-image"));
247
+ const cleanupRestoreStagingImages = (runtime, images) => Effect.forEach(images, (image) => runtime.removeImage(image.stagedRef).pipe(Effect.catch((cause) => Effect.logWarning(`remove restore staging image ${image.stagedImageTag} failed during restore cleanup: ${String(cause)}`))), { concurrency: "unbounded" }).pipe(Effect.asVoid);
248
+ const promoteStagedImages = (images, runtime) => Effect.gen(function* () {
249
+ for (const image of images) yield* runtime.tagImage(image.stagedRef, image.captured.imageName, { removeSourceAfterTag: true }).pipe(Effect.catch(failPhase("retag-image", `tag staged image ${image.stagedImageTag} as ${image.captured.imageName} failed`, image.captured.plugin)));
250
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.promote-images"));
251
+ const restoreHostTree = (artifactDir, target) => Effect.gen(function* () {
252
+ const fs = yield* FileSystem.FileSystem;
253
+ const tarPath = `${artifactDir}/${SnapshotLayout.hostTreeTar}`;
254
+ if (!(yield* fs.exists(tarPath).pipe(Effect.catch(() => Effect.succeed(false))))) return yield* Effect.fail(new RestorePhaseError({
255
+ phase: "untar-host-tree",
256
+ detail: `host-tree tar absent at ${tarPath}`
257
+ }));
258
+ const tarStream = fs.stream(tarPath).pipe(Stream.mapError((cause) => new HostTreeTarError({
259
+ stage: "stream-stdin",
260
+ operation: "untar",
261
+ detail: `read host-tree tar failed at ${tarPath}`,
262
+ cause
263
+ })));
264
+ yield* Effect.scoped(untarHostTree(tarStream, { target })).pipe(Effect.catch(failPhase("untar-host-tree", `untar ${tarPath} to ${target} failed`)));
265
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore.host-tree"));
266
+ const LIVE_RESTORE_PRESERVED_PATHS = [
267
+ {
268
+ relativePath: SNAPSHOTS_DIR_NAME,
269
+ kind: "directory"
270
+ },
271
+ {
272
+ relativePath: COMMAND_CHANNEL_COMMANDS_FILE_NAME,
273
+ kind: "file"
274
+ },
275
+ {
276
+ relativePath: COMMAND_CHANNEL_EVENTS_FILE_NAME,
277
+ kind: "file"
278
+ },
279
+ {
280
+ relativePath: "roster.json",
281
+ kind: "file"
282
+ },
283
+ {
284
+ relativePath: "container-claims.json",
285
+ kind: "file"
286
+ },
287
+ {
288
+ relativePath: "snapshot.reservation",
289
+ kind: "file"
290
+ }
291
+ ];
292
+ /**
293
+ * Run the full restore. Bracketed-atomic via `stageAndSwap` at the
294
+ * runtime-root level — external watchers never observe a half-restored
295
+ * tree.
296
+ *
297
+ * Order:
298
+ * 1. Read meta.json (refuse if absent / corrupt — no mutation).
299
+ * 2. Run identity-guard against runtime metadata and merged plugin
300
+ * contributions (refuse on any disagreement — no mutation).
301
+ * 3. Pre-restore hooks (per-plugin validation; soft errors).
302
+ * 4. Stage:
303
+ * - Untar host-tree into staging.
304
+ * - Copy state.json into staging.
305
+ * - Re-read contribution docs.
306
+ * - Load image bundles and stage verified snapshot tags.
307
+ * - Write a restore-pending marker into the staged root.
308
+ * 5. Atomic swap staging → runtime root, preserving live command /
309
+ * event channel files and other explicit runtime-control files.
310
+ * 6. Promote staged images to recorded refs, then remove captured
311
+ * managed containers by label. If this fails, the pending marker
312
+ * remains in the restored root for diagnosis/recovery.
313
+ * 7. Post-restore hooks.
314
+ *
315
+ * The caller is responsible for `acquireReservation`; restore supplies
316
+ * the runtime-control publish lock to `stageAndSwap`.
317
+ */
318
+ const runRestore = (inputs) => Effect.gen(function* () {
319
+ yield* Effect.annotateCurrentSpan({
320
+ "devstack.snapshot.phase": "restore",
321
+ "devstack.snapshot.artifact": inputs.artifactDir
322
+ });
323
+ const meta = yield* readMeta(inputs.artifactDir, inputs.snapshotId);
324
+ yield* verifyIntegrity(inputs.artifactDir);
325
+ yield* runRuntimeIdentityGuard({
326
+ app: meta.app,
327
+ stack: meta.stack,
328
+ network: meta.network
329
+ }, inputs.runtimeIdentity);
330
+ const liveContributions = [];
331
+ for (const participant of inputs.participants) {
332
+ const slice = yield* participant.liveIdentity;
333
+ liveContributions.push({
334
+ plugin: participant.plugin,
335
+ slice
336
+ });
337
+ }
338
+ const live = yield* mergeContributions(liveContributions);
339
+ yield* runIdentityGuard(meta.identity, live);
340
+ for (const participant of inputs.participants) if (participant.preRestore) yield* participant.preRestore.pipe(Effect.catch(failPhase("pre-restore-hook", `preRestore failed`, participant.plugin)));
341
+ yield* preflightArtifact(meta, inputs.artifactDir);
342
+ const stagedImages = yield* Effect.scoped(Effect.gen(function* () {
343
+ const stagedImages = [];
344
+ let recoveryHandoffComplete = false;
345
+ yield* Effect.addFinalizer((exit) => Exit.isFailure(exit) && !recoveryHandoffComplete ? cleanupRestoreStagingImages(inputs.runtime, stagedImages) : Effect.void);
346
+ const swappedImages = yield* stageAndSwap({
347
+ targetPath: inputs.runtimeStackRoot,
348
+ stagingPath: inputs.runtimeStagingPath,
349
+ backupPath: inputs.runtimeBackupPath,
350
+ preserveFromTarget: LIVE_RESTORE_PRESERVED_PATHS,
351
+ publishLockPath: runtimeControlLockPathForStackRoot(inputs.runtimeStackRoot),
352
+ build: Effect.gen(function* () {
353
+ if (meta.hostTreeIncluded) yield* restoreHostTree(inputs.artifactDir, inputs.runtimeStagingPath);
354
+ const fs = yield* FileSystem.FileSystem;
355
+ const srcState = `${inputs.artifactDir}/${SnapshotLayout.stateFile}`;
356
+ if (yield* fs.exists(srcState).pipe(Effect.catch(() => Effect.succeed(false)))) {
357
+ const stateDoc = yield* readSnapshotStateDocument(srcState).pipe(Effect.catch(failPhase("read-state", `state.json failed schema validation`)));
358
+ yield* writeSnapshotStateDocument(`${inputs.runtimeStagingPath}/${SnapshotLayout.stateFile}`, stateDoc).pipe(Effect.catch(failPhase("expand-state", `write state.json failed`)));
359
+ }
360
+ for (const pluginKey of meta.participants) {
361
+ const path = `${inputs.artifactDir}/${contributionPath(pluginKey)}`;
362
+ if (!(yield* fs.exists(path).pipe(Effect.catch(() => Effect.succeed(false))))) return yield* Effect.fail(new RestorePhaseError({
363
+ phase: "read-contribution",
364
+ plugin: pluginKey,
365
+ detail: `contribution doc absent at ${path}`
366
+ }));
367
+ }
368
+ const expectedTagsByBundle = expectedSnapshotTagsByBundle(meta.containers);
369
+ const loadedRefsBySnapshotTag = /* @__PURE__ */ new Map();
370
+ for (const [tarPath, expectedTags] of expectedTagsByBundle) {
371
+ const loadedRefs = yield* loadImageBundle(tarPath, inputs.artifactDir, inputs.runtime, expectedTags);
372
+ for (const [tag, ref] of loadedRefs) loadedRefsBySnapshotTag.set(tag, ref);
373
+ }
374
+ for (const captured of meta.containers) {
375
+ const loadedRef = loadedRefsBySnapshotTag.get(captured.snapshotTag);
376
+ if (loadedRef === void 0) return yield* failRestore("load-image", `container image bundle did not return loaded ref for ${captured.snapshotTag}`, captured.plugin);
377
+ yield* stageLoadedImage(captured, loadedRef, inputs.runtime, (image) => Effect.sync(() => {
378
+ stagedImages.push(image);
379
+ }));
380
+ }
381
+ yield* writeRestorePendingMarker({
382
+ runtimeRoot: inputs.runtimeStagingPath,
383
+ meta,
384
+ artifactDir: inputs.artifactDir,
385
+ stagedImages
386
+ });
387
+ return stagedImages;
388
+ })
389
+ });
390
+ recoveryHandoffComplete = true;
391
+ return swappedImages;
392
+ }));
393
+ if (stagedImages.length > 0) {
394
+ yield* promoteStagedImages(stagedImages, inputs.runtime);
395
+ yield* removeCapturedContainers(meta, inputs.runtime, inputs.runtimeIdentity);
396
+ yield* clearRestorePendingMarker(inputs.runtimeStackRoot);
397
+ }
398
+ for (const participant of inputs.participants) if (participant.postRestore) yield* participant.postRestore.pipe(Effect.catch(failPhase("post-restore-hook", `postRestore failed`, participant.plugin)));
399
+ return meta;
400
+ }).pipe(Effect.withSpan("orchestrator.snapshot.restore"));
401
+ //#endregion
402
+ export { runRestore };
403
+
404
+ //# sourceMappingURL=restore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.mjs","names":[],"sources":["../../../src/orchestrators/snapshot/restore.ts"],"sourcesContent":["// Restore pipeline.\n//\n// Architecture § Snapshot lifecycle (restore half):\n//\n// Identity guard (chain identity + plugin contributions)\n// │ (refuse and stop if mismatch — nothing touched)\n// ▼\n// Stage atomic restore in tempdir\n// │\n// ▼\n// Per plugin: expand tar to staging, load committed images\n// │\n// ▼\n// Atomic swap into runtime dir, preserving live control files\n// │\n// ▼\n// snapshot.restored event → next stack acquire picks it up\n//\n// Bracketed-atomic — Tension 9 decision: one outer atomic swap, not\n// per-phase idempotency.\n\nimport { randomUUID } from 'node:crypto';\n\nimport { Effect, Exit, FileSystem, Schema, Stream } from 'effect';\n\nimport type { ContainerRuntime, ImageRef } from '../../contracts/container-runtime.ts';\nimport {\n\tHostTreeTarError,\n\tuntarHostTree,\n\tvalidateHostTreeTarEntries,\n} from '../../substrate/runtime/host-tree-tar/index.ts';\nimport {\n\tContributionDocSchema,\n\tcontainerImagesBundlePath,\n\tcontributionPath,\n\tSnapshotLayout,\n\tSnapshotMetadataSchema,\n\ttype SnapshotId,\n\ttype CapturedContainer,\n\ttype IdentitySlice,\n\ttype SnapshotMetadata,\n\tisRestorableContainerImageName,\n\tisSafeSnapshotPathSegment,\n\tisSafeSnapshotRelativePath,\n\tparseSnapshotId,\n} from './descriptor.ts';\nimport { verifyArtifactIntegrity } from './integrity.ts';\nimport { readSnapshotStateDocument, writeSnapshotStateDocument } from './state-document.ts';\nimport {\n\tmergeContributions,\n\trunIdentityGuard,\n\trunRuntimeIdentityGuard,\n\ttype IdentityContribution,\n\ttype IdentityContributionConflictError,\n\ttype IdentityGuardError,\n\ttype SnapshotRuntimeIdentity,\n} from './identity-guard.ts';\nimport {\n\tstageAndSwap,\n\ttype StageAndSwapError,\n\ttype StageAndSwapPreservedPath,\n} from '../../substrate/runtime/stage-and-swap/index.ts';\nimport {\n\tCOMMAND_CHANNEL_COMMANDS_FILE_NAME,\n\tCOMMAND_CHANNEL_EVENTS_FILE_NAME,\n\truntimeControlLockPathForStackRoot,\n} from '../../substrate/runtime/cross-process/command-channel/index.ts';\nimport {\n\tImageBundleTagScanError,\n\treadImageBundleTags,\n\tverifyImageBundleTags,\n} from './image-bundle-tags.ts';\nimport { SNAPSHOTS_DIR_NAME } from './wipe.ts';\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\n/** Tagged failure during a restore step. Phase discriminates the\n * failing step so the user-facing message can point at it. */\nexport class RestorePhaseError extends Schema.TaggedErrorClass<RestorePhaseError>()(\n\t'SnapshotRestorePhaseError',\n\t{\n\t\tphase: Schema.Literals([\n\t\t\t'read-meta',\n\t\t\t'meta-corrupt',\n\t\t\t'meta-absent',\n\t\t\t'read-state',\n\t\t\t'read-contribution',\n\t\t\t'read-integrity',\n\t\t\t'verify-integrity',\n\t\t\t'preflight',\n\t\t\t'pre-restore-hook',\n\t\t\t'untar-host-tree',\n\t\t\t'load-image',\n\t\t\t'retag-image',\n\t\t\t'expand-state',\n\t\t\t'post-restore-hook',\n\t\t\t'pre-cleanup',\n\t\t\t'write-restore-pending',\n\t\t\t'clear-restore-pending',\n\t\t\t'missing-subtree-fatal',\n\t\t]),\n\t\tplugin: Schema.optional(Schema.String),\n\t\tdetail: Schema.String,\n\t\tcause: Schema.optional(Schema.Defect),\n\t},\n) {}\n\nconst failPhase =\n\t(\n\t\tphase: RestorePhaseError['phase'],\n\t\tdetail: string,\n\t\tplugin?: string,\n\t): ((cause: unknown) => Effect.Effect<never, RestorePhaseError>) =>\n\t(cause) =>\n\t\tEffect.fail(new RestorePhaseError({ phase, plugin, detail, cause }));\n\nconst failRestore = (\n\tphase: RestorePhaseError['phase'],\n\tdetail: string,\n\tplugin?: string,\n): Effect.Effect<never, RestorePhaseError> =>\n\tEffect.fail(new RestorePhaseError({ phase, plugin, detail }));\n\nconst failImageBundleTagScan =\n\t(phase: RestorePhaseError['phase'], plugin?: string) =>\n\t(cause: ImageBundleTagScanError): Effect.Effect<never, RestorePhaseError> =>\n\t\tEffect.fail(new RestorePhaseError({ phase, plugin, detail: cause.detail, cause }));\n\n// -----------------------------------------------------------------------------\n// Participants — what restore needs from each plugin\n// -----------------------------------------------------------------------------\n\n/** One plugin's restore-side contributions: a live identity probe\n * (read fresh from the live stack), an opaque pre-restore validation\n * hook, and a post-restore hook. Mirrors `SnapshotableDecl`'s\n * pre/post hook surface but closed over the plugin's key. */\nexport interface RestoreParticipant {\n\treadonly plugin: string;\n\treadonly liveIdentity: Effect.Effect<IdentitySlice>;\n\t/** Pre-restore application-level validation (version compat,\n\t * side-state). Identity-guard runs FIRST and unilaterally; this\n\t * is the plugin's extra hook. */\n\treadonly preRestore?: Effect.Effect<void>;\n\t/** Post-restore hook: re-validate, warm caches, etc. */\n\treadonly postRestore?: Effect.Effect<void>;\n}\n\n// -----------------------------------------------------------------------------\n// Metadata read — authoritative; absent / unparseable refuses restore.\n// -----------------------------------------------------------------------------\n\nconst readMeta = (\n\tartifactDir: string,\n\texpectedId: SnapshotId,\n): Effect.Effect<SnapshotMetadata, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst path = `${artifactDir}/${SnapshotLayout.metaFile}`;\n\t\tconst exists = yield* fs.exists(path).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (!exists) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase: 'meta-absent',\n\t\t\t\t\tdetail: `snapshot meta.json not found at ${path}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst text = yield* fs\n\t\t\t.readFileString(path)\n\t\t\t.pipe(Effect.catch(failPhase('read-meta', `read meta.json failed at ${path}`)));\n\t\tconst raw = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase: 'meta-corrupt',\n\t\t\t\t\tdetail: `meta.json is not valid JSON at ${path}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tconst meta = yield* Schema.decodeUnknownEffect(SnapshotMetadataSchema)(raw).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\t\tphase: 'meta-corrupt',\n\t\t\t\t\t\tdetail: `meta.json failed schema decode at ${path}`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tconst parsedId = parseSnapshotId(meta.id);\n\t\tif (parsedId === null) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'meta-corrupt',\n\t\t\t\t`meta.json contains an unsafe snapshot id: ${meta.id}`,\n\t\t\t);\n\t\t}\n\t\tif (parsedId !== expectedId) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'meta-corrupt',\n\t\t\t\t`meta.json id ${meta.id} does not match requested snapshot id ${expectedId}`,\n\t\t\t);\n\t\t}\n\t\treturn meta;\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.read-meta'));\n\nconst verifyIntegrity = (\n\tartifactDir: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tverifyArtifactIntegrity(artifactDir).pipe(\n\t\tEffect.catch((cause) =>\n\t\t\tEffect.fail(\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase:\n\t\t\t\t\t\tcause instanceof Error && cause.message.includes(SnapshotLayout.integrityFile)\n\t\t\t\t\t\t\t? 'read-integrity'\n\t\t\t\t\t\t\t: 'verify-integrity',\n\t\t\t\t\tdetail: cause instanceof Error ? cause.message : `snapshot integrity failed`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t);\n\n// -----------------------------------------------------------------------------\n// Managed-container removal by label.\n// -----------------------------------------------------------------------------\n\n/** Restore must discard the current writable layer even when the live\n * supervisor still holds a claim for the container. This is\n * intentionally separate from orphan sweep, which skips claimed\n * containers by design. */\nconst removeCapturedContainers = (\n\tmeta: SnapshotMetadata,\n\truntime: ContainerRuntime,\n\truntimeIdentity: SnapshotRuntimeIdentity,\n): Effect.Effect<void, RestorePhaseError> =>\n\tEffect.gen(function* () {\n\t\tfor (const captured of meta.containers) {\n\t\t\tyield* runtime\n\t\t\t\t.removeManagedContainers({\n\t\t\t\t\tapp: runtimeIdentity.app,\n\t\t\t\t\tstack: runtimeIdentity.stack,\n\t\t\t\t\tplugin: captured.plugin,\n\t\t\t\t\trole: captured.role,\n\t\t\t\t})\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catch(\n\t\t\t\t\t\tfailPhase(\n\t\t\t\t\t\t\t'pre-cleanup',\n\t\t\t\t\t\t\t`remove managed containers for ${captured.plugin}/${captured.role} failed`,\n\t\t\t\t\t\t\tcaptured.plugin,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t}\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.remove-containers'));\n\n// -----------------------------------------------------------------------------\n// Post-publish Docker finalization recovery marker.\n// -----------------------------------------------------------------------------\n\nexport const SNAPSHOT_RESTORE_PENDING_VERSION = 1 as const;\nexport const RESTORE_PENDING_FILE_NAME = 'snapshot.restore-pending.json' as const;\n\nexport const RestorePendingDocumentSchema = Schema.Struct({\n\tversion: Schema.Literal(SNAPSHOT_RESTORE_PENDING_VERSION),\n\tsnapshotId: Schema.String,\n\tartifactDir: Schema.String,\n\tapp: Schema.String,\n\tstack: Schema.String,\n\tnetwork: Schema.String,\n\tcontainers: Schema.Array(\n\t\tSchema.Struct({\n\t\t\tplugin: Schema.String,\n\t\t\trole: Schema.String,\n\t\t\ttargetImageName: Schema.String,\n\t\t\tstagedImageTag: Schema.String,\n\t\t}),\n\t),\n});\nexport type RestorePendingDocument = Schema.Schema.Type<typeof RestorePendingDocumentSchema>;\n\ninterface StagedContainerImage {\n\treadonly captured: CapturedContainer;\n\treadonly stagedRef: ImageRef;\n\treadonly stagedImageTag: string;\n}\n\nconst loadedBundleTags = (bundle: { readonly refs: ReadonlyArray<ImageRef> }): Set<string> => {\n\tconst tags = new Set<string>();\n\tfor (const ref of bundle.refs) {\n\t\tif (ref.tag !== undefined) tags.add(ref.tag);\n\t}\n\treturn tags;\n};\n\nconst mintRestoreStagingTag = (): string =>\n\t`devstack-snapshot:restore-${randomUUID().replaceAll('-', '').slice(0, 24)}`;\n\nconst writeRestorePendingMarker = (args: {\n\treadonly runtimeRoot: string;\n\treadonly meta: SnapshotMetadata;\n\treadonly artifactDir: string;\n\treadonly stagedImages: ReadonlyArray<StagedContainerImage>;\n}): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> => {\n\tif (args.stagedImages.length === 0) return Effect.void;\n\tconst doc: RestorePendingDocument = {\n\t\tversion: SNAPSHOT_RESTORE_PENDING_VERSION,\n\t\tsnapshotId: args.meta.id,\n\t\tartifactDir: args.artifactDir,\n\t\tapp: args.meta.app,\n\t\tstack: args.meta.stack,\n\t\tnetwork: args.meta.network,\n\t\tcontainers: args.stagedImages.map((image) => ({\n\t\t\tplugin: image.captured.plugin,\n\t\t\trole: image.captured.role,\n\t\t\ttargetImageName: image.captured.imageName,\n\t\t\tstagedImageTag: image.stagedImageTag,\n\t\t})),\n\t};\n\treturn Effect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tyield* fs\n\t\t\t.writeFileString(\n\t\t\t\t`${args.runtimeRoot}/${RESTORE_PENDING_FILE_NAME}`,\n\t\t\t\t`${JSON.stringify(doc, null, 2)}\\n`,\n\t\t\t)\n\t\t\t.pipe(\n\t\t\t\tEffect.catch(\n\t\t\t\t\tfailPhase('write-restore-pending', `write ${RESTORE_PENDING_FILE_NAME} failed`),\n\t\t\t\t),\n\t\t\t);\n\t});\n};\n\nconst clearRestorePendingMarker = (\n\truntimeRoot: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tyield* fs\n\t\t\t.remove(`${runtimeRoot}/${RESTORE_PENDING_FILE_NAME}`, { force: true })\n\t\t\t.pipe(\n\t\t\t\tEffect.catch(\n\t\t\t\t\tfailPhase('clear-restore-pending', `remove ${RESTORE_PENDING_FILE_NAME} failed`),\n\t\t\t\t),\n\t\t\t);\n\t});\n\n// -----------------------------------------------------------------------------\n// Artifact preflight — no destructive cleanup until required files are present.\n// -----------------------------------------------------------------------------\n\nconst requirePathSegment = (\n\tkind: string,\n\tvalue: string,\n\tplugin?: string,\n): Effect.Effect<void, RestorePhaseError> =>\n\tisSafeSnapshotPathSegment(value)\n\t\t? Effect.void\n\t\t: failRestore('preflight', `unsafe snapshot ${kind} path segment: ${value}`, plugin);\n\nconst requireReadableNonEmptyFile = (\n\tpath: string,\n\tphase: RestorePhaseError['phase'],\n\tdetail: string,\n\tplugin?: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst stat = yield* fs\n\t\t\t.stat(path)\n\t\t\t.pipe(Effect.catch(failPhase(phase, `${detail}: stat failed at ${path}`, plugin)));\n\t\tif (stat.size === 0n) {\n\t\t\treturn yield* failRestore(phase, `${detail}: empty file at ${path}`, plugin);\n\t\t}\n\t\tyield* Stream.runDrain(fs.stream(path).pipe(Stream.take(1))).pipe(\n\t\t\tEffect.catch(failPhase(phase, `${detail}: read failed at ${path}`, plugin)),\n\t\t);\n\t});\n\nconst preflightCapturedContainer = (\n\tcaptured: CapturedContainer,\n\tartifactDir: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tyield* requirePathSegment('plugin', captured.plugin, captured.plugin);\n\t\tyield* requirePathSegment('role', captured.role, captured.plugin);\n\t\tif (!isSafeSnapshotRelativePath(captured.tarPath)) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'preflight',\n\t\t\t\t`unsafe container image tar path: ${captured.tarPath}`,\n\t\t\t\tcaptured.plugin,\n\t\t\t);\n\t\t}\n\t\tconst expectedTarPath = containerImagesBundlePath();\n\t\tif (captured.tarPath !== expectedTarPath) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'preflight',\n\t\t\t\t`container image tar path ${captured.tarPath} does not match canonical bundle ${expectedTarPath}`,\n\t\t\t\tcaptured.plugin,\n\t\t\t);\n\t\t}\n\t\tif (!isRestorableContainerImageName(captured.imageName)) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'preflight',\n\t\t\t\t`container imageName is not a restorable Docker tag destination: ${captured.imageName}`,\n\t\t\t\tcaptured.plugin,\n\t\t\t);\n\t\t}\n\t\tif (!isRestorableContainerImageName(captured.snapshotTag)) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'preflight',\n\t\t\t\t`container snapshotTag is not a restorable Docker tag source: ${captured.snapshotTag}`,\n\t\t\t\tcaptured.plugin,\n\t\t\t);\n\t\t}\n\t\tyield* requireReadableNonEmptyFile(\n\t\t\t`${artifactDir}/${captured.tarPath}`,\n\t\t\t'load-image',\n\t\t\t'container image tar is required',\n\t\t\tcaptured.plugin,\n\t\t);\n\t});\n\nconst preflightContributionDoc = (\n\tpluginKey: string,\n\tartifactDir: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst path = `${artifactDir}/${contributionPath(pluginKey)}`;\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst text = yield* fs\n\t\t\t.readFileString(path)\n\t\t\t.pipe(\n\t\t\t\tEffect.catch(\n\t\t\t\t\tfailPhase('read-contribution', `read contribution doc failed at ${path}`, pluginKey),\n\t\t\t\t),\n\t\t\t);\n\t\tconst raw = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase: 'read-contribution',\n\t\t\t\t\tplugin: pluginKey,\n\t\t\t\t\tdetail: `contribution doc is not valid JSON at ${path}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t\tconst decoded = yield* Schema.decodeUnknownEffect(ContributionDocSchema)(raw).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\t\tphase: 'read-contribution',\n\t\t\t\t\t\tplugin: pluginKey,\n\t\t\t\t\t\tdetail: `contribution doc failed schema decode at ${path}`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tif (decoded.plugin !== pluginKey) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'read-contribution',\n\t\t\t\t`contribution doc plugin ${decoded.plugin} does not match ${pluginKey}`,\n\t\t\t\tpluginKey,\n\t\t\t);\n\t\t}\n\t});\n\nconst preflightArtifact = (\n\tmeta: SnapshotMetadata,\n\tartifactDir: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst seenSnapshotTags = new Map<string, CapturedContainer>();\n\t\tfor (const captured of meta.containers) {\n\t\t\tyield* preflightCapturedContainer(captured, artifactDir);\n\t\t\tconst previous = seenSnapshotTags.get(captured.snapshotTag);\n\t\t\tif (previous !== undefined) {\n\t\t\t\treturn yield* failRestore(\n\t\t\t\t\t'preflight',\n\t\t\t\t\t`duplicate container snapshotTag ${captured.snapshotTag} for ${previous.plugin}/${previous.role} and ${captured.plugin}/${captured.role}`,\n\t\t\t\t\tcaptured.plugin,\n\t\t\t\t);\n\t\t\t}\n\t\t\tseenSnapshotTags.set(captured.snapshotTag, captured);\n\t\t}\n\t\tfor (const pluginKey of meta.participants) {\n\t\t\tyield* preflightContributionDoc(pluginKey, artifactDir);\n\t\t}\n\t\tconst statePath = `${artifactDir}/${SnapshotLayout.stateFile}`;\n\t\tconst stateExists = yield* fs.exists(statePath).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (stateExists) {\n\t\t\tyield* readSnapshotStateDocument(statePath).pipe(\n\t\t\t\tEffect.catch(failPhase('read-state', `state.json failed schema validation`)),\n\t\t\t);\n\t\t}\n\t\tif (meta.hostTreeIncluded) {\n\t\t\tconst tarPath = `${artifactDir}/${SnapshotLayout.hostTreeTar}`;\n\t\t\tyield* requireReadableNonEmptyFile(tarPath, 'untar-host-tree', 'host-tree tar is required');\n\t\t\tconst tarStream = fs.stream(tarPath).pipe(\n\t\t\t\tStream.mapError(\n\t\t\t\t\t(cause) =>\n\t\t\t\t\t\tnew HostTreeTarError({\n\t\t\t\t\t\t\tstage: 'entry-validation',\n\t\t\t\t\t\t\toperation: 'untar',\n\t\t\t\t\t\t\tdetail: `read host-tree tar failed at ${tarPath}`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tyield* validateHostTreeTarEntries(tarStream).pipe(\n\t\t\t\tEffect.catch(failPhase('untar-host-tree', `host-tree tar entry validation failed`)),\n\t\t\t);\n\t\t}\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.preflight'));\n\n// -----------------------------------------------------------------------------\n// Image load + staged re-tag.\n// -----------------------------------------------------------------------------\n\nconst loadImageBundle = (\n\ttarPath: string,\n\tartifactDir: string,\n\truntime: ContainerRuntime,\n\texpectedSnapshotTags: ReadonlyArray<string>,\n): Effect.Effect<ReadonlyMap<string, ImageRef>, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst fullTarPath = `${artifactDir}/${tarPath}`;\n\t\tconst exists = yield* fs.exists(fullTarPath).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (!exists) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase: 'load-image',\n\t\t\t\t\tdetail: `container image bundle absent at ${fullTarPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst bundleTags = yield* readImageBundleTags(fullTarPath, tarPath).pipe(\n\t\t\tEffect.catch(failImageBundleTagScan('load-image')),\n\t\t);\n\t\tyield* verifyImageBundleTags(tarPath, bundleTags, expectedSnapshotTags).pipe(\n\t\t\tEffect.catch(failImageBundleTagScan('load-image')),\n\t\t);\n\t\tconst loaded = yield* runtime\n\t\t\t.loadImage(fs.stream(fullTarPath))\n\t\t\t.pipe(\n\t\t\t\tEffect.catch(\n\t\t\t\t\tfailPhase('load-image', `load container image bundle from ${fullTarPath} failed`),\n\t\t\t\t),\n\t\t\t);\n\t\tconst loadedTags = loadedBundleTags(loaded);\n\t\tconst missing = expectedSnapshotTags.filter((tag) => !loadedTags.has(tag));\n\t\tif (missing.length > 0) {\n\t\t\treturn yield* failRestore(\n\t\t\t\t'load-image',\n\t\t\t\t`container image bundle ${tarPath} did not load expected snapshot tags: ${missing.join(', ')}`,\n\t\t\t);\n\t\t}\n\t\tconst refsByTag = new Map<string, ImageRef>();\n\t\tfor (const ref of loaded.refs) {\n\t\t\tif (ref.tag === undefined || !expectedSnapshotTags.includes(ref.tag)) continue;\n\t\t\tif (refsByTag.has(ref.tag)) {\n\t\t\t\treturn yield* failRestore(\n\t\t\t\t\t'load-image',\n\t\t\t\t\t`container image bundle ${tarPath} loaded duplicate snapshot tag ${ref.tag}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\trefsByTag.set(ref.tag, ref);\n\t\t}\n\t\treturn refsByTag;\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.load-image-bundle'));\n\nconst expectedSnapshotTagsByBundle = (\n\tcontainers: ReadonlyArray<CapturedContainer>,\n): ReadonlyMap<string, ReadonlyArray<string>> => {\n\tconst byBundle = new Map<string, string[]>();\n\tfor (const captured of containers) {\n\t\tconst tags = byBundle.get(captured.tarPath);\n\t\tif (tags === undefined) {\n\t\t\tbyBundle.set(captured.tarPath, [captured.snapshotTag]);\n\t\t} else {\n\t\t\ttags.push(captured.snapshotTag);\n\t\t}\n\t}\n\treturn byBundle;\n};\n\nconst stageLoadedImage = (\n\tcaptured: CapturedContainer,\n\tloadedRef: ImageRef,\n\truntime: ContainerRuntime,\n\tregisterStagedImage: (image: StagedContainerImage) => Effect.Effect<void>,\n): Effect.Effect<StagedContainerImage, RestorePhaseError> =>\n\tEffect.gen(function* () {\n\t\tconst stagedImageTag = mintRestoreStagingTag();\n\t\tconst stagedImage: StagedContainerImage = {\n\t\t\tcaptured,\n\t\t\tstagedRef: { digest: loadedRef.digest, tag: stagedImageTag },\n\t\t\tstagedImageTag,\n\t\t};\n\t\tyield* registerStagedImage(stagedImage);\n\t\tyield* runtime\n\t\t\t.tagImage(loadedRef, stagedImageTag, { removeSourceAfterTag: true })\n\t\t\t.pipe(\n\t\t\t\tEffect.catch(\n\t\t\t\t\tfailPhase(\n\t\t\t\t\t\t'retag-image',\n\t\t\t\t\t\t`tag restored image ${captured.snapshotTag} as staging ref ${stagedImageTag} failed`,\n\t\t\t\t\t\tcaptured.plugin,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\treturn stagedImage;\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.stage-image'));\n\nconst cleanupRestoreStagingImages = (\n\truntime: ContainerRuntime,\n\timages: ReadonlyArray<StagedContainerImage>,\n): Effect.Effect<void> =>\n\tEffect.forEach(\n\t\timages,\n\t\t(image) =>\n\t\t\truntime\n\t\t\t\t.removeImage(image.stagedRef)\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catch((cause) =>\n\t\t\t\t\t\tEffect.logWarning(\n\t\t\t\t\t\t\t`remove restore staging image ${image.stagedImageTag} failed during restore cleanup: ${String(\n\t\t\t\t\t\t\t\tcause,\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),\n\t\t{ concurrency: 'unbounded' },\n\t).pipe(Effect.asVoid);\n\nconst promoteStagedImages = (\n\timages: ReadonlyArray<StagedContainerImage>,\n\truntime: ContainerRuntime,\n): Effect.Effect<void, RestorePhaseError> =>\n\tEffect.gen(function* () {\n\t\tfor (const image of images) {\n\t\t\tyield* runtime\n\t\t\t\t.tagImage(image.stagedRef, image.captured.imageName, {\n\t\t\t\t\tremoveSourceAfterTag: true,\n\t\t\t\t})\n\t\t\t\t.pipe(\n\t\t\t\t\tEffect.catch(\n\t\t\t\t\t\tfailPhase(\n\t\t\t\t\t\t\t'retag-image',\n\t\t\t\t\t\t\t`tag staged image ${image.stagedImageTag} as ${image.captured.imageName} failed`,\n\t\t\t\t\t\t\timage.captured.plugin,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t}\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.promote-images'));\n\nconst restoreHostTree = (\n\tartifactDir: string,\n\ttarget: string,\n): Effect.Effect<void, RestorePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst tarPath = `${artifactDir}/${SnapshotLayout.hostTreeTar}`;\n\t\tconst exists = yield* fs.exists(tarPath).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\tif (!exists) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\tphase: 'untar-host-tree',\n\t\t\t\t\tdetail: `host-tree tar absent at ${tarPath}`,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst tarStream = fs.stream(tarPath).pipe(\n\t\t\tStream.mapError(\n\t\t\t\t(cause) =>\n\t\t\t\t\tnew HostTreeTarError({\n\t\t\t\t\t\tstage: 'stream-stdin',\n\t\t\t\t\t\toperation: 'untar',\n\t\t\t\t\t\tdetail: `read host-tree tar failed at ${tarPath}`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tyield* Effect.scoped(untarHostTree(tarStream, { target })).pipe(\n\t\t\tEffect.catch(failPhase('untar-host-tree', `untar ${tarPath} to ${target} failed`)),\n\t\t);\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.host-tree'));\n\nconst LIVE_RESTORE_PRESERVED_PATHS: ReadonlyArray<StageAndSwapPreservedPath> = [\n\t{ relativePath: SNAPSHOTS_DIR_NAME, kind: 'directory' },\n\t{ relativePath: COMMAND_CHANNEL_COMMANDS_FILE_NAME, kind: 'file' },\n\t{ relativePath: COMMAND_CHANNEL_EVENTS_FILE_NAME, kind: 'file' },\n\t{ relativePath: 'roster.json', kind: 'file' },\n\t{ relativePath: 'container-claims.json', kind: 'file' },\n\t{ relativePath: 'snapshot.reservation', kind: 'file' },\n];\n\n// -----------------------------------------------------------------------------\n// Top-level restore — bracketed-atomic via stage-and-swap.\n// -----------------------------------------------------------------------------\n\nexport interface RestoreInputs {\n\treadonly snapshotId: SnapshotId;\n\treadonly artifactDir: string;\n\treadonly runtimeStackRoot: string;\n\treadonly runtimeStagingPath: string;\n\treadonly runtimeBackupPath: string;\n\treadonly participants: ReadonlyArray<RestoreParticipant>;\n\treadonly runtime: ContainerRuntime;\n\treadonly runtimeIdentity: SnapshotRuntimeIdentity;\n}\n\n/**\n * Run the full restore. Bracketed-atomic via `stageAndSwap` at the\n * runtime-root level — external watchers never observe a half-restored\n * tree.\n *\n * Order:\n * 1. Read meta.json (refuse if absent / corrupt — no mutation).\n * 2. Run identity-guard against runtime metadata and merged plugin\n * contributions (refuse on any disagreement — no mutation).\n * 3. Pre-restore hooks (per-plugin validation; soft errors).\n * 4. Stage:\n * - Untar host-tree into staging.\n * - Copy state.json into staging.\n * - Re-read contribution docs.\n * - Load image bundles and stage verified snapshot tags.\n * - Write a restore-pending marker into the staged root.\n * 5. Atomic swap staging → runtime root, preserving live command /\n * event channel files and other explicit runtime-control files.\n * 6. Promote staged images to recorded refs, then remove captured\n * managed containers by label. If this fails, the pending marker\n * remains in the restored root for diagnosis/recovery.\n * 7. Post-restore hooks.\n *\n * The caller is responsible for `acquireReservation`; restore supplies\n * the runtime-control publish lock to `stageAndSwap`.\n */\nexport const runRestore = (\n\tinputs: RestoreInputs,\n): Effect.Effect<\n\tSnapshotMetadata,\n\tRestorePhaseError | IdentityGuardError | IdentityContributionConflictError | StageAndSwapError,\n\tFileSystem.FileSystem\n> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.snapshot.phase': 'restore',\n\t\t\t'devstack.snapshot.artifact': inputs.artifactDir,\n\t\t});\n\n\t\t// 1. Authoritative meta read.\n\t\tconst meta = yield* readMeta(inputs.artifactDir, inputs.snapshotId);\n\t\tyield* verifyIntegrity(inputs.artifactDir);\n\n\t\t// 2. Identity guard — compare the metadata's runtime identity\n\t\t// and plugin-contributed identity. FAIL-CLOSED before any mutation.\n\t\tyield* runRuntimeIdentityGuard(\n\t\t\t{ app: meta.app, stack: meta.stack, network: meta.network },\n\t\t\tinputs.runtimeIdentity,\n\t\t);\n\t\tconst liveContributions: IdentityContribution[] = [];\n\t\tfor (const participant of inputs.participants) {\n\t\t\tconst slice = yield* participant.liveIdentity;\n\t\t\tliveContributions.push({ plugin: participant.plugin, slice });\n\t\t}\n\t\tconst live = yield* mergeContributions(liveContributions);\n\t\tyield* runIdentityGuard(meta.identity, live);\n\n\t\t// 3. Plugin-level preRestore hooks (run AFTER identity-guard so\n\t\t// a mismatch refuses without ever calling them).\n\t\tfor (const participant of inputs.participants) {\n\t\t\tif (participant.preRestore) {\n\t\t\t\tyield* participant.preRestore.pipe(\n\t\t\t\t\tEffect.catch(failPhase('pre-restore-hook', `preRestore failed`, participant.plugin)),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tyield* preflightArtifact(meta, inputs.artifactDir);\n\n\t\t// 4. Stage filesystem content and non-destructive Docker image\n\t\t// refs; atomic swap on success. Until `stageAndSwap`\n\t\t// succeeds, the restore-pending marker is only in staging, so\n\t\t// restore owns cleanup for any Docker staging refs it minted.\n\t\tconst stagedImages = yield* Effect.scoped(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst stagedImages: StagedContainerImage[] = [];\n\t\t\t\tlet recoveryHandoffComplete = false;\n\t\t\t\tyield* Effect.addFinalizer((exit) =>\n\t\t\t\t\tExit.isFailure(exit) && !recoveryHandoffComplete\n\t\t\t\t\t\t? cleanupRestoreStagingImages(inputs.runtime, stagedImages)\n\t\t\t\t\t\t: Effect.void,\n\t\t\t\t);\n\t\t\t\tconst swappedImages = yield* stageAndSwap({\n\t\t\t\t\ttargetPath: inputs.runtimeStackRoot,\n\t\t\t\t\tstagingPath: inputs.runtimeStagingPath,\n\t\t\t\t\tbackupPath: inputs.runtimeBackupPath,\n\t\t\t\t\tpreserveFromTarget: LIVE_RESTORE_PRESERVED_PATHS,\n\t\t\t\t\tpublishLockPath: runtimeControlLockPathForStackRoot(inputs.runtimeStackRoot),\n\t\t\t\t\tbuild: Effect.gen(function* () {\n\t\t\t\t\t\t// 4a. Untar host-tree into staging.\n\t\t\t\t\t\tif (meta.hostTreeIncluded) {\n\t\t\t\t\t\t\tyield* restoreHostTree(inputs.artifactDir, inputs.runtimeStagingPath);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 4b. Copy state.json into staging.\n\t\t\t\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\t\t\t\tconst srcState = `${inputs.artifactDir}/${SnapshotLayout.stateFile}`;\n\t\t\t\t\t\tconst stateExists = yield* fs\n\t\t\t\t\t\t\t.exists(srcState)\n\t\t\t\t\t\t\t.pipe(Effect.catch(() => Effect.succeed(false)));\n\t\t\t\t\t\tif (stateExists) {\n\t\t\t\t\t\t\tconst stateDoc = yield* readSnapshotStateDocument(srcState).pipe(\n\t\t\t\t\t\t\t\tEffect.catch(failPhase('read-state', `state.json failed schema validation`)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tyield* writeSnapshotStateDocument(\n\t\t\t\t\t\t\t\t`${inputs.runtimeStagingPath}/${SnapshotLayout.stateFile}`,\n\t\t\t\t\t\t\t\tstateDoc,\n\t\t\t\t\t\t\t).pipe(Effect.catch(failPhase('expand-state', `write state.json failed`)));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 4c. Read each contribution doc — the participants'\n\t\t\t\t\t\t// post-restore hooks may want this; we surface it\n\t\t\t\t\t\t// via the participant's own state-store reads after\n\t\t\t\t\t\t// the swap lands.\n\t\t\t\t\t\tfor (const pluginKey of meta.participants) {\n\t\t\t\t\t\t\tconst path = `${inputs.artifactDir}/${contributionPath(pluginKey)}`;\n\t\t\t\t\t\t\tconst exists = yield* fs.exists(path).pipe(Effect.catch(() => Effect.succeed(false)));\n\t\t\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\t\t\tnew RestorePhaseError({\n\t\t\t\t\t\t\t\t\t\tphase: 'read-contribution',\n\t\t\t\t\t\t\t\t\t\tplugin: pluginKey,\n\t\t\t\t\t\t\t\t\t\tdetail: `contribution doc absent at ${path}`,\n\t\t\t\t\t\t\t\t\t}),\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// 4d. Load + tag committed images under restore-staging\n\t\t\t\t\t\t// refs only after all artifact expansion/copy work\n\t\t\t\t\t\t// has succeeded. The Docker save manifest must match\n\t\t\t\t\t\t// snapshot metadata exactly before docker load mutates\n\t\t\t\t\t\t// the daemon; loaded refs then supply the real digest\n\t\t\t\t\t\t// used for staging tags.\n\t\t\t\t\t\tconst expectedTagsByBundle = expectedSnapshotTagsByBundle(meta.containers);\n\t\t\t\t\t\tconst loadedRefsBySnapshotTag = new Map<string, ImageRef>();\n\t\t\t\t\t\tfor (const [tarPath, expectedTags] of expectedTagsByBundle) {\n\t\t\t\t\t\t\tconst loadedRefs = yield* loadImageBundle(\n\t\t\t\t\t\t\t\ttarPath,\n\t\t\t\t\t\t\t\tinputs.artifactDir,\n\t\t\t\t\t\t\t\tinputs.runtime,\n\t\t\t\t\t\t\t\texpectedTags,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [tag, ref] of loadedRefs) {\n\t\t\t\t\t\t\t\tloadedRefsBySnapshotTag.set(tag, ref);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const captured of meta.containers) {\n\t\t\t\t\t\t\tconst loadedRef = loadedRefsBySnapshotTag.get(captured.snapshotTag);\n\t\t\t\t\t\t\tif (loadedRef === undefined) {\n\t\t\t\t\t\t\t\treturn yield* failRestore(\n\t\t\t\t\t\t\t\t\t'load-image',\n\t\t\t\t\t\t\t\t\t`container image bundle did not return loaded ref for ${captured.snapshotTag}`,\n\t\t\t\t\t\t\t\t\tcaptured.plugin,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tyield* stageLoadedImage(captured, loadedRef, inputs.runtime, (image) =>\n\t\t\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\t\t\tstagedImages.push(image);\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\tyield* writeRestorePendingMarker({\n\t\t\t\t\t\t\truntimeRoot: inputs.runtimeStagingPath,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\tartifactDir: inputs.artifactDir,\n\t\t\t\t\t\t\tstagedImages,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn stagedImages;\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\trecoveryHandoffComplete = true;\n\t\t\t\treturn swappedImages;\n\t\t\t}),\n\t\t);\n\n\t\t// 5. Docker finalization happens after filesystem publish. If\n\t\t// promotion or removal fails, the restored root still carries\n\t\t// snapshot.restore-pending.json with the staged image refs.\n\t\tif (stagedImages.length > 0) {\n\t\t\tyield* promoteStagedImages(stagedImages, inputs.runtime);\n\t\t\tyield* removeCapturedContainers(meta, inputs.runtime, inputs.runtimeIdentity);\n\t\t\tyield* clearRestorePendingMarker(inputs.runtimeStackRoot);\n\t\t}\n\n\t\t// 6. Post-restore hooks (after the swap lands so plugins read\n\t\t// fresh state from the runtime root).\n\t\tfor (const participant of inputs.participants) {\n\t\t\tif (participant.postRestore) {\n\t\t\t\tyield* participant.postRestore.pipe(\n\t\t\t\t\tEffect.catch(failPhase('post-restore-hook', `postRestore failed`, participant.plugin)),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn meta;\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore'));\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import { Context, Effect, FileSystem, Layer, Schema, Scope } from "effect";