@mysten-incubation/devstack 0.1.1 → 0.2.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 (858) hide show
  1. package/README.md +6 -3
  2. package/dashboard-ui/assets/grpc-a4usE3Nk.js +3 -0
  3. package/dashboard-ui/assets/index-B82Bh84P.css +1 -0
  4. package/dashboard-ui/assets/index-CRYJ4pru.js +1277 -0
  5. package/dashboard-ui/index.html +2 -2
  6. package/dist/api/define-capabilities.d.mts +1 -20
  7. package/dist/api/define-capabilities.mjs +15 -22
  8. package/dist/api/define-capabilities.mjs.map +1 -1
  9. package/dist/api/define-devstack-with.d.mts +7 -1
  10. package/dist/api/define-devstack-with.mjs.map +1 -1
  11. package/dist/api/define-devstack.mjs.map +1 -1
  12. package/dist/api/define-plugin.d.mts +2 -1
  13. package/dist/api/inference-network.d.mts +31 -17
  14. package/dist/api/inference-network.mjs +40 -43
  15. package/dist/api/inference-network.mjs.map +1 -1
  16. package/dist/api/load-config.mjs +88 -0
  17. package/dist/api/load-config.mjs.map +1 -0
  18. package/dist/api/mode-narrowed-factory.d.mts +1 -1
  19. package/dist/api/mode-narrowed-factory.mjs.map +1 -1
  20. package/dist/api/run-stack-internal.mjs +202 -0
  21. package/dist/api/run-stack-internal.mjs.map +1 -0
  22. package/dist/api/run-stack.d.mts +82 -31
  23. package/dist/api/run-stack.mjs +22 -141
  24. package/dist/api/run-stack.mjs.map +1 -1
  25. package/dist/build-integrations/dapp-kit/index.d.mts +61 -0
  26. package/dist/build-integrations/dapp-kit/index.mjs +58 -0
  27. package/dist/build-integrations/dapp-kit/index.mjs.map +1 -0
  28. package/dist/build-integrations/playwright/config.d.mts +1 -30
  29. package/dist/build-integrations/playwright/config.mjs +1 -27
  30. package/dist/build-integrations/playwright/config.mjs.map +1 -1
  31. package/dist/build-integrations/playwright/errors.d.mts +4 -7
  32. package/dist/build-integrations/playwright/errors.mjs.map +1 -1
  33. package/dist/build-integrations/playwright/global-setup.d.mts +42 -71
  34. package/dist/build-integrations/playwright/global-setup.mjs +142 -218
  35. package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
  36. package/dist/build-integrations/playwright/index.d.mts +2 -2
  37. package/dist/build-integrations/playwright/index.mjs +2 -2
  38. package/dist/build-integrations/playwright/stack-context.d.mts +3 -1
  39. package/dist/build-integrations/playwright/stack-context.mjs +4 -2
  40. package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
  41. package/dist/build-integrations/playwright/wallet-context.mjs +44 -19
  42. package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
  43. package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
  44. package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -1
  45. package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -1
  46. package/dist/build-integrations/runtime/discover.d.mts +6 -4
  47. package/dist/build-integrations/runtime/discover.mjs +15 -4
  48. package/dist/build-integrations/runtime/discover.mjs.map +1 -1
  49. package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
  50. package/dist/build-integrations/runtime/errors.mjs.map +1 -1
  51. package/dist/build-integrations/runtime/read-stack-context.mjs +3 -3
  52. package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
  53. package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +23 -7
  54. package/dist/build-integrations/runtime/resolve-discovery-env.mjs +25 -12
  55. package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -1
  56. package/dist/build-integrations/runtime/stack-context.d.mts +2 -2
  57. package/dist/build-integrations/vite/index.d.mts +84 -19
  58. package/dist/build-integrations/vite/index.mjs +203 -28
  59. package/dist/build-integrations/vite/index.mjs.map +1 -1
  60. package/dist/build-integrations/vitest/config.d.mts +20 -2
  61. package/dist/build-integrations/vitest/config.mjs +16 -4
  62. package/dist/build-integrations/vitest/config.mjs.map +1 -1
  63. package/dist/build-integrations/vitest/env.d.mts +18 -10
  64. package/dist/build-integrations/vitest/env.mjs +11 -10
  65. package/dist/build-integrations/vitest/env.mjs.map +1 -1
  66. package/dist/build-integrations/vitest/errors.d.mts +7 -11
  67. package/dist/build-integrations/vitest/errors.mjs +3 -4
  68. package/dist/build-integrations/vitest/errors.mjs.map +1 -1
  69. package/dist/build-integrations/vitest/global-setup.d.mts +35 -0
  70. package/dist/build-integrations/vitest/global-setup.mjs +156 -0
  71. package/dist/build-integrations/vitest/global-setup.mjs.map +1 -0
  72. package/dist/build-integrations/vitest/index.d.mts +3 -2
  73. package/dist/build-integrations/vitest/index.mjs +3 -2
  74. package/dist/build-integrations/vitest/setup.mjs +2 -2
  75. package/dist/build-integrations/vitest/setup.mjs.map +1 -1
  76. package/dist/build-integrations/vitest/stack-context.d.mts +5 -3
  77. package/dist/build-integrations/vitest/stack-context.mjs +3 -2
  78. package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
  79. package/dist/cli/bail.mjs.map +1 -1
  80. package/dist/cli/doctor-probes.mjs +1 -3
  81. package/dist/cli/doctor-probes.mjs.map +1 -1
  82. package/dist/cli/main.d.mts +23 -1
  83. package/dist/cli/main.mjs +63 -8
  84. package/dist/cli/main.mjs.map +1 -1
  85. package/dist/cli/prune-direct.mjs.map +1 -1
  86. package/dist/cli/snapshot-reader.mjs.map +1 -1
  87. package/dist/cli/up-lifecycle.mjs.map +1 -1
  88. package/dist/cli/wirings/apply.mjs +28 -21
  89. package/dist/cli/wirings/apply.mjs.map +1 -1
  90. package/dist/cli/wirings/codegen.mjs +108 -0
  91. package/dist/cli/wirings/codegen.mjs.map +1 -0
  92. package/dist/cli/wirings/config-loader.mjs +12 -62
  93. package/dist/cli/wirings/config-loader.mjs.map +1 -1
  94. package/dist/cli/wirings/dump-ids.mjs +86 -0
  95. package/dist/cli/wirings/dump-ids.mjs.map +1 -0
  96. package/dist/cli/wirings/engine-command.mjs +1 -1
  97. package/dist/cli/wirings/engine-command.mjs.map +1 -1
  98. package/dist/cli/wirings/identity.mjs +2 -2
  99. package/dist/cli/wirings/identity.mjs.map +1 -1
  100. package/dist/cli/wirings/provide-file-system.mjs.map +1 -1
  101. package/dist/cli/wirings/read-devstack-version.mjs +17 -0
  102. package/dist/cli/wirings/read-devstack-version.mjs.map +1 -0
  103. package/dist/cli/wirings/snapshot.mjs +27 -34
  104. package/dist/cli/wirings/snapshot.mjs.map +1 -1
  105. package/dist/cli/wirings/up-ipc.mjs +147 -0
  106. package/dist/cli/wirings/up-ipc.mjs.map +1 -0
  107. package/dist/cli/wirings/up.mjs +218 -198
  108. package/dist/cli/wirings/up.mjs.map +1 -1
  109. package/dist/cli/wirings/wipe.mjs +1 -1
  110. package/dist/cli/wirings/wipe.mjs.map +1 -1
  111. package/dist/contracts/chain-probe.d.mts +1 -1
  112. package/dist/contracts/chain-probe.mjs +1 -1
  113. package/dist/contracts/chain-probe.mjs.map +1 -1
  114. package/dist/contracts/codegenable.d.mts +60 -6
  115. package/dist/contracts/codegenable.mjs +28 -0
  116. package/dist/contracts/codegenable.mjs.map +1 -0
  117. package/dist/contracts/config-bindings.mjs +162 -0
  118. package/dist/contracts/config-bindings.mjs.map +1 -0
  119. package/dist/contracts/container-runtime.d.mts +23 -17
  120. package/dist/contracts/plugin-expander.mjs.map +1 -1
  121. package/dist/contracts/snapshotable.d.mts +5 -7
  122. package/dist/contracts/wallet-protocol.d.mts +2 -5
  123. package/dist/contracts/wallet-protocol.mjs +2 -5
  124. package/dist/contracts/wallet-protocol.mjs.map +1 -1
  125. package/dist/index.d.mts +21 -26
  126. package/dist/index.mjs +8 -9
  127. package/dist/orchestrators/boot.d.mts +28 -0
  128. package/dist/orchestrators/boot.mjs +440 -0
  129. package/dist/orchestrators/boot.mjs.map +1 -0
  130. package/dist/orchestrators/codegen/bindings.d.mts +13 -1
  131. package/dist/orchestrators/codegen/bindings.mjs +23 -9
  132. package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
  133. package/dist/orchestrators/codegen/config-runtime.mjs +208 -0
  134. package/dist/orchestrators/codegen/config-runtime.mjs.map +1 -0
  135. package/dist/orchestrators/codegen/emit.mjs +1 -1
  136. package/dist/orchestrators/codegen/emit.mjs.map +1 -1
  137. package/dist/orchestrators/codegen/errors.mjs +21 -1
  138. package/dist/orchestrators/codegen/errors.mjs.map +1 -1
  139. package/dist/orchestrators/codegen/format.mjs +2 -0
  140. package/dist/orchestrators/codegen/format.mjs.map +1 -1
  141. package/dist/orchestrators/codegen/gitignore.mjs +30 -11
  142. package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
  143. package/dist/orchestrators/codegen/id-config.mjs +107 -0
  144. package/dist/orchestrators/codegen/id-config.mjs.map +1 -0
  145. package/dist/orchestrators/codegen/output-location.mjs +23 -32
  146. package/dist/orchestrators/codegen/output-location.mjs.map +1 -1
  147. package/dist/orchestrators/codegen/paths.mjs +8 -1
  148. package/dist/orchestrators/codegen/paths.mjs.map +1 -1
  149. package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
  150. package/dist/orchestrators/codegen/service.mjs +286 -58
  151. package/dist/orchestrators/codegen/service.mjs.map +1 -1
  152. package/dist/orchestrators/layers.mjs +31 -0
  153. package/dist/orchestrators/layers.mjs.map +1 -0
  154. package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -1
  155. package/dist/orchestrators/lifecycle-prune/index.mjs +8 -10
  156. package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -1
  157. package/dist/orchestrators/network-options.d.mts +52 -0
  158. package/dist/orchestrators/network-options.mjs +43 -0
  159. package/dist/orchestrators/network-options.mjs.map +1 -0
  160. package/dist/orchestrators/router/cleanup.mjs.map +1 -1
  161. package/dist/orchestrators/router/cors.mjs.map +1 -1
  162. package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
  163. package/dist/orchestrators/router/errors.mjs.map +1 -1
  164. package/dist/orchestrators/router/file-provider.mjs.map +1 -1
  165. package/dist/orchestrators/router/hostname.mjs.map +1 -1
  166. package/dist/orchestrators/router/profile.mjs +1 -1
  167. package/dist/orchestrators/router/profile.mjs.map +1 -1
  168. package/dist/orchestrators/router/service.d.mts +2 -2
  169. package/dist/orchestrators/router/service.mjs +12 -27
  170. package/dist/orchestrators/router/service.mjs.map +1 -1
  171. package/dist/orchestrators/router/traefik-container.mjs +1 -1
  172. package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
  173. package/dist/orchestrators/snapshot/capture.mjs +171 -195
  174. package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
  175. package/dist/orchestrators/snapshot/descriptor.d.mts +1 -1
  176. package/dist/orchestrators/snapshot/descriptor.mjs +53 -11
  177. package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
  178. package/dist/orchestrators/snapshot/identity-guard.mjs +3 -5
  179. package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -1
  180. package/dist/orchestrators/snapshot/image-bundle-tags.mjs +32 -101
  181. package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -1
  182. package/dist/orchestrators/snapshot/index.mjs +1 -4
  183. package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
  184. package/dist/orchestrators/snapshot/interrupted-restore.mjs +116 -0
  185. package/dist/orchestrators/snapshot/interrupted-restore.mjs.map +1 -0
  186. package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -1
  187. package/dist/orchestrators/snapshot/prune.mjs +40 -31
  188. package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
  189. package/dist/orchestrators/snapshot/restore.mjs +221 -196
  190. package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
  191. package/dist/orchestrators/snapshot/service.mjs +72 -62
  192. package/dist/orchestrators/snapshot/service.mjs.map +1 -1
  193. package/dist/orchestrators/snapshot/wipe.mjs +67 -56
  194. package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
  195. package/dist/plugins/account/codegen.mjs +3 -0
  196. package/dist/plugins/account/codegen.mjs.map +1 -1
  197. package/dist/plugins/account/errors.d.mts +2 -2
  198. package/dist/plugins/account/errors.mjs +1 -4
  199. package/dist/plugins/account/errors.mjs.map +1 -1
  200. package/dist/plugins/account/funding.mjs +3 -27
  201. package/dist/plugins/account/funding.mjs.map +1 -1
  202. package/dist/plugins/account/index.d.mts +3 -8
  203. package/dist/plugins/account/index.mjs +71 -35
  204. package/dist/plugins/account/index.mjs.map +1 -1
  205. package/dist/plugins/account/keypair.d.mts +8 -7
  206. package/dist/plugins/account/keypair.mjs +5 -18
  207. package/dist/plugins/account/keypair.mjs.map +1 -1
  208. package/dist/plugins/account/lease.mjs.map +1 -1
  209. package/dist/plugins/account/registry.d.mts +1 -46
  210. package/dist/plugins/account/registry.mjs.map +1 -1
  211. package/dist/plugins/account/service.d.mts +43 -34
  212. package/dist/plugins/account/service.mjs +9 -54
  213. package/dist/plugins/account/service.mjs.map +1 -1
  214. package/dist/plugins/account/snapshot.mjs.map +1 -1
  215. package/dist/plugins/account/variants/ephemeral.mjs.map +1 -1
  216. package/dist/plugins/account/variants/impersonate.mjs.map +1 -1
  217. package/dist/plugins/account/variants/signer.mjs.map +1 -1
  218. package/dist/plugins/action/discriminator.mjs.map +1 -1
  219. package/dist/plugins/action/errors.mjs +1 -4
  220. package/dist/plugins/action/errors.mjs.map +1 -1
  221. package/dist/plugins/action/execute.mjs +3 -4
  222. package/dist/plugins/action/execute.mjs.map +1 -1
  223. package/dist/plugins/action/index.d.mts +2 -2
  224. package/dist/plugins/action/index.mjs +7 -11
  225. package/dist/plugins/action/index.mjs.map +1 -1
  226. package/dist/plugins/action/service.d.mts +5 -7
  227. package/dist/plugins/action/service.mjs +2 -16
  228. package/dist/plugins/action/service.mjs.map +1 -1
  229. package/dist/plugins/coin/address-resolution.mjs.map +1 -1
  230. package/dist/plugins/coin/codegen.mjs +97 -16
  231. package/dist/plugins/coin/codegen.mjs.map +1 -1
  232. package/dist/plugins/coin/discovery.mjs.map +1 -1
  233. package/dist/plugins/coin/errors.mjs +1 -4
  234. package/dist/plugins/coin/errors.mjs.map +1 -1
  235. package/dist/plugins/coin/index.d.mts +4 -34
  236. package/dist/plugins/coin/index.mjs +47 -28
  237. package/dist/plugins/coin/index.mjs.map +1 -1
  238. package/dist/plugins/coin/metadata.d.mts +1 -0
  239. package/dist/plugins/coin/metadata.mjs +8 -9
  240. package/dist/plugins/coin/metadata.mjs.map +1 -1
  241. package/dist/plugins/coin/mint.mjs +7 -21
  242. package/dist/plugins/coin/mint.mjs.map +1 -1
  243. package/dist/plugins/coin/registry.mjs +33 -20
  244. package/dist/plugins/coin/registry.mjs.map +1 -1
  245. package/dist/plugins/coin/service.d.mts +1 -1
  246. package/dist/plugins/coin/service.mjs +1 -8
  247. package/dist/plugins/coin/service.mjs.map +1 -1
  248. package/dist/plugins/coin/snapshot.mjs.map +1 -1
  249. package/dist/plugins/coin/type-strings.mjs.map +1 -1
  250. package/dist/plugins/dashboard/domain.mjs +106 -167
  251. package/dist/plugins/dashboard/domain.mjs.map +1 -1
  252. package/dist/plugins/dashboard/index.mjs +13 -13
  253. package/dist/plugins/dashboard/index.mjs.map +1 -1
  254. package/dist/plugins/dashboard/origin-policy.mjs +3 -3
  255. package/dist/plugins/dashboard/origin-policy.mjs.map +1 -1
  256. package/dist/plugins/dashboard/routable.mjs.map +1 -1
  257. package/dist/plugins/dashboard/schema/builder.mjs.map +1 -1
  258. package/dist/plugins/dashboard/schema/enums.mjs.map +1 -1
  259. package/dist/plugins/dashboard/schema/root.mjs +23 -44
  260. package/dist/plugins/dashboard/schema/root.mjs.map +1 -1
  261. package/dist/plugins/dashboard/schema/types.mjs +37 -91
  262. package/dist/plugins/dashboard/schema/types.mjs.map +1 -1
  263. package/dist/plugins/dashboard/schema.mjs.map +1 -1
  264. package/dist/plugins/dashboard/server.mjs.map +1 -1
  265. package/dist/plugins/deepbook/codegen.d.mts +12 -11
  266. package/dist/plugins/deepbook/codegen.mjs +108 -11
  267. package/dist/plugins/deepbook/codegen.mjs.map +1 -1
  268. package/dist/plugins/deepbook/deploy.mjs +7 -14
  269. package/dist/plugins/deepbook/deploy.mjs.map +1 -1
  270. package/dist/plugins/deepbook/errors.mjs +4 -2
  271. package/dist/plugins/deepbook/errors.mjs.map +1 -1
  272. package/dist/plugins/deepbook/faucet-strategy.mjs +4 -10
  273. package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
  274. package/dist/plugins/deepbook/hash.mjs.map +1 -1
  275. package/dist/plugins/deepbook/index.d.mts +38 -34
  276. package/dist/plugins/deepbook/index.mjs +133 -64
  277. package/dist/plugins/deepbook/index.mjs.map +1 -1
  278. package/dist/plugins/deepbook/plugin-key.mjs.map +1 -1
  279. package/dist/plugins/deepbook/pyth/index.mjs +4 -8
  280. package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
  281. package/dist/plugins/deepbook/snapshot.mjs +0 -1
  282. package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
  283. package/dist/plugins/deepbook/type-strings.mjs.map +1 -1
  284. package/dist/plugins/deepbook/types.d.mts +2 -1
  285. package/dist/plugins/deepbook/types.mjs.map +1 -1
  286. package/dist/plugins/faucet/dispatcher.d.mts +3 -3
  287. package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
  288. package/dist/plugins/faucet/errors.mjs.map +1 -1
  289. package/dist/plugins/faucet/http.mjs +2 -10
  290. package/dist/plugins/faucet/http.mjs.map +1 -1
  291. package/dist/plugins/faucet/index.mjs +0 -1
  292. package/dist/plugins/faucet/index.mjs.map +1 -1
  293. package/dist/plugins/host-service/errors.d.mts +1 -3
  294. package/dist/plugins/host-service/errors.mjs +1 -2
  295. package/dist/plugins/host-service/errors.mjs.map +1 -1
  296. package/dist/plugins/host-service/index.d.mts +1 -2
  297. package/dist/plugins/host-service/index.mjs +11 -11
  298. package/dist/plugins/host-service/index.mjs.map +1 -1
  299. package/dist/plugins/host-service/routable.mjs.map +1 -1
  300. package/dist/plugins/host-service/service.mjs +13 -13
  301. package/dist/plugins/host-service/service.mjs.map +1 -1
  302. package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -1
  303. package/dist/plugins/internal/codegen-helpers.mjs +2 -0
  304. package/dist/plugins/internal/codegen-helpers.mjs.map +1 -1
  305. package/dist/plugins/internal/funding-failure-error.mjs.map +1 -1
  306. package/dist/plugins/{postgres → internal/postgres-sidecar}/connection.mjs +1 -1
  307. package/dist/plugins/internal/postgres-sidecar/connection.mjs.map +1 -0
  308. package/dist/plugins/{postgres → internal/postgres-sidecar}/db-ensure.mjs +30 -16
  309. package/dist/plugins/internal/postgres-sidecar/db-ensure.mjs.map +1 -0
  310. package/dist/plugins/internal/postgres-sidecar/errors.mjs +21 -0
  311. package/dist/plugins/internal/postgres-sidecar/errors.mjs.map +1 -0
  312. package/dist/{substrate/runtime/scoped-multimap → plugins/internal/postgres-sidecar}/index.mjs +1 -0
  313. package/dist/plugins/internal/postgres-sidecar/service.mjs +121 -0
  314. package/dist/plugins/internal/postgres-sidecar/service.mjs.map +1 -0
  315. package/dist/plugins/package/build.mjs +2 -2
  316. package/dist/plugins/package/build.mjs.map +1 -1
  317. package/dist/plugins/package/codegen.d.mts +7 -14
  318. package/dist/plugins/package/codegen.mjs +187 -59
  319. package/dist/plugins/package/codegen.mjs.map +1 -1
  320. package/dist/plugins/package/dep-resolution.mjs +51 -3
  321. package/dist/plugins/package/dep-resolution.mjs.map +1 -1
  322. package/dist/plugins/package/errors.mjs +1 -4
  323. package/dist/plugins/package/errors.mjs.map +1 -1
  324. package/dist/plugins/package/git-source.d.mts +18 -0
  325. package/dist/plugins/package/git-source.mjs +119 -0
  326. package/dist/plugins/package/git-source.mjs.map +1 -0
  327. package/dist/plugins/package/index.d.mts +28 -19
  328. package/dist/plugins/package/index.mjs +107 -32
  329. package/dist/plugins/package/index.mjs.map +1 -1
  330. package/dist/plugins/package/mode-known.mjs +2 -2
  331. package/dist/plugins/package/mode-known.mjs.map +1 -1
  332. package/dist/plugins/package/mode-local.mjs +18 -35
  333. package/dist/plugins/package/mode-local.mjs.map +1 -1
  334. package/dist/plugins/package/publish-executor.mjs +13 -8
  335. package/dist/plugins/package/publish-executor.mjs.map +1 -1
  336. package/dist/plugins/package/publish-output.d.mts +1 -11
  337. package/dist/plugins/package/publish-output.mjs +1 -9
  338. package/dist/plugins/package/publish-output.mjs.map +1 -1
  339. package/dist/plugins/package/registry.d.mts +1 -1
  340. package/dist/plugins/package/registry.mjs +26 -14
  341. package/dist/plugins/package/registry.mjs.map +1 -1
  342. package/dist/plugins/package/service.mjs.map +1 -1
  343. package/dist/plugins/package/snapshot.mjs.map +1 -1
  344. package/dist/plugins/router-entrypoints.mjs +1 -3
  345. package/dist/plugins/router-entrypoints.mjs.map +1 -1
  346. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +1 -2
  347. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
  348. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +1 -6
  349. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
  350. package/dist/plugins/seal/codegen.d.mts +1 -5
  351. package/dist/plugins/seal/codegen.mjs +83 -12
  352. package/dist/plugins/seal/codegen.mjs.map +1 -1
  353. package/dist/plugins/seal/config-render.mjs +2 -6
  354. package/dist/plugins/seal/config-render.mjs.map +1 -1
  355. package/dist/plugins/seal/deploy.mjs +18 -29
  356. package/dist/plugins/seal/deploy.mjs.map +1 -1
  357. package/dist/plugins/seal/errors.d.mts +4 -5
  358. package/dist/plugins/seal/errors.mjs +1 -8
  359. package/dist/plugins/seal/errors.mjs.map +1 -1
  360. package/dist/plugins/seal/index.d.mts +7 -28
  361. package/dist/plugins/seal/index.mjs +69 -47
  362. package/dist/plugins/seal/index.mjs.map +1 -1
  363. package/dist/plugins/seal/key-manager.mjs.map +1 -1
  364. package/dist/plugins/seal/key-server.mjs +1 -6
  365. package/dist/plugins/seal/key-server.mjs.map +1 -1
  366. package/dist/plugins/seal/keygen.mjs +2 -3
  367. package/dist/plugins/seal/keygen.mjs.map +1 -1
  368. package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
  369. package/dist/plugins/seal/mode/live.mjs +1 -1
  370. package/dist/plugins/seal/mode/live.mjs.map +1 -1
  371. package/dist/plugins/seal/mode/local-keygen.mjs +4 -10
  372. package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
  373. package/dist/plugins/seal/plugin-key.mjs.map +1 -1
  374. package/dist/plugins/seal/registry-publish.mjs.map +1 -1
  375. package/dist/plugins/seal/routable.mjs.map +1 -1
  376. package/dist/plugins/seal/service.mjs.map +1 -1
  377. package/dist/plugins/seal/snapshot.mjs +1 -2
  378. package/dist/plugins/seal/snapshot.mjs.map +1 -1
  379. package/dist/plugins/sui/auto-tick.mjs +5 -5
  380. package/dist/plugins/sui/auto-tick.mjs.map +1 -1
  381. package/dist/plugins/sui/chain-build-container.mjs +2 -2
  382. package/dist/plugins/sui/chain-build-container.mjs.map +1 -1
  383. package/dist/plugins/sui/chain-probe.mjs +4 -4
  384. package/dist/plugins/sui/chain-probe.mjs.map +1 -1
  385. package/dist/plugins/sui/codegen.d.mts +9 -7
  386. package/dist/plugins/sui/codegen.mjs +49 -46
  387. package/dist/plugins/sui/codegen.mjs.map +1 -1
  388. package/dist/plugins/sui/errors.d.mts +1 -1
  389. package/dist/plugins/sui/errors.mjs +1 -9
  390. package/dist/plugins/sui/errors.mjs.map +1 -1
  391. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.d.mts +1 -1
  392. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.mjs +3 -7
  393. package/dist/plugins/sui/exec/index.mjs.map +1 -0
  394. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.mjs +1 -1
  395. package/dist/plugins/sui/exec/sign-and-dispatch.mjs.map +1 -0
  396. package/dist/plugins/sui/fork-faucet-strategy.mjs +2 -6
  397. package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -1
  398. package/dist/plugins/sui/fork-orchestration.mjs +13 -23
  399. package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
  400. package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
  401. package/dist/plugins/sui/index.d.mts +34 -83
  402. package/dist/plugins/sui/index.mjs +200 -68
  403. package/dist/plugins/sui/index.mjs.map +1 -1
  404. package/dist/{substrate/runtime/sui-ledger → plugins/sui/ledger}/object-ref.mjs +1 -1
  405. package/dist/plugins/sui/ledger/object-ref.mjs.map +1 -0
  406. package/dist/plugins/sui/local-faucet-strategy.mjs +1 -5
  407. package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -1
  408. package/dist/plugins/sui/log-attrs.mjs +11 -0
  409. package/dist/plugins/sui/log-attrs.mjs.map +1 -0
  410. package/dist/plugins/sui/mode/external.mjs +4 -12
  411. package/dist/plugins/sui/mode/external.mjs.map +1 -1
  412. package/dist/plugins/sui/mode/fork.mjs +19 -16
  413. package/dist/plugins/sui/mode/fork.mjs.map +1 -1
  414. package/dist/plugins/sui/mode/live.mjs +4 -17
  415. package/dist/plugins/sui/mode/live.mjs.map +1 -1
  416. package/dist/plugins/sui/mode/local.d.mts +1 -0
  417. package/dist/plugins/sui/mode/local.mjs +203 -61
  418. package/dist/plugins/sui/mode/local.mjs.map +1 -1
  419. package/dist/plugins/sui/mode/shared-boot.mjs +18 -23
  420. package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
  421. package/dist/plugins/sui/mode/shared.d.mts +6 -7
  422. package/dist/plugins/sui/mode/shared.mjs.map +1 -1
  423. package/dist/plugins/sui/mode/spec.d.mts +23 -6
  424. package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.mjs +28 -30
  425. package/dist/plugins/sui/move/index.mjs.map +1 -0
  426. package/dist/plugins/sui/move-summary-runner.mjs +8 -4
  427. package/dist/plugins/sui/move-summary-runner.mjs.map +1 -1
  428. package/dist/{substrate/network.d.mts → plugins/sui/network-config.d.mts} +11 -10
  429. package/dist/plugins/sui/network-resolver.d.mts +6 -6
  430. package/dist/plugins/sui/routable.mjs.map +1 -1
  431. package/dist/plugins/sui/service.mjs +10 -6
  432. package/dist/plugins/sui/service.mjs.map +1 -1
  433. package/dist/plugins/sui/snapshot.mjs +10 -5
  434. package/dist/plugins/sui/snapshot.mjs.map +1 -1
  435. package/dist/plugins/wallet/codegen.d.mts +8 -6
  436. package/dist/plugins/wallet/codegen.mjs +4 -10
  437. package/dist/plugins/wallet/codegen.mjs.map +1 -1
  438. package/dist/plugins/wallet/errors.mjs +1 -4
  439. package/dist/plugins/wallet/errors.mjs.map +1 -1
  440. package/dist/plugins/wallet/index.d.mts +3 -6
  441. package/dist/plugins/wallet/index.mjs +16 -21
  442. package/dist/plugins/wallet/index.mjs.map +1 -1
  443. package/dist/plugins/wallet/origin-policy.mjs +3 -3
  444. package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
  445. package/dist/plugins/wallet/pairing.mjs +6 -24
  446. package/dist/plugins/wallet/pairing.mjs.map +1 -1
  447. package/dist/plugins/wallet/protocol.mjs.map +1 -1
  448. package/dist/plugins/wallet/routable.mjs.map +1 -1
  449. package/dist/plugins/wallet/server.mjs +17 -24
  450. package/dist/plugins/wallet/server.mjs.map +1 -1
  451. package/dist/plugins/wallet/service.d.mts +2 -2
  452. package/dist/plugins/wallet/service.mjs +4 -15
  453. package/dist/plugins/wallet/service.mjs.map +1 -1
  454. package/dist/plugins/wallet/snapshot.mjs.map +1 -1
  455. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +1 -5
  456. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
  457. package/dist/plugins/walrus/codegen.d.mts +2 -13
  458. package/dist/plugins/walrus/codegen.mjs +93 -28
  459. package/dist/plugins/walrus/codegen.mjs.map +1 -1
  460. package/dist/plugins/walrus/deploy-paths.mjs +2 -3
  461. package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
  462. package/dist/plugins/walrus/deploy.mjs +26 -19
  463. package/dist/plugins/walrus/deploy.mjs.map +1 -1
  464. package/dist/plugins/walrus/errors.mjs +1 -8
  465. package/dist/plugins/walrus/errors.mjs.map +1 -1
  466. package/dist/plugins/walrus/faucet-strategy.mjs +15 -1
  467. package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
  468. package/dist/plugins/walrus/index.d.mts +13 -44
  469. package/dist/plugins/walrus/index.mjs +119 -122
  470. package/dist/plugins/walrus/index.mjs.map +1 -1
  471. package/dist/plugins/walrus/mode/known-deploy.mjs +6 -6
  472. package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
  473. package/dist/plugins/walrus/mode/local-cluster.d.mts +2 -2
  474. package/dist/plugins/walrus/mode/local-cluster.mjs +2 -10
  475. package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
  476. package/dist/plugins/walrus/plugin-key.mjs.map +1 -1
  477. package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
  478. package/dist/plugins/walrus/routable.mjs.map +1 -1
  479. package/dist/plugins/walrus/service.mjs.map +1 -1
  480. package/dist/plugins/walrus/snapshot.mjs +3 -3
  481. package/dist/plugins/walrus/snapshot.mjs.map +1 -1
  482. package/dist/plugins/walrus/storage-nodes.mjs +53 -14
  483. package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
  484. package/dist/plugins/walrus/wal-swap.mjs +4 -8
  485. package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
  486. package/dist/primitives/artifact-publisher.mjs.map +1 -1
  487. package/dist/primitives/cache.d.mts +1 -1
  488. package/dist/runtime/docker/client.mjs +47 -3
  489. package/dist/runtime/docker/client.mjs.map +1 -1
  490. package/dist/runtime/docker/container.mjs +37 -57
  491. package/dist/runtime/docker/container.mjs.map +1 -1
  492. package/dist/runtime/docker/errors.mjs.map +1 -1
  493. package/dist/runtime/docker/exec.mjs +2 -2
  494. package/dist/runtime/docker/exec.mjs.map +1 -1
  495. package/dist/runtime/docker/image.mjs +10 -11
  496. package/dist/runtime/docker/image.mjs.map +1 -1
  497. package/dist/runtime/docker/index.mjs +0 -1
  498. package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -1
  499. package/dist/runtime/docker/inventory.mjs +9 -9
  500. package/dist/runtime/docker/inventory.mjs.map +1 -1
  501. package/dist/runtime/docker/labels.mjs +12 -1
  502. package/dist/runtime/docker/labels.mjs.map +1 -1
  503. package/dist/runtime/docker/network.mjs +6 -6
  504. package/dist/runtime/docker/network.mjs.map +1 -1
  505. package/dist/runtime/docker/render-run-args.mjs.map +1 -1
  506. package/dist/runtime/docker/service.mjs +31 -45
  507. package/dist/runtime/docker/service.mjs.map +1 -1
  508. package/dist/runtime/docker/sweep.mjs +14 -64
  509. package/dist/runtime/docker/sweep.mjs.map +1 -1
  510. package/dist/runtime/docker/volume.mjs +1 -1
  511. package/dist/runtime/docker/volume.mjs.map +1 -1
  512. package/dist/runtime/docker/wrap.mjs +14 -2
  513. package/dist/runtime/docker/wrap.mjs.map +1 -1
  514. package/dist/substrate/brand.d.mts +2 -5
  515. package/dist/substrate/brand.mjs +3 -2
  516. package/dist/substrate/brand.mjs.map +1 -1
  517. package/dist/substrate/cross-process.mjs +2 -16
  518. package/dist/substrate/cross-process.mjs.map +1 -1
  519. package/dist/substrate/event-time.mjs +0 -2
  520. package/dist/substrate/event-time.mjs.map +1 -1
  521. package/dist/substrate/events.d.mts +46 -16
  522. package/dist/substrate/identity.d.mts +11 -5
  523. package/dist/substrate/manifest.d.mts +33 -26
  524. package/dist/substrate/manifest.mjs +8 -3
  525. package/dist/substrate/manifest.mjs.map +1 -1
  526. package/dist/substrate/options.d.mts +33 -4
  527. package/dist/substrate/plugin-ctx.d.mts +70 -0
  528. package/dist/substrate/plugin-ctx.mjs +66 -0
  529. package/dist/substrate/plugin-ctx.mjs.map +1 -0
  530. package/dist/substrate/plugin.d.mts +46 -38
  531. package/dist/substrate/plugin.mjs +13 -9
  532. package/dist/substrate/plugin.mjs.map +1 -1
  533. package/dist/substrate/projection.d.mts +1 -1
  534. package/dist/substrate/runtime/atomic-write.mjs +3 -4
  535. package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
  536. package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
  537. package/dist/substrate/runtime/cache/service.mjs +50 -20
  538. package/dist/substrate/runtime/cache/service.mjs.map +1 -1
  539. package/dist/substrate/runtime/config-validation.mjs.map +1 -1
  540. package/dist/substrate/runtime/control-plane/domain.mjs +34 -12
  541. package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -1
  542. package/dist/substrate/runtime/control-plane/service.mjs.map +1 -1
  543. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +14 -17
  544. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
  545. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
  546. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
  547. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -1
  548. package/dist/substrate/runtime/cross-process/index.mjs +0 -2
  549. package/dist/substrate/runtime/cross-process/live-clock.mjs +1 -1
  550. package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -1
  551. package/dist/substrate/runtime/cross-process/liveness.mjs +11 -18
  552. package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
  553. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +2 -2
  554. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -1
  555. package/dist/substrate/runtime/cross-process/roster.mjs +17 -127
  556. package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
  557. package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -1
  558. package/dist/substrate/runtime/cross-process/stack-lock.mjs +29 -28
  559. package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
  560. package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
  561. package/dist/substrate/runtime/errors.mjs +1 -13
  562. package/dist/substrate/runtime/errors.mjs.map +1 -1
  563. package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -1
  564. package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -1
  565. package/dist/substrate/runtime/host-gateway.mjs.map +1 -1
  566. package/dist/substrate/runtime/host-tree-tar/index.mjs +15 -163
  567. package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
  568. package/dist/substrate/runtime/http-probe.d.mts +1 -3
  569. package/dist/substrate/runtime/http-probe.mjs.map +1 -1
  570. package/dist/substrate/runtime/index.mjs +1 -6
  571. package/dist/substrate/runtime/lease-broker/service.mjs +5 -23
  572. package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
  573. package/dist/substrate/runtime/lifecycle/dep-graph.mjs +3 -3
  574. package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
  575. package/dist/substrate/runtime/lifecycle/graph-input-id.d.mts +1 -0
  576. package/dist/substrate/runtime/lifecycle/graph-input-id.mjs +133 -0
  577. package/dist/substrate/runtime/lifecycle/graph-input-id.mjs.map +1 -0
  578. package/dist/substrate/runtime/lifecycle/index.mjs +2 -2
  579. package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -1
  580. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +22 -1
  581. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
  582. package/dist/substrate/runtime/lifecycle/ready-gate.mjs +2 -15
  583. package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -1
  584. package/dist/substrate/runtime/lifecycle/selective-restart.mjs +29 -25
  585. package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -1
  586. package/dist/substrate/runtime/lifecycle/signals.mjs +1 -1
  587. package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
  588. package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -1
  589. package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -1
  590. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +0 -1
  591. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -1
  592. package/dist/substrate/runtime/managed-container.d.mts +5 -1
  593. package/dist/substrate/runtime/managed-container.mjs +8 -10
  594. package/dist/substrate/runtime/managed-container.mjs.map +1 -1
  595. package/dist/substrate/runtime/manifest/manifest.mjs +8 -30
  596. package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
  597. package/dist/substrate/runtime/mode-errors.d.mts +1 -2
  598. package/dist/substrate/runtime/mode-errors.mjs.map +1 -1
  599. package/dist/substrate/runtime/observability/cascade-formatter.mjs +1 -11
  600. package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
  601. package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -1
  602. package/dist/substrate/runtime/observability/index.d.mts +1 -1
  603. package/dist/substrate/runtime/observability/index.mjs +4 -6
  604. package/dist/substrate/runtime/observability/log-attrs.mjs +46 -0
  605. package/dist/substrate/runtime/observability/log-attrs.mjs.map +1 -0
  606. package/dist/substrate/runtime/observability/log-store.mjs.map +1 -1
  607. package/dist/substrate/runtime/observability/logger.mjs +3 -3
  608. package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
  609. package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -1
  610. package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
  611. package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -1
  612. package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
  613. package/dist/substrate/runtime/observability/subprocess-capture.mjs +2 -2
  614. package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -1
  615. package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -1
  616. package/dist/substrate/runtime/paths.mjs +27 -9
  617. package/dist/substrate/runtime/paths.mjs.map +1 -1
  618. package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -1
  619. package/dist/substrate/runtime/port-broker/service.mjs +10 -27
  620. package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
  621. package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
  622. package/dist/substrate/runtime/probes.d.mts +2 -3
  623. package/dist/substrate/runtime/probes.mjs.map +1 -1
  624. package/dist/substrate/runtime/process-supervisor.mjs.map +1 -1
  625. package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
  626. package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
  627. package/dist/substrate/runtime/projection/update.mjs +87 -11
  628. package/dist/substrate/runtime/projection/update.mjs.map +1 -1
  629. package/dist/substrate/runtime/random-suffix.mjs.map +1 -1
  630. package/dist/substrate/runtime/reconcile/fs-plan.mjs +146 -0
  631. package/dist/substrate/runtime/reconcile/fs-plan.mjs.map +1 -0
  632. package/dist/substrate/runtime/reconcile/graph.mjs +19 -0
  633. package/dist/substrate/runtime/reconcile/graph.mjs.map +1 -0
  634. package/dist/substrate/runtime/reconcile/index.mjs +5 -0
  635. package/dist/substrate/runtime/reconcile/label.mjs +41 -0
  636. package/dist/substrate/runtime/reconcile/label.mjs.map +1 -0
  637. package/dist/substrate/runtime/reconcile/spec.mjs +15 -0
  638. package/dist/substrate/runtime/reconcile/spec.mjs.map +1 -0
  639. package/dist/substrate/runtime/retry-policy.d.mts +2 -3
  640. package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
  641. package/dist/substrate/runtime/routed-url.mjs.map +1 -1
  642. package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
  643. package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
  644. package/dist/substrate/runtime/stage-and-swap/index.mjs +49 -12
  645. package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
  646. package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -1
  647. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
  648. package/dist/substrate/runtime/strategy-registry/service.mjs +29 -17
  649. package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
  650. package/dist/substrate/runtime/subnet-broker.mjs.map +1 -1
  651. package/dist/substrate/runtime/supervisor/acquire-node.mjs +188 -56
  652. package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -1
  653. package/dist/substrate/runtime/supervisor/background-tasks.mjs +79 -65
  654. package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -1
  655. package/dist/substrate/runtime/supervisor/command-loop.mjs +82 -23
  656. package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -1
  657. package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs +16 -0
  658. package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs.map +1 -0
  659. package/dist/substrate/runtime/supervisor/errors.mjs +11 -2
  660. package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -1
  661. package/dist/substrate/runtime/supervisor/index.mjs +2 -0
  662. package/dist/substrate/runtime/supervisor/shutdown.mjs +6 -6
  663. package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -1
  664. package/dist/substrate/runtime/supervisor/start-supervisor.mjs +60 -70
  665. package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -1
  666. package/dist/substrate/runtime/supervisor/state.d.mts +1 -1
  667. package/dist/substrate/runtime/supervisor/state.mjs +1 -1
  668. package/dist/substrate/runtime/supervisor/state.mjs.map +1 -1
  669. package/dist/substrate/runtime/supervisor/teardown.mjs +10 -9
  670. package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -1
  671. package/dist/substrate/runtime/supervisor/wiring.mjs +6 -20
  672. package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -1
  673. package/dist/substrate/runtime/tar/reader.mjs +216 -0
  674. package/dist/substrate/runtime/tar/reader.mjs.map +1 -0
  675. package/dist/substrate/runtime/typed-env.mjs.map +1 -1
  676. package/dist/substrate/versioned-doc-schema.mjs.map +1 -1
  677. package/dist/substrate/versioned-doc-sync.mjs +5 -5
  678. package/dist/substrate/versioned-doc-sync.mjs.map +1 -1
  679. package/dist/surfaces/cli/command-tree.mjs +49 -7
  680. package/dist/surfaces/cli/command-tree.mjs.map +1 -1
  681. package/dist/surfaces/cli/commands/config.mjs +1 -1
  682. package/dist/surfaces/cli/commands/config.mjs.map +1 -1
  683. package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -1
  684. package/dist/surfaces/cli/commands/confirm.mjs.map +1 -1
  685. package/dist/surfaces/cli/commands/doctor.mjs +1 -1
  686. package/dist/surfaces/cli/commands/doctor.mjs.map +1 -1
  687. package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -1
  688. package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
  689. package/dist/surfaces/cli/commands/prune.mjs +1 -1
  690. package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
  691. package/dist/surfaces/cli/commands/snapshot.mjs +1 -1
  692. package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -1
  693. package/dist/surfaces/cli/commands/status.mjs +1 -1
  694. package/dist/surfaces/cli/commands/status.mjs.map +1 -1
  695. package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
  696. package/dist/surfaces/cli/commands/wipe.mjs +3 -4
  697. package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
  698. package/dist/surfaces/cli/envelope.mjs.map +1 -1
  699. package/dist/surfaces/cli/errors.mjs.map +1 -1
  700. package/dist/surfaces/cli/flags.mjs.map +1 -1
  701. package/dist/surfaces/cli/index.mjs +45 -14
  702. package/dist/surfaces/cli/index.mjs.map +1 -1
  703. package/dist/surfaces/cli/output.mjs.map +1 -1
  704. package/dist/surfaces/cli/sysexits.mjs.map +1 -1
  705. package/dist/surfaces/tui/app.mjs +0 -21
  706. package/dist/surfaces/tui/app.mjs.map +1 -1
  707. package/dist/surfaces/tui/dashboard.mjs +0 -48
  708. package/dist/surfaces/tui/dashboard.mjs.map +1 -1
  709. package/dist/surfaces/tui/display-derivation.mjs +80 -16
  710. package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
  711. package/dist/surfaces/tui/errors.mjs.map +1 -1
  712. package/dist/surfaces/tui/event-log.mjs +0 -9
  713. package/dist/surfaces/tui/event-log.mjs.map +1 -1
  714. package/dist/surfaces/tui/heartbeat.mjs.map +1 -1
  715. package/dist/surfaces/tui/index.mjs +2 -2
  716. package/dist/surfaces/tui/index.mjs.map +1 -1
  717. package/dist/surfaces/tui/input.mjs.map +1 -1
  718. package/dist/surfaces/tui/mode-detect.mjs.map +1 -1
  719. package/dist/surfaces/tui/mount-ink.mjs.map +1 -1
  720. package/dist/surfaces/tui/plain-renderer.mjs +26 -19
  721. package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
  722. package/dist/surfaces/tui/resource-table.mjs +8 -10
  723. package/dist/surfaces/tui/resource-table.mjs.map +1 -1
  724. package/images/postgres/Dockerfile +0 -1
  725. package/images/sui/Dockerfile +27 -54
  726. package/images/sui/entrypoint.sh +17 -179
  727. package/package.json +23 -15
  728. package/dashboard-ui/assets/index-Bmi1UtAg.js +0 -1356
  729. package/dashboard-ui/assets/index-D5EShVt4.js +0 -3
  730. package/dashboard-ui/assets/index-Deml9drg.css +0 -1
  731. package/dist/api/plugin-errors.d.mts +0 -7
  732. package/dist/api/plugin-errors.mjs +0 -10
  733. package/dist/api/plugin-errors.mjs.map +0 -1
  734. package/dist/cli/wirings/build-verb-layers.mjs +0 -42
  735. package/dist/cli/wirings/build-verb-layers.mjs.map +0 -1
  736. package/dist/contracts/capability-decl.d.mts +0 -40
  737. package/dist/orchestrators/built-in-plugin-layers.mjs +0 -54
  738. package/dist/orchestrators/built-in-plugin-layers.mjs.map +0 -1
  739. package/dist/orchestrators/run.mjs +0 -91
  740. package/dist/orchestrators/run.mjs.map +0 -1
  741. package/dist/orchestrators/runtime-composition.d.mts +0 -10
  742. package/dist/orchestrators/runtime-composition.mjs +0 -252
  743. package/dist/orchestrators/runtime-composition.mjs.map +0 -1
  744. package/dist/orchestrators/snapshot/capture-command.d.mts +0 -1
  745. package/dist/orchestrators/snapshot/capture-command.mjs +0 -25
  746. package/dist/orchestrators/snapshot/capture-command.mjs.map +0 -1
  747. package/dist/orchestrators/snapshot/pending-marker.mjs +0 -99
  748. package/dist/orchestrators/snapshot/pending-marker.mjs.map +0 -1
  749. package/dist/orchestrators/snapshot/recover-pending.mjs +0 -223
  750. package/dist/orchestrators/snapshot/recover-pending.mjs.map +0 -1
  751. package/dist/orchestrators/snapshot/state-document.d.mts +0 -1
  752. package/dist/orchestrators/snapshot/state-document.mjs +0 -58
  753. package/dist/orchestrators/snapshot/state-document.mjs.map +0 -1
  754. package/dist/plugins/account/spans.mjs +0 -16
  755. package/dist/plugins/account/spans.mjs.map +0 -1
  756. package/dist/plugins/account/variants/env.mjs +0 -24
  757. package/dist/plugins/account/variants/env.mjs.map +0 -1
  758. package/dist/plugins/account/variants/inline.mjs +0 -13
  759. package/dist/plugins/account/variants/inline.mjs.map +0 -1
  760. package/dist/plugins/account/variants/keystore.mjs +0 -91
  761. package/dist/plugins/account/variants/keystore.mjs.map +0 -1
  762. package/dist/plugins/action/spans.mjs +0 -11
  763. package/dist/plugins/action/spans.mjs.map +0 -1
  764. package/dist/plugins/coin/spans.mjs +0 -20
  765. package/dist/plugins/coin/spans.mjs.map +0 -1
  766. package/dist/plugins/deepbook/spans.mjs +0 -18
  767. package/dist/plugins/deepbook/spans.mjs.map +0 -1
  768. package/dist/plugins/faucet/spans.mjs +0 -12
  769. package/dist/plugins/faucet/spans.mjs.map +0 -1
  770. package/dist/plugins/package/spans.mjs +0 -14
  771. package/dist/plugins/package/spans.mjs.map +0 -1
  772. package/dist/plugins/postgres/codegen.mjs +0 -42
  773. package/dist/plugins/postgres/codegen.mjs.map +0 -1
  774. package/dist/plugins/postgres/connection.d.mts +0 -33
  775. package/dist/plugins/postgres/connection.mjs.map +0 -1
  776. package/dist/plugins/postgres/db-ensure.mjs.map +0 -1
  777. package/dist/plugins/postgres/errors.d.mts +0 -60
  778. package/dist/plugins/postgres/errors.mjs +0 -29
  779. package/dist/plugins/postgres/errors.mjs.map +0 -1
  780. package/dist/plugins/postgres/index.d.mts +0 -37
  781. package/dist/plugins/postgres/index.mjs +0 -68
  782. package/dist/plugins/postgres/index.mjs.map +0 -1
  783. package/dist/plugins/postgres/routable.mjs +0 -33
  784. package/dist/plugins/postgres/routable.mjs.map +0 -1
  785. package/dist/plugins/postgres/service.d.mts +0 -50
  786. package/dist/plugins/postgres/service.mjs +0 -179
  787. package/dist/plugins/postgres/service.mjs.map +0 -1
  788. package/dist/plugins/postgres/snapshot.mjs +0 -32
  789. package/dist/plugins/postgres/snapshot.mjs.map +0 -1
  790. package/dist/plugins/postgres/spans.mjs +0 -11
  791. package/dist/plugins/postgres/spans.mjs.map +0 -1
  792. package/dist/plugins/seal/spans.mjs +0 -18
  793. package/dist/plugins/seal/spans.mjs.map +0 -1
  794. package/dist/plugins/sui/spans.mjs +0 -17
  795. package/dist/plugins/sui/spans.mjs.map +0 -1
  796. package/dist/plugins/wallet/spans.mjs +0 -22
  797. package/dist/plugins/wallet/spans.mjs.map +0 -1
  798. package/dist/plugins/walrus/registry-publish.d.mts +0 -24
  799. package/dist/plugins/walrus/spans.mjs +0 -18
  800. package/dist/plugins/walrus/spans.mjs.map +0 -1
  801. package/dist/runtime/docker/logs.d.mts +0 -1
  802. package/dist/runtime/docker/logs.mjs +0 -34
  803. package/dist/runtime/docker/logs.mjs.map +0 -1
  804. package/dist/substrate/runtime/artifact-publisher/index.mjs +0 -86
  805. package/dist/substrate/runtime/artifact-publisher/index.mjs.map +0 -1
  806. package/dist/substrate/runtime/capability-sinks/index.d.mts +0 -1
  807. package/dist/substrate/runtime/capability-sinks/index.mjs +0 -3
  808. package/dist/substrate/runtime/capability-sinks/layer.d.mts +0 -1
  809. package/dist/substrate/runtime/capability-sinks/layer.mjs +0 -31
  810. package/dist/substrate/runtime/capability-sinks/layer.mjs.map +0 -1
  811. package/dist/substrate/runtime/capability-sinks/service.d.mts +0 -95
  812. package/dist/substrate/runtime/capability-sinks/service.mjs +0 -69
  813. package/dist/substrate/runtime/capability-sinks/service.mjs.map +0 -1
  814. package/dist/substrate/runtime/cross-process/lock.d.mts +0 -1
  815. package/dist/substrate/runtime/cross-process/lock.mjs +0 -23
  816. package/dist/substrate/runtime/cross-process/lock.mjs.map +0 -1
  817. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +0 -113
  818. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +0 -1
  819. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +0 -31
  820. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +0 -1
  821. package/dist/substrate/runtime/observability/formatter-registry.d.mts +0 -1
  822. package/dist/substrate/runtime/observability/formatter-registry.mjs +0 -48
  823. package/dist/substrate/runtime/observability/formatter-registry.mjs.map +0 -1
  824. package/dist/substrate/runtime/observability/span-store.d.mts +0 -1
  825. package/dist/substrate/runtime/observability/span-store.mjs +0 -110
  826. package/dist/substrate/runtime/observability/span-store.mjs.map +0 -1
  827. package/dist/substrate/runtime/observability/spans.d.mts +0 -1
  828. package/dist/substrate/runtime/observability/spans.mjs +0 -87
  829. package/dist/substrate/runtime/observability/spans.mjs.map +0 -1
  830. package/dist/substrate/runtime/projection/index.mjs +0 -4
  831. package/dist/substrate/runtime/projection/persisted.mjs +0 -213
  832. package/dist/substrate/runtime/projection/persisted.mjs.map +0 -1
  833. package/dist/substrate/runtime/scoped-multimap/service.mjs +0 -52
  834. package/dist/substrate/runtime/scoped-multimap/service.mjs.map +0 -1
  835. package/dist/substrate/runtime/scoped-ref-map/index.mjs +0 -2
  836. package/dist/substrate/runtime/scoped-ref-map/service.mjs +0 -83
  837. package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +0 -1
  838. package/dist/substrate/runtime/state-store/index.mjs +0 -3
  839. package/dist/substrate/runtime/state-store/schema.d.mts +0 -1
  840. package/dist/substrate/runtime/state-store/schema.mjs +0 -41
  841. package/dist/substrate/runtime/state-store/schema.mjs.map +0 -1
  842. package/dist/substrate/runtime/state-store/service.d.mts +0 -1
  843. package/dist/substrate/runtime/state-store/service.mjs +0 -145
  844. package/dist/substrate/runtime/state-store/service.mjs.map +0 -1
  845. package/dist/substrate/runtime/sui-execute/index.mjs.map +0 -1
  846. package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +0 -1
  847. package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +0 -1
  848. package/dist/substrate/runtime/sui-move-build/index.mjs.map +0 -1
  849. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +0 -151
  850. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +0 -1
  851. package/dist/substrate/state-store.d.mts +0 -1
  852. /package/dist/orchestrators/{snapshot/pending-marker.d.mts → codegen/id-config.d.mts} +0 -0
  853. /package/dist/orchestrators/snapshot/{recover-pending.d.mts → interrupted-restore.d.mts} +0 -0
  854. /package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.d.mts +0 -0
  855. /package/dist/plugins/{postgres/snapshot.d.mts → sui/ledger/object-ref.d.mts} +0 -0
  856. /package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.d.mts +0 -0
  857. /package/dist/substrate/runtime/{state-store/index.d.mts → reconcile/graph.d.mts} +0 -0
  858. /package/dist/substrate/runtime/{cross-process/snapshot-reservation.d.mts → supervisor/contribution-dispatcher.d.mts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-store.mjs","names":[],"sources":["../../../../src/substrate/runtime/observability/span-store.ts"],"sourcesContent":["// Completed-span ring + recording Tracer.\n//\n// Devstack emits spans with `Effect.withSpan` all over the substrate\n// (`acquire-node`, command names, background tasks, teardown, http handlers,\n// …) carrying the canonical `devstack.*` attributes (see spans.ts). Until\n// now no `Tracer` was provided, so those spans hit Effect's default no-op\n// native tracer and evaporated — the dashboard's \"Traces\" tab had nothing to\n// read.\n//\n// This module provides a minimal RECORDING tracer: it wraps Effect's\n// `NativeSpan` and, when a span ends, projects it into a bounded ring the\n// dashboard can query. The tracer is a drop-in for the default native tracer\n// (it still produces real `Span` objects with parent/trace ids, so span\n// propagation and any future OTel layer keep working) — it just also pushes\n// the completed span into the ring on `end()`.\n//\n// Hot-path discipline: `span()` allocates one `NativeSpan` (same as the\n// default). `end()` does one synchronous array push + bounded trim via a\n// direct mutable array — NO Effect/Ref round-trip on the hot path, since\n// `Tracer.span` / `Span.end` are synchronous and run on the fiber's critical\n// path. The ring is a plain object captured in the closure; reads go through\n// an Effect accessor for the service surface.\n//\n// Process-scoped: the ring object is created in the supervisor alongside the\n// log store, so it survives `stack.restart`.\n\nimport { Context, Effect, Exit, Layer, Option, Tracer } from 'effect';\n\nimport { SpanAttr } from './spans.ts';\n\n// -----------------------------------------------------------------------------\n// Record shape\n// -----------------------------------------------------------------------------\n\n/** One completed span. Plain data; the dashboard schema projects it\n * directly. `op` is the span name; `service` is derived from the\n * `devstack.plugin` attribute (falling back to the span name's leading\n * segment). */\nexport interface SpanRecord {\n\treadonly traceId: string;\n\treadonly spanId: string;\n\treadonly parentId: string | null;\n\t/** Span name / operation (`acquire-node`, `lifecycle.supervisor.runCommand`, …). */\n\treadonly name: string;\n\t/** `devstack.plugin` attribute when present, else `null`. */\n\treadonly service: string | null;\n\treadonly startMillis: number;\n\treadonly durationMillis: number;\n\treadonly status: 'ok' | 'error';\n\t/** Flattened span attributes (string-coerced values). */\n\treadonly attributes: Readonly<Record<string, string>>;\n}\n\n/** Server-side span filter. Every field optional. */\nexport interface SpanFilter {\n\t/** Keep only spans whose derived `service` is in this set. */\n\treadonly services?: ReadonlyArray<string>;\n\t/** Keep only spans with one of these statuses. */\n\treadonly statuses?: ReadonlyArray<'ok' | 'error'>;\n\t/** Case-insensitive substring match against the span name (and service). */\n\treadonly search?: string;\n\t/** Keep only spans that STARTED at/after this epoch-ms. */\n\treadonly sinceMillis?: number;\n\t/** Cap on returned spans (most recent first). */\n\treadonly limit?: number;\n}\n\n// -----------------------------------------------------------------------------\n// Capacity policy\n// -----------------------------------------------------------------------------\n\n/** Completed-span retention. Bounded so a long-lived stack stays flat. */\nexport const DEFAULT_SPAN_CAPACITY = 2000;\n\n// -----------------------------------------------------------------------------\n// Service\n// -----------------------------------------------------------------------------\n\nexport interface SpanStoreShape {\n\t/** Query the ring with a filter (most-recent-first). Never fails. */\n\treadonly query: (filter?: SpanFilter) => Effect.Effect<ReadonlyArray<SpanRecord>>;\n\t/** Distinct derived service keys currently in the ring. */\n\treadonly services: Effect.Effect<ReadonlyArray<string>>;\n\t/** The recording `Tracer` to provide into the supervisor's effect\n\t * context. Wraps Effect's native tracer; records on span `end()`. */\n\treadonly tracer: Tracer.Tracer;\n}\n\nexport class SpanStore extends Context.Service<SpanStore, SpanStoreShape>()(\n\t'@devstack/substrate/SpanStore',\n) {}\n\n// -----------------------------------------------------------------------------\n// Plain mutable ring (hot-path-cheap; no Ref round-trip in `end()`)\n// -----------------------------------------------------------------------------\n\ninterface Ring {\n\trecords: SpanRecord[];\n\treadonly capacity: number;\n}\n\nconst pushRecord = (ring: Ring, record: SpanRecord): void => {\n\tring.records.push(record);\n\tif (ring.records.length > ring.capacity) {\n\t\t// Drop the oldest. `shift` is O(n) but spans complete far slower than\n\t\t// logs and the capacity is bounded; keep it simple over a head index.\n\t\tring.records.shift();\n\t}\n};\n\nconst NANOS_PER_MILLI = 1_000_000n;\nconst nanosToMillis = (n: bigint): number => Number(n / NANOS_PER_MILLI);\n\n/** Derive the dashboard `service` for a span: prefer the canonical\n * `devstack.plugin` attribute, else fall back to the span name. Plugin\n * spans without the attribute use the dotted `devstack.plugin.<name>.…`\n * convention, so we special-case that prefix to recover `<name>` (e.g.\n * `devstack.plugin.postgres.acquire` → `postgres`) instead of bucketing\n * every plugin span under the shared `devstack` head. Other namespaced\n * spans fall back to the leading dotted/slashed segment\n * (`lifecycle.supervisor.runCommand` → `lifecycle`). `null` when neither\n * is informative. */\nconst PLUGIN_SPAN_PREFIX = 'devstack.plugin.';\nconst deriveService = (name: string, attributes: ReadonlyMap<string, unknown>): string | null => {\n\tconst plugin = attributes.get(SpanAttr.plugin);\n\tif (typeof plugin === 'string' && plugin.length > 0) return plugin;\n\tif (name.startsWith(PLUGIN_SPAN_PREFIX)) {\n\t\t// `devstack.plugin.<name>.<op>` → `<name>` (the segment after the prefix).\n\t\tconst rest = name.slice(PLUGIN_SPAN_PREFIX.length);\n\t\tconst pluginName = rest.split(/[./]/, 1)[0];\n\t\tif (pluginName !== undefined && pluginName.length > 0) return pluginName;\n\t}\n\tconst head = name.split(/[./]/, 1)[0];\n\treturn head !== undefined && head.length > 0 && head !== name ? head : null;\n};\n\nconst flattenAttributes = (attributes: ReadonlyMap<string, unknown>): Record<string, string> => {\n\tconst out: Record<string, string> = {};\n\tfor (const [k, v] of attributes) {\n\t\tout[k] = typeof v === 'string' ? v : String(v);\n\t}\n\treturn out;\n};\n\n/** Build the recording span from the native span at end time. */\nconst recordFrom = (\n\tspan: Tracer.NativeSpan,\n\tendTime: bigint,\n\texit: Exit.Exit<unknown, unknown>,\n): SpanRecord => {\n\tconst parent = Option.getOrUndefined(span.parent);\n\tconst startMillis = nanosToMillis(span.startTime);\n\treturn {\n\t\ttraceId: span.traceId,\n\t\tspanId: span.spanId,\n\t\tparentId: parent?.spanId ?? null,\n\t\tname: span.name,\n\t\tservice: deriveService(span.name, span.attributes),\n\t\tstartMillis,\n\t\tdurationMillis: Math.max(0, nanosToMillis(endTime) - startMillis),\n\t\tstatus: Exit.isSuccess(exit) ? 'ok' : 'error',\n\t\tattributes: flattenAttributes(span.attributes),\n\t};\n};\n\n/** A `Tracer` that builds Effect's `NativeSpan` (so parent/trace propagation\n * and attribute capture behave exactly like the default) and records each\n * span into `ring` when it ends. */\nconst recordingTracer = (ring: Ring): Tracer.Tracer =>\n\tTracer.make({\n\t\tspan: (options) => {\n\t\t\tconst span = new Tracer.NativeSpan(options);\n\t\t\tconst originalEnd = span.end.bind(span);\n\t\t\tspan.end = (endTime, exit) => {\n\t\t\t\toriginalEnd(endTime, exit);\n\t\t\t\t// Guard: recording must never break tracing.\n\t\t\t\ttry {\n\t\t\t\t\tpushRecord(ring, recordFrom(span, endTime, exit));\n\t\t\t\t} catch {\n\t\t\t\t\t/* swallow — observability is best-effort */\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn span;\n\t\t},\n\t});\n\n/** Build a `SpanStoreShape` over a fresh ring. The supervisor calls this so\n * the ring is process-scoped. `capacity` is injectable for tests. */\nexport const makeSpanStore = (\n\tcapacity: number = DEFAULT_SPAN_CAPACITY,\n): Effect.Effect<SpanStoreShape> =>\n\tEffect.sync(() => {\n\t\tconst ring: Ring = { records: [], capacity };\n\n\t\tconst query: SpanStoreShape['query'] = (filter) =>\n\t\t\tEffect.sync(() => applySpanFilter(ring.records, filter, capacity));\n\n\t\tconst services: SpanStoreShape['services'] = Effect.sync(() => {\n\t\t\tconst seen = new Set<string>();\n\t\t\tfor (const r of ring.records) if (r.service !== null) seen.add(r.service);\n\t\t\treturn [...seen].sort();\n\t\t});\n\n\t\treturn SpanStore.of({ query, services, tracer: recordingTracer(ring) });\n\t});\n\n/** Pure filter application — exported for tests. Stored oldest-first; we\n * return newest-first and cap to `limit`. */\nexport const applySpanFilter = (\n\trecords: ReadonlyArray<SpanRecord>,\n\tfilter: SpanFilter | undefined,\n\tcapacity: number,\n): ReadonlyArray<SpanRecord> => {\n\tconst serviceSet =\n\t\tfilter?.services && filter.services.length > 0 ? new Set(filter.services) : null;\n\tconst statusSet =\n\t\tfilter?.statuses && filter.statuses.length > 0 ? new Set(filter.statuses) : null;\n\tconst search = filter?.search?.trim().toLowerCase();\n\tconst since = filter?.sinceMillis;\n\tconst limit = filter?.limit ?? capacity;\n\n\tconst out: SpanRecord[] = [];\n\tfor (let i = records.length - 1; i >= 0 && out.length < limit; i -= 1) {\n\t\tconst r = records[i]!;\n\t\tif (serviceSet !== null && (r.service === null || !serviceSet.has(r.service))) continue;\n\t\tif (statusSet !== null && !statusSet.has(r.status)) continue;\n\t\tif (since !== undefined && r.startMillis < since) continue;\n\t\tif (\n\t\t\tsearch !== undefined &&\n\t\t\tsearch.length > 0 &&\n\t\t\t!r.name.toLowerCase().includes(search) &&\n\t\t\t!(r.service ?? '').toLowerCase().includes(search)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tout.push(r);\n\t}\n\treturn out;\n};\n\n/** Layer form (default capacity) for callers that want the store via a Layer. */\nexport const layerSpanStore: Layer.Layer<SpanStore> = Layer.effect(SpanStore, makeSpanStore());\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import { Effect } from "effect";
@@ -1,87 +0,0 @@
1
- import "../paths.mjs";
2
- import { Effect } from "effect";
3
- //#region src/substrate/runtime/observability/spans.ts
4
- /** Canonical span-attribute keys. Engine-dimensional + http/process
5
- * generic only. Plugin-domain keys belong on per-plugin `spans.ts`. */
6
- const SpanAttr = {
7
- app: "devstack.app",
8
- stack: "devstack.stack",
9
- network: "devstack.network",
10
- plugin: "devstack.plugin",
11
- role: "devstack.role",
12
- phase: "devstack.phase",
13
- containerName: "container.name",
14
- containerRole: "container.role",
15
- event: "event.name",
16
- errorCode: "error.code",
17
- errorCause: "error.cause",
18
- errorMessage: "error.message",
19
- exitCode: "process.exit.code",
20
- exitSignal: "process.exit.signal",
21
- exitStatus: "process.exit.status",
22
- endpointKey: "devstack.endpoint.key",
23
- httpMethod: "http.method",
24
- httpPath: "http.path",
25
- httpUrl: "http.url",
26
- host: "server.address",
27
- logTag: "log.tag",
28
- port: "server.port",
29
- cycleId: "devstack.cycle.id",
30
- op: "devstack.op",
31
- requestId: "devstack.request.id",
32
- rosterHeartbeatIntervalMs: "roster.heartbeat.intervalMs",
33
- serviceName: "devstack.service.name",
34
- stageAndSwapStagingPath: "stageAndSwap.stagingPath",
35
- stageAndSwapTargetPath: "stageAndSwap.targetPath",
36
- cacheCorruption: "cache.corruption",
37
- capabilitySinksKind: "capability-sinks.kind",
38
- strategyKey: "strategy.key",
39
- strategyAutoMounted: "strategy.autoMounted",
40
- artifactPublisherNamespace: "artifactPublisher.namespace",
41
- artifactPublisherChain: "artifactPublisher.chain",
42
- artifactPublisherContentHash: "artifactPublisher.contentHash",
43
- artifactPublisherPath: "artifactPublisher.path",
44
- stackLockPath: "devstack.stack-lock.path",
45
- stackLockTimeoutMillis: "devstack.stack-lock.timeoutMillis",
46
- snapshotReservationPath: "devstack.snapshot-reservation.path"
47
- };
48
- /**
49
- * Wrap an Effect in a stack-scoped span. Sets `devstack.app`,
50
- * `devstack.stack`, `devstack.network` attributes. Use at the
51
- * top-level engine entry points (boot, cycle start, supervisor
52
- * loop) — not inside per-plugin code (use `withPluginSpan` for that).
53
- */
54
- const withStackSpan = (name, ctx) => (effect) => effect.pipe(Effect.withSpan(name, { attributes: {
55
- [SpanAttr.app]: ctx.app,
56
- [SpanAttr.stack]: ctx.stack,
57
- [SpanAttr.network]: ctx.network
58
- } }));
59
- /**
60
- * Wrap an Effect in a plugin-scoped span. Inherits stack identity from
61
- * the surrounding Context (callers should compose with
62
- * `withStackSpan` at the top so the stack identity propagates).
63
- */
64
- const withPluginSpan = (name, ctx) => (effect) => effect.pipe(Effect.withSpan(name, { attributes: {
65
- [SpanAttr.app]: ctx.app,
66
- [SpanAttr.stack]: ctx.stack,
67
- [SpanAttr.network]: ctx.network,
68
- [SpanAttr.plugin]: ctx.pluginKey,
69
- [SpanAttr.role]: ctx.role
70
- } }));
71
- /**
72
- * Annotate the current span with a phase marker. Cheap; safe to call
73
- * from anywhere. Used by the supervisor when transitioning a plugin
74
- * through acquire phases so the OTEL trace correlates with the
75
- * lifecycle stream.
76
- */
77
- const annotatePhase = (phase) => Effect.annotateCurrentSpan({ [SpanAttr.phase]: phase });
78
- /**
79
- * Annotate the current span with a subprocess `op` tag. Mirrors the
80
- * `CaptureError.op` field so a failure that originates in a captured
81
- * subprocess can be traced back to its span by `devstack.op`.
82
- */
83
- const annotateOp = (op) => Effect.annotateCurrentSpan({ [SpanAttr.op]: op });
84
- //#endregion
85
- export { SpanAttr, annotateOp, annotatePhase, withPluginSpan, withStackSpan };
86
-
87
- //# sourceMappingURL=spans.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spans.mjs","names":[],"sources":["../../../../src/substrate/runtime/observability/spans.ts"],"sourcesContent":["// Span propagation wrappers.\n//\n// Architecture § L0 Observability: \"span/annotation conventions\".\n// Centralises the attribute keys so every wrapped span uses the same\n// vocabulary — OTEL consumers can filter by `devstack.app`,\n// `devstack.stack`, `devstack.plugin`, `devstack.role` reliably.\n//\n// Discipline: substrate-owned vocabulary carries ONLY engine-dimensional\n// keys (`devstack.*`, `error.*`, `process.exit.*`, `container.*`) plus\n// HTTP-generic keys (`http.*`, `server.*`). Plugin-domain keys\n// (`wallet.token`, `sui.mode`, `account.name`, etc.) live in\n// `src/plugins/<name>/spans.ts` next to the plugin that owns them; see\n// STYLE_GUIDE §16.\n\nimport { Effect } from 'effect';\n\nimport type { PluginKey } from '../../brand.ts';\nimport type { PluginRole } from '../../lifecycle.ts';\nimport { IdentityContext } from '../paths.ts';\n\n/** Canonical span-attribute keys. Engine-dimensional + http/process\n * generic only. Plugin-domain keys belong on per-plugin `spans.ts`. */\nexport const SpanAttr = {\n\tapp: 'devstack.app',\n\tstack: 'devstack.stack',\n\tnetwork: 'devstack.network',\n\tplugin: 'devstack.plugin',\n\trole: 'devstack.role',\n\tphase: 'devstack.phase',\n\tcontainerName: 'container.name',\n\tcontainerRole: 'container.role',\n\tevent: 'event.name',\n\terrorCode: 'error.code',\n\terrorCause: 'error.cause',\n\terrorMessage: 'error.message',\n\texitCode: 'process.exit.code',\n\texitSignal: 'process.exit.signal',\n\texitStatus: 'process.exit.status',\n\tendpointKey: 'devstack.endpoint.key',\n\thttpMethod: 'http.method',\n\thttpPath: 'http.path',\n\thttpUrl: 'http.url',\n\thost: 'server.address',\n\tlogTag: 'log.tag',\n\tport: 'server.port',\n\tcycleId: 'devstack.cycle.id',\n\top: 'devstack.op',\n\trequestId: 'devstack.request.id',\n\trosterHeartbeatIntervalMs: 'roster.heartbeat.intervalMs',\n\tserviceName: 'devstack.service.name',\n\tstageAndSwapStagingPath: 'stageAndSwap.stagingPath',\n\tstageAndSwapTargetPath: 'stageAndSwap.targetPath',\n\tcacheCorruption: 'cache.corruption',\n\tcapabilitySinksKind: 'capability-sinks.kind',\n\tstrategyKey: 'strategy.key',\n\tstrategyAutoMounted: 'strategy.autoMounted',\n\tartifactPublisherNamespace: 'artifactPublisher.namespace',\n\tartifactPublisherChain: 'artifactPublisher.chain',\n\tartifactPublisherContentHash: 'artifactPublisher.contentHash',\n\tartifactPublisherPath: 'artifactPublisher.path',\n\tstackLockPath: 'devstack.stack-lock.path',\n\tstackLockTimeoutMillis: 'devstack.stack-lock.timeoutMillis',\n\tsnapshotReservationPath: 'devstack.snapshot-reservation.path',\n} as const;\n\nexport interface StackSpanContext {\n\treadonly app: string;\n\treadonly stack: string;\n\treadonly network: string;\n}\n\nexport interface PluginSpanContext extends StackSpanContext {\n\treadonly pluginKey: PluginKey;\n\treadonly role: PluginRole;\n}\n\n/**\n * Wrap an Effect in a stack-scoped span. Sets `devstack.app`,\n * `devstack.stack`, `devstack.network` attributes. Use at the\n * top-level engine entry points (boot, cycle start, supervisor\n * loop) — not inside per-plugin code (use `withPluginSpan` for that).\n */\nexport const withStackSpan =\n\t(name: string, ctx: StackSpanContext) =>\n\t<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n\t\teffect.pipe(\n\t\t\tEffect.withSpan(name, {\n\t\t\t\tattributes: {\n\t\t\t\t\t[SpanAttr.app]: ctx.app,\n\t\t\t\t\t[SpanAttr.stack]: ctx.stack,\n\t\t\t\t\t[SpanAttr.network]: ctx.network,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n/**\n * Wrap an Effect in a plugin-scoped span. Inherits stack identity from\n * the surrounding Context (callers should compose with\n * `withStackSpan` at the top so the stack identity propagates).\n */\nexport const withPluginSpan =\n\t(name: string, ctx: PluginSpanContext) =>\n\t<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n\t\teffect.pipe(\n\t\t\tEffect.withSpan(name, {\n\t\t\t\tattributes: {\n\t\t\t\t\t[SpanAttr.app]: ctx.app,\n\t\t\t\t\t[SpanAttr.stack]: ctx.stack,\n\t\t\t\t\t[SpanAttr.network]: ctx.network,\n\t\t\t\t\t[SpanAttr.plugin]: ctx.pluginKey,\n\t\t\t\t\t[SpanAttr.role]: ctx.role,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n/**\n * Annotate the current span with a phase marker. Cheap; safe to call\n * from anywhere. Used by the supervisor when transitioning a plugin\n * through acquire phases so the OTEL trace correlates with the\n * lifecycle stream.\n */\nexport const annotatePhase = (phase: string): Effect.Effect<void> =>\n\tEffect.annotateCurrentSpan({ [SpanAttr.phase]: phase });\n\n/**\n * Annotate the current span with the engine cycle id. Called once per\n * cycle at supervisor entry.\n */\nexport const annotateCycle = (cycleId: number): Effect.Effect<void> =>\n\tEffect.annotateCurrentSpan({ [SpanAttr.cycleId]: cycleId });\n\n/**\n * Annotate the current span with a subprocess `op` tag. Mirrors the\n * `CaptureError.op` field so a failure that originates in a captured\n * subprocess can be traced back to its span by `devstack.op`.\n */\nexport const annotateOp = (op: string): Effect.Effect<void> =>\n\tEffect.annotateCurrentSpan({ [SpanAttr.op]: op });\n\n/**\n * Canonical labels every `spanWithLabels` span carries. `plugin` is\n * caller-supplied (per-acquisition); `endpoint` + `op` are optional\n * canonical narrowers — anything plugin-specific goes through `extras`\n * so the OTEL namespace check (STYLE_GUIDE §16) still applies.\n */\nexport interface SpanLabels {\n\treadonly plugin: PluginKey | string;\n\treadonly endpoint?: string;\n\treadonly op?: string;\n}\n\n/**\n * Wrap an Effect in a span that pre-bakes the canonical identity\n * footprint — `devstack.app` + `devstack.stack` (read from the ambient\n * `IdentityContext`) + `devstack.plugin` from `labels.plugin`. Reach\n * for this on any span that needs to be filterable or groupable by\n * plugin on the dashboard (i.e. basically every span). Coexists with\n * raw `Effect.withSpan` — migration is incremental, not a flag day.\n *\n * Adoption prerequisite: this adds `IdentityContext` to the wrapped\n * effect's `R`. Only reach for it where `IdentityContext` is already in\n * scope (or the boot signature can be widened to carry it). Plugin\n * acquire/boot effects currently do NOT thread `IdentityContext` — they\n * set `devstack.plugin` directly via `Effect.withSpan` — so migrating\n * them needs the identity plumbed first. Note also that a span's\n * app/stack may legitimately differ from the ambient identity (e.g. the\n * `_per-app_` shared-stack sentinel in `managed-container.ts`), where\n * this helper is the wrong tool.\n */\nexport const spanWithLabels =\n\t(name: string, labels: SpanLabels, extras?: Record<string, unknown>) =>\n\t<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R | IdentityContext> =>\n\t\tEffect.gen(function* () {\n\t\t\tconst identity = yield* IdentityContext;\n\t\t\tconst attributes: Record<string, unknown> = {\n\t\t\t\t[SpanAttr.app]: identity.app,\n\t\t\t\t[SpanAttr.stack]: identity.stack,\n\t\t\t\t[SpanAttr.plugin]: labels.plugin,\n\t\t\t\t...(labels.endpoint !== undefined ? { [SpanAttr.endpointKey]: labels.endpoint } : {}),\n\t\t\t\t...(labels.op !== undefined ? { [SpanAttr.op]: labels.op } : {}),\n\t\t\t\t...extras,\n\t\t\t};\n\t\t\treturn yield* effect.pipe(Effect.withSpan(name, { attributes }));\n\t\t});\n"],"mappings":";;;;;AAsBA,MAAa,WAAW;CACvB,KAAK;CACL,OAAO;CACP,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,eAAe;CACf,eAAe;CACf,OAAO;CACP,WAAW;CACX,YAAY;CACZ,cAAc;CACd,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,UAAU;CACV,SAAS;CACT,MAAM;CACN,QAAQ;CACR,MAAM;CACN,SAAS;CACT,IAAI;CACJ,WAAW;CACX,2BAA2B;CAC3B,aAAa;CACb,yBAAyB;CACzB,wBAAwB;CACxB,iBAAiB;CACjB,qBAAqB;CACrB,aAAa;CACb,qBAAqB;CACrB,4BAA4B;CAC5B,wBAAwB;CACxB,8BAA8B;CAC9B,uBAAuB;CACvB,eAAe;CACf,wBAAwB;CACxB,yBAAyB;CACzB;;;;;;;AAmBD,MAAa,iBACX,MAAc,SACL,WACT,OAAO,KACN,OAAO,SAAS,MAAM,EACrB,YAAY;EACV,SAAS,MAAM,IAAI;EACnB,SAAS,QAAQ,IAAI;EACrB,SAAS,UAAU,IAAI;CACxB,EACD,CAAC,CACF;;;;;;AAOH,MAAa,kBACX,MAAc,SACL,WACT,OAAO,KACN,OAAO,SAAS,MAAM,EACrB,YAAY;EACV,SAAS,MAAM,IAAI;EACnB,SAAS,QAAQ,IAAI;EACrB,SAAS,UAAU,IAAI;EACvB,SAAS,SAAS,IAAI;EACtB,SAAS,OAAO,IAAI;CACrB,EACD,CAAC,CACF;;;;;;;AAQH,MAAa,iBAAiB,UAC7B,OAAO,oBAAoB,GAAG,SAAS,QAAQ,OAAO,CAAC;;;;;;AAcxD,MAAa,cAAc,OAC1B,OAAO,oBAAoB,GAAG,SAAS,KAAK,IAAI,CAAC"}
@@ -1,4 +0,0 @@
1
- import "./state-ref.mjs";
2
- import "./persisted.mjs";
3
- import "./update.mjs";
4
- export {};
@@ -1,213 +0,0 @@
1
- import { endpointKey, pluginKey } from "../../brand.mjs";
2
- import { versionedDocSchema } from "../../versioned-doc-schema.mjs";
3
- import { atomicWriteJson } from "../atomic-write.mjs";
4
- import { logWarningAndIgnore } from "../observability/ignore-with-log.mjs";
5
- import { decodeJsonTextSync } from "../runtime-decode.mjs";
6
- import { Effect, Schema, Stream, SubscriptionRef } from "effect";
7
- import { existsSync, readFileSync } from "node:fs";
8
- import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
9
- //#region src/substrate/runtime/projection/persisted.ts
10
- const PROJECTION_SNAPSHOT_FILE_NAME = "projection.v4.json";
11
- const projectionSnapshotPath = (stackRoot) => `${stackRoot}/${PROJECTION_SNAPSHOT_FILE_NAME}`;
12
- const SeveritySchema = Schema.Literals([
13
- "warn",
14
- "error",
15
- "fatal"
16
- ]);
17
- const LogLevelSchema = Schema.Literals([
18
- "info",
19
- "warn",
20
- "error"
21
- ]);
22
- const LifecycleStatusSchema = Schema.Literals([
23
- "pending",
24
- "acquiring",
25
- "ready",
26
- "failed",
27
- "stopping",
28
- "stopped",
29
- "done"
30
- ]);
31
- const PluginRoleSchema = Schema.Literals(["service", "task"]);
32
- const CyclePhaseSchema = Schema.Literals([
33
- "booting",
34
- "running",
35
- "restarting",
36
- "shutting-down"
37
- ]);
38
- const RowSectionSchema = Schema.Literals([
39
- "service",
40
- "package",
41
- "account",
42
- "action",
43
- "app",
44
- "other"
45
- ]);
46
- const StructuredErrorSchema = Schema.Struct({
47
- at: Schema.Number,
48
- pluginKey: Schema.NullOr(Schema.String),
49
- tag: Schema.String,
50
- summary: Schema.String,
51
- chain: Schema.Array(Schema.String),
52
- severity: SeveritySchema
53
- });
54
- const EndpointSchema = Schema.Struct({
55
- endpointKey: Schema.String,
56
- pluginKey: Schema.String,
57
- name: Schema.String,
58
- url: Schema.String,
59
- displayUrl: Schema.NullOr(Schema.String),
60
- wireProtocol: Schema.Literals([
61
- "http",
62
- "h2c",
63
- "tcp"
64
- ]),
65
- registeredAt: Schema.Number
66
- });
67
- const AccountProjectionSchema = Schema.Struct({
68
- key: Schema.String,
69
- rowKey: Schema.NullOr(Schema.String),
70
- name: Schema.String,
71
- address: Schema.NullOr(Schema.String),
72
- scheme: Schema.NullOr(Schema.Literals([
73
- "ed25519",
74
- "secp256k1",
75
- "secp256r1"
76
- ])),
77
- source: Schema.NullOr(Schema.Literals(["real", "impersonate"])),
78
- funding: Schema.Struct({
79
- status: Schema.Literals([
80
- "pending",
81
- "funded",
82
- "skipped",
83
- "failed",
84
- "unknown"
85
- ]),
86
- balanceMist: Schema.NullOr(Schema.String),
87
- requestedMist: Schema.NullOr(Schema.String),
88
- entries: Schema.optional(Schema.Array(Schema.Struct({
89
- coin: Schema.String,
90
- fullCoinType: Schema.String,
91
- amount: Schema.String,
92
- status: Schema.Literals([
93
- "funded",
94
- "already-satisfied",
95
- "skipped"
96
- ])
97
- })))
98
- }),
99
- walletVisible: Schema.Boolean,
100
- updatedAt: Schema.Number
101
- });
102
- const PackageProjectionSchema = Schema.Struct({
103
- key: Schema.String,
104
- rowKey: Schema.NullOr(Schema.String),
105
- name: Schema.String,
106
- kind: Schema.Literals(["local", "known"]),
107
- packageId: Schema.String,
108
- upgradeCapId: Schema.NullOr(Schema.String),
109
- mvrPlaceholder: Schema.String,
110
- sourcePath: Schema.NullOr(Schema.String),
111
- updatedAt: Schema.Number
112
- });
113
- const RowSchema = Schema.Struct({
114
- key: Schema.String,
115
- role: PluginRoleSchema,
116
- status: LifecycleStatusSchema,
117
- phase: Schema.NullOr(Schema.String),
118
- lastError: Schema.NullOr(StructuredErrorSchema),
119
- logTail: Schema.Struct({
120
- lines: Schema.Array(Schema.String),
121
- level: LogLevelSchema,
122
- truncated: Schema.Boolean
123
- }),
124
- endpoints: Schema.Array(Schema.String),
125
- selectiveRestartHighlight: Schema.Boolean,
126
- section: RowSectionSchema,
127
- endpointSection: RowSectionSchema
128
- });
129
- const BuildEntrySchema = Schema.Struct({
130
- pluginKey: Schema.NullOr(Schema.String),
131
- phase: Schema.String,
132
- progress: Schema.String,
133
- startedAt: Schema.Number
134
- });
135
- const ProjectionSnapshotSchema = versionedDocSchema(4, { state: Schema.Struct({
136
- identity: Schema.Struct({
137
- app: Schema.String,
138
- stack: Schema.String,
139
- network: Schema.String
140
- }),
141
- cycle: Schema.Struct({
142
- id: Schema.Number,
143
- startedAt: Schema.Number,
144
- phase: CyclePhaseSchema
145
- }),
146
- rows: Schema.Array(RowSchema),
147
- endpoints: Schema.Array(EndpointSchema),
148
- accounts: Schema.Array(AccountProjectionSchema),
149
- packages: Schema.Array(PackageProjectionSchema),
150
- errors: Schema.Array(StructuredErrorSchema),
151
- lastEvent: Schema.Struct({
152
- seq: Schema.Number,
153
- at: Schema.Number
154
- }),
155
- stackBuild: Schema.Array(BuildEntrySchema)
156
- }) });
157
- const rebrandStructuredError = (error) => ({
158
- ...error,
159
- pluginKey: error.pluginKey === null ? null : pluginKey(error.pluginKey)
160
- });
161
- const rebrandPersistedState = (state) => ({
162
- ...state,
163
- rows: state.rows.map((row) => ({
164
- ...row,
165
- key: pluginKey(row.key),
166
- lastError: row.lastError === null ? null : rebrandStructuredError(row.lastError),
167
- endpoints: row.endpoints.map(endpointKey)
168
- })),
169
- endpoints: state.endpoints.map((endpoint) => ({
170
- ...endpoint,
171
- endpointKey: endpointKey(endpoint.endpointKey),
172
- pluginKey: pluginKey(endpoint.pluginKey)
173
- })),
174
- accounts: state.accounts.map((account) => ({
175
- ...account,
176
- key: account.key,
177
- rowKey: account.rowKey === null ? null : pluginKey(account.rowKey)
178
- })),
179
- packages: state.packages.map((pkg) => ({
180
- ...pkg,
181
- key: pkg.key,
182
- rowKey: pkg.rowKey === null ? null : pluginKey(pkg.rowKey)
183
- })),
184
- errors: state.errors.map(rebrandStructuredError),
185
- stackBuild: state.stackBuild.map((entry) => ({
186
- ...entry,
187
- pluginKey: entry.pluginKey === null ? null : pluginKey(entry.pluginKey)
188
- }))
189
- });
190
- const writeProjectionSnapshot = (stackRoot, state) => atomicWriteJson(projectionSnapshotPath(stackRoot), ProjectionSnapshotSchema, {
191
- version: 4,
192
- state
193
- }).pipe(Effect.provide(NodeFileSystem.layer), logWarningAndIgnore("projection snapshot write failed", { path: projectionSnapshotPath(stackRoot) }));
194
- const persistProjectionChanges = (stackRoot, ref) => Effect.gen(function* () {
195
- yield* writeProjectionSnapshot(stackRoot, yield* SubscriptionRef.get(ref));
196
- yield* Stream.runForEach(SubscriptionRef.changes(ref), (state) => writeProjectionSnapshot(stackRoot, state));
197
- });
198
- const readProjectionSnapshot = (stackRoot) => {
199
- const path = projectionSnapshotPath(stackRoot);
200
- if (!existsSync(path)) return null;
201
- try {
202
- return rebrandPersistedState(decodeJsonTextSync(ProjectionSnapshotSchema, readFileSync(path, "utf8"), {
203
- source: path,
204
- mkError: (issue) => issue
205
- }).state);
206
- } catch {
207
- return null;
208
- }
209
- };
210
- //#endregion
211
- export { AccountProjectionSchema, PROJECTION_SNAPSHOT_FILE_NAME, PackageProjectionSchema, ProjectionSnapshotSchema, persistProjectionChanges, projectionSnapshotPath, readProjectionSnapshot, writeProjectionSnapshot };
212
-
213
- //# sourceMappingURL=persisted.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persisted.mjs","names":[],"sources":["../../../../src/substrate/runtime/projection/persisted.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\n\nimport { Effect, Schema, Stream, SubscriptionRef } from 'effect';\nimport * as NodeFileSystem from '@effect/platform-node/NodeFileSystem';\n\nimport type { SubscribableState } from '../../projection.ts';\nimport { endpointKey, pluginKey } from '../../brand.ts';\nimport { versionedDocSchema } from '../../versioned-doc-schema.ts';\nimport { atomicWriteJson } from '../atomic-write.ts';\nimport { logWarningAndIgnore } from '../observability/ignore-with-log.ts';\nimport { decodeJsonTextSync } from '../runtime-decode.ts';\n\nexport const PROJECTION_SNAPSHOT_FILE_NAME = 'projection.v4.json';\n\nexport const projectionSnapshotPath = (stackRoot: string): string =>\n\t`${stackRoot}/${PROJECTION_SNAPSHOT_FILE_NAME}`;\n\nconst SeveritySchema = Schema.Literals(['warn', 'error', 'fatal']);\nconst LogLevelSchema = Schema.Literals(['info', 'warn', 'error']);\nconst LifecycleStatusSchema = Schema.Literals([\n\t'pending',\n\t'acquiring',\n\t'ready',\n\t'failed',\n\t'stopping',\n\t'stopped',\n\t'done',\n]);\nconst PluginRoleSchema = Schema.Literals(['service', 'task']);\nconst CyclePhaseSchema = Schema.Literals(['booting', 'running', 'restarting', 'shutting-down']);\nconst RowSectionSchema = Schema.Literals([\n\t'service',\n\t'package',\n\t'account',\n\t'action',\n\t'app',\n\t'other',\n]);\n\nconst StructuredErrorSchema = Schema.Struct({\n\tat: Schema.Number,\n\tpluginKey: Schema.NullOr(Schema.String),\n\ttag: Schema.String,\n\tsummary: Schema.String,\n\tchain: Schema.Array(Schema.String),\n\tseverity: SeveritySchema,\n});\n\nconst EndpointSchema = Schema.Struct({\n\tendpointKey: Schema.String,\n\tpluginKey: Schema.String,\n\tname: Schema.String,\n\turl: Schema.String,\n\tdisplayUrl: Schema.NullOr(Schema.String),\n\twireProtocol: Schema.Literals(['http', 'h2c', 'tcp']),\n\tregisteredAt: Schema.Number,\n});\n\nexport const AccountProjectionSchema = Schema.Struct({\n\tkey: Schema.String,\n\trowKey: Schema.NullOr(Schema.String),\n\tname: Schema.String,\n\taddress: Schema.NullOr(Schema.String),\n\tscheme: Schema.NullOr(Schema.Literals(['ed25519', 'secp256k1', 'secp256r1'])),\n\tsource: Schema.NullOr(Schema.Literals(['real', 'impersonate'])),\n\tfunding: Schema.Struct({\n\t\tstatus: Schema.Literals(['pending', 'funded', 'skipped', 'failed', 'unknown']),\n\t\tbalanceMist: Schema.NullOr(Schema.String),\n\t\trequestedMist: Schema.NullOr(Schema.String),\n\t\tentries: Schema.optional(\n\t\t\tSchema.Array(\n\t\t\t\tSchema.Struct({\n\t\t\t\t\tcoin: Schema.String,\n\t\t\t\t\tfullCoinType: Schema.String,\n\t\t\t\t\tamount: Schema.String,\n\t\t\t\t\t// Mirrors `AccountProjection.funding.entries[].status` in\n\t\t\t\t\t// `substrate/projection.ts`. `'already-satisfied'` is\n\t\t\t\t\t// the pre-existing-balance short-circuit emitted by the\n\t\t\t\t\t// account funding pass — semantically a success, kept\n\t\t\t\t\t// distinct from `'funded'` so renderers can surface the\n\t\t\t\t\t// cached-vs-fresh distinction.\n\t\t\t\t\tstatus: Schema.Literals(['funded', 'already-satisfied', 'skipped']),\n\t\t\t\t}),\n\t\t\t),\n\t\t),\n\t}),\n\twalletVisible: Schema.Boolean,\n\tupdatedAt: Schema.Number,\n});\n\nexport const PackageProjectionSchema = Schema.Struct({\n\tkey: Schema.String,\n\trowKey: Schema.NullOr(Schema.String),\n\tname: Schema.String,\n\tkind: Schema.Literals(['local', 'known']),\n\tpackageId: Schema.String,\n\tupgradeCapId: Schema.NullOr(Schema.String),\n\tmvrPlaceholder: Schema.String,\n\tsourcePath: Schema.NullOr(Schema.String),\n\tupdatedAt: Schema.Number,\n});\n\nconst RowSchema = Schema.Struct({\n\tkey: Schema.String,\n\trole: PluginRoleSchema,\n\tstatus: LifecycleStatusSchema,\n\tphase: Schema.NullOr(Schema.String),\n\tlastError: Schema.NullOr(StructuredErrorSchema),\n\tlogTail: Schema.Struct({\n\t\tlines: Schema.Array(Schema.String),\n\t\tlevel: LogLevelSchema,\n\t\ttruncated: Schema.Boolean,\n\t}),\n\tendpoints: Schema.Array(Schema.String),\n\tselectiveRestartHighlight: Schema.Boolean,\n\tsection: RowSectionSchema,\n\tendpointSection: RowSectionSchema,\n});\n\nconst BuildEntrySchema = Schema.Struct({\n\tpluginKey: Schema.NullOr(Schema.String),\n\tphase: Schema.String,\n\tprogress: Schema.String,\n\tstartedAt: Schema.Number,\n});\n\nconst SubscribableStateSchema = Schema.Struct({\n\tidentity: Schema.Struct({\n\t\tapp: Schema.String,\n\t\tstack: Schema.String,\n\t\tnetwork: Schema.String,\n\t}),\n\tcycle: Schema.Struct({\n\t\tid: Schema.Number,\n\t\tstartedAt: Schema.Number,\n\t\tphase: CyclePhaseSchema,\n\t}),\n\trows: Schema.Array(RowSchema),\n\tendpoints: Schema.Array(EndpointSchema),\n\taccounts: Schema.Array(AccountProjectionSchema),\n\tpackages: Schema.Array(PackageProjectionSchema),\n\terrors: Schema.Array(StructuredErrorSchema),\n\tlastEvent: Schema.Struct({\n\t\tseq: Schema.Number,\n\t\tat: Schema.Number,\n\t}),\n\tstackBuild: Schema.Array(BuildEntrySchema),\n});\n\nexport const ProjectionSnapshotSchema = versionedDocSchema(4, {\n\tstate: SubscribableStateSchema,\n});\n\ntype PersistedSubscribableState = Schema.Schema.Type<typeof SubscribableStateSchema>;\ntype PersistedStructuredError = PersistedSubscribableState['errors'][number];\n\nconst rebrandStructuredError = (error: PersistedStructuredError) => ({\n\t...error,\n\tpluginKey: error.pluginKey === null ? null : pluginKey(error.pluginKey),\n});\n\nconst rebrandPersistedState = (state: PersistedSubscribableState): SubscribableState => ({\n\t...state,\n\trows: state.rows.map((row) => ({\n\t\t...row,\n\t\tkey: pluginKey(row.key),\n\t\tlastError: row.lastError === null ? null : rebrandStructuredError(row.lastError),\n\t\tendpoints: row.endpoints.map(endpointKey),\n\t})),\n\tendpoints: state.endpoints.map((endpoint) => ({\n\t\t...endpoint,\n\t\tendpointKey: endpointKey(endpoint.endpointKey),\n\t\tpluginKey: pluginKey(endpoint.pluginKey),\n\t})),\n\taccounts: state.accounts.map((account) => ({\n\t\t...account,\n\t\tkey: account.key as `account/${string}`,\n\t\trowKey: account.rowKey === null ? null : pluginKey(account.rowKey),\n\t})),\n\tpackages: state.packages.map((pkg) => ({\n\t\t...pkg,\n\t\tkey: pkg.key as `package/${string}`,\n\t\trowKey: pkg.rowKey === null ? null : pluginKey(pkg.rowKey),\n\t})),\n\terrors: state.errors.map(rebrandStructuredError),\n\tstackBuild: state.stackBuild.map((entry) => ({\n\t\t...entry,\n\t\tpluginKey: entry.pluginKey === null ? null : pluginKey(entry.pluginKey),\n\t})),\n});\n\nexport const writeProjectionSnapshot = (\n\tstackRoot: string,\n\tstate: SubscribableState,\n): Effect.Effect<void> =>\n\tatomicWriteJson(projectionSnapshotPath(stackRoot), ProjectionSnapshotSchema, {\n\t\tversion: 4 as const,\n\t\tstate,\n\t}).pipe(\n\t\tEffect.provide(NodeFileSystem.layer),\n\t\t// Best-effort: a snapshot write failure must not fail the caller\n\t\t// (the projection is a re-derivable read model). But a bare\n\t\t// `Effect.catch(() => Effect.void)` hid disk-full / permission\n\t\t// faults entirely — leave the cause in the log stream (§18) so a\n\t\t// persistently-failing snapshot is diagnosable.\n\t\tlogWarningAndIgnore('projection snapshot write failed', {\n\t\t\tpath: projectionSnapshotPath(stackRoot),\n\t\t}),\n\t);\n\nexport const persistProjectionChanges = (\n\tstackRoot: string,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* writeProjectionSnapshot(stackRoot, yield* SubscriptionRef.get(ref));\n\t\tyield* Stream.runForEach(SubscriptionRef.changes(ref), (state) =>\n\t\t\twriteProjectionSnapshot(stackRoot, state),\n\t\t);\n\t});\n\nexport const readProjectionSnapshot = (stackRoot: string): SubscribableState | null => {\n\tconst path = projectionSnapshotPath(stackRoot);\n\tif (!existsSync(path)) return null;\n\ttry {\n\t\tconst snapshot = decodeJsonTextSync(ProjectionSnapshotSchema, readFileSync(path, 'utf8'), {\n\t\t\tsource: path,\n\t\t\tmkError: (issue) => issue,\n\t\t});\n\t\treturn rebrandPersistedState(snapshot.state);\n\t} catch {\n\t\treturn null;\n\t}\n};\n"],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- import { Effect, Ref } from "effect";
2
- //#region src/substrate/runtime/scoped-multimap/service.ts
3
- /**
4
- * Construct a fresh scoped multimap. Call this inside a Layer build
5
- * effect (the registry's `Layer.effect` body); the returned ops close
6
- * over a private `Ref` that lives for that Layer's scope.
7
- *
8
- * `register` is interruption-safe: the append + finalizer-wire pair is
9
- * `uninterruptible`, so an interrupt arriving between the two can't
10
- * leak an entry past scope close (mirrors `leaseBroker.tryAcquire`).
11
- */
12
- const makeScopedMultimap = () => Effect.gen(function* () {
13
- const state = yield* Ref.make(/* @__PURE__ */ new Map());
14
- const seqRef = yield* Ref.make(0);
15
- const register = (items) => Effect.gen(function* () {
16
- const seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);
17
- yield* Ref.update(state, (current) => {
18
- const next = new Map(current);
19
- for (const item of items) {
20
- const existing = next.get(item.key) ?? [];
21
- next.set(item.key, [...existing, {
22
- value: item.value,
23
- seq
24
- }]);
25
- }
26
- return next;
27
- });
28
- yield* Effect.addFinalizer((_exit) => Ref.update(state, (current) => {
29
- const next = new Map(current);
30
- for (const item of items) {
31
- const existing = next.get(item.key);
32
- if (!existing) continue;
33
- const filtered = existing.filter((e) => e.seq !== seq);
34
- if (filtered.length === 0) next.delete(item.key);
35
- else next.set(item.key, filtered);
36
- }
37
- return next;
38
- }));
39
- return seq;
40
- }).pipe(Effect.uninterruptible);
41
- const entriesFor = (key) => Ref.get(state).pipe(Effect.map((current) => current.get(key) ?? []));
42
- return {
43
- register,
44
- entriesFor,
45
- snapshot: Ref.get(state),
46
- keys: Ref.get(state).pipe(Effect.map((current) => [...current.keys()]))
47
- };
48
- });
49
- //#endregion
50
- export { makeScopedMultimap };
51
-
52
- //# sourceMappingURL=service.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.mjs","names":[],"sources":["../../../../src/substrate/runtime/scoped-multimap/service.ts"],"sourcesContent":["// Scoped seq-tagged multimap primitive.\n//\n// Three substrate registries — `StrategyRegistry`, `FormatterRegistry`,\n// `CapabilitySinks` — independently grew the same shape: a `Ref` of a\n// per-key LIST of seq-tagged entries, plus a per-registration scope\n// finalizer that drops the entries it added when the surrounding scope\n// closes. This module is the ONE place that shape lives.\n//\n// Why a per-key LIST tagged by a monotonic seq (rather than a single\n// value-per-key with prior-restore):\n//\n// - Parallel / sibling-scope safety. The naive \"remember the prior\n// value, restore it on close\" finalizer is only correct under\n// strict LIFO nesting. With sibling scopes it clobbers a still-live\n// registration: scope A installs `X`, sibling B overwrites `X`\n// (capturing A's value as its `prior`), then A closes first and its\n// finalizer — holding `prior = nothing` — DELETES `X`, dropping B's\n// live overlay. capability-sinks had exactly this bug.\n//\n// - The seq-tagged list makes every finalizer remove ONLY the entry\n// (or entries) it added — it never touches a newer registration for\n// the same key. \"Who wins right now\" is a pure function of the\n// surviving entries (highest seq = last-write-wins), so close order\n// no longer matters.\n//\n// The primitive deliberately stops at the storage + finalizer layer.\n// The \"winner\" policy differs per registry (priority+seq, non-null\n// formatter+seq, plain last-seq), so each call site folds the surviving\n// entries with its own rule over the snapshot this primitive exposes.\n//\n// Scope-local, like every substrate registry: the `Ref` is private to\n// the build effect, so it dies with the stack scope.\n\nimport { Effect, Ref, type Scope } from 'effect';\n\n/** One stored entry: the caller's `value` plus the monotonic `seq` the\n * multimap stamped it with. The `seq` is the identity the finalizer\n * drops on and the tiebreaker call sites fold on. */\nexport interface MultimapEntry<V> {\n\treadonly value: V;\n\treadonly seq: number;\n}\n\n/** A single `(key, value)` pair to register. A registration may carry\n * several pairs (formatter-registry contributes one tag-entry per\n * declared error tag); all pairs in one `register` call share one\n * `seq` and one finalizer. */\nexport interface MultimapItem<K extends string, V> {\n\treadonly key: K;\n\treadonly value: V;\n}\n\n/** Operations on a scoped seq-tagged multimap. Generic over `K`\n * (string-shaped, used as a Map key) and the opaque per-entry `V`. */\nexport interface ScopedMultimap<K extends string, V> {\n\t/** Append one or more `(key, value)` pairs under a single fresh\n\t * `seq`, and register a scope finalizer that drops exactly those\n\t * entries (by `seq`) on scope close. Returns the assigned `seq` so\n\t * callers that need to span-annotate or correlate can.\n\t *\n\t * Requires `Scope.Scope`: the finalizer lands on the caller's\n\t * scope, so the registration is reaped on that scope's close. */\n\treadonly register: (\n\t\titems: ReadonlyArray<MultimapItem<K, V>>,\n\t) => Effect.Effect<number, never, Scope.Scope>;\n\t/** Surviving entries under one key, in registration order\n\t * (ascending `seq`). Empty array when the key is absent. */\n\treadonly entriesFor: (key: K) => Effect.Effect<ReadonlyArray<MultimapEntry<V>>>;\n\t/** Full snapshot: every key mapped to its surviving entries. */\n\treadonly snapshot: Effect.Effect<ReadonlyMap<K, ReadonlyArray<MultimapEntry<V>>>>;\n\t/** Keys with at least one surviving entry. */\n\treadonly keys: Effect.Effect<ReadonlyArray<K>>;\n}\n\ntype State<K extends string, V> = ReadonlyMap<K, ReadonlyArray<MultimapEntry<V>>>;\n\n/**\n * Construct a fresh scoped multimap. Call this inside a Layer build\n * effect (the registry's `Layer.effect` body); the returned ops close\n * over a private `Ref` that lives for that Layer's scope.\n *\n * `register` is interruption-safe: the append + finalizer-wire pair is\n * `uninterruptible`, so an interrupt arriving between the two can't\n * leak an entry past scope close (mirrors `leaseBroker.tryAcquire`).\n */\nexport const makeScopedMultimap = <K extends string, V>(): Effect.Effect<ScopedMultimap<K, V>> =>\n\tEffect.gen(function* () {\n\t\tconst state = yield* Ref.make<State<K, V>>(new Map());\n\t\tconst seqRef = yield* Ref.make(0);\n\n\t\tconst register: ScopedMultimap<K, V>['register'] = (items) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);\n\t\t\t\tyield* Ref.update(state, (current) => {\n\t\t\t\t\tconst next = new Map(current);\n\t\t\t\t\tfor (const item of items) {\n\t\t\t\t\t\tconst existing = next.get(item.key) ?? [];\n\t\t\t\t\t\tnext.set(item.key, [...existing, { value: item.value, seq }]);\n\t\t\t\t\t}\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t\t// Drop-by-seq finalizer. Touches only the entries THIS\n\t\t\t\t// registration added — never a newer registration for the\n\t\t\t\t// same key — so sibling-scope close order is irrelevant.\n\t\t\t\tyield* Effect.addFinalizer((_exit) =>\n\t\t\t\t\tRef.update(state, (current) => {\n\t\t\t\t\t\tconst next = new Map(current);\n\t\t\t\t\t\tfor (const item of items) {\n\t\t\t\t\t\t\tconst existing = next.get(item.key);\n\t\t\t\t\t\t\tif (!existing) continue;\n\t\t\t\t\t\t\tconst filtered = existing.filter((e) => e.seq !== seq);\n\t\t\t\t\t\t\tif (filtered.length === 0) next.delete(item.key);\n\t\t\t\t\t\t\telse next.set(item.key, filtered);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn seq;\n\t\t\t}).pipe(Effect.uninterruptible);\n\n\t\tconst entriesFor: ScopedMultimap<K, V>['entriesFor'] = (key) =>\n\t\t\tRef.get(state).pipe(Effect.map((current) => current.get(key) ?? []));\n\n\t\tconst snapshot: ScopedMultimap<K, V>['snapshot'] = Ref.get(state);\n\n\t\tconst keys: ScopedMultimap<K, V>['keys'] = Ref.get(state).pipe(\n\t\t\tEffect.map((current) => [...current.keys()]),\n\t\t);\n\n\t\treturn { register, entriesFor, snapshot, keys } as const;\n\t});\n"],"mappings":";;;;;;;;;;;AAqFA,MAAa,2BACZ,OAAO,IAAI,aAAa;CACvB,MAAM,QAAQ,OAAO,IAAI,qBAAkB,IAAI,KAAK,CAAC;CACrD,MAAM,SAAS,OAAO,IAAI,KAAK,EAAE;CAEjC,MAAM,YAA8C,UACnD,OAAO,IAAI,aAAa;EACvB,MAAM,MAAM,OAAO,IAAI,aAAa,SAAS,MAAM,IAAI,EAAE;AACzD,SAAO,IAAI,OAAO,QAAQ,YAAY;GACrC,MAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAK,MAAM,QAAQ,OAAO;IACzB,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE;AACzC,SAAK,IAAI,KAAK,KAAK,CAAC,GAAG,UAAU;KAAE,OAAO,KAAK;KAAO;KAAK,CAAC,CAAC;;AAE9D,UAAO;IACN;AAIF,SAAO,OAAO,cAAc,UAC3B,IAAI,OAAO,QAAQ,YAAY;GAC9B,MAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAK,MAAM,QAAQ,OAAO;IACzB,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI;AACnC,QAAI,CAAC,SAAU;IACf,MAAM,WAAW,SAAS,QAAQ,MAAM,EAAE,QAAQ,IAAI;AACtD,QAAI,SAAS,WAAW,EAAG,MAAK,OAAO,KAAK,IAAI;QAC3C,MAAK,IAAI,KAAK,KAAK,SAAS;;AAElC,UAAO;IACN,CACF;AACD,SAAO;GACN,CAAC,KAAK,OAAO,gBAAgB;CAEhC,MAAM,cAAkD,QACvD,IAAI,IAAI,MAAM,CAAC,KAAK,OAAO,KAAK,YAAY,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AAQrE,QAAO;EAAE;EAAU;EAAY,UANoB,IAAI,IAAI,MAMpB;EAAE,MAJE,IAAI,IAAI,MAAM,CAAC,KACzD,OAAO,KAAK,YAAY,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC,CAGA;EAAE;EAC9C"}
@@ -1,2 +0,0 @@
1
- import "./service.mjs";
2
- export {};
@@ -1,83 +0,0 @@
1
- import { Context, Effect, Layer, Schema, SubscriptionRef } from "effect";
2
- //#region src/substrate/runtime/scoped-ref-map/service.ts
3
- /** Lookup failure for a missing key. Schema-tagged so consumers
4
- * may `Effect.catchTag('ScopedRefMapKeyMissingError', ...)` and
5
- * the cascade-formatter can render it without importing the class. */
6
- var ScopedRefMapKeyMissingError = class extends Schema.TaggedErrorClass()("ScopedRefMapKeyMissingError", {
7
- registryName: Schema.String,
8
- key: Schema.String
9
- }) {};
10
- /**
11
- * Factory: declare a typed `K -> V` scoped ref-map service.
12
- *
13
- * The `name` becomes both the human-readable registry name (used
14
- * in `ScopedRefMapKeyMissingError.registryName`) and the
15
- * Context.Service identifier (prefixed with the substrate
16
- * namespace). Each call returns a fresh Service class; calling
17
- * twice with the same name produces two distinct services
18
- * (Context.Service identity is per-class, not per-id-string —
19
- * the id string is a debugging aid).
20
- *
21
- * Return shape — typed via inference so the inner Service class's
22
- * identity flows through to callers:
23
- * - `Service` — the `Context.Service` tag class. Plugin authors
24
- * yield this from their `acquire` body via `yield* MyRegistry.Service`.
25
- * - `layer` — scope-bound Layer constructing one ref-map per
26
- * stack scope.
27
- * - `changes` — stream helper mirroring `routesStream(router)`.
28
- *
29
- * Example (in an L2 plugin):
30
- *
31
- * ```ts
32
- * const PackageRegistry = defineScopedRefMap<PackageKey, PackageRecord>('PackageRegistry');
33
- *
34
- * // In the plugin's acquire body:
35
- * const registry = yield* PackageRegistry.Service;
36
- * yield* registry.set(name, resolved);
37
- *
38
- * // In the boot Layer:
39
- * Layer.mergeAll(PackageRegistry.layer, ...)
40
- * ```
41
- */
42
- const defineScopedRefMap = (name) => {
43
- const serviceId = `@devstack/substrate/ScopedRefMap/${name}`;
44
- class Service extends Context.Service()(serviceId) {}
45
- const layer = Layer.effect(Service, Effect.gen(function* () {
46
- const ref = yield* SubscriptionRef.make([]);
47
- const set = (key, value) => SubscriptionRef.update(ref, (current) => {
48
- return [...current.filter(([k]) => k !== key), [key, value]];
49
- });
50
- const find = (key) => SubscriptionRef.get(ref).pipe(Effect.map((current) => {
51
- const hit = current.find(([k]) => k === key);
52
- return hit ? hit[1] : null;
53
- }));
54
- const get = (key) => Effect.gen(function* () {
55
- const value = yield* find(key);
56
- if (value === null) return yield* new ScopedRefMapKeyMissingError({
57
- registryName: name,
58
- key
59
- });
60
- return value;
61
- });
62
- const has = (key) => SubscriptionRef.get(ref).pipe(Effect.map((current) => current.some(([k]) => k === key)));
63
- const entries = () => SubscriptionRef.get(ref);
64
- return Service.of({
65
- set,
66
- get,
67
- find,
68
- has,
69
- entries,
70
- changes: SubscriptionRef.changes(ref)
71
- });
72
- }));
73
- const changes = (svc) => svc.changes;
74
- return {
75
- Service,
76
- layer,
77
- changes
78
- };
79
- };
80
- //#endregion
81
- export { ScopedRefMapKeyMissingError, defineScopedRefMap };
82
-
83
- //# sourceMappingURL=service.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.mjs","names":[],"sources":["../../../../src/substrate/runtime/scoped-ref-map/service.ts"],"sourcesContent":["// Generic scoped Ref-Map registry primitive.\n//\n// Architecture (ARCHITECTURE.md § Substrate primitives roster /\n// § Substrate name-blindness): a name-blind, per-stack-scoped\n// in-memory `K -> V` lookup table. Substrate exposes ONLY the\n// generic primitive; L2 plugins (Sui-coin, Move-package, future\n// chain plugins) instantiate it with their domain-specific\n// `K` and `V` shapes to author their own typed Context.Service.\n//\n// Why the factory `defineScopedRefMap<K, V>(name)` shape rather\n// than a single `ScopedRefMapService` tag:\n//\n// - One service per plugin domain — `PackageRegistry`,\n// `CoinRegistry`, etc. — gives each plugin its own typed\n// tag instead of every consumer reaching into a single map\n// and narrowing.\n// - Substrate stays name-blind: it doesn't know `coin` or\n// `package`; it only knows \"give me a Layer + Service for\n// `<K, V>`\". The plugin chooses the name.\n// - The substrate Service-class identity is the namespace —\n// two `defineScopedRefMap('Foo')` and `defineScopedRefMap('Bar')`\n// calls return distinct services that can coexist in the\n// same scope.\n//\n// Lifetime: each instantiated service is materialized by a\n// Layer that lives for the stack scope. When the scope closes,\n// the in-memory `SubscriptionRef` drops with it — the ref is\n// closure-private to the Layer's build effect, so the GC\n// reclaims it once no subscribers hold the stream.\n\nimport { Context, Effect, Layer, Schema, Stream, SubscriptionRef } from 'effect';\n\n/** Lookup failure for a missing key. Schema-tagged so consumers\n * may `Effect.catchTag('ScopedRefMapKeyMissingError', ...)` and\n * the cascade-formatter can render it without importing the class. */\nexport class ScopedRefMapKeyMissingError extends Schema.TaggedErrorClass<ScopedRefMapKeyMissingError>()(\n\t'ScopedRefMapKeyMissingError',\n\t{\n\t\tregistryName: Schema.String,\n\t\tkey: Schema.String,\n\t},\n) {}\n\n/** Operations on a scoped `K -> V` ref-map. Generic over `K`\n * (constrained to `string`-shaped brands so it can be used as\n * a Map key) and `V` (fully opaque to substrate). */\nexport interface ScopedRefMap<K extends string, V> {\n\t/** Insert / overwrite. Last-write-wins on `K`. */\n\treadonly set: (key: K, value: V) => Effect.Effect<void>;\n\t/** Strict lookup. Fails with `ScopedRefMapKeyMissingError`\n\t * when the key isn't present. */\n\treadonly get: (key: K) => Effect.Effect<V, ScopedRefMapKeyMissingError>;\n\t/** Non-failing lookup — `null` when absent. */\n\treadonly find: (key: K) => Effect.Effect<V | null>;\n\t/** Presence check without an error projection. */\n\treadonly has: (key: K) => Effect.Effect<boolean>;\n\t/** Snapshot of all `(key, value)` pairs. Iteration order is\n\t * insertion order. */\n\treadonly entries: () => Effect.Effect<ReadonlyArray<readonly [K, V]>>;\n\t/** Stream of full-snapshot states. Each emission is the\n\t * current `entries` array; consumers diff if they need\n\t * incremental updates. */\n\treadonly changes: Stream.Stream<ReadonlyArray<readonly [K, V]>>;\n}\n\n/**\n * Factory: declare a typed `K -> V` scoped ref-map service.\n *\n * The `name` becomes both the human-readable registry name (used\n * in `ScopedRefMapKeyMissingError.registryName`) and the\n * Context.Service identifier (prefixed with the substrate\n * namespace). Each call returns a fresh Service class; calling\n * twice with the same name produces two distinct services\n * (Context.Service identity is per-class, not per-id-string —\n * the id string is a debugging aid).\n *\n * Return shape — typed via inference so the inner Service class's\n * identity flows through to callers:\n * - `Service` — the `Context.Service` tag class. Plugin authors\n * yield this from their `acquire` body via `yield* MyRegistry.Service`.\n * - `layer` — scope-bound Layer constructing one ref-map per\n * stack scope.\n * - `changes` — stream helper mirroring `routesStream(router)`.\n *\n * Example (in an L2 plugin):\n *\n * ```ts\n * const PackageRegistry = defineScopedRefMap<PackageKey, PackageRecord>('PackageRegistry');\n *\n * // In the plugin's acquire body:\n * const registry = yield* PackageRegistry.Service;\n * yield* registry.set(name, resolved);\n *\n * // In the boot Layer:\n * Layer.mergeAll(PackageRegistry.layer, ...)\n * ```\n */\nexport const defineScopedRefMap = <K extends string, V>(name: string) => {\n\tconst serviceId = `@devstack/substrate/ScopedRefMap/${name}`;\n\n\tclass Service extends Context.Service<Service, ScopedRefMap<K, V>>()(serviceId) {}\n\n\tconst layer: Layer.Layer<Service> = Layer.effect(\n\t\tService,\n\t\tEffect.gen(function* () {\n\t\t\tconst ref = yield* SubscriptionRef.make<ReadonlyArray<readonly [K, V]>>([]);\n\n\t\t\tconst set: ScopedRefMap<K, V>['set'] = (key, value) =>\n\t\t\t\tSubscriptionRef.update(ref, (current) => {\n\t\t\t\t\tconst filtered = current.filter(([k]) => k !== key);\n\t\t\t\t\treturn [...filtered, [key, value] as const];\n\t\t\t\t});\n\n\t\t\tconst find: ScopedRefMap<K, V>['find'] = (key) =>\n\t\t\t\tSubscriptionRef.get(ref).pipe(\n\t\t\t\t\tEffect.map((current) => {\n\t\t\t\t\t\tconst hit = current.find(([k]) => k === key);\n\t\t\t\t\t\treturn hit ? hit[1] : null;\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\tconst get: ScopedRefMap<K, V>['get'] = (key) =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst value = yield* find(key);\n\t\t\t\t\tif (value === null) {\n\t\t\t\t\t\treturn yield* new ScopedRefMapKeyMissingError({\n\t\t\t\t\t\t\tregistryName: name,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t});\n\n\t\t\tconst has: ScopedRefMap<K, V>['has'] = (key) =>\n\t\t\t\tSubscriptionRef.get(ref).pipe(Effect.map((current) => current.some(([k]) => k === key)));\n\n\t\t\tconst entries: ScopedRefMap<K, V>['entries'] = () => SubscriptionRef.get(ref);\n\n\t\t\treturn Service.of({\n\t\t\t\tset,\n\t\t\t\tget,\n\t\t\t\tfind,\n\t\t\t\thas,\n\t\t\t\tentries,\n\t\t\t\tchanges: SubscriptionRef.changes(ref),\n\t\t\t});\n\t\t}),\n\t);\n\n\tconst changes = (svc: ScopedRefMap<K, V>): Stream.Stream<ReadonlyArray<readonly [K, V]>> =>\n\t\tsvc.changes;\n\n\treturn {\n\t\tService,\n\t\tlayer,\n\t\tchanges,\n\t} as const;\n};\n"],"mappings":";;;;;AAmCA,IAAa,8BAAb,cAAiD,OAAO,kBAA+C,CACtG,+BACA;CACC,cAAc,OAAO;CACrB,KAAK,OAAO;CACZ,CACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDF,MAAa,sBAA2C,SAAiB;CACxE,MAAM,YAAY,oCAAoC;CAEtD,MAAM,gBAAgB,QAAQ,SAAsC,CAAC,UAAU,CAAC;CAEhF,MAAM,QAA8B,MAAM,OACzC,SACA,OAAO,IAAI,aAAa;EACvB,MAAM,MAAM,OAAO,gBAAgB,KAAqC,EAAE,CAAC;EAE3E,MAAM,OAAkC,KAAK,UAC5C,gBAAgB,OAAO,MAAM,YAAY;AAExC,UAAO,CAAC,GADS,QAAQ,QAAQ,CAAC,OAAO,MAAM,IAC5B,EAAE,CAAC,KAAK,MAAM,CAAU;IAC1C;EAEH,MAAM,QAAoC,QACzC,gBAAgB,IAAI,IAAI,CAAC,KACxB,OAAO,KAAK,YAAY;GACvB,MAAM,MAAM,QAAQ,MAAM,CAAC,OAAO,MAAM,IAAI;AAC5C,UAAO,MAAM,IAAI,KAAK;IACrB,CACF;EAEF,MAAM,OAAkC,QACvC,OAAO,IAAI,aAAa;GACvB,MAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,OAAI,UAAU,KACb,QAAO,OAAO,IAAI,4BAA4B;IAC7C,cAAc;IACd;IACA,CAAC;AAEH,UAAO;IACN;EAEH,MAAM,OAAkC,QACvC,gBAAgB,IAAI,IAAI,CAAC,KAAK,OAAO,KAAK,YAAY,QAAQ,MAAM,CAAC,OAAO,MAAM,IAAI,CAAC,CAAC;EAEzF,MAAM,gBAA+C,gBAAgB,IAAI,IAAI;AAE7E,SAAO,QAAQ,GAAG;GACjB;GACA;GACA;GACA;GACA;GACA,SAAS,gBAAgB,QAAQ,IAAI;GACrC,CAAC;GACD,CACF;CAED,MAAM,WAAW,QAChB,IAAI;AAEL,QAAO;EACN;EACA;EACA;EACA"}
@@ -1,3 +0,0 @@
1
- import "./schema.mjs";
2
- import "./service.mjs";
3
- export {};
@@ -1 +0,0 @@
1
- import { Schema } from "effect";
@@ -1,41 +0,0 @@
1
- import { versionedDocSchema } from "../../versioned-doc-schema.mjs";
2
- import { Schema } from "effect";
3
- //#region src/substrate/runtime/state-store/schema.ts
4
- /** Stored value envelope. The phantom-typed `StateKey<V>` reads /
5
- * writes against the `value` slot opaquely (the substrate doesn't
6
- * introspect plugin values — it stores the JSON value as `unknown`
7
- * and re-encodes the document on every set). */
8
- const StateEntry = Schema.Struct({
9
- /** Discriminator. `present` carries a value; `tombstone` records
10
- * that the key was deleted (so reads can distinguish "user
11
- * removed this" from "user never wrote it"). */
12
- state: Schema.Literals(["present", "tombstone"]),
13
- /** Encoded value. For `tombstone` entries this is `null`; the
14
- * substrate refuses to deliver it on `get`. */
15
- value: Schema.Unknown,
16
- /** Timestamp of the last mutation. Renderers may surface it;
17
- * the substrate uses it only for diagnostics. */
18
- updatedAt: Schema.Number
19
- });
20
- /** Document — one file per stack. Keys are the `StateKey<V>` string
21
- * form (`<pluginKey>/<suffix>`), values are entries.
22
- *
23
- * Schema version: bump on incompatible changes. v1 is the initial
24
- * release; bumps are the only way to introduce backward-incompatible
25
- * shape changes. Schema-decode failure on read with an unknown
26
- * version surfaces as `corruption`. */
27
- const StateDocument = versionedDocSchema(1, {
28
- /** Per-plugin namespaces. Key is the plugin-key prefix; nested
29
- * record is the plugin's own keys (suffix → entry). Two-level
30
- * structure (vs. flat `pluginKey/suffix → entry`) so `listUnder`
31
- * is an O(1) lookup and per-plugin wipes are O(1) field deletes. */
32
- plugins: Schema.Record(Schema.String, Schema.Record(Schema.String, StateEntry)) });
33
- /** Initial empty document. */
34
- const emptyDocument = {
35
- version: 1,
36
- plugins: {}
37
- };
38
- //#endregion
39
- export { StateDocument, StateEntry, emptyDocument };
40
-
41
- //# sourceMappingURL=schema.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.mjs","names":[],"sources":["../../../../src/substrate/runtime/state-store/schema.ts"],"sourcesContent":["// On-disk schema for the per-stack state.json.\n//\n// One file per stack. Plugin-keyed top-level subtrees so two\n// plugins never see each other's keys. Tombstones distinguish\n// \"deleted\" from \"missing\" — see header of `state-store.ts`.\n\nimport { Schema } from 'effect';\n\nimport { versionedDocSchema } from '../../versioned-doc-schema.ts';\n\n/** Stored value envelope. The phantom-typed `StateKey<V>` reads /\n * writes against the `value` slot opaquely (the substrate doesn't\n * introspect plugin values — it stores the JSON value as `unknown`\n * and re-encodes the document on every set). */\nexport const StateEntry = Schema.Struct({\n\t/** Discriminator. `present` carries a value; `tombstone` records\n\t * that the key was deleted (so reads can distinguish \"user\n\t * removed this\" from \"user never wrote it\"). */\n\tstate: Schema.Literals(['present', 'tombstone']),\n\t/** Encoded value. For `tombstone` entries this is `null`; the\n\t * substrate refuses to deliver it on `get`. */\n\tvalue: Schema.Unknown,\n\t/** Timestamp of the last mutation. Renderers may surface it;\n\t * the substrate uses it only for diagnostics. */\n\tupdatedAt: Schema.Number,\n});\nexport type StateEntry = typeof StateEntry.Type;\n\n/** Document — one file per stack. Keys are the `StateKey<V>` string\n * form (`<pluginKey>/<suffix>`), values are entries.\n *\n * Schema version: bump on incompatible changes. v1 is the initial\n * release; bumps are the only way to introduce backward-incompatible\n * shape changes. Schema-decode failure on read with an unknown\n * version surfaces as `corruption`. */\nexport const StateDocument = versionedDocSchema(1, {\n\t/** Per-plugin namespaces. Key is the plugin-key prefix; nested\n\t * record is the plugin's own keys (suffix → entry). Two-level\n\t * structure (vs. flat `pluginKey/suffix → entry`) so `listUnder`\n\t * is an O(1) lookup and per-plugin wipes are O(1) field deletes. */\n\tplugins: Schema.Record(Schema.String, Schema.Record(Schema.String, StateEntry)),\n});\nexport type StateDocument = typeof StateDocument.Type;\n\n/** Initial empty document. */\nexport const emptyDocument: StateDocument = { version: 1, plugins: {} };\n"],"mappings":";;;;;;;AAcA,MAAa,aAAa,OAAO,OAAO;;;;CAIvC,OAAO,OAAO,SAAS,CAAC,WAAW,YAAY,CAAC;;;CAGhD,OAAO,OAAO;;;CAGd,WAAW,OAAO;CAClB,CAAC;;;;;;;;AAUF,MAAa,gBAAgB,mBAAmB,GAAG;;;;;AAKlD,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAAW,CAAC,EAC/E,CAAC;;AAIF,MAAa,gBAA+B;CAAE,SAAS;CAAG,SAAS,EAAE;CAAE"}
@@ -1 +0,0 @@
1
- import { Context, FileSystem, Layer } from "effect";