@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,405 @@
1
+ import { LeaseBrokerService } from "../../substrate/runtime/lease-broker/service.mjs";
2
+ import { accountAcquireError, accountSignError } from "./errors.mjs";
3
+ import { withAddressLease } from "./lease.mjs";
4
+ import { DEFAULT_EPHEMERAL_FUND_MIST, SUI_FULL_COIN_TYPE, applyCrossCuttingFunding, fundEphemeralDefault } from "./funding.mjs";
5
+ import { resolveEphemeralVariant } from "./variants/ephemeral.mjs";
6
+ import { resolveKeystoreVariant } from "./variants/keystore.mjs";
7
+ import { resolveEnvVariant } from "./variants/env.mjs";
8
+ import { resolveInlineVariant } from "./variants/inline.mjs";
9
+ import { resolveSignerVariant } from "./variants/signer.mjs";
10
+ import { resolveImpersonateVariant } from "./variants/impersonate.mjs";
11
+ import { Effect } from "effect";
12
+ //#region src/plugins/account/service.ts
13
+ /** Architecture-distilled invariant: name flows into the resource id, an
14
+ * on-disk path, a manifest key, container labels, and generated
15
+ * TypeScript exports. Keep the public name identifier-safe instead
16
+ * of accepting path-safe spellings that codegen later rejects. */
17
+ const ACCOUNT_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;
18
+ const ACCOUNT_NAME_HINT = "letters, digits, and underscores; must start with a letter; max 64 chars; cannot be a TypeScript reserved word";
19
+ const TS_RESERVED_BINDING_NAMES = new Set([
20
+ "as",
21
+ "async",
22
+ "await",
23
+ "break",
24
+ "case",
25
+ "catch",
26
+ "class",
27
+ "const",
28
+ "continue",
29
+ "debugger",
30
+ "default",
31
+ "delete",
32
+ "do",
33
+ "else",
34
+ "enum",
35
+ "export",
36
+ "extends",
37
+ "false",
38
+ "finally",
39
+ "for",
40
+ "from",
41
+ "function",
42
+ "if",
43
+ "import",
44
+ "in",
45
+ "instanceof",
46
+ "let",
47
+ "new",
48
+ "null",
49
+ "of",
50
+ "return",
51
+ "super",
52
+ "switch",
53
+ "this",
54
+ "throw",
55
+ "true",
56
+ "try",
57
+ "typeof",
58
+ "var",
59
+ "void",
60
+ "while",
61
+ "with",
62
+ "yield"
63
+ ]);
64
+ const accountNameInvalidReason = (name) => {
65
+ if (!ACCOUNT_NAME_RE.test(name)) return `must match ${ACCOUNT_NAME_RE.source}`;
66
+ if (TS_RESERVED_BINDING_NAMES.has(name)) return "cannot be a TypeScript reserved word";
67
+ return null;
68
+ };
69
+ const assertAccountName = (name) => {
70
+ const reason = accountNameInvalidReason(name);
71
+ if (reason !== null) throw new TypeError(`Account name '${name}' is invalid — ${reason}. ${ACCOUNT_NAME_HINT}`);
72
+ };
73
+ const validateAccountName = (name) => {
74
+ const reason = accountNameInvalidReason(name);
75
+ if (reason !== null) return Effect.fail(accountAcquireError({
76
+ phase: "validate-name",
77
+ accountName: name,
78
+ variant: "ephemeral",
79
+ message: `Account name '${name}' is invalid — ${reason}.`,
80
+ hint: ACCOUNT_NAME_HINT
81
+ }));
82
+ return Effect.void;
83
+ };
84
+ const FUNDING_BALANCE_TIMEOUT_MS = 5e3;
85
+ const makeFundingBalanceReader = (sdk) => ({ readBalance: ({ owner, coinType }) => Effect.promise(async () => {
86
+ try {
87
+ return balanceAmountFromSdkResponse(await sdk.core.getBalance({
88
+ owner,
89
+ coinType
90
+ }));
91
+ } catch {
92
+ return null;
93
+ }
94
+ }).pipe(Effect.timeoutOrElse({
95
+ duration: `${FUNDING_BALANCE_TIMEOUT_MS} millis`,
96
+ orElse: () => Effect.succeed(null)
97
+ })) });
98
+ const balanceAmountFromSdkResponse = (response) => {
99
+ const outer = typeof response === "object" && response !== null && "balance" in response ? response.balance : response;
100
+ const value = typeof outer === "object" && outer !== null && "balance" in outer ? outer.balance : outer;
101
+ if (typeof value === "bigint") return value;
102
+ if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) return BigInt(value);
103
+ if (typeof value === "string" && /^\d+$/.test(value)) return BigInt(value);
104
+ return null;
105
+ };
106
+ /** Dispatch on the variant discriminator. */
107
+ const resolveVariant = (opts, ctx) => {
108
+ switch (opts.kind) {
109
+ case "ephemeral": return resolveEphemeralVariant({
110
+ name: opts.name,
111
+ secretFilePath: `${ctx.runtimeRoot}/account/${opts.name}.key`
112
+ });
113
+ case "keystore": return resolveKeystoreVariant({
114
+ name: opts.name,
115
+ path: opts.path,
116
+ aliasOrAddress: opts.aliasOrAddress
117
+ });
118
+ case "env": return resolveEnvVariant({
119
+ name: opts.name,
120
+ varName: opts.key
121
+ });
122
+ case "inline": return resolveInlineVariant({
123
+ name: opts.name,
124
+ privateKey: opts.privateKey
125
+ });
126
+ case "signer": return resolveSignerVariant({
127
+ name: opts.name,
128
+ signer: opts.signer,
129
+ ...opts.addressOverride !== void 0 ? { addressOverride: opts.addressOverride } : {}
130
+ });
131
+ case "impersonate": return resolveImpersonateVariant({
132
+ name: opts.name,
133
+ address: opts.address,
134
+ suiMode: ctx.sui.mode
135
+ });
136
+ }
137
+ };
138
+ /** Promote a Promise-returning sign call into the typed-error
139
+ * channel. The `signer.signTransaction` / `signPersonalMessage`
140
+ * helpers on `@mysten/sui` `Signer` instances are async; the
141
+ * bring-your-own-signer variant uses the same shape. */
142
+ const signWith = (signer, tx, accountName, address) => Effect.tryPromise({
143
+ try: () => signer.signTransaction(tx),
144
+ catch: (cause) => accountSignError({
145
+ phase: "sign",
146
+ accountName,
147
+ address,
148
+ message: `Account '${accountName}': signer.signTransaction() rejected.`,
149
+ cause
150
+ })
151
+ });
152
+ const signPersonalWith = (signer, msg, accountName, address) => Effect.tryPromise({
153
+ try: () => signer.signPersonalMessage(msg),
154
+ catch: (cause) => accountSignError({
155
+ phase: "sign",
156
+ accountName,
157
+ address,
158
+ message: `Account '${accountName}': signer.signPersonalMessage() rejected.`,
159
+ cause
160
+ })
161
+ });
162
+ /** Project the raw `@mysten/sui` executeTransaction response into
163
+ * the narrowed `TxResult` shape consumers depend on. The SDK
164
+ * response carries a discriminated union; the result we surface
165
+ * always carries a digest plus the include-projected sub-fields. */
166
+ const projectTxResult = (raw, accountName, address) => {
167
+ const r = raw;
168
+ if (r.$kind === "FailedTransaction") return Effect.fail(accountSignError({
169
+ phase: "submit",
170
+ accountName,
171
+ address,
172
+ message: `Account '${accountName}': transaction execution failed on-chain (digest=${r.FailedTransaction?.digest ?? "<unknown>"}).`
173
+ }));
174
+ const tx = r.Transaction;
175
+ if (tx?.digest === void 0) return Effect.fail(accountSignError({
176
+ phase: "submit",
177
+ accountName,
178
+ address,
179
+ message: `Account '${accountName}': executeTransaction returned no digest. Raw shape=${JSON.stringify(r).slice(0, 200)}.`
180
+ }));
181
+ return Effect.succeed({
182
+ digest: tx.digest,
183
+ effects: tx.effects ?? null,
184
+ objectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),
185
+ balanceChanges: tx.balanceChanges ?? []
186
+ });
187
+ };
188
+ const extractExecuteDigest = (raw) => {
189
+ const r = raw;
190
+ return r.$kind === "FailedTransaction" ? r.FailedTransaction?.digest : r.Transaction?.digest;
191
+ };
192
+ const projectObjectChanges = (effects, objectTypes) => {
193
+ const changedObjects = typeof effects === "object" && effects !== null && "changedObjects" in effects ? effects.changedObjects : void 0;
194
+ if (changedObjects === void 0) return [];
195
+ return changedObjects.filter((change) => typeof change.objectId === "string").map((change) => {
196
+ const objectType = objectTypes[change.objectId];
197
+ const entry = {
198
+ type: change.outputState === "PackageWrite" ? "published" : change.idOperation === "Created" ? "created" : "mutated",
199
+ objectId: change.objectId
200
+ };
201
+ if (objectType !== void 0) entry.objectType = objectType;
202
+ if (change.outputState !== void 0) entry.outputState = change.outputState;
203
+ if (change.idOperation !== void 0) entry.idOperation = change.idOperation;
204
+ return entry;
205
+ });
206
+ };
207
+ const buildClosures = (args) => {
208
+ const { accountName, resolved, sui, broker, source } = args;
209
+ if (source === "impersonate") {
210
+ const refuse = () => Effect.fail(accountSignError({
211
+ phase: "impersonation-bypass-attempt",
212
+ accountName,
213
+ address: resolved.address,
214
+ message: `Account '${accountName}' is an impersonation account — sign/execute must route through Sui's fork admin surface.`
215
+ }));
216
+ const unlockedSignAndExecute = (tx) => Effect.gen(function* () {
217
+ const fork = sui.fork ?? null;
218
+ if (fork === null) return yield* Effect.fail(accountSignError({
219
+ phase: "submit",
220
+ accountName,
221
+ address: resolved.address,
222
+ message: `Account '${accountName}': impersonation requires a fork-mode Sui client.`
223
+ }));
224
+ const submitted = yield* fork.impersonate(resolved.address, tx).pipe(Effect.mapError((cause) => accountSignError({
225
+ phase: "submit",
226
+ accountName,
227
+ address: resolved.address,
228
+ message: `Account '${accountName}': fork impersonation submit failed.`,
229
+ cause
230
+ })));
231
+ yield* Effect.tryPromise({
232
+ try: () => sui.sdk.core.waitForTransaction({ digest: submitted.digest }),
233
+ catch: (cause) => accountSignError({
234
+ phase: "await-finality",
235
+ accountName,
236
+ address: resolved.address,
237
+ message: `Account '${accountName}': waitForTransaction(${submitted.digest}) failed.`,
238
+ cause
239
+ })
240
+ });
241
+ return yield* projectTxResult(submitted.raw, accountName, resolved.address);
242
+ });
243
+ const transactionSigner = {
244
+ signTransaction: refuse,
245
+ signAndExecute: unlockedSignAndExecute
246
+ };
247
+ const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
248
+ return yield* body(transactionSigner);
249
+ })).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
250
+ "account.name": accountName,
251
+ "account.address": resolved.address
252
+ } }));
253
+ return {
254
+ signAndExecute: (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
255
+ "account.name": accountName,
256
+ "account.address": resolved.address
257
+ } })),
258
+ withTransactionSigner,
259
+ signTransaction: refuse,
260
+ signPersonalMessage: refuse
261
+ };
262
+ }
263
+ const signer = resolved.signer;
264
+ const unlockedSignTransaction = (tx) => signWith(signer, tx, accountName, resolved.address);
265
+ const unlockedSignAndExecute = (tx) => Effect.gen(function* () {
266
+ const signed = yield* unlockedSignTransaction(tx);
267
+ const raw = yield* Effect.tryPromise({
268
+ try: () => sui.sdk.core.executeTransaction({
269
+ transaction: tx,
270
+ signatures: [signed.signature],
271
+ include: {
272
+ effects: true,
273
+ objectTypes: true
274
+ }
275
+ }),
276
+ catch: (cause) => accountSignError({
277
+ phase: "submit",
278
+ accountName,
279
+ address: resolved.address,
280
+ message: `Account '${accountName}': executeTransaction transport failed.`,
281
+ cause
282
+ })
283
+ });
284
+ const digest = extractExecuteDigest(raw);
285
+ if (digest !== void 0) yield* Effect.tryPromise({
286
+ try: () => sui.sdk.core.waitForTransaction({ digest }),
287
+ catch: (cause) => accountSignError({
288
+ phase: "await-finality",
289
+ accountName,
290
+ address: resolved.address,
291
+ message: `Account '${accountName}': waitForTransaction(${digest}) failed.`,
292
+ cause
293
+ })
294
+ });
295
+ return yield* projectTxResult(raw, accountName, resolved.address);
296
+ });
297
+ const transactionSigner = {
298
+ signTransaction: unlockedSignTransaction,
299
+ signAndExecute: unlockedSignAndExecute
300
+ };
301
+ const withTransactionSigner = (body) => withAddressLease(broker, accountName, resolved.address, Effect.gen(function* () {
302
+ return yield* body(transactionSigner);
303
+ })).pipe(Effect.withSpan("devstack.plugin.account.transactionSigner", { attributes: {
304
+ "account.name": accountName,
305
+ "account.address": resolved.address
306
+ } }));
307
+ const signTransaction = (tx) => withTransactionSigner((locked) => locked.signTransaction(tx)).pipe(Effect.withSpan("devstack.plugin.account.signTransaction", { attributes: {
308
+ "account.name": accountName,
309
+ "account.address": resolved.address
310
+ } }));
311
+ const signPersonalMessage = (msg) => withAddressLease(broker, accountName, resolved.address, signPersonalWith(signer, msg, accountName, resolved.address)).pipe(Effect.withSpan("devstack.plugin.account.signPersonalMessage", { attributes: {
312
+ "account.name": accountName,
313
+ "account.address": resolved.address
314
+ } }));
315
+ const signAndExecute = (tx) => withTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(Effect.withSpan("devstack.plugin.account.signAndExecute", { attributes: {
316
+ "account.name": accountName,
317
+ "account.address": resolved.address
318
+ } }));
319
+ return {
320
+ signAndExecute,
321
+ withTransactionSigner,
322
+ signTransaction,
323
+ signPersonalMessage
324
+ };
325
+ };
326
+ /** Acquire an account. Coordinates variant dispatch + funding +
327
+ * the resolved-value projection. */
328
+ const acquireAccount = (opts, ctx) => Effect.gen(function* () {
329
+ yield* validateAccountName(opts.name);
330
+ yield* Effect.annotateCurrentSpan({
331
+ "account.name": opts.name,
332
+ "account.variant": opts.kind,
333
+ "sui.mode": ctx.sui.mode
334
+ });
335
+ const resolved = yield* resolveVariant(opts, ctx);
336
+ yield* Effect.annotateCurrentSpan({
337
+ "account.address": resolved.address,
338
+ "account.scheme": resolved.scheme
339
+ });
340
+ const broker = yield* LeaseBrokerService;
341
+ const balanceReader = makeFundingBalanceReader(ctx.sui.sdk);
342
+ const defaultFunding = opts.kind === "ephemeral" && opts.funding === void 0 ? {
343
+ coin: "SUI",
344
+ fullCoinType: SUI_FULL_COIN_TYPE,
345
+ amount: DEFAULT_EPHEMERAL_FUND_MIST
346
+ } : null;
347
+ const requestedFunding = defaultFunding === null ? ctx.projectedFunding ?? [] : [defaultFunding, ...ctx.projectedFunding ?? []];
348
+ const appliedDefaultFunding = [];
349
+ if (defaultFunding !== null) {
350
+ yield* fundEphemeralDefault({
351
+ accountName: opts.name,
352
+ address: resolved.address,
353
+ amountMist: defaultFunding.amount,
354
+ suiMode: ctx.sui.mode,
355
+ chainId: ctx.sui.chain,
356
+ emitAutoPromotionEvent: ctx.emitAutoPromotionEvent,
357
+ broker,
358
+ balanceReader
359
+ });
360
+ if (defaultFunding.amount > 0n) appliedDefaultFunding.push(defaultFunding);
361
+ }
362
+ const source = opts.kind === "impersonate" ? "impersonate" : "real";
363
+ const closures = buildClosures({
364
+ accountName: opts.name,
365
+ resolved,
366
+ sui: ctx.sui,
367
+ broker,
368
+ source
369
+ });
370
+ const value = {
371
+ name: opts.name,
372
+ address: resolved.address,
373
+ scheme: resolved.scheme,
374
+ publicKey: resolved.publicKey,
375
+ source,
376
+ funding: {
377
+ requested: requestedFunding,
378
+ applied: appliedDefaultFunding
379
+ },
380
+ ...closures
381
+ };
382
+ const projected = ctx.projectedFunding ?? [];
383
+ let appliedCrossCuttingFunding = [];
384
+ if (projected.length > 0) appliedCrossCuttingFunding = yield* applyCrossCuttingFunding({
385
+ accountName: opts.name,
386
+ address: resolved.address,
387
+ variant: opts.kind,
388
+ account: value,
389
+ funding: projected,
390
+ chainId: ctx.sui.chain,
391
+ broker,
392
+ balanceReader
393
+ });
394
+ return {
395
+ ...value,
396
+ funding: {
397
+ requested: requestedFunding,
398
+ applied: [...appliedDefaultFunding, ...appliedCrossCuttingFunding]
399
+ }
400
+ };
401
+ });
402
+ //#endregion
403
+ export { acquireAccount, assertAccountName };
404
+
405
+ //# sourceMappingURL=service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.mjs","names":[],"sources":["../../../src/plugins/account/service.ts"],"sourcesContent":["// Account plugin — service body (main acquire Effect).\n//\n// What this file does:\n//\n// 1. Validate the account name (12-account.md \"Name shape\"\n// invariant) — strict charset, length-bounded. Loud-fail at\n// the factory boundary.\n// 2. Dispatch on the variant discriminator to the right resolver\n// under `variants/`.\n// 3. Coordinate the funding pass (default + cross-cutting).\n// 4. Project the resolved keypair into the user-facing\n// `AccountValue` shape (sign + execute closures).\n//\n// What it does NOT do:\n//\n// - Talk to the chain or the faucet directly — the variant\n// resolvers + the funding helpers own those wires.\n// - Wire the capabilities — that's the barrel's job (`index.ts`).\n//\n// Distilled-doc invariant (\"Acquisition vs signing error split\"):\n// the acquire body emits ONLY `AccountAcquireError`; the resolved\n// value's sign/execute closures emit `AccountSignError`. The two\n// channels never mix.\n//\n// Per-address serialization (architecture invariant): concurrent\n// account-bound transactions for the same address MUST serialize\n// across build + sign + execute. `Transaction.build({ client })`\n// resolves gas/object versions, so taking the lease only while\n// signing still lets two callers build stale object references. The\n// substrate's `LeaseBrokerService` is the L0 primitive: each\n// transaction scope opens a fresh lease keyed by `account:<address>`.\n// The public sign helpers are implemented in terms of that scope so\n// they keep the historical per-address behavior.\n\nimport { Effect } from 'effect';\n\nimport type { Signer, SignatureWithBytes } from '@mysten/sui/cryptography';\n\nimport {\n\taccountAcquireError,\n\taccountSignError,\n\ttype AccountAcquireError,\n\ttype AccountSignError,\n} from './errors.ts';\nimport { type ResolvedKeypair } from './keypair.ts';\nimport {\n\tapplyCrossCuttingFunding,\n\tfundEphemeralDefault,\n\tDEFAULT_EPHEMERAL_FUND_MIST,\n\tSUI_FULL_COIN_TYPE,\n\ttype AccountFunding,\n\ttype AccountFundingResult,\n\ttype FundingBalanceReader,\n\ttype ProjectedFunding,\n\ttype ProjectedFundingEntry,\n} from './funding.ts';\nimport { resolveEphemeralVariant } from './variants/ephemeral.ts';\nimport { resolveKeystoreVariant } from './variants/keystore.ts';\nimport { resolveEnvVariant } from './variants/env.ts';\nimport { resolveInlineVariant } from './variants/inline.ts';\nimport { resolveSignerVariant } from './variants/signer.ts';\nimport { resolveImpersonateVariant } from './variants/impersonate.ts';\nimport type { SuiSdkShim } from '../sui/chain-probe.ts';\nimport type { StrategyRegistryService } from '../../substrate/runtime/strategy-registry/service.ts';\nimport type { ChainId } from '../../substrate/brand.ts';\nimport type { TransactionSignerScope } from '../../substrate/runtime/sui-execute/index.ts';\nimport {\n\tLeaseBrokerService,\n\ttype LeaseBroker,\n} from '../../substrate/runtime/lease-broker/index.ts';\nimport type { ForkAdminSurface } from '../sui/index.ts';\nimport { withAddressLease } from './lease.ts';\n\n// -----------------------------------------------------------------------------\n// User-facing options shape\n// -----------------------------------------------------------------------------\n\n/** Account variant discriminated union. The user-facing factory\n * takes one of these shapes (or omits `opts` entirely for the\n * default ephemeral form). */\nexport type AccountOptions<Funding extends AccountFunding = AccountFunding> =\n\t| {\n\t\t\treadonly kind: 'ephemeral';\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'keystore';\n\t\t\treadonly path: string;\n\t\t\treadonly aliasOrAddress: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'env';\n\t\t\treadonly key: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'inline';\n\t\t\treadonly privateKey: string | Uint8Array;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'signer';\n\t\t\treadonly signer: {\n\t\t\t\treadonly toSuiAddress: () => string;\n\t\t\t\treadonly getKeyScheme: () => string;\n\t\t\t\treadonly getPublicKey: () => { readonly toRawBytes: () => Uint8Array };\n\t\t\t\treadonly signTransaction: (\n\t\t\t\t\ttx: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t\treadonly signPersonalMessage: (\n\t\t\t\t\tmsg: Uint8Array,\n\t\t\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t\t\t};\n\t\t\treadonly addressOverride?: string;\n\t\t\treadonly funding?: Funding;\n\t }\n\t| {\n\t\t\treadonly kind: 'impersonate';\n\t\t\treadonly address: string;\n\t\t\treadonly funding?: Funding;\n\t };\n\nexport type ResolvedAccountOptions<Funding extends AccountFunding = AccountFunding> =\n\tAccountOptions<Funding> & { readonly name: string };\n\n// -----------------------------------------------------------------------------\n// Resolved value (the Tag's resolved-shape)\n// -----------------------------------------------------------------------------\n\n/** Per-account resolved value — the typed handle the Account tag\n * publishes.\n *\n * Architecture-distilled finding (12-account.md \"Tighten the\n * resolved-account type\"): the `source` discriminator is mandatory\n * so consumers can branch on impersonation. Impersonation accounts\n * carry a zero-buffer publicKey — the discriminator is the\n * trustworthy signal. */\nexport interface AccountValue {\n\treadonly name: string;\n\treadonly address: string;\n\treadonly scheme: 'ed25519' | 'secp256k1' | 'secp256r1';\n\treadonly publicKey: Uint8Array;\n\t/** Source discriminator — `'real'` for ephemeral / keystore / env\n\t * / inline / signer; `'impersonate'` for the fork-only variant. */\n\treadonly source: 'real' | 'impersonate';\n\t/** Sign + execute (the canonical execution surface — per-address\n\t * serialized, post-submit transaction-wait included, bounded\n\t * retry on the \"dependent package not found on-chain\" race).\n\t *\n\t * For impersonation accounts, routes through Sui's fork\n\t * admin `impersonate` surface; for real signers, routes\n\t * through the SDK's executeTransaction surface. */\n\treadonly signAndExecute: (tx: Uint8Array) => Effect.Effect<TxResult, AccountSignError>;\n\t/** Run a full account-bound transaction critical section.\n\t * Callers that must serialize `Transaction.build({ client })`\n\t * together with signing/execution use the signer passed to this\n\t * callback; the callback runs while the per-address lease is held. */\n\treadonly withTransactionSigner: <A, E, R>(\n\t\tbody: (signer: AccountTransactionSigner) => Effect.Effect<A, E, R>,\n\t) => Effect.Effect<A, E, R>;\n\t/** Sign-only — real signers honor this; impersonation accounts\n\t * throw synchronously (see `variants/impersonate.ts`). */\n\treadonly signTransaction: (\n\t\ttx: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly signPersonalMessage: (\n\t\tmsg: Uint8Array,\n\t) => Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError>;\n\treadonly funding: AccountFundingResult;\n}\n\n/** Submit result projection — kept narrow so downstream consumers\n * don't depend on the full @mysten/sui execute envelope. */\nexport interface TxResult {\n\treadonly digest: string;\n\treadonly effects: unknown;\n\treadonly objectChanges: ReadonlyArray<unknown>;\n\treadonly balanceChanges: ReadonlyArray<unknown>;\n}\n\nexport interface AccountTransactionSigner extends TransactionSignerScope<AccountSignError> {\n\treadonly signAndExecute: AccountValue['signAndExecute'];\n}\n\n// -----------------------------------------------------------------------------\n// Name validation\n// -----------------------------------------------------------------------------\n\n/** Architecture-distilled invariant: name flows into the resource id, an\n * on-disk path, a manifest key, container labels, and generated\n * TypeScript exports. Keep the public name identifier-safe instead\n * of accepting path-safe spellings that codegen later rejects. */\nconst ACCOUNT_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ACCOUNT_NAME_HINT =\n\t'letters, digits, and underscores; must start with a letter; max 64 chars; cannot be a TypeScript reserved word';\nconst TS_RESERVED_BINDING_NAMES = new Set([\n\t'as',\n\t'async',\n\t'await',\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'from',\n\t'function',\n\t'if',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'let',\n\t'new',\n\t'null',\n\t'of',\n\t'return',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'yield',\n]);\n\nconst accountNameInvalidReason = (name: string): string | null => {\n\tif (!ACCOUNT_NAME_RE.test(name)) {\n\t\treturn `must match ${ACCOUNT_NAME_RE.source}`;\n\t}\n\tif (TS_RESERVED_BINDING_NAMES.has(name)) {\n\t\treturn 'cannot be a TypeScript reserved word';\n\t}\n\treturn null;\n};\n\nexport const assertAccountName = (name: string): void => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\tthrow new TypeError(`Account name '${name}' is invalid — ${reason}. ${ACCOUNT_NAME_HINT}`);\n\t}\n};\n\nexport const validateAccountName = (name: string): Effect.Effect<void, AccountAcquireError> => {\n\tconst reason = accountNameInvalidReason(name);\n\tif (reason !== null) {\n\t\treturn Effect.fail(\n\t\t\taccountAcquireError({\n\t\t\t\tphase: 'validate-name',\n\t\t\t\taccountName: name,\n\t\t\t\tvariant: 'ephemeral',\n\t\t\t\tmessage: `Account name '${name}' is invalid — ${reason}.`,\n\t\t\t\thint: ACCOUNT_NAME_HINT,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.void;\n};\n\n// -----------------------------------------------------------------------------\n// Variant dispatch\n// -----------------------------------------------------------------------------\n\n/** Sui mode + sdk shim — the slice of the resolved `SuiClient` the\n * account service actually consumes. Kept narrow so the variants +\n * funding helpers stay typed at the resolved-fields level (mode,\n * chain, sdk) rather than at the wide `SuiClient` shape. */\nexport interface AccountSuiShim {\n\treadonly mode: 'local' | 'local-rpc' | 'live' | 'fork';\n\treadonly chain: ChainId;\n\t/** SDK shim — exposes `executeTransaction` + `waitForTransaction`\n\t * for the signAndExecute pipeline. */\n\treadonly sdk: SuiSdkShim;\n\treadonly fork?: ForkAdminSurface | null;\n}\n\n/** Per-acquire context — supplied by the barrel from resolved plugin\n * dependencies and per-stack identity.\n *\n * `projectedFunding` carries the funding entries already resolved\n * from each `opts.funding[i].coin` dependency and projected to\n * `{fullCoinType, amount}` BEFORE handing off to `acquireAccount`.\n * The acquire body never sees the raw member refs — keeps the\n * cross-cutting funding dispatch substrate-name-blind. */\nexport interface AccountAcquireContext {\n\treadonly sui: AccountSuiShim;\n\treadonly runtimeRoot: string;\n\treadonly app: string;\n\treadonly stack: string;\n\treadonly emitAutoPromotionEvent: () => Effect.Effect<void>;\n\t/** Projected cross-cutting funding entries. Empty when `opts.funding`\n\t * is absent. The barrel stamps each resolved coin dependency's\n\t * `fullCoinType` here. */\n\treadonly projectedFunding?: ProjectedFunding;\n}\n\nconst FUNDING_BALANCE_TIMEOUT_MS = 5_000;\n\nconst makeFundingBalanceReader = (sdk: SuiSdkShim): FundingBalanceReader => ({\n\treadBalance: ({ owner, coinType }) =>\n\t\tEffect.promise(async () => {\n\t\t\ttry {\n\t\t\t\treturn balanceAmountFromSdkResponse(await sdk.core.getBalance({ owner, coinType }));\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}).pipe(\n\t\t\tEffect.timeoutOrElse({\n\t\t\t\tduration: `${FUNDING_BALANCE_TIMEOUT_MS} millis`,\n\t\t\t\torElse: () => Effect.succeed(null),\n\t\t\t}),\n\t\t),\n});\n\nconst balanceAmountFromSdkResponse = (response: unknown): bigint | null => {\n\tconst outer =\n\t\ttypeof response === 'object' && response !== null && 'balance' in response\n\t\t\t? (response as { readonly balance?: unknown }).balance\n\t\t\t: response;\n\tconst value =\n\t\ttypeof outer === 'object' && outer !== null && 'balance' in outer\n\t\t\t? (outer as { readonly balance?: unknown }).balance\n\t\t\t: outer;\n\tif (typeof value === 'bigint') return value;\n\tif (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return BigInt(value);\n\tif (typeof value === 'string' && /^\\d+$/.test(value)) return BigInt(value);\n\treturn null;\n};\n\n/** Dispatch on the variant discriminator. */\nconst resolveVariant = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> => {\n\tswitch (opts.kind) {\n\t\tcase 'ephemeral':\n\t\t\treturn resolveEphemeralVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\t// Architecture-distilled (12-account.md \"Cross-component\n\t\t\t\t// references\"): persisted key lives under the stack's\n\t\t\t\t// runtime tree. Path shape mirrors the on-disk convention.\n\t\t\t\tsecretFilePath: `${ctx.runtimeRoot}/account/${opts.name}.key`,\n\t\t\t});\n\t\tcase 'keystore':\n\t\t\treturn resolveKeystoreVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tpath: opts.path,\n\t\t\t\taliasOrAddress: opts.aliasOrAddress,\n\t\t\t});\n\t\tcase 'env':\n\t\t\treturn resolveEnvVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tvarName: opts.key,\n\t\t\t});\n\t\tcase 'inline':\n\t\t\treturn resolveInlineVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tprivateKey: opts.privateKey,\n\t\t\t});\n\t\tcase 'signer':\n\t\t\treturn resolveSignerVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\tsigner: opts.signer,\n\t\t\t\t...(opts.addressOverride !== undefined ? { addressOverride: opts.addressOverride } : {}),\n\t\t\t});\n\t\tcase 'impersonate':\n\t\t\treturn resolveImpersonateVariant({\n\t\t\t\tname: opts.name,\n\t\t\t\taddress: opts.address,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t});\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Sign + execute closures\n// -----------------------------------------------------------------------------\n\n/** Promote a Promise-returning sign call into the typed-error\n * channel. The `signer.signTransaction` / `signPersonalMessage`\n * helpers on `@mysten/sui` `Signer` instances are async; the\n * bring-your-own-signer variant uses the same shape. */\nconst signWith = (\n\tsigner: {\n\t\treadonly signTransaction: (\n\t\t\ttx: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\ttx: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signTransaction(tx),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signTransaction() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\nconst signPersonalWith = (\n\tsigner: {\n\t\treadonly signPersonalMessage: (\n\t\t\tmsg: Uint8Array,\n\t\t) => Promise<{ readonly bytes: string; readonly signature: string }>;\n\t},\n\tmsg: Uint8Array,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<{ readonly bytes: string; readonly signature: string }, AccountSignError> =>\n\tEffect.tryPromise({\n\t\ttry: () => signer.signPersonalMessage(msg),\n\t\tcatch: (cause): AccountSignError =>\n\t\t\taccountSignError({\n\t\t\t\tphase: 'sign',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': signer.signPersonalMessage() rejected.`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n\n/** Project the raw `@mysten/sui` executeTransaction response into\n * the narrowed `TxResult` shape consumers depend on. The SDK\n * response carries a discriminated union; the result we surface\n * always carries a digest plus the include-projected sub-fields. */\nconst projectTxResult = (\n\traw: unknown,\n\taccountName: string,\n\taddress: string,\n): Effect.Effect<TxResult, AccountSignError> => {\n\t// Defensive shape: the SDK's TransactionResult is\n\t// `{$kind, Transaction?, FailedTransaction?}` — `Transaction.digest`\n\t// is the canonical id we need. We do best-effort projection here\n\t// rather than schema-decode (the shape is wide + the SDK pins it).\n\tconst r = raw as {\n\t\t$kind?: 'Transaction' | 'FailedTransaction';\n\t\tTransaction?: {\n\t\t\tdigest?: string;\n\t\t\teffects?: unknown;\n\t\t\tobjectTypes?: Readonly<Record<string, string>>;\n\t\t\tbalanceChanges?: ReadonlyArray<unknown>;\n\t\t};\n\t\tFailedTransaction?: {\n\t\t\tdigest?: string;\n\t\t};\n\t};\n\tif (r.$kind === 'FailedTransaction') {\n\t\treturn Effect.fail(\n\t\t\taccountSignError({\n\t\t\t\tphase: 'submit',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': transaction execution failed on-chain (digest=${r.FailedTransaction?.digest ?? '<unknown>'}).`,\n\t\t\t}),\n\t\t);\n\t}\n\tconst tx = r.Transaction;\n\tif (tx?.digest === undefined) {\n\t\treturn Effect.fail(\n\t\t\taccountSignError({\n\t\t\t\tphase: 'submit',\n\t\t\t\taccountName,\n\t\t\t\taddress,\n\t\t\t\tmessage: `Account '${accountName}': executeTransaction returned no digest. Raw shape=${JSON.stringify(r).slice(0, 200)}.`,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.succeed({\n\t\tdigest: tx.digest,\n\t\teffects: tx.effects ?? null,\n\t\tobjectChanges: projectObjectChanges(tx.effects, tx.objectTypes ?? {}),\n\t\tbalanceChanges: tx.balanceChanges ?? [],\n\t});\n};\n\nconst extractExecuteDigest = (raw: unknown): string | undefined => {\n\tconst r = raw as {\n\t\t$kind?: 'Transaction' | 'FailedTransaction';\n\t\tTransaction?: { readonly digest?: string };\n\t\tFailedTransaction?: { readonly digest?: string };\n\t};\n\treturn r.$kind === 'FailedTransaction' ? r.FailedTransaction?.digest : r.Transaction?.digest;\n};\n\nconst projectObjectChanges = (\n\teffects: unknown,\n\tobjectTypes: Readonly<Record<string, string>>,\n): ReadonlyArray<unknown> => {\n\tconst changedObjects =\n\t\ttypeof effects === 'object' && effects !== null && 'changedObjects' in effects\n\t\t\t? (\n\t\t\t\t\teffects as {\n\t\t\t\t\t\treadonly changedObjects?: ReadonlyArray<{\n\t\t\t\t\t\t\treadonly objectId?: string;\n\t\t\t\t\t\t\treadonly outputState?: string;\n\t\t\t\t\t\t\treadonly idOperation?: string;\n\t\t\t\t\t\t}>;\n\t\t\t\t\t}\n\t\t\t\t).changedObjects\n\t\t\t: undefined;\n\tif (changedObjects === undefined) return [];\n\treturn changedObjects\n\t\t.filter(\n\t\t\t(\n\t\t\t\tchange,\n\t\t\t): change is {\n\t\t\t\treadonly objectId: string;\n\t\t\t\treadonly outputState?: string;\n\t\t\t\treadonly idOperation?: string;\n\t\t\t} => typeof change.objectId === 'string',\n\t\t)\n\t\t.map((change) => {\n\t\t\tconst objectType = objectTypes[change.objectId];\n\t\t\tconst entry: {\n\t\t\t\ttype: 'published' | 'created' | 'mutated';\n\t\t\t\tobjectId: string;\n\t\t\t\tobjectType?: string;\n\t\t\t\toutputState?: string;\n\t\t\t\tidOperation?: string;\n\t\t\t} = {\n\t\t\t\ttype:\n\t\t\t\t\tchange.outputState === 'PackageWrite'\n\t\t\t\t\t\t? 'published'\n\t\t\t\t\t\t: change.idOperation === 'Created'\n\t\t\t\t\t\t\t? 'created'\n\t\t\t\t\t\t\t: 'mutated',\n\t\t\t\tobjectId: change.objectId,\n\t\t\t};\n\t\t\tif (objectType !== undefined) entry.objectType = objectType;\n\t\t\tif (change.outputState !== undefined) entry.outputState = change.outputState;\n\t\t\tif (change.idOperation !== undefined) entry.idOperation = change.idOperation;\n\t\t\treturn entry;\n\t\t});\n};\n\ninterface BuildClosuresArgs {\n\treadonly accountName: string;\n\treadonly resolved: ResolvedKeypair;\n\treadonly sui: AccountSuiShim;\n\treadonly broker: LeaseBroker;\n\treadonly source: 'real' | 'impersonate';\n}\n\nconst buildClosures = (\n\targs: BuildClosuresArgs,\n): Pick<\n\tAccountValue,\n\t'signAndExecute' | 'withTransactionSigner' | 'signTransaction' | 'signPersonalMessage'\n> => {\n\tconst { accountName, resolved, sui, broker, source } = args;\n\n\t// Impersonation accounts MUST NOT sign — the synthetic signer's\n\t// signTransaction throws synchronously (architecture invariant).\n\t// signAndExecute routes through sui-fork's empty-signature\n\t// execution path while still holding the per-address lease.\n\tif (source === 'impersonate') {\n\t\tconst refuse = <A>(): Effect.Effect<A, AccountSignError> =>\n\t\t\tEffect.fail(\n\t\t\t\taccountSignError({\n\t\t\t\t\tphase: 'impersonation-bypass-attempt',\n\t\t\t\t\taccountName,\n\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\tmessage: `Account '${accountName}' is an impersonation account — sign/execute must route through Sui's fork admin surface.`,\n\t\t\t\t}),\n\t\t\t);\n\t\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst fork = sui.fork ?? null;\n\t\t\t\tif (fork === null) {\n\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': impersonation requires a fork-mode Sui client.`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst submitted = yield* fork.impersonate(resolved.address, tx).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause): AccountSignError =>\n\t\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\t\tmessage: `Account '${accountName}': fork impersonation submit failed.`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest: submitted.digest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${submitted.digest}) failed.`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\treturn yield* projectTxResult(submitted.raw, accountName, resolved.address);\n\t\t\t});\n\t\tconst transactionSigner: AccountTransactionSigner = {\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignAndExecute: unlockedSignAndExecute,\n\t\t};\n\t\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\t\twithAddressLease(\n\t\t\t\tbroker,\n\t\t\t\taccountName,\n\t\t\t\tresolved.address,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t\t}),\n\t\t\t).pipe(\n\t\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t\t}),\n\t\t\t);\n\t\treturn {\n\t\t\tsignAndExecute: (tx) =>\n\t\t\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\twithTransactionSigner,\n\t\t\tsignTransaction: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t\tsignPersonalMessage: refuse<{ readonly bytes: string; readonly signature: string }>,\n\t\t};\n\t}\n\n\t// Both real-keypair and bring-your-own-signer paths satisfy the\n\t// minimal `signTransaction` / `signPersonalMessage` shape (the\n\t// SDK's `Signer` and the BYO `signer` declaration agree on it).\n\tconst signer = resolved.signer as Pick<Signer, 'signTransaction' | 'signPersonalMessage'>;\n\n\tconst unlockedSignTransaction: AccountTransactionSigner['signTransaction'] = (tx) =>\n\t\tsignWith(signer, tx, accountName, resolved.address);\n\n\tconst unlockedSignAndExecute: AccountTransactionSigner['signAndExecute'] = (tx) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst signed: SignatureWithBytes = yield* unlockedSignTransaction(tx);\n\t\t\tconst raw = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tsui.sdk.core.executeTransaction({\n\t\t\t\t\t\ttransaction: tx,\n\t\t\t\t\t\tsignatures: [signed.signature],\n\t\t\t\t\t\tinclude: { effects: true, objectTypes: true },\n\t\t\t\t\t}),\n\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\taccountSignError({\n\t\t\t\t\t\tphase: 'submit',\n\t\t\t\t\t\taccountName,\n\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\tmessage: `Account '${accountName}': executeTransaction transport failed.`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\tconst digest = extractExecuteDigest(raw);\n\t\t\tif (digest !== undefined) {\n\t\t\t\tyield* Effect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tsui.sdk.core.waitForTransaction({\n\t\t\t\t\t\t\tdigest,\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause): AccountSignError =>\n\t\t\t\t\t\taccountSignError({\n\t\t\t\t\t\t\tphase: 'await-finality',\n\t\t\t\t\t\t\taccountName,\n\t\t\t\t\t\t\taddress: resolved.address,\n\t\t\t\t\t\t\tmessage: `Account '${accountName}': waitForTransaction(${digest}) failed.`,\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\tconst result = yield* projectTxResult(raw, accountName, resolved.address);\n\t\t\treturn result;\n\t\t});\n\n\tconst transactionSigner: AccountTransactionSigner = {\n\t\tsignTransaction: unlockedSignTransaction,\n\t\tsignAndExecute: unlockedSignAndExecute,\n\t};\n\n\tconst withTransactionSigner: AccountValue['withTransactionSigner'] = (body) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tEffect.gen(function* () {\n\t\t\t\treturn yield* body(transactionSigner);\n\t\t\t}),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.transactionSigner', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signTransaction: AccountValue['signTransaction'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signTransaction(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signTransaction', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signPersonalMessage: AccountValue['signPersonalMessage'] = (msg) =>\n\t\twithAddressLease(\n\t\t\tbroker,\n\t\t\taccountName,\n\t\t\tresolved.address,\n\t\t\tsignPersonalWith(signer, msg, accountName, resolved.address),\n\t\t).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signPersonalMessage', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\tconst signAndExecute: AccountValue['signAndExecute'] = (tx) =>\n\t\twithTransactionSigner((locked) => locked.signAndExecute(tx)).pipe(\n\t\t\tEffect.withSpan('devstack.plugin.account.signAndExecute', {\n\t\t\t\tattributes: { 'account.name': accountName, 'account.address': resolved.address },\n\t\t\t}),\n\t\t);\n\n\treturn { signAndExecute, withTransactionSigner, signTransaction, signPersonalMessage };\n};\n\n// -----------------------------------------------------------------------------\n// Acquire orchestration\n// -----------------------------------------------------------------------------\n\n/** Acquire an account. Coordinates variant dispatch + funding +\n * the resolved-value projection. */\nexport const acquireAccount = (\n\topts: ResolvedAccountOptions,\n\tctx: AccountAcquireContext,\n): Effect.Effect<AccountValue, AccountAcquireError, StrategyRegistryService | LeaseBrokerService> =>\n\tEffect.gen(function* () {\n\t\tyield* validateAccountName(opts.name);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'account.name': opts.name,\n\t\t\t'account.variant': opts.kind,\n\t\t\t'sui.mode': ctx.sui.mode,\n\t\t});\n\n\t\t// --- variant dispatch ----------------------------------------\n\t\tconst resolved = yield* resolveVariant(opts, ctx);\n\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'account.address': resolved.address,\n\t\t\t'account.scheme': resolved.scheme,\n\t\t});\n\n\t\t// --- lease broker handle (captured once; both funding and the\n\t\t// resolved-value closures share this handle so concurrent\n\t\t// callers serialize through the substrate broker's per-key\n\t\t// FIFO queue) -------------------------------------------\n\t\tconst broker = yield* LeaseBrokerService;\n\t\tconst balanceReader = makeFundingBalanceReader(ctx.sui.sdk);\n\n\t\tconst defaultFunding: ProjectedFundingEntry | null =\n\t\t\topts.kind === 'ephemeral' && opts.funding === undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcoin: 'SUI',\n\t\t\t\t\t\tfullCoinType: SUI_FULL_COIN_TYPE,\n\t\t\t\t\t\tamount: DEFAULT_EPHEMERAL_FUND_MIST,\n\t\t\t\t\t}\n\t\t\t\t: null;\n\t\tconst requestedFunding =\n\t\t\tdefaultFunding === null\n\t\t\t\t? (ctx.projectedFunding ?? [])\n\t\t\t\t: [defaultFunding, ...(ctx.projectedFunding ?? [])];\n\t\tconst appliedDefaultFunding: ProjectedFundingEntry[] = [];\n\n\t\t// --- default funding (bare ephemeral only) -------------------\n\t\tif (defaultFunding !== null) {\n\t\t\tyield* fundEphemeralDefault({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tamountMist: defaultFunding.amount,\n\t\t\t\tsuiMode: ctx.sui.mode,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\temitAutoPromotionEvent: ctx.emitAutoPromotionEvent,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t\tif (defaultFunding.amount > 0n) {\n\t\t\t\tappliedDefaultFunding.push(defaultFunding);\n\t\t\t}\n\t\t}\n\n\t\tconst source: AccountValue['source'] = opts.kind === 'impersonate' ? 'impersonate' : 'real';\n\t\tconst closures = buildClosures({\n\t\t\taccountName: opts.name,\n\t\t\tresolved,\n\t\t\tsui: ctx.sui,\n\t\t\tbroker,\n\t\t\tsource,\n\t\t});\n\n\t\t// --- project the resolved value ------------------------------\n\t\tconst value: AccountValue = {\n\t\t\tname: opts.name,\n\t\t\taddress: resolved.address,\n\t\t\tscheme: resolved.scheme,\n\t\t\tpublicKey: resolved.publicKey,\n\t\t\tsource,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: appliedDefaultFunding,\n\t\t\t},\n\t\t\t...closures,\n\t\t};\n\n\t\t// --- cross-cutting funding (all variants) --------------------\n\t\t//\n\t\t// The barrel pre-projects each user-supplied `CoinMember` to\n\t\t// `{fullCoinType, amount}` from resolved dependencies so this\n\t\t// dispatch stays substrate-name-blind. The resolved account\n\t\t// handle is passed so strategy providers without admin\n\t\t// capabilities can sign account-owned funding swaps. Missing /\n\t\t// empty `projectedFunding` is a no-op (matches the \"Optional\n\t\t// Faucet is a noop\" invariant).\n\t\tconst projected = ctx.projectedFunding ?? [];\n\t\tlet appliedCrossCuttingFunding: ProjectedFunding = [];\n\t\tif (projected.length > 0) {\n\t\t\tappliedCrossCuttingFunding = yield* applyCrossCuttingFunding({\n\t\t\t\taccountName: opts.name,\n\t\t\t\taddress: resolved.address,\n\t\t\t\tvariant: opts.kind,\n\t\t\t\taccount: value,\n\t\t\t\tfunding: projected,\n\t\t\t\tchainId: ctx.sui.chain,\n\t\t\t\tbroker,\n\t\t\t\tbalanceReader,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\t...value,\n\t\t\tfunding: {\n\t\t\t\trequested: requestedFunding,\n\t\t\t\tapplied: [...appliedDefaultFunding, ...appliedCrossCuttingFunding],\n\t\t\t},\n\t\t};\n\t});\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Effect } from "effect";
2
+ //#region src/plugins/account/snapshot.ts
3
+ /** Build the Snapshotable contribution for a resolved variant.
4
+ *
5
+ * Only the `ephemeral` variant declares a persisted subtree. The
6
+ * subtree is per-account so wipe-single-account (12-account.md
7
+ * open question) would target a single path; today's "wipe whole
8
+ * stack" recipe doesn't need this granularity but the seam is here. */
9
+ const makeAccountSnapshotable = (parts) => {
10
+ parts.app, parts.stack, parts.accountName;
11
+ if (parts.variant !== "ephemeral") return {
12
+ kind: "snapshotable",
13
+ subtrees: [],
14
+ missingTolerance: "fine"
15
+ };
16
+ return {
17
+ kind: "snapshotable",
18
+ subtrees: [`account/${parts.accountName}.key`],
19
+ missingTolerance: "fine",
20
+ secretMaterial: true,
21
+ preRestore: Effect.succeed({
22
+ kind: "account-secret",
23
+ account: parts.accountName,
24
+ app: parts.app,
25
+ stack: parts.stack
26
+ }),
27
+ postRestore: Effect.void
28
+ };
29
+ };
30
+ //#endregion
31
+ export { makeAccountSnapshotable };
32
+
33
+ //# sourceMappingURL=snapshot.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../src/plugins/account/snapshot.ts"],"sourcesContent":["// Account plugin — Snapshotable contribution.\n//\n// Architecture §3 + 12-account.md \"Cross-component references\":\n// Account's persisted secret material lives under the runtime tree\n// at `runtime/account/<name>.key` (bech32 secret, 0o600 inside a\n// 0o700 parent). The runtime-rooted tar already captures this via\n// the substrate's auto-included subtree convention — Account just\n// declares the SECRET-MATERIAL flag so the substrate preserves the\n// permissions bits on round-trip.\n//\n// Distilled-doc invariant (\"Restrictive file permissions\"): the\n// 0o600 / 0o700 mode bits are load-bearing. The `secretMaterial:\n// true` flag drives the substrate's mode-bit preservation;\n// re-tightening on warm-start is the runtime's job (snapshot only\n// captures + restores).\n//\n// Variants that do NOT persist secret material (`keystore`, `env`,\n// `inline`, `signer`, `impersonate`) emit an EMPTY snapshot decl\n// with `missingTolerance: 'fine'` so cross-variant restores are\n// clean no-ops.\n\nimport { Effect } from 'effect';\n\nimport type { ContainerLabelTuple, SnapshotableDecl } from '../../contracts/snapshotable.ts';\nimport type { AccountVariantKind } from './errors.ts';\n\n/** Build the Snapshotable contribution for a resolved variant.\n *\n * Only the `ephemeral` variant declares a persisted subtree. The\n * subtree is per-account so wipe-single-account (12-account.md\n * open question) would target a single path; today's \"wipe whole\n * stack\" recipe doesn't need this granularity but the seam is here. */\nexport const makeAccountSnapshotable = (parts: {\n\treadonly accountName: string;\n\treadonly variant: AccountVariantKind;\n\treadonly app: string;\n\treadonly stack: string;\n}): SnapshotableDecl => {\n\tconst _labels: ContainerLabelTuple = {\n\t\tapp: parts.app,\n\t\tstack: parts.stack,\n\t\tplugin: 'account',\n\t\trole: parts.accountName,\n\t};\n\t// Account is value-producing — no managed container. We retain\n\t// the label tuple in the file for symmetry with Sui's snapshot\n\t// decl (and for the future `wipe-single-account` recipe).\n\tvoid _labels;\n\n\tif (parts.variant !== 'ephemeral') {\n\t\treturn {\n\t\t\tkind: 'snapshotable',\n\t\t\tsubtrees: [],\n\t\t\tmissingTolerance: 'fine',\n\t\t};\n\t}\n\n\treturn {\n\t\tkind: 'snapshotable',\n\t\t// Per-account secret file under the runtime tree. The\n\t\t// substrate's runtime-tar already covers `runtime/account/`\n\t\t// inclusively; this opt-in extra is symmetric with Sui's\n\t\t// `sui-fork/` subtree declaration and serves as the\n\t\t// authoritative path for the future per-account wipe.\n\t\tsubtrees: [`account/${parts.accountName}.key`],\n\t\tmissingTolerance: 'fine',\n\t\tsecretMaterial: true,\n\t\t// Pre-restore identity guard: assert the snapshot was taken\n\t\t// under the same `(app, stack, name)` triplet. The substrate's\n\t\t// identity walker reads this opaquely.\n\t\tpreRestore: Effect.succeed({\n\t\t\tkind: 'account-secret',\n\t\t\taccount: parts.accountName,\n\t\t\tapp: parts.app,\n\t\t\tstack: parts.stack,\n\t\t}),\n\t\tpostRestore: Effect.void,\n\t};\n};\n"],"mappings":";;;;;;;;AAgCA,MAAa,2BAA2B,UAKhB;AAEjB,OAAM,KACJ,MAAM,OAEP,MAAM;AAOb,KAAI,MAAM,YAAY,YACrB,QAAO;EACN,MAAM;EACN,UAAU,EAAE;EACZ,kBAAkB;EAClB;AAGF,QAAO;EACN,MAAM;EAMN,UAAU,CAAC,WAAW,MAAM,YAAY,MAAM;EAC9C,kBAAkB;EAClB,gBAAgB;EAIhB,YAAY,OAAO,QAAQ;GAC1B,MAAM;GACN,SAAS,MAAM;GACf,KAAK,MAAM;GACX,OAAO,MAAM;GACb,CAAC;EACF,aAAa,OAAO;EACpB"}
@@ -0,0 +1,24 @@
1
+ import { accountAcquireError } from "../errors.mjs";
2
+ import { decodeBech32Secret } from "../keypair.mjs";
3
+ import { Effect } from "effect";
4
+ //#region src/plugins/account/variants/env.ts
5
+ /** Resolve the env variant.
6
+ *
7
+ * Stub: the actual env-read happens inside `Effect.sync` against
8
+ * the resolved-once process env. The decode path then funnels into
9
+ * `decodeBech32Secret`. */
10
+ const resolveEnvVariant = (args) => Effect.gen(function* () {
11
+ return yield* decodeBech32Secret(yield* Effect.sync(() => {
12
+ return globalThis.process?.env?.[args.varName];
13
+ }).pipe(Effect.flatMap((v) => v === void 0 || v === "" ? Effect.fail(accountAcquireError({
14
+ phase: "read-env",
15
+ accountName: args.name,
16
+ variant: "env",
17
+ message: `Account '${args.name}': env var '${args.varName}' is missing or empty.`,
18
+ hint: `Set ${args.varName}=suiprivkey1... in the process environment.`
19
+ })) : Effect.succeed(v))), args.name, "env");
20
+ });
21
+ //#endregion
22
+ export { resolveEnvVariant };
23
+
24
+ //# sourceMappingURL=env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.mjs","names":[],"sources":["../../../../src/plugins/account/variants/env.ts"],"sourcesContent":["// Account variant — env (read bech32 secret from a process env var).\n//\n// Distilled-doc surface: scoped to CI / vault-injected configurations.\n// The env-var NAME is taken verbatim from the user's options — the\n// VALUE is never logged, spanned, or surfaced in error messages\n// (security invariant: only the variable name is referenced).\n\nimport { Effect } from 'effect';\n\nimport { accountAcquireError, type AccountAcquireError } from '../errors.ts';\nimport { decodeBech32Secret, type ResolvedKeypair } from '../keypair.ts';\n\nexport interface EnvVariantArgs {\n\treadonly name: string;\n\t/** The `process.env` variable name holding the bech32 secret. */\n\treadonly varName: string;\n}\n\n/** Resolve the env variant.\n *\n * Stub: the actual env-read happens inside `Effect.sync` against\n * the resolved-once process env. The decode path then funnels into\n * `decodeBech32Secret`. */\nexport const resolveEnvVariant = (\n\targs: EnvVariantArgs,\n): Effect.Effect<ResolvedKeypair, AccountAcquireError> =>\n\tEffect.gen(function* () {\n\t\t// Stub: read env, refuse empty / missing.\n\t\tconst bech32 = yield* Effect.sync((): string | undefined => {\n\t\t\tconst proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n\t\t\t\t.process;\n\t\t\treturn proc?.env?.[args.varName];\n\t\t}).pipe(\n\t\t\tEffect.flatMap((v) =>\n\t\t\t\tv === undefined || v === ''\n\t\t\t\t\t? Effect.fail(\n\t\t\t\t\t\t\taccountAcquireError({\n\t\t\t\t\t\t\t\tphase: 'read-env',\n\t\t\t\t\t\t\t\taccountName: args.name,\n\t\t\t\t\t\t\t\tvariant: 'env',\n\t\t\t\t\t\t\t\t// Reference the variable's NAME only — never the value.\n\t\t\t\t\t\t\t\tmessage: `Account '${args.name}': env var '${args.varName}' is missing or empty.`,\n\t\t\t\t\t\t\t\thint: `Set ${args.varName}=suiprivkey1... in the process environment.`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t: Effect.succeed(v),\n\t\t\t),\n\t\t);\n\t\treturn yield* decodeBech32Secret(bech32, args.name, 'env');\n\t});\n"],"mappings":";;;;;;;;;AAuBA,MAAa,qBACZ,SAEA,OAAO,IAAI,aAAa;AAsBvB,QAAO,OAAO,mBAAmB,OApBX,OAAO,WAA+B;AAG3D,SAFc,WACZ,SACW,MAAM,KAAK;GACvB,CAAC,KACF,OAAO,SAAS,MACf,MAAM,KAAA,KAAa,MAAM,KACtB,OAAO,KACP,oBAAoB;EACnB,OAAO;EACP,aAAa,KAAK;EAClB,SAAS;EAET,SAAS,YAAY,KAAK,KAAK,cAAc,KAAK,QAAQ;EAC1D,MAAM,OAAO,KAAK,QAAQ;EAC1B,CAAC,CACF,GACA,OAAO,QAAQ,EAAE,CACpB,CACD,EACwC,KAAK,MAAM,MAAM;EACzD"}
@@ -0,0 +1,72 @@
1
+ import { accountAcquireError } from "../errors.mjs";
2
+ import { decodeBech32Secret, generateEd25519Keypair } from "../keypair.mjs";
3
+ import { Effect } from "effect";
4
+ import { dirname } from "node:path";
5
+ import * as nodeFs from "node:fs/promises";
6
+ //#region src/plugins/account/variants/ephemeral.ts
7
+ const isErrnoCode = (cause, code) => typeof cause === "object" && cause !== null && "code" in cause && cause.code === code;
8
+ const bestEffortChmod = (path, mode) => Effect.promise(() => nodeFs.chmod(path, mode)).pipe(Effect.ignore);
9
+ const readPersistedKeypair = (args, message) => Effect.gen(function* () {
10
+ const raw = yield* Effect.tryPromise({
11
+ try: () => nodeFs.readFile(args.secretFilePath, "utf8"),
12
+ catch: (cause) => accountAcquireError({
13
+ phase: "read-persisted-keypair",
14
+ accountName: args.name,
15
+ variant: "ephemeral",
16
+ message,
17
+ cause
18
+ })
19
+ });
20
+ yield* bestEffortChmod(args.secretFilePath, 384);
21
+ return yield* decodeBech32Secret(raw.trim(), args.name, "ephemeral");
22
+ });
23
+ const readPersistedKeypairIfPresent = (args) => readPersistedKeypair(args, `Account '${args.name}': failed to read persisted ephemeral keypair at ${args.secretFilePath}.`).pipe(Effect.catch((cause) => isErrnoCode(cause.cause, "ENOENT") ? Effect.succeed(null) : Effect.fail(cause)));
24
+ const persistGeneratedSecret = (args, secret) => Effect.tryPromise({
25
+ try: async () => {
26
+ await nodeFs.mkdir(dirname(args.secretFilePath), {
27
+ recursive: true,
28
+ mode: 448
29
+ });
30
+ await nodeFs.chmod(dirname(args.secretFilePath), 448).catch(() => {});
31
+ try {
32
+ await nodeFs.writeFile(args.secretFilePath, secret, {
33
+ flag: "wx",
34
+ mode: 384
35
+ });
36
+ return "wrote";
37
+ } catch (cause) {
38
+ if (isErrnoCode(cause, "EEXIST")) return "exists";
39
+ throw cause;
40
+ }
41
+ },
42
+ catch: (cause) => accountAcquireError({
43
+ phase: "persist-keypair",
44
+ accountName: args.name,
45
+ variant: "ephemeral",
46
+ message: `Account '${args.name}': failed to persist ephemeral keypair at ${args.secretFilePath}.`,
47
+ cause
48
+ })
49
+ });
50
+ /** Resolve the ephemeral variant — read or generate an Ed25519 keypair.
51
+ *
52
+ * First-time writes use O_EXCL so parallel acquires for the same
53
+ * account cannot both publish different addresses; the loser re-reads
54
+ * the winner's file and returns the persisted identity. */
55
+ const resolveEphemeralVariant = (args) => Effect.gen(function* () {
56
+ const persisted = yield* readPersistedKeypairIfPresent(args);
57
+ if (persisted !== null) return persisted;
58
+ const generated = yield* generateEd25519Keypair(args.name);
59
+ if (generated.bech32Secret === null) return yield* Effect.fail(accountAcquireError({
60
+ phase: "generate-keypair",
61
+ accountName: args.name,
62
+ variant: "ephemeral",
63
+ message: `Account '${args.name}': generated keypair did not expose a bech32 secret.`
64
+ }));
65
+ if ((yield* persistGeneratedSecret(args, generated.bech32Secret)) === "exists") return yield* readPersistedKeypair(args, `Account '${args.name}': lost ephemeral keypair write race at ${args.secretFilePath} and failed to read the winner.`);
66
+ yield* bestEffortChmod(args.secretFilePath, 384);
67
+ return generated;
68
+ });
69
+ //#endregion
70
+ export { resolveEphemeralVariant };
71
+
72
+ //# sourceMappingURL=ephemeral.mjs.map