@mysten-incubation/devstack 0.0.1 → 0.1.1

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 (838) hide show
  1. package/README.md +8 -4
  2. package/dashboard-ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  3. package/dashboard-ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  4. package/dashboard-ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  5. package/dashboard-ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  6. package/dashboard-ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
  7. package/dashboard-ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
  8. package/dashboard-ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
  9. package/dashboard-ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  10. package/dashboard-ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
  11. package/dashboard-ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
  12. package/dashboard-ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  13. package/dashboard-ui/assets/index-Bmi1UtAg.js +1356 -0
  14. package/dashboard-ui/assets/index-D5EShVt4.js +3 -0
  15. package/dashboard-ui/assets/index-Deml9drg.css +1 -0
  16. package/dashboard-ui/index.html +13 -0
  17. package/dist/api/define-capabilities.d.mts +14 -3
  18. package/dist/api/define-capabilities.mjs +18 -1
  19. package/dist/api/define-capabilities.mjs.map +1 -1
  20. package/dist/api/define-devstack.d.mts +1 -1
  21. package/dist/api/define-devstack.mjs +6 -26
  22. package/dist/api/define-devstack.mjs.map +1 -1
  23. package/dist/api/define-plugin.d.mts +1 -0
  24. package/dist/api/define-plugin.mjs +2 -0
  25. package/dist/api/inference-network.d.mts +132 -0
  26. package/dist/api/inference-network.mjs +105 -16
  27. package/dist/api/inference-network.mjs.map +1 -1
  28. package/dist/api/plugin-errors.d.mts +7 -0
  29. package/dist/api/run-stack.d.mts +20 -9
  30. package/dist/api/run-stack.mjs +56 -29
  31. package/dist/api/run-stack.mjs.map +1 -1
  32. package/dist/build-integrations/playwright/config.d.mts +6 -4
  33. package/dist/build-integrations/playwright/config.mjs +5 -3
  34. package/dist/build-integrations/playwright/config.mjs.map +1 -1
  35. package/dist/build-integrations/playwright/errors.d.mts +1 -1
  36. package/dist/build-integrations/playwright/global-setup.d.mts +43 -17
  37. package/dist/build-integrations/playwright/global-setup.mjs +250 -13
  38. package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
  39. package/dist/build-integrations/playwright/index.d.mts +5 -3
  40. package/dist/build-integrations/playwright/index.mjs +4 -2
  41. package/dist/build-integrations/playwright/stack-context.d.mts +0 -1
  42. package/dist/build-integrations/playwright/stack-context.mjs +24 -63
  43. package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
  44. package/dist/build-integrations/playwright/wallet-context.d.mts +7 -10
  45. package/dist/build-integrations/playwright/wallet-context.mjs +8 -13
  46. package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
  47. package/dist/build-integrations/runtime/cold-start-url.d.mts +5 -0
  48. package/dist/build-integrations/runtime/cold-start-url.mjs +4 -3
  49. package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
  50. package/dist/build-integrations/runtime/conventional-routes.d.mts +51 -0
  51. package/dist/build-integrations/runtime/conventional-routes.mjs +92 -0
  52. package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -0
  53. package/dist/build-integrations/runtime/discover.d.mts +38 -30
  54. package/dist/build-integrations/runtime/discover.mjs +73 -70
  55. package/dist/build-integrations/runtime/discover.mjs.map +1 -1
  56. package/dist/build-integrations/runtime/endpoint-registry.d.mts +3 -1
  57. package/dist/build-integrations/runtime/endpoint-registry.mjs +3 -1
  58. package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
  59. package/dist/build-integrations/runtime/index.d.mts +7 -2
  60. package/dist/build-integrations/runtime/index.mjs +9 -2
  61. package/dist/build-integrations/runtime/manifest-types.d.mts +2 -0
  62. package/dist/build-integrations/runtime/manifest-types.mjs +3 -0
  63. package/dist/build-integrations/runtime/playwright-stack-context-slot.d.mts +29 -0
  64. package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs +10 -0
  65. package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs.map +1 -0
  66. package/dist/build-integrations/runtime/read-stack-context.d.mts +1 -1
  67. package/dist/build-integrations/runtime/read-stack-context.mjs +10 -4
  68. package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
  69. package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +48 -0
  70. package/dist/build-integrations/runtime/resolve-discovery-env.mjs +42 -0
  71. package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -0
  72. package/dist/build-integrations/runtime/stack-context.d.mts +1 -1
  73. package/dist/build-integrations/runtime/wallet-paths.mjs +2 -0
  74. package/dist/build-integrations/vite/index.d.mts +51 -0
  75. package/dist/build-integrations/vite/index.mjs +73 -0
  76. package/dist/build-integrations/vite/index.mjs.map +1 -0
  77. package/dist/build-integrations/vitest/env.d.mts +4 -3
  78. package/dist/build-integrations/vitest/env.mjs +6 -4
  79. package/dist/build-integrations/vitest/env.mjs.map +1 -1
  80. package/dist/build-integrations/vitest/errors.d.mts +25 -4
  81. package/dist/build-integrations/vitest/errors.mjs +15 -2
  82. package/dist/build-integrations/vitest/errors.mjs.map +1 -1
  83. package/dist/build-integrations/vitest/index.d.mts +2 -2
  84. package/dist/build-integrations/vitest/index.mjs +3 -3
  85. package/dist/build-integrations/vitest/setup.d.mts +4 -2
  86. package/dist/build-integrations/vitest/setup.mjs +2 -2
  87. package/dist/build-integrations/vitest/setup.mjs.map +1 -1
  88. package/dist/build-integrations/vitest/stack-context.d.mts +0 -1
  89. package/dist/build-integrations/vitest/stack-context.mjs +33 -13
  90. package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
  91. package/dist/cli/bail.mjs +23 -0
  92. package/dist/cli/bail.mjs.map +1 -0
  93. package/dist/{surfaces/cli/commands → cli}/doctor-probes.mjs +26 -16
  94. package/dist/cli/doctor-probes.mjs.map +1 -0
  95. package/dist/cli/main.d.mts +15 -1
  96. package/dist/cli/main.mjs +166 -482
  97. package/dist/cli/main.mjs.map +1 -1
  98. package/dist/cli/prune-direct.mjs +31 -201
  99. package/dist/cli/prune-direct.mjs.map +1 -1
  100. package/dist/cli/snapshot-reader.mjs +14 -11
  101. package/dist/cli/snapshot-reader.mjs.map +1 -1
  102. package/dist/cli/up-lifecycle.mjs +4 -1
  103. package/dist/cli/up-lifecycle.mjs.map +1 -1
  104. package/dist/cli/wirings/apply.mjs +95 -0
  105. package/dist/cli/wirings/apply.mjs.map +1 -0
  106. package/dist/cli/wirings/build-verb-layers.mjs +42 -0
  107. package/dist/cli/wirings/build-verb-layers.mjs.map +1 -0
  108. package/dist/cli/wirings/config-loader.mjs +69 -0
  109. package/dist/cli/wirings/config-loader.mjs.map +1 -0
  110. package/dist/cli/wirings/engine-command.mjs +30 -0
  111. package/dist/cli/wirings/engine-command.mjs.map +1 -0
  112. package/dist/cli/wirings/identity.mjs +72 -0
  113. package/dist/cli/wirings/identity.mjs.map +1 -0
  114. package/dist/cli/wirings/provide-file-system.mjs +7 -0
  115. package/dist/cli/wirings/provide-file-system.mjs.map +1 -0
  116. package/dist/cli/wirings/snapshot.mjs +177 -0
  117. package/dist/cli/wirings/snapshot.mjs.map +1 -0
  118. package/dist/cli/wirings/up.mjs +287 -0
  119. package/dist/cli/wirings/up.mjs.map +1 -0
  120. package/dist/cli/wirings/wipe.mjs +40 -0
  121. package/dist/cli/wirings/wipe.mjs.map +1 -0
  122. package/dist/contracts/capability-decl.d.mts +0 -2
  123. package/dist/contracts/codegenable.d.mts +43 -0
  124. package/dist/contracts/container-runtime.d.mts +26 -1
  125. package/dist/contracts/faucet-strategy.d.mts +25 -0
  126. package/dist/contracts/funding-strategy.d.mts +42 -0
  127. package/dist/contracts/plugin-expander.mjs +60 -0
  128. package/dist/contracts/plugin-expander.mjs.map +1 -0
  129. package/dist/contracts/projection.d.mts +5 -3
  130. package/dist/contracts/renderer.d.mts +23 -0
  131. package/dist/contracts/routable.d.mts +14 -1
  132. package/dist/contracts/snapshotable.d.mts +25 -3
  133. package/dist/contracts/wallet-protocol.d.mts +52 -0
  134. package/dist/contracts/wallet-protocol.mjs +52 -0
  135. package/dist/contracts/wallet-protocol.mjs.map +1 -0
  136. package/dist/index.d.mts +26 -25
  137. package/dist/index.mjs +20 -13
  138. package/dist/{runtime → orchestrators}/built-in-plugin-layers.mjs +10 -5
  139. package/dist/orchestrators/built-in-plugin-layers.mjs.map +1 -0
  140. package/dist/orchestrators/codegen/bindings.d.mts +1 -2
  141. package/dist/orchestrators/codegen/bindings.mjs +52 -186
  142. package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
  143. package/dist/orchestrators/codegen/emit.mjs +19 -1
  144. package/dist/orchestrators/codegen/emit.mjs.map +1 -1
  145. package/dist/orchestrators/codegen/errors.mjs +8 -3
  146. package/dist/orchestrators/codegen/errors.mjs.map +1 -1
  147. package/dist/orchestrators/codegen/format.mjs +47 -39
  148. package/dist/orchestrators/codegen/format.mjs.map +1 -1
  149. package/dist/orchestrators/codegen/gitignore.mjs +3 -1
  150. package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
  151. package/dist/orchestrators/codegen/output-location.mjs +41 -0
  152. package/dist/orchestrators/codegen/output-location.mjs.map +1 -0
  153. package/dist/orchestrators/codegen/paths.d.mts +1 -1
  154. package/dist/orchestrators/codegen/paths.mjs +40 -14
  155. package/dist/orchestrators/codegen/paths.mjs.map +1 -1
  156. package/dist/orchestrators/codegen/permissions.mjs +3 -1
  157. package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
  158. package/dist/orchestrators/codegen/service.mjs +157 -105
  159. package/dist/orchestrators/codegen/service.mjs.map +1 -1
  160. package/dist/orchestrators/lifecycle-prune/errors.mjs +31 -0
  161. package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -0
  162. package/dist/orchestrators/lifecycle-prune/index.mjs +350 -0
  163. package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -0
  164. package/dist/orchestrators/router/cleanup.mjs +26 -27
  165. package/dist/orchestrators/router/cleanup.mjs.map +1 -1
  166. package/dist/orchestrators/router/entrypoints.mjs +2 -2
  167. package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
  168. package/dist/orchestrators/router/file-provider.mjs +14 -5
  169. package/dist/orchestrators/router/file-provider.mjs.map +1 -1
  170. package/dist/orchestrators/router/hostname.mjs +19 -55
  171. package/dist/orchestrators/router/hostname.mjs.map +1 -1
  172. package/dist/orchestrators/router/index.mjs +11 -0
  173. package/dist/orchestrators/router/profile.mjs +2 -2
  174. package/dist/orchestrators/router/sentinels.mjs +26 -0
  175. package/dist/orchestrators/router/sentinels.mjs.map +1 -0
  176. package/dist/orchestrators/router/service.mjs +40 -37
  177. package/dist/orchestrators/router/service.mjs.map +1 -1
  178. package/dist/orchestrators/router/traefik-container.mjs +27 -16
  179. package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
  180. package/dist/{substrate/runtime → orchestrators}/run.mjs +26 -21
  181. package/dist/orchestrators/run.mjs.map +1 -0
  182. package/dist/orchestrators/runtime-composition.d.mts +1 -1
  183. package/dist/orchestrators/runtime-composition.mjs +123 -39
  184. package/dist/orchestrators/runtime-composition.mjs.map +1 -1
  185. package/dist/orchestrators/snapshot/capture-command.d.mts +1 -0
  186. package/dist/orchestrators/snapshot/capture-command.mjs +25 -0
  187. package/dist/orchestrators/snapshot/capture-command.mjs.map +1 -0
  188. package/dist/orchestrators/snapshot/capture.mjs +42 -28
  189. package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
  190. package/dist/orchestrators/snapshot/descriptor.mjs +35 -10
  191. package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
  192. package/dist/orchestrators/snapshot/identity-guard.mjs +1 -1
  193. package/dist/orchestrators/snapshot/index.mjs +13 -0
  194. package/dist/orchestrators/snapshot/integrity.d.mts +1 -1
  195. package/dist/orchestrators/snapshot/integrity.mjs +73 -17
  196. package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
  197. package/dist/orchestrators/snapshot/pending-marker.d.mts +1 -0
  198. package/dist/orchestrators/snapshot/pending-marker.mjs +99 -0
  199. package/dist/orchestrators/snapshot/pending-marker.mjs.map +1 -0
  200. package/dist/orchestrators/snapshot/phase-error.mjs +23 -0
  201. package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -0
  202. package/dist/orchestrators/snapshot/prune.mjs +20 -55
  203. package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
  204. package/dist/orchestrators/snapshot/recover-pending.d.mts +1 -0
  205. package/dist/orchestrators/snapshot/recover-pending.mjs +223 -0
  206. package/dist/orchestrators/snapshot/recover-pending.mjs.map +1 -0
  207. package/dist/orchestrators/snapshot/restore.mjs +118 -84
  208. package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
  209. package/dist/orchestrators/snapshot/service.mjs +53 -56
  210. package/dist/orchestrators/snapshot/service.mjs.map +1 -1
  211. package/dist/orchestrators/snapshot/state-document.d.mts +1 -0
  212. package/dist/orchestrators/snapshot/state-document.mjs +47 -7
  213. package/dist/orchestrators/snapshot/state-document.mjs.map +1 -1
  214. package/dist/orchestrators/snapshot/wipe.mjs +67 -10
  215. package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
  216. package/dist/plugins/account/codegen.mjs +9 -8
  217. package/dist/plugins/account/codegen.mjs.map +1 -1
  218. package/dist/plugins/account/errors.d.mts +33 -6
  219. package/dist/plugins/account/errors.mjs.map +1 -1
  220. package/dist/plugins/account/funding.d.mts +29 -19
  221. package/dist/plugins/account/funding.mjs +84 -66
  222. package/dist/plugins/account/funding.mjs.map +1 -1
  223. package/dist/plugins/account/index.d.mts +2 -4
  224. package/dist/plugins/account/index.mjs +64 -31
  225. package/dist/plugins/account/index.mjs.map +1 -1
  226. package/dist/plugins/account/keypair.mjs +6 -9
  227. package/dist/plugins/account/keypair.mjs.map +1 -1
  228. package/dist/plugins/account/lease.mjs +1 -0
  229. package/dist/plugins/account/lease.mjs.map +1 -1
  230. package/dist/plugins/account/registry.d.mts +14 -1
  231. package/dist/plugins/account/registry.mjs +18 -18
  232. package/dist/plugins/account/registry.mjs.map +1 -1
  233. package/dist/plugins/account/service.d.mts +23 -4
  234. package/dist/plugins/account/service.mjs +83 -45
  235. package/dist/plugins/account/service.mjs.map +1 -1
  236. package/dist/plugins/account/snapshot.mjs +2 -5
  237. package/dist/plugins/account/snapshot.mjs.map +1 -1
  238. package/dist/plugins/account/spans.mjs +16 -0
  239. package/dist/plugins/account/spans.mjs.map +1 -0
  240. package/dist/plugins/account/variants/keystore.mjs +6 -8
  241. package/dist/plugins/account/variants/keystore.mjs.map +1 -1
  242. package/dist/plugins/action/build-context.d.mts +3 -2
  243. package/dist/plugins/action/errors.d.mts +16 -12
  244. package/dist/plugins/action/errors.mjs.map +1 -1
  245. package/dist/plugins/action/execute.mjs +65 -103
  246. package/dist/plugins/action/execute.mjs.map +1 -1
  247. package/dist/plugins/action/index.d.mts +0 -2
  248. package/dist/plugins/action/index.mjs +17 -13
  249. package/dist/plugins/action/index.mjs.map +1 -1
  250. package/dist/plugins/action/service.mjs +38 -35
  251. package/dist/plugins/action/service.mjs.map +1 -1
  252. package/dist/plugins/action/spans.mjs +11 -0
  253. package/dist/plugins/action/spans.mjs.map +1 -0
  254. package/dist/plugins/coin/codegen.mjs +9 -8
  255. package/dist/plugins/coin/codegen.mjs.map +1 -1
  256. package/dist/plugins/coin/discovery.mjs +8 -4
  257. package/dist/plugins/coin/discovery.mjs.map +1 -1
  258. package/dist/plugins/coin/index.d.mts +11 -29
  259. package/dist/plugins/coin/index.mjs +56 -27
  260. package/dist/plugins/coin/index.mjs.map +1 -1
  261. package/dist/plugins/coin/metadata.mjs +8 -15
  262. package/dist/plugins/coin/metadata.mjs.map +1 -1
  263. package/dist/plugins/coin/mint.d.mts +30 -11
  264. package/dist/plugins/coin/mint.mjs +78 -74
  265. package/dist/plugins/coin/mint.mjs.map +1 -1
  266. package/dist/plugins/coin/registry.mjs +4 -7
  267. package/dist/plugins/coin/registry.mjs.map +1 -1
  268. package/dist/plugins/coin/service.d.mts +39 -1
  269. package/dist/plugins/coin/service.mjs +11 -4
  270. package/dist/plugins/coin/service.mjs.map +1 -1
  271. package/dist/plugins/coin/spans.mjs +20 -0
  272. package/dist/plugins/coin/spans.mjs.map +1 -0
  273. package/dist/plugins/dashboard/domain.mjs +402 -0
  274. package/dist/plugins/dashboard/domain.mjs.map +1 -0
  275. package/dist/plugins/dashboard/index.d.mts +29 -0
  276. package/dist/plugins/dashboard/index.mjs +91 -0
  277. package/dist/plugins/dashboard/index.mjs.map +1 -0
  278. package/dist/plugins/dashboard/origin-policy.mjs +36 -0
  279. package/dist/plugins/dashboard/origin-policy.mjs.map +1 -0
  280. package/dist/plugins/dashboard/routable.mjs +27 -0
  281. package/dist/plugins/dashboard/routable.mjs.map +1 -0
  282. package/dist/plugins/dashboard/schema/builder.mjs +21 -0
  283. package/dist/plugins/dashboard/schema/builder.mjs.map +1 -0
  284. package/dist/plugins/dashboard/schema/enums.mjs +72 -0
  285. package/dist/plugins/dashboard/schema/enums.mjs.map +1 -0
  286. package/dist/plugins/dashboard/schema/root.mjs +351 -0
  287. package/dist/plugins/dashboard/schema/root.mjs.map +1 -0
  288. package/dist/plugins/dashboard/schema/types.mjs +508 -0
  289. package/dist/plugins/dashboard/schema/types.mjs.map +1 -0
  290. package/dist/plugins/dashboard/schema.mjs +11 -0
  291. package/dist/plugins/dashboard/schema.mjs.map +1 -0
  292. package/dist/plugins/dashboard/server.mjs +166 -0
  293. package/dist/plugins/dashboard/server.mjs.map +1 -0
  294. package/dist/plugins/deepbook/deploy.mjs +53 -115
  295. package/dist/plugins/deepbook/deploy.mjs.map +1 -1
  296. package/dist/plugins/deepbook/errors.mjs +1 -0
  297. package/dist/plugins/deepbook/errors.mjs.map +1 -1
  298. package/dist/plugins/deepbook/faucet-strategy.mjs +47 -34
  299. package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
  300. package/dist/plugins/deepbook/hash.mjs +9 -0
  301. package/dist/plugins/deepbook/hash.mjs.map +1 -0
  302. package/dist/plugins/deepbook/index.d.mts +1 -10
  303. package/dist/plugins/deepbook/index.mjs +25 -22
  304. package/dist/plugins/deepbook/index.mjs.map +1 -1
  305. package/dist/plugins/deepbook/pyth/index.mjs +26 -55
  306. package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
  307. package/dist/plugins/deepbook/snapshot.mjs +17 -29
  308. package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
  309. package/dist/plugins/deepbook/spans.mjs +18 -0
  310. package/dist/plugins/deepbook/spans.mjs.map +1 -0
  311. package/dist/plugins/deepbook/type-strings.mjs +65 -0
  312. package/dist/plugins/deepbook/type-strings.mjs.map +1 -0
  313. package/dist/plugins/deepbook/types.d.mts +2 -3
  314. package/dist/plugins/deepbook/types.mjs.map +1 -1
  315. package/dist/plugins/faucet/dispatcher.d.mts +21 -2
  316. package/dist/plugins/faucet/dispatcher.mjs +1 -2
  317. package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
  318. package/dist/plugins/faucet/errors.d.mts +11 -24
  319. package/dist/plugins/faucet/errors.mjs.map +1 -1
  320. package/dist/plugins/faucet/http.mjs +33 -14
  321. package/dist/plugins/faucet/http.mjs.map +1 -1
  322. package/dist/plugins/faucet/index.d.mts +15 -5
  323. package/dist/plugins/faucet/index.mjs +3 -0
  324. package/dist/plugins/faucet/index.mjs.map +1 -1
  325. package/dist/plugins/faucet/spans.mjs +12 -0
  326. package/dist/plugins/faucet/spans.mjs.map +1 -0
  327. package/dist/plugins/host-service/errors.d.mts +1 -1
  328. package/dist/plugins/host-service/index.mjs +34 -8
  329. package/dist/plugins/host-service/index.mjs.map +1 -1
  330. package/dist/plugins/host-service/routable.mjs +2 -1
  331. package/dist/plugins/host-service/routable.mjs.map +1 -1
  332. package/dist/plugins/host-service/service.d.mts +21 -0
  333. package/dist/plugins/host-service/service.mjs +136 -81
  334. package/dist/plugins/host-service/service.mjs.map +1 -1
  335. package/dist/plugins/internal/acquire-on-chain-artifact.mjs +23 -0
  336. package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -0
  337. package/dist/plugins/internal/codegen-helpers.mjs +18 -0
  338. package/dist/plugins/internal/codegen-helpers.mjs.map +1 -0
  339. package/dist/plugins/internal/funding-failure-error.mjs +32 -0
  340. package/dist/plugins/internal/funding-failure-error.mjs.map +1 -0
  341. package/dist/plugins/package/build.mjs +1 -1
  342. package/dist/plugins/package/build.mjs.map +1 -1
  343. package/dist/plugins/package/codegen.mjs +26 -0
  344. package/dist/plugins/package/codegen.mjs.map +1 -1
  345. package/dist/plugins/package/errors.d.mts +16 -6
  346. package/dist/plugins/package/errors.mjs.map +1 -1
  347. package/dist/plugins/package/index.d.mts +0 -4
  348. package/dist/plugins/package/index.mjs +27 -21
  349. package/dist/plugins/package/index.mjs.map +1 -1
  350. package/dist/plugins/package/mode-known.mjs +26 -12
  351. package/dist/plugins/package/mode-known.mjs.map +1 -1
  352. package/dist/plugins/package/mode-local.mjs +47 -41
  353. package/dist/plugins/package/mode-local.mjs.map +1 -1
  354. package/dist/plugins/package/publish-executor.mjs +55 -114
  355. package/dist/plugins/package/publish-executor.mjs.map +1 -1
  356. package/dist/plugins/package/registry.mjs +2 -1
  357. package/dist/plugins/package/registry.mjs.map +1 -1
  358. package/dist/plugins/package/service.mjs.map +1 -1
  359. package/dist/plugins/package/spans.mjs +14 -0
  360. package/dist/plugins/package/spans.mjs.map +1 -0
  361. package/dist/plugins/postgres/db-ensure.mjs +19 -12
  362. package/dist/plugins/postgres/db-ensure.mjs.map +1 -1
  363. package/dist/plugins/postgres/errors.d.mts +5 -0
  364. package/dist/plugins/postgres/errors.mjs.map +1 -1
  365. package/dist/plugins/postgres/index.mjs +10 -17
  366. package/dist/plugins/postgres/index.mjs.map +1 -1
  367. package/dist/plugins/postgres/service.mjs +58 -24
  368. package/dist/plugins/postgres/service.mjs.map +1 -1
  369. package/dist/plugins/postgres/snapshot.mjs.map +1 -1
  370. package/dist/plugins/postgres/spans.mjs +11 -0
  371. package/dist/plugins/postgres/spans.mjs.map +1 -0
  372. package/dist/plugins/router-entrypoints.mjs +4 -4
  373. package/dist/plugins/router-entrypoints.mjs.map +1 -1
  374. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +15 -13
  375. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
  376. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +15 -19
  377. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
  378. package/dist/plugins/seal/codegen.d.mts +2 -3
  379. package/dist/plugins/seal/codegen.mjs.map +1 -1
  380. package/dist/plugins/seal/config-render.mjs +35 -8
  381. package/dist/plugins/seal/config-render.mjs.map +1 -1
  382. package/dist/plugins/seal/deploy.mjs +31 -39
  383. package/dist/plugins/seal/deploy.mjs.map +1 -1
  384. package/dist/plugins/seal/errors.d.mts +1 -3
  385. package/dist/plugins/seal/errors.mjs +7 -1
  386. package/dist/plugins/seal/errors.mjs.map +1 -1
  387. package/dist/plugins/seal/index.d.mts +1 -6
  388. package/dist/plugins/seal/index.mjs +40 -14
  389. package/dist/plugins/seal/index.mjs.map +1 -1
  390. package/dist/plugins/seal/key-manager.d.mts +1 -9
  391. package/dist/plugins/seal/key-manager.mjs +2 -18
  392. package/dist/plugins/seal/key-manager.mjs.map +1 -1
  393. package/dist/plugins/seal/key-server.mjs +37 -36
  394. package/dist/plugins/seal/key-server.mjs.map +1 -1
  395. package/dist/plugins/seal/keygen.mjs +16 -17
  396. package/dist/plugins/seal/keygen.mjs.map +1 -1
  397. package/dist/plugins/seal/mode/fork-known.mjs +36 -14
  398. package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
  399. package/dist/plugins/seal/mode/live.d.mts +6 -4
  400. package/dist/plugins/seal/mode/live.mjs +14 -21
  401. package/dist/plugins/seal/mode/live.mjs.map +1 -1
  402. package/dist/plugins/seal/mode/local-keygen.mjs +57 -21
  403. package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
  404. package/dist/plugins/seal/registry-publish.mjs +1 -0
  405. package/dist/plugins/seal/registry-publish.mjs.map +1 -1
  406. package/dist/plugins/seal/routable.mjs.map +1 -1
  407. package/dist/plugins/seal/service.mjs.map +1 -1
  408. package/dist/plugins/seal/spans.mjs +18 -0
  409. package/dist/plugins/seal/spans.mjs.map +1 -0
  410. package/dist/plugins/sui/auto-tick.mjs +17 -23
  411. package/dist/plugins/sui/auto-tick.mjs.map +1 -1
  412. package/dist/plugins/sui/chain-build-container.mjs +18 -0
  413. package/dist/plugins/sui/chain-build-container.mjs.map +1 -0
  414. package/dist/plugins/sui/chain-probe.d.mts +5 -5
  415. package/dist/plugins/sui/chain-probe.mjs +28 -58
  416. package/dist/plugins/sui/chain-probe.mjs.map +1 -1
  417. package/dist/plugins/sui/codegen.mjs +26 -0
  418. package/dist/plugins/sui/codegen.mjs.map +1 -1
  419. package/dist/plugins/sui/errors.d.mts +2 -29
  420. package/dist/plugins/sui/errors.mjs +1 -3
  421. package/dist/plugins/sui/errors.mjs.map +1 -1
  422. package/dist/plugins/sui/fork-faucet-strategy.d.mts +1 -0
  423. package/dist/plugins/sui/fork-faucet-strategy.mjs +55 -0
  424. package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -0
  425. package/dist/plugins/sui/fork-orchestration.d.mts +1 -0
  426. package/dist/plugins/sui/fork-orchestration.mjs +170 -2
  427. package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
  428. package/dist/plugins/sui/fork-transaction.d.mts +2 -0
  429. package/dist/plugins/sui/fork-transaction.mjs +92 -28
  430. package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
  431. package/dist/plugins/sui/index.d.mts +33 -70
  432. package/dist/plugins/sui/index.mjs +58 -35
  433. package/dist/plugins/sui/index.mjs.map +1 -1
  434. package/dist/plugins/{faucet/strategies/sui-local.mjs → sui/local-faucet-strategy.mjs} +10 -7
  435. package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -0
  436. package/dist/plugins/sui/mode/external.mjs +7 -13
  437. package/dist/plugins/sui/mode/external.mjs.map +1 -1
  438. package/dist/plugins/sui/mode/fork.mjs +136 -59
  439. package/dist/plugins/sui/mode/fork.mjs.map +1 -1
  440. package/dist/plugins/sui/mode/live.mjs +10 -16
  441. package/dist/plugins/sui/mode/live.mjs.map +1 -1
  442. package/dist/plugins/sui/mode/local.mjs +37 -36
  443. package/dist/plugins/sui/mode/local.mjs.map +1 -1
  444. package/dist/plugins/sui/mode/shared-boot.mjs +38 -115
  445. package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
  446. package/dist/plugins/sui/mode/shared.d.mts +1 -5
  447. package/dist/plugins/sui/mode/shared.mjs.map +1 -1
  448. package/dist/plugins/sui/mode/spec.d.mts +18 -0
  449. package/dist/plugins/sui/move-summary-runner.mjs +207 -0
  450. package/dist/plugins/sui/move-summary-runner.mjs.map +1 -0
  451. package/dist/plugins/sui/network-resolver.d.mts +4 -3
  452. package/dist/plugins/sui/service.mjs.map +1 -1
  453. package/dist/plugins/sui/snapshot.mjs +3 -0
  454. package/dist/plugins/sui/snapshot.mjs.map +1 -1
  455. package/dist/plugins/sui/spans.mjs +17 -0
  456. package/dist/plugins/sui/spans.mjs.map +1 -0
  457. package/dist/plugins/wallet/codegen.d.mts +0 -1
  458. package/dist/plugins/wallet/codegen.mjs +8 -9
  459. package/dist/plugins/wallet/codegen.mjs.map +1 -1
  460. package/dist/plugins/wallet/index.d.mts +6 -8
  461. package/dist/plugins/wallet/index.mjs +46 -35
  462. package/dist/plugins/wallet/index.mjs.map +1 -1
  463. package/dist/plugins/wallet/origin-policy.mjs +12 -28
  464. package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
  465. package/dist/plugins/wallet/pairing.mjs +6 -4
  466. package/dist/plugins/wallet/pairing.mjs.map +1 -1
  467. package/dist/plugins/wallet/protocol.d.mts +1 -0
  468. package/dist/plugins/wallet/protocol.mjs +5 -44
  469. package/dist/plugins/wallet/protocol.mjs.map +1 -1
  470. package/dist/plugins/wallet/routable.mjs +2 -8
  471. package/dist/plugins/wallet/routable.mjs.map +1 -1
  472. package/dist/plugins/wallet/server.mjs +36 -44
  473. package/dist/plugins/wallet/server.mjs.map +1 -1
  474. package/dist/plugins/wallet/service.d.mts +1 -5
  475. package/dist/plugins/wallet/service.mjs +22 -18
  476. package/dist/plugins/wallet/service.mjs.map +1 -1
  477. package/dist/plugins/wallet/spans.mjs +22 -0
  478. package/dist/plugins/wallet/spans.mjs.map +1 -0
  479. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +33 -8
  480. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
  481. package/dist/plugins/walrus/codegen.d.mts +3 -3
  482. package/dist/plugins/walrus/codegen.mjs.map +1 -1
  483. package/dist/plugins/walrus/deploy-paths.mjs +21 -5
  484. package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
  485. package/dist/plugins/walrus/deploy.mjs +67 -69
  486. package/dist/plugins/walrus/deploy.mjs.map +1 -1
  487. package/dist/plugins/walrus/errors.mjs +1 -0
  488. package/dist/plugins/walrus/errors.mjs.map +1 -1
  489. package/dist/plugins/walrus/faucet-strategy.mjs +12 -7
  490. package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
  491. package/dist/plugins/walrus/index.d.mts +2 -13
  492. package/dist/plugins/walrus/index.mjs +18 -23
  493. package/dist/plugins/walrus/index.mjs.map +1 -1
  494. package/dist/plugins/walrus/mode/known-deploy.mjs +7 -5
  495. package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
  496. package/dist/plugins/walrus/mode/local-cluster.mjs +26 -7
  497. package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
  498. package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
  499. package/dist/plugins/walrus/routable.mjs +7 -23
  500. package/dist/plugins/walrus/routable.mjs.map +1 -1
  501. package/dist/plugins/walrus/service.mjs.map +1 -1
  502. package/dist/plugins/walrus/spans.mjs +18 -0
  503. package/dist/plugins/walrus/spans.mjs.map +1 -0
  504. package/dist/plugins/walrus/storage-nodes.d.mts +6 -2
  505. package/dist/plugins/walrus/storage-nodes.mjs +15 -8
  506. package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
  507. package/dist/plugins/walrus/wal-swap.mjs +58 -15
  508. package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
  509. package/dist/primitives/artifact-publisher.d.mts +1 -1
  510. package/dist/primitives/artifact-publisher.mjs +15 -0
  511. package/dist/primitives/artifact-publisher.mjs.map +1 -0
  512. package/dist/runtime/docker/client.mjs +17 -4
  513. package/dist/runtime/docker/client.mjs.map +1 -1
  514. package/dist/runtime/docker/container.mjs +219 -132
  515. package/dist/runtime/docker/container.mjs.map +1 -1
  516. package/dist/runtime/docker/errors.mjs +0 -6
  517. package/dist/runtime/docker/errors.mjs.map +1 -1
  518. package/dist/runtime/docker/exec.mjs +21 -18
  519. package/dist/runtime/docker/exec.mjs.map +1 -1
  520. package/dist/runtime/docker/image.mjs +36 -13
  521. package/dist/runtime/docker/image.mjs.map +1 -1
  522. package/dist/runtime/docker/index.mjs +14 -0
  523. package/dist/runtime/docker/inspect-and-decode.mjs +51 -0
  524. package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -0
  525. package/dist/runtime/docker/inventory.mjs +14 -11
  526. package/dist/runtime/docker/inventory.mjs.map +1 -1
  527. package/dist/runtime/docker/labels.mjs +38 -5
  528. package/dist/runtime/docker/labels.mjs.map +1 -1
  529. package/dist/runtime/docker/logs.d.mts +1 -1
  530. package/dist/runtime/docker/logs.mjs.map +1 -1
  531. package/dist/runtime/docker/network.mjs +83 -47
  532. package/dist/runtime/docker/network.mjs.map +1 -1
  533. package/dist/runtime/docker/render-run-args.mjs +82 -0
  534. package/dist/runtime/docker/render-run-args.mjs.map +1 -0
  535. package/dist/runtime/docker/service.d.mts +1 -1
  536. package/dist/runtime/docker/service.mjs +12 -7
  537. package/dist/runtime/docker/service.mjs.map +1 -1
  538. package/dist/runtime/docker/sweep.mjs +118 -43
  539. package/dist/runtime/docker/sweep.mjs.map +1 -1
  540. package/dist/runtime/docker/volume.mjs +2 -0
  541. package/dist/runtime/docker/volume.mjs.map +1 -1
  542. package/dist/runtime/docker/wrap.mjs +30 -1
  543. package/dist/runtime/docker/wrap.mjs.map +1 -1
  544. package/dist/substrate/cross-process.mjs +14 -8
  545. package/dist/substrate/cross-process.mjs.map +1 -1
  546. package/dist/substrate/event-time.mjs +33 -0
  547. package/dist/substrate/event-time.mjs.map +1 -0
  548. package/dist/substrate/events.d.mts +28 -8
  549. package/dist/substrate/identity.d.mts +2 -1
  550. package/dist/substrate/manifest.d.mts +68 -5
  551. package/dist/substrate/manifest.mjs +34 -5
  552. package/dist/substrate/manifest.mjs.map +1 -1
  553. package/dist/substrate/network.d.mts +3 -5
  554. package/dist/substrate/options.d.mts +0 -2
  555. package/dist/substrate/plugin.d.mts +13 -0
  556. package/dist/substrate/plugin.mjs +4 -2
  557. package/dist/substrate/plugin.mjs.map +1 -1
  558. package/dist/substrate/projection.d.mts +35 -3
  559. package/dist/substrate/runtime/artifact-publisher/index.mjs +19 -9
  560. package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -1
  561. package/dist/substrate/runtime/atomic-write.mjs +97 -32
  562. package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
  563. package/dist/substrate/runtime/cache/index.mjs +3 -0
  564. package/dist/substrate/runtime/cache/schema.mjs +2 -2
  565. package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
  566. package/dist/substrate/runtime/cache/service.mjs +9 -7
  567. package/dist/substrate/runtime/cache/service.mjs.map +1 -1
  568. package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -1
  569. package/dist/substrate/runtime/capability-sinks/index.mjs +3 -0
  570. package/dist/substrate/runtime/capability-sinks/layer.mjs +1 -1
  571. package/dist/substrate/runtime/capability-sinks/service.d.mts +61 -2
  572. package/dist/substrate/runtime/capability-sinks/service.mjs +21 -26
  573. package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -1
  574. package/dist/substrate/runtime/config-validation.d.mts +1 -13
  575. package/dist/substrate/runtime/config-validation.mjs +2 -91
  576. package/dist/substrate/runtime/config-validation.mjs.map +1 -1
  577. package/dist/substrate/runtime/container-runtime.d.mts +1 -0
  578. package/dist/substrate/runtime/container-runtime.mjs +2 -0
  579. package/dist/substrate/runtime/control-plane/domain.mjs +101 -0
  580. package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -0
  581. package/dist/substrate/runtime/control-plane/service.mjs +7 -0
  582. package/dist/substrate/runtime/control-plane/service.mjs.map +1 -0
  583. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +46 -19
  584. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
  585. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +30 -12
  586. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
  587. package/dist/substrate/runtime/cross-process/command-channel/index.mjs +5 -0
  588. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +11 -2
  589. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
  590. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +1 -1
  591. package/dist/substrate/runtime/cross-process/index.mjs +11 -0
  592. package/dist/substrate/runtime/cross-process/live-clock.mjs +34 -0
  593. package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -0
  594. package/dist/substrate/runtime/cross-process/liveness.mjs +52 -10
  595. package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
  596. package/dist/substrate/runtime/cross-process/lock.d.mts +1 -0
  597. package/dist/substrate/runtime/cross-process/lock.mjs +23 -0
  598. package/dist/substrate/runtime/cross-process/lock.mjs.map +1 -0
  599. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +64 -0
  600. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -0
  601. package/dist/substrate/runtime/cross-process/roster.mjs +97 -83
  602. package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
  603. package/dist/substrate/runtime/cross-process/self-pid.mjs +8 -0
  604. package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -0
  605. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +24 -28
  606. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -1
  607. package/dist/substrate/runtime/cross-process/stack-lock.mjs +41 -20
  608. package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
  609. package/dist/substrate/runtime/current-plugin.mjs +2 -2
  610. package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
  611. package/dist/substrate/runtime/errors.mjs +12 -6
  612. package/dist/substrate/runtime/errors.mjs.map +1 -1
  613. package/dist/substrate/runtime/format-unknown-error.mjs +30 -0
  614. package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -0
  615. package/dist/substrate/runtime/host-bind-mount-owner.mjs +10 -0
  616. package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -0
  617. package/dist/substrate/runtime/host-gateway.mjs +20 -0
  618. package/dist/substrate/runtime/host-gateway.mjs.map +1 -0
  619. package/dist/substrate/runtime/host-tree-tar/index.mjs +61 -50
  620. package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
  621. package/dist/substrate/runtime/http-probe.d.mts +1 -1
  622. package/dist/substrate/runtime/index.mjs +14 -0
  623. package/dist/substrate/runtime/lease-broker/index.d.mts +1 -1
  624. package/dist/substrate/runtime/lease-broker/index.mjs +2 -0
  625. package/dist/substrate/runtime/lease-broker/service.d.mts +1 -64
  626. package/dist/substrate/runtime/lease-broker/service.mjs +1 -1
  627. package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
  628. package/dist/substrate/runtime/lifecycle/dep-graph.mjs +22 -3
  629. package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
  630. package/dist/substrate/runtime/lifecycle/index.mjs +9 -0
  631. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -1
  632. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +20 -3
  633. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
  634. package/dist/substrate/runtime/lifecycle/selective-restart.mjs +1 -1
  635. package/dist/substrate/runtime/lifecycle/signals.mjs +5 -5
  636. package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
  637. package/dist/substrate/runtime/lifecycle/state-machine.mjs +1 -1
  638. package/dist/substrate/runtime/managed-container.d.mts +19 -1
  639. package/dist/substrate/runtime/managed-container.mjs +20 -1
  640. package/dist/substrate/runtime/managed-container.mjs.map +1 -1
  641. package/dist/substrate/runtime/manifest/index.mjs +3 -0
  642. package/dist/substrate/runtime/manifest/manifest.mjs +15 -11
  643. package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
  644. package/dist/substrate/runtime/mode-errors.mjs +20 -0
  645. package/dist/substrate/runtime/mode-errors.mjs.map +1 -0
  646. package/dist/substrate/runtime/observability/cascade-formatter.mjs +9 -13
  647. package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
  648. package/dist/substrate/runtime/observability/formatter-registry.mjs +19 -36
  649. package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -1
  650. package/dist/substrate/runtime/observability/ignore-with-log.d.mts +1 -0
  651. package/dist/substrate/runtime/observability/ignore-with-log.mjs +17 -0
  652. package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -0
  653. package/dist/substrate/runtime/observability/index.d.mts +1 -1
  654. package/dist/substrate/runtime/observability/index.mjs +13 -0
  655. package/dist/substrate/runtime/observability/log-store.d.mts +1 -0
  656. package/dist/substrate/runtime/observability/log-store.mjs +175 -0
  657. package/dist/substrate/runtime/observability/log-store.mjs.map +1 -0
  658. package/dist/substrate/runtime/observability/logger.d.mts +2 -1
  659. package/dist/substrate/runtime/observability/logger.mjs +5 -9
  660. package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
  661. package/dist/substrate/runtime/observability/output-truncate.mjs +35 -0
  662. package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -0
  663. package/dist/substrate/runtime/observability/pretty-error.mjs +9 -12
  664. package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
  665. package/dist/substrate/runtime/observability/redaction.d.mts +2 -13
  666. package/dist/substrate/runtime/observability/redaction.mjs +8 -14
  667. package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
  668. package/dist/substrate/runtime/observability/span-store.d.mts +1 -0
  669. package/dist/substrate/runtime/observability/span-store.mjs +110 -0
  670. package/dist/substrate/runtime/observability/span-store.mjs.map +1 -0
  671. package/dist/substrate/runtime/observability/spans.mjs +14 -14
  672. package/dist/substrate/runtime/observability/spans.mjs.map +1 -1
  673. package/dist/substrate/runtime/observability/subprocess-capture.mjs +1 -1
  674. package/dist/substrate/runtime/passthrough-or-wrap.mjs +33 -0
  675. package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -0
  676. package/dist/substrate/runtime/paths.d.mts +1 -1
  677. package/dist/substrate/runtime/paths.mjs +4 -3
  678. package/dist/substrate/runtime/paths.mjs.map +1 -1
  679. package/dist/substrate/runtime/phase-preserving-produce.mjs +40 -0
  680. package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -0
  681. package/dist/substrate/runtime/port-broker/index.mjs +3 -0
  682. package/dist/substrate/runtime/port-broker/service.mjs +170 -126
  683. package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
  684. package/dist/substrate/runtime/post-acquire-tasks.mjs +1 -1
  685. package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
  686. package/dist/substrate/runtime/probes.d.mts +7 -5
  687. package/dist/substrate/runtime/probes.mjs +3 -1
  688. package/dist/substrate/runtime/probes.mjs.map +1 -1
  689. package/dist/substrate/runtime/projection/index.mjs +4 -0
  690. package/dist/substrate/runtime/projection/operational-endpoints.mjs +1 -2
  691. package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
  692. package/dist/substrate/runtime/projection/persisted.mjs +33 -15
  693. package/dist/substrate/runtime/projection/persisted.mjs.map +1 -1
  694. package/dist/substrate/runtime/projection/state-ref.mjs +26 -2
  695. package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
  696. package/dist/substrate/runtime/projection/update.mjs +88 -24
  697. package/dist/substrate/runtime/projection/update.mjs.map +1 -1
  698. package/dist/substrate/runtime/random-suffix.mjs +11 -0
  699. package/dist/substrate/runtime/random-suffix.mjs.map +1 -0
  700. package/dist/substrate/runtime/retry-policy.d.mts +59 -1
  701. package/dist/substrate/runtime/retry-policy.mjs +66 -1
  702. package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
  703. package/dist/substrate/runtime/routed-url.d.mts +1 -0
  704. package/dist/substrate/runtime/routed-url.mjs +79 -0
  705. package/dist/substrate/runtime/routed-url.mjs.map +1 -0
  706. package/dist/substrate/runtime/runtime-decode.d.mts +1 -1
  707. package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
  708. package/dist/substrate/runtime/scoped-http-server.mjs +2 -3
  709. package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
  710. package/dist/substrate/runtime/scoped-multimap/index.mjs +2 -0
  711. package/dist/substrate/runtime/scoped-multimap/service.mjs +52 -0
  712. package/dist/substrate/runtime/scoped-multimap/service.mjs.map +1 -0
  713. package/dist/substrate/runtime/scoped-ref-map/index.mjs +2 -0
  714. package/dist/substrate/runtime/scoped-ref-map/service.mjs +2 -2
  715. package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -1
  716. package/dist/substrate/runtime/stage-and-swap/index.mjs +72 -4
  717. package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
  718. package/dist/substrate/runtime/state-store/index.d.mts +1 -0
  719. package/dist/substrate/runtime/state-store/index.mjs +3 -0
  720. package/dist/substrate/runtime/state-store/schema.d.mts +1 -0
  721. package/dist/substrate/runtime/state-store/schema.mjs +19 -14
  722. package/dist/substrate/runtime/state-store/schema.mjs.map +1 -1
  723. package/dist/substrate/runtime/state-store/service.d.mts +1 -0
  724. package/dist/substrate/runtime/state-store/service.mjs +145 -0
  725. package/dist/substrate/runtime/state-store/service.mjs.map +1 -0
  726. package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.d.mts +1 -0
  727. package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs +33 -0
  728. package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -0
  729. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +1 -1
  730. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
  731. package/dist/substrate/runtime/strategy-registry/index.mjs +4 -0
  732. package/dist/substrate/runtime/strategy-registry/service.mjs +19 -33
  733. package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
  734. package/dist/substrate/runtime/subnet-broker.mjs +60 -0
  735. package/dist/substrate/runtime/subnet-broker.mjs.map +1 -0
  736. package/dist/substrate/runtime/sui-execute/index.d.mts +21 -1
  737. package/dist/substrate/runtime/sui-execute/index.mjs +84 -20
  738. package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -1
  739. package/dist/substrate/runtime/sui-execute/sign-and-dispatch.d.mts +1 -0
  740. package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs +32 -0
  741. package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +1 -0
  742. package/dist/substrate/runtime/sui-ledger/object-ref.mjs +32 -0
  743. package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +1 -0
  744. package/dist/substrate/runtime/sui-move-build/index.mjs +93 -19
  745. package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -1
  746. package/dist/substrate/runtime/supervisor/acquire-node.mjs +181 -0
  747. package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -0
  748. package/dist/substrate/runtime/supervisor/background-tasks.mjs +144 -0
  749. package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -0
  750. package/dist/substrate/runtime/supervisor/command-loop.mjs +68 -0
  751. package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -0
  752. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +151 -0
  753. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +1 -0
  754. package/dist/substrate/runtime/supervisor/errors.d.mts +1 -0
  755. package/dist/substrate/runtime/supervisor/errors.mjs +9 -0
  756. package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -0
  757. package/dist/substrate/runtime/supervisor/index.d.mts +1 -0
  758. package/dist/substrate/runtime/supervisor/index.mjs +3 -0
  759. package/dist/substrate/runtime/supervisor/shutdown.mjs +51 -0
  760. package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -0
  761. package/dist/substrate/runtime/supervisor/start-supervisor.d.mts +1 -0
  762. package/dist/substrate/runtime/supervisor/start-supervisor.mjs +250 -0
  763. package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -0
  764. package/dist/substrate/runtime/supervisor/state.d.mts +1 -0
  765. package/dist/substrate/runtime/supervisor/state.mjs +22 -0
  766. package/dist/substrate/runtime/supervisor/state.mjs.map +1 -0
  767. package/dist/substrate/runtime/supervisor/teardown.mjs +57 -0
  768. package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -0
  769. package/dist/substrate/runtime/supervisor/types.d.mts +1 -0
  770. package/dist/substrate/runtime/supervisor/wiring.mjs +133 -0
  771. package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -0
  772. package/dist/substrate/runtime/typed-env.mjs +8 -0
  773. package/dist/substrate/runtime/typed-env.mjs.map +1 -0
  774. package/dist/substrate/state-store.d.mts +1 -0
  775. package/dist/substrate/versioned-doc-schema.mjs +17 -0
  776. package/dist/substrate/versioned-doc-schema.mjs.map +1 -0
  777. package/dist/substrate/versioned-doc-sync.mjs +94 -0
  778. package/dist/substrate/versioned-doc-sync.mjs.map +1 -0
  779. package/dist/surfaces/cli/command-tree.mjs.map +1 -1
  780. package/dist/surfaces/cli/commands/index.mjs +9 -0
  781. package/dist/surfaces/cli/commands/prune-picker-entry.mjs +13 -0
  782. package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -0
  783. package/dist/surfaces/cli/commands/prune-picker.mjs +3 -2
  784. package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
  785. package/dist/surfaces/cli/commands/prune.mjs +34 -17
  786. package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
  787. package/dist/surfaces/cli/commands/status.mjs +2 -2
  788. package/dist/surfaces/cli/commands/status.mjs.map +1 -1
  789. package/dist/surfaces/cli/commands/supervisor-presence.mjs +5 -3
  790. package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
  791. package/dist/surfaces/cli/commands/wipe.mjs +38 -4
  792. package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
  793. package/dist/surfaces/cli/errors.mjs +1 -1
  794. package/dist/surfaces/cli/errors.mjs.map +1 -1
  795. package/dist/surfaces/cli/flags.mjs +0 -1
  796. package/dist/surfaces/cli/flags.mjs.map +1 -1
  797. package/dist/surfaces/cli/index.mjs +98 -18
  798. package/dist/surfaces/cli/index.mjs.map +1 -1
  799. package/dist/surfaces/cli/output.mjs +1 -0
  800. package/dist/surfaces/cli/output.mjs.map +1 -1
  801. package/dist/surfaces/cli/sysexits.mjs +2 -1
  802. package/dist/surfaces/cli/sysexits.mjs.map +1 -1
  803. package/dist/surfaces/tui/app.mjs +25 -3
  804. package/dist/surfaces/tui/app.mjs.map +1 -1
  805. package/dist/surfaces/tui/display-derivation.mjs +23 -74
  806. package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
  807. package/dist/surfaces/tui/event-log.mjs +35 -23
  808. package/dist/surfaces/tui/event-log.mjs.map +1 -1
  809. package/dist/surfaces/tui/input.mjs +5 -1
  810. package/dist/surfaces/tui/input.mjs.map +1 -1
  811. package/dist/surfaces/tui/plain-renderer.mjs +70 -34
  812. package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
  813. package/package.json +24 -4
  814. package/dist/contracts/liveness-classifier.d.mts +0 -19
  815. package/dist/contracts/network-resolver.d.mts +0 -15
  816. package/dist/contracts/network-resolver.mjs +0 -7
  817. package/dist/contracts/network-resolver.mjs.map +0 -1
  818. package/dist/orchestrators/codegen/extras.mjs +0 -16
  819. package/dist/orchestrators/codegen/extras.mjs.map +0 -1
  820. package/dist/plugins/deepbook/routable.mjs +0 -21
  821. package/dist/plugins/deepbook/routable.mjs.map +0 -1
  822. package/dist/plugins/faucet/service.d.mts +0 -20
  823. package/dist/plugins/faucet/strategies/sui-local.d.mts +0 -23
  824. package/dist/plugins/faucet/strategies/sui-local.mjs.map +0 -1
  825. package/dist/plugins/sui/seed-objects.d.mts +0 -18
  826. package/dist/plugins/sui/seed-objects.mjs +0 -25
  827. package/dist/plugins/sui/seed-objects.mjs.map +0 -1
  828. package/dist/runtime/built-in-plugin-layers.mjs.map +0 -1
  829. package/dist/substrate/runtime/context-helpers.mjs +0 -32
  830. package/dist/substrate/runtime/context-helpers.mjs.map +0 -1
  831. package/dist/substrate/runtime/run.mjs.map +0 -1
  832. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +0 -30
  833. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +0 -1
  834. package/dist/substrate/runtime/supervisor.d.mts +0 -1
  835. package/dist/substrate/runtime/supervisor.mjs +0 -831
  836. package/dist/substrate/runtime/supervisor.mjs.map +0 -1
  837. package/dist/surfaces/cli/commands/doctor-probes.mjs.map +0 -1
  838. /package/dist/{substrate/runtime/strategy-registry/faucet-capability-for.d.mts → plugins/faucet/http.d.mts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":[],"sources":["../../../../src/substrate/runtime/capability-sinks/service.ts"],"sourcesContent":["// CapabilitySinks — kind→sink registry.\n//\n// Architecture § Substrate name-blindness (STYLE_GUIDE Open slot O6):\n// the supervisor used to import a hardcoded list of capability-decl\n// modules and dispatch by name on a switch. This module inverts that:\n// the substrate exposes an Effect.Service the supervisor consults\n// once per harvested contribution; plugin-authored kinds can be\n// registered via the same surface that ships the built-ins. Adding a\n// new capability contract is `registerSink({ kind, accept })` — no\n// supervisor edit required.\n//\n// The dispatch is structural on the `kind` literal of the contribution.\n// The substrate never inspects the contribution's payload; the sink's\n// `accept` body owns interpretation. The substrate never imports a\n// concrete plugin module.\n\nimport { Context, Data, Effect, Layer, Ref, Scope } from 'effect';\n\nimport type { CapabilityDecl } from '../../../contracts/capability-decl.ts';\nimport type { StrategyContributorDecl } from '../../../contracts/strategy-contributor.ts';\nimport type { PluginKey } from '../../brand.ts';\nimport type { EngineEvent } from '../../events.ts';\nimport type { Identity } from '../../identity.ts';\nimport type { PluginErrorContribution } from '../../plugin.ts';\n\n// -----------------------------------------------------------------------------\n// Contribution surface\n// -----------------------------------------------------------------------------\n\n/** A single harvested item — either a capability decl OR an error\n * contribution. Discriminated by the literal `kind`. The supervisor\n * produces one of these for each item it pulls off a plugin during\n * the harvest loop. */\nexport type AnyContribution =\n\t| { readonly source: 'capability'; readonly decl: CapabilityDecl }\n\t| { readonly source: 'error'; readonly contribution: PluginErrorContribution };\n\n/** The discriminator the sinks register against. Substrate-owned\n * literal vocabulary — plugins authoring a custom contract add a new\n * literal and a sink. */\nexport type ContributionKind =\n\t| 'snapshotable'\n\t| 'routable'\n\t| 'codegenable'\n\t| 'projection'\n\t| 'strategy-contributor'\n\t| 'liveness-classifier'\n\t| 'error-contribution'\n\t| (string & { readonly __extensionKind?: never });\n\n// -----------------------------------------------------------------------------\n// Harvest context\n// -----------------------------------------------------------------------------\n\n/** Context the harvest loop supplies to each sink invocation. Carries\n * the plugin's key + identity so sinks can attribute their work\n * without naming the plugin. `publish` is the supervisor-owned event\n * path, so sink-emitted events keep the same ordering/projection\n * semantics as lifecycle/log/error events. The plugin scope is\n * exposed via `Scope.Scope` in the sink's R-channel — sinks\n * `addFinalizer` lands on the plugin's scope so registrations reap\n * on plugin teardown. */\nexport interface HarvestContext {\n\treadonly pluginKey: PluginKey;\n\treadonly identity: Identity;\n\treadonly publish: (event: EngineEvent) => Effect.Effect<void, never, never>;\n\treadonly registerStrategy: (\n\t\tdecl: StrategyContributorDecl<string, unknown>,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n}\n\n// -----------------------------------------------------------------------------\n// Sink shape\n// -----------------------------------------------------------------------------\n\n/** A sink for a specific contribution kind. `accept` is the\n * registration body — runs on the plugin's scope so its finalizers\n * reap on plugin teardown. */\nexport interface CapabilitySink<K extends ContributionKind, TDecl> {\n\treadonly kind: K;\n\treadonly accept: (decl: TDecl, ctx: HarvestContext) => Effect.Effect<void, unknown, Scope.Scope>;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch errors\n// -----------------------------------------------------------------------------\n\n/** Surfaced when `dispatch` receives a kind no sink is registered for.\n * Substrate stays open by default — unknown kinds are no-ops at the\n * supervisor's call site (see `dispatchOrIgnore`); but tests + custom\n * callers can drive the strict surface via `dispatch`. */\nexport class UnknownContributionKind extends Data.TaggedError('UnknownContributionKind')<{\n\treadonly kind: string;\n\treadonly known: ReadonlyArray<string>;\n}> {}\n\n/** Surfaced when a registered sink rejects while handling a known\n * contribution kind. The original failure stays attached as `cause`\n * so the supervisor's structured error renderer shows the domain\n * error, such as `RouteCollision`, underneath the dispatch wrapper. */\nexport class ContributionSinkFailed extends Data.TaggedError('ContributionSinkFailed')<{\n\treadonly kind: string;\n\treadonly message: string;\n\treadonly cause: unknown;\n}> {}\n\n// -----------------------------------------------------------------------------\n// Public service shape\n// -----------------------------------------------------------------------------\n\nexport interface CapabilitySinksShape {\n\t/** Register a sink for a contribution kind. Last-write-wins on\n\t * duplicate kinds: a plugin-author overlay replaces the built-in.\n\t * Scope-bound: registering inside a `Layer` and providing the\n\t * layer to the supervisor's scope reaps the sink on shutdown. */\n\treadonly registerSink: <K extends ContributionKind, TDecl>(\n\t\tsink: CapabilitySink<K, TDecl>,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\t/** Dispatch a contribution to its registered sink. Errors with\n\t * `UnknownContributionKind` when no sink matches; the supervisor's\n\t * loop catches and downgrades to a no-op (per the\n\t * substrate-open-by-default rule). */\n\treadonly dispatch: (\n\t\tcontribution: AnyContribution,\n\t\tctx: HarvestContext,\n\t) => Effect.Effect<void, UnknownContributionKind | ContributionSinkFailed, Scope.Scope>;\n\t/** Snapshot the kinds the registry currently knows. Diagnostic. */\n\treadonly knownKinds: Effect.Effect<ReadonlyArray<string>>;\n}\n\nexport class CapabilitySinksService extends Context.Service<\n\tCapabilitySinksService,\n\tCapabilitySinksShape\n>()('@devstack-rewrite/substrate/CapabilitySinks') {}\n\n// -----------------------------------------------------------------------------\n// Implementation helper — kind extraction\n// -----------------------------------------------------------------------------\n\n/** Derive the discriminator literal from a harvested contribution.\n * Substrate name-blindness: this is the ONE place the substrate\n * reads a `kind` off a decl — every other site routes through the\n * registered sink, which interprets the payload. */\nexport const kindOf = (contribution: AnyContribution): ContributionKind => {\n\tif (contribution.source === 'error') return 'error-contribution';\n\t// `decl.kind` is a literal on every CapabilityDecl variant; we\n\t// trust the substrate-owned contract here.\n\treturn contribution.decl.kind;\n};\n\n// -----------------------------------------------------------------------------\n// Layer\n// -----------------------------------------------------------------------------\n\ntype SinkAccept = (decl: unknown, ctx: HarvestContext) => Effect.Effect<void, unknown, Scope.Scope>;\n\n/** Layer constructing an empty registry. Built-in sinks ship via the\n * composed `layerCapabilitySinksDefault` (see `layer.ts`); plugin-\n * authored sinks compose by providing a Layer that yields the\n * service and calls `registerSink`. */\nexport const layerCapabilitySinks: Layer.Layer<CapabilitySinksService> = Layer.effect(\n\tCapabilitySinksService,\n\tEffect.gen(function* () {\n\t\tconst sinksRef = yield* Ref.make<ReadonlyMap<string, SinkAccept>>(new Map());\n\n\t\tconst registerSink = <K extends ContributionKind, TDecl>(\n\t\t\tsink: CapabilitySink<K, TDecl>,\n\t\t): Effect.Effect<void, never, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst accept = sink.accept as SinkAccept;\n\t\t\t\tconst prior = yield* Ref.modify(sinksRef, (current) => {\n\t\t\t\t\tconst next = new Map(current);\n\t\t\t\t\tconst had = next.get(sink.kind) ?? null;\n\t\t\t\t\tnext.set(sink.kind, accept);\n\t\t\t\t\treturn [had, next];\n\t\t\t\t});\n\t\t\t\t// Scope finalizer: restore the prior sink (or remove\n\t\t\t\t// entirely) on scope close. Symmetric semantics — a\n\t\t\t\t// plugin-author overlay's scope close restores the\n\t\t\t\t// built-in.\n\t\t\t\tyield* Effect.addFinalizer((_exit) =>\n\t\t\t\t\tRef.update(sinksRef, (current) => {\n\t\t\t\t\t\tconst next = new Map(current);\n\t\t\t\t\t\tif (prior === null) next.delete(sink.kind);\n\t\t\t\t\t\telse next.set(sink.kind, prior);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'capability-sinks.kind': sink.kind,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('substrate.capabilitySinks.registerSink'));\n\n\t\tconst dispatch = (\n\t\t\tcontribution: AnyContribution,\n\t\t\tctx: HarvestContext,\n\t\t): Effect.Effect<void, UnknownContributionKind | ContributionSinkFailed, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst kind = kindOf(contribution);\n\t\t\t\tconst sinks = yield* Ref.get(sinksRef);\n\t\t\t\tconst accept = sinks.get(kind);\n\t\t\t\tif (accept === undefined) {\n\t\t\t\t\treturn yield* new UnknownContributionKind({\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tknown: [...sinks.keys()],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst payload: unknown =\n\t\t\t\t\tcontribution.source === 'error' ? contribution.contribution : contribution.decl;\n\t\t\t\tyield* accept(payload, ctx).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\tnew ContributionSinkFailed({\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tmessage: `capability sink '${kind}' failed`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'capability-sinks.kind': kind,\n\t\t\t\t\t'devstack.plugin': ctx.pluginKey,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('substrate.capabilitySinks.dispatch'));\n\n\t\tconst knownKinds: Effect.Effect<ReadonlyArray<string>> = Effect.gen(function* () {\n\t\t\tconst sinks = yield* Ref.get(sinksRef);\n\t\t\treturn [...sinks.keys()];\n\t\t});\n\n\t\treturn CapabilitySinksService.of({ registerSink, dispatch, knownKinds });\n\t}),\n);\n"],"mappings":";;;;;;AA2FA,IAAa,0BAAb,cAA6C,KAAK,YAAY,0BAA0B,CAGrF;;;;;AAMH,IAAa,yBAAb,cAA4C,KAAK,YAAY,yBAAyB,CAInF;AA0BH,IAAa,yBAAb,cAA4C,QAAQ,SAGjD,CAAC,8CAA8C,CAAC;;;;;AAUnD,MAAa,UAAU,iBAAoD;AAC1E,KAAI,aAAa,WAAW,QAAS,QAAO;AAG5C,QAAO,aAAa,KAAK;;;;;;AAa1B,MAAa,uBAA4D,MAAM,OAC9E,wBACA,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,IAAI,qBAAsC,IAAI,KAAK,CAAC;CAE5E,MAAM,gBACL,SAEA,OAAO,IAAI,aAAa;EACvB,MAAM,SAAS,KAAK;EACpB,MAAM,QAAQ,OAAO,IAAI,OAAO,WAAW,YAAY;GACtD,MAAM,OAAO,IAAI,IAAI,QAAQ;GAC7B,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI;AACnC,QAAK,IAAI,KAAK,MAAM,OAAO;AAC3B,UAAO,CAAC,KAAK,KAAK;IACjB;AAKF,SAAO,OAAO,cAAc,UAC3B,IAAI,OAAO,WAAW,YAAY;GACjC,MAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,OAAI,UAAU,KAAM,MAAK,OAAO,KAAK,KAAK;OACrC,MAAK,IAAI,KAAK,MAAM,MAAM;AAC/B,UAAO;IACN,CACF;AACD,SAAO,OAAO,oBAAoB,EACjC,yBAAyB,KAAK,MAC9B,CAAC;GACD,CAAC,KAAK,OAAO,SAAS,yCAAyC,CAAC;CAEnE,MAAM,YACL,cACA,QAEA,OAAO,IAAI,aAAa;EACvB,MAAM,OAAO,OAAO,aAAa;EACjC,MAAM,QAAQ,OAAO,IAAI,IAAI,SAAS;EACtC,MAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,MAAI,WAAW,KAAA,EACd,QAAO,OAAO,IAAI,wBAAwB;GACzC;GACA,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;GACxB,CAAC;AAIH,SAAO,OADN,aAAa,WAAW,UAAU,aAAa,eAAe,aAAa,MACrD,IAAI,CAAC,KAC3B,OAAO,UACL,UACA,IAAI,uBAAuB;GAC1B;GACA,SAAS,oBAAoB,KAAK;GAClC;GACA,CAAC,CACH,CACD;AACD,SAAO,OAAO,oBAAoB;GACjC,yBAAyB;GACzB,mBAAmB,IAAI;GACvB,CAAC;GACD,CAAC,KAAK,OAAO,SAAS,qCAAqC,CAAC;CAE/D,MAAM,aAAmD,OAAO,IAAI,aAAa;AAEhF,SAAO,CAAC,IAAG,OADU,IAAI,IAAI,SAAS,EACrB,MAAM,CAAC;GACvB;AAEF,QAAO,uBAAuB,GAAG;EAAE;EAAc;EAAU;EAAY,CAAC;EACvE,CACF"}
1
+ {"version":3,"file":"service.mjs","names":[],"sources":["../../../../src/substrate/runtime/capability-sinks/service.ts"],"sourcesContent":["// CapabilitySinks — kind→sink registry.\n//\n// Architecture § Substrate name-blindness (STYLE_GUIDE Open slot O6):\n// the supervisor used to import a hardcoded list of capability-decl\n// modules and dispatch by name on a switch. This module inverts that:\n// the substrate exposes an Effect.Service the supervisor consults\n// once per harvested contribution; plugin-authored kinds can be\n// registered via the same surface that ships the built-ins. Adding a\n// new capability contract is `registerSink({ kind, accept })` — no\n// supervisor edit required.\n//\n// The dispatch is structural on the `kind` literal of the contribution.\n// The substrate never inspects the contribution's payload; the sink's\n// `accept` body owns interpretation. The substrate never imports a\n// concrete plugin module.\n\nimport { Context, Data, Effect, Layer, Scope } from 'effect';\n\nimport type { CapabilityDecl } from '../../../contracts/capability-decl.ts';\nimport type { StrategyContributorDecl } from '../../../contracts/strategy-contributor.ts';\nimport type { PluginKey } from '../../brand.ts';\nimport type { EngineEvent } from '../../events.ts';\nimport type { Identity } from '../../identity.ts';\nimport type { PluginErrorContribution } from '../../plugin.ts';\nimport { SpanAttr } from '../observability/spans.ts';\nimport { makeScopedMultimap } from '../scoped-multimap/index.ts';\n\n// -----------------------------------------------------------------------------\n// Contribution surface\n// -----------------------------------------------------------------------------\n\n/** A single harvested item — either a capability decl OR an error\n * contribution. Discriminated by the literal `kind`. The supervisor\n * produces one of these for each item it pulls off a plugin during\n * the harvest loop. */\nexport type AnyContribution =\n\t| { readonly source: 'capability'; readonly decl: CapabilityDecl }\n\t| { readonly source: 'error'; readonly contribution: PluginErrorContribution };\n\n/** The discriminator the sinks register against. Substrate-owned\n * literal vocabulary — plugins authoring a custom contract add a new\n * literal and a sink. */\nexport type ContributionKind =\n\t| 'snapshotable'\n\t| 'routable'\n\t| 'codegenable'\n\t| 'projection'\n\t| 'strategy-contributor'\n\t| 'error-contribution'\n\t| (string & { readonly __extensionKind?: never });\n\n// -----------------------------------------------------------------------------\n// Harvest context\n// -----------------------------------------------------------------------------\n\n/** Context the harvest loop supplies to each sink invocation. Carries\n * the plugin's key + identity so sinks can attribute their work\n * without naming the plugin. `publish` is the supervisor-owned event\n * path, so sink-emitted events keep the same ordering/projection\n * semantics as lifecycle/log/error events. The plugin scope is\n * exposed via `Scope.Scope` in the sink's R-channel — sinks\n * `addFinalizer` lands on the plugin's scope so registrations reap\n * on plugin teardown. */\nexport interface HarvestContext {\n\treadonly pluginKey: PluginKey;\n\treadonly identity: Identity;\n\treadonly publish: (event: EngineEvent) => Effect.Effect<void, never, never>;\n\treadonly registerStrategy: (\n\t\tdecl: StrategyContributorDecl<string, unknown>,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n}\n\n// -----------------------------------------------------------------------------\n// Sink shape\n// -----------------------------------------------------------------------------\n\n/** A sink for a specific contribution kind. `accept` is the\n * registration body — runs on the plugin's scope so its finalizers\n * reap on plugin teardown. */\nexport interface CapabilitySink<K extends ContributionKind, TDecl> {\n\treadonly kind: K;\n\treadonly accept: (decl: TDecl, ctx: HarvestContext) => Effect.Effect<void, unknown, Scope.Scope>;\n}\n\n// -----------------------------------------------------------------------------\n// Dispatch errors\n// -----------------------------------------------------------------------------\n\n/** Surfaced when `dispatch` receives a kind no sink is registered for.\n * Substrate stays open by default — unknown kinds are no-ops at the\n * supervisor's call site (see `dispatchOrIgnore`); but tests + custom\n * callers can drive the strict surface via `dispatch`. */\nexport class UnknownContributionKind extends Data.TaggedError('UnknownContributionKind')<{\n\treadonly kind: string;\n\treadonly known: ReadonlyArray<string>;\n}> {}\n\n/** Surfaced when a registered sink rejects while handling a known\n * contribution kind. The original failure stays attached as `cause`\n * so the supervisor's structured error renderer shows the domain\n * error, such as `RouteCollision`, underneath the dispatch wrapper. */\nexport class ContributionSinkFailed extends Data.TaggedError('ContributionSinkFailed')<{\n\treadonly kind: string;\n\treadonly message: string;\n\treadonly cause: unknown;\n}> {}\n\n// -----------------------------------------------------------------------------\n// Public service shape\n// -----------------------------------------------------------------------------\n\nexport interface CapabilitySinksShape {\n\t/** Register a sink for a contribution kind. Last-write-wins on\n\t * duplicate kinds: a plugin-author overlay shadows the built-in\n\t * (the highest-seq surviving registration wins at `dispatch`).\n\t * Scope-bound: registering inside a `Layer` and providing the\n\t * layer to the supervisor's scope reaps the sink on shutdown.\n\t * Closing an overlay's scope un-shadows the built-in WITHOUT\n\t * clobbering any newer sibling registration for the same kind —\n\t * the scoped-multimap drops only this registration's own entry. */\n\treadonly registerSink: <K extends ContributionKind, TDecl>(\n\t\tsink: CapabilitySink<K, TDecl>,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\t/** Dispatch a contribution to its registered sink. Errors with\n\t * `UnknownContributionKind` when no sink matches; the supervisor's\n\t * loop catches and downgrades to a no-op (per the\n\t * substrate-open-by-default rule). */\n\treadonly dispatch: (\n\t\tcontribution: AnyContribution,\n\t\tctx: HarvestContext,\n\t) => Effect.Effect<void, UnknownContributionKind | ContributionSinkFailed, Scope.Scope>;\n\t/** Snapshot the kinds the registry currently knows. Diagnostic. */\n\treadonly knownKinds: Effect.Effect<ReadonlyArray<string>>;\n}\n\nexport class CapabilitySinksService extends Context.Service<\n\tCapabilitySinksService,\n\tCapabilitySinksShape\n>()('@devstack/substrate/CapabilitySinks') {}\n\n// -----------------------------------------------------------------------------\n// Implementation helper — kind extraction\n// -----------------------------------------------------------------------------\n\n/** Derive the discriminator literal from a harvested contribution.\n * Substrate name-blindness: this is the ONE place the substrate\n * reads a `kind` off a decl — every other site routes through the\n * registered sink, which interprets the payload. */\nexport const kindOf = (contribution: AnyContribution): ContributionKind => {\n\tif (contribution.source === 'error') return 'error-contribution';\n\t// `decl.kind` is a literal on every CapabilityDecl variant; we\n\t// trust the substrate-owned contract here.\n\treturn contribution.decl.kind;\n};\n\n// -----------------------------------------------------------------------------\n// Layer\n// -----------------------------------------------------------------------------\n\ntype SinkAccept = (decl: unknown, ctx: HarvestContext) => Effect.Effect<void, unknown, Scope.Scope>;\n\n/** Layer constructing an empty registry. Built-in sinks ship via the\n * composed `layerCapabilitySinksDefault` (see `layer.ts`); plugin-\n * authored sinks compose by providing a Layer that yields the\n * service and calls `registerSink`. */\nexport const layerCapabilitySinks: Layer.Layer<CapabilitySinksService> = Layer.effect(\n\tCapabilitySinksService,\n\tEffect.gen(function* () {\n\t\t// Seq-tagged multimap, NOT a single-value-per-kind map. The old\n\t\t// shape stored one accept per kind and restored a captured\n\t\t// `prior` on scope close — correct only under strict LIFO. With\n\t\t// sibling scopes (an overlay registered while another overlay for\n\t\t// the same kind is still live) the first to close would restore\n\t\t// ITS stale `prior` and clobber the live sibling. The multimap's\n\t\t// drop-by-seq finalizer removes only this registration's entry,\n\t\t// so the surviving highest-seq sink keeps winning regardless of\n\t\t// close order.\n\t\tconst store = yield* makeScopedMultimap<string, SinkAccept>();\n\n\t\tconst registerSink = <K extends ContributionKind, TDecl>(\n\t\t\tsink: CapabilitySink<K, TDecl>,\n\t\t): Effect.Effect<void, never, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst accept = sink.accept as SinkAccept;\n\t\t\t\t// The multimap's register is already uninterruptible and\n\t\t\t\t// wires the drop-by-seq finalizer atomically with the\n\t\t\t\t// append (mirrors `leaseBroker.tryAcquire`).\n\t\t\t\tyield* store.register([{ key: sink.kind, value: accept }]);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t[SpanAttr.capabilitySinksKind]: sink.kind,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('substrate.capabilitySinks.registerSink'));\n\n\t\tconst dispatch = (\n\t\t\tcontribution: AnyContribution,\n\t\t\tctx: HarvestContext,\n\t\t): Effect.Effect<void, UnknownContributionKind | ContributionSinkFailed, Scope.Scope> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst kind = kindOf(contribution);\n\t\t\t\tconst entries = yield* store.entriesFor(kind);\n\t\t\t\tif (entries.length === 0) {\n\t\t\t\t\tconst known = yield* store.keys;\n\t\t\t\t\treturn yield* new UnknownContributionKind({ kind, known });\n\t\t\t\t}\n\t\t\t\t// Last-write-wins: the highest-seq surviving registration\n\t\t\t\t// is the active sink for this kind.\n\t\t\t\tlet chosen = entries[0]!;\n\t\t\t\tfor (let i = 1; i < entries.length; i++) {\n\t\t\t\t\tif (entries[i]!.seq > chosen.seq) chosen = entries[i]!;\n\t\t\t\t}\n\t\t\t\tconst accept = chosen.value;\n\t\t\t\tconst payload: unknown =\n\t\t\t\t\tcontribution.source === 'error' ? contribution.contribution : contribution.decl;\n\t\t\t\tyield* accept(payload, ctx).pipe(\n\t\t\t\t\tEffect.mapError(\n\t\t\t\t\t\t(cause) =>\n\t\t\t\t\t\t\tnew ContributionSinkFailed({\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tmessage: `capability sink '${kind}' failed`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t[SpanAttr.capabilitySinksKind]: kind,\n\t\t\t\t\t[SpanAttr.plugin]: ctx.pluginKey,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('substrate.capabilitySinks.dispatch'));\n\n\t\tconst knownKinds: Effect.Effect<ReadonlyArray<string>> = store.keys;\n\n\t\treturn CapabilitySinksService.of({ registerSink, dispatch, knownKinds });\n\t}),\n);\n"],"mappings":";;;;;;;;;AA4FA,IAAa,0BAAb,cAA6C,KAAK,YAAY,0BAA0B,CAGrF;;;;;AAMH,IAAa,yBAAb,cAA4C,KAAK,YAAY,yBAAyB,CAInF;AA8BH,IAAa,yBAAb,cAA4C,QAAQ,SAGjD,CAAC,sCAAsC,CAAC;;;;;AAU3C,MAAa,UAAU,iBAAoD;AAC1E,KAAI,aAAa,WAAW,QAAS,QAAO;AAG5C,QAAO,aAAa,KAAK;;;;;;AAa1B,MAAa,uBAA4D,MAAM,OAC9E,wBACA,OAAO,IAAI,aAAa;CAUvB,MAAM,QAAQ,OAAO,oBAAwC;CAE7D,MAAM,gBACL,SAEA,OAAO,IAAI,aAAa;EACvB,MAAM,SAAS,KAAK;AAIpB,SAAO,MAAM,SAAS,CAAC;GAAE,KAAK,KAAK;GAAM,OAAO;GAAQ,CAAC,CAAC;AAC1D,SAAO,OAAO,oBAAoB,GAChC,SAAS,sBAAsB,KAAK,MACrC,CAAC;GACD,CAAC,KAAK,OAAO,SAAS,yCAAyC,CAAC;CAEnE,MAAM,YACL,cACA,QAEA,OAAO,IAAI,aAAa;EACvB,MAAM,OAAO,OAAO,aAAa;EACjC,MAAM,UAAU,OAAO,MAAM,WAAW,KAAK;AAC7C,MAAI,QAAQ,WAAW,EAEtB,QAAO,OAAO,IAAI,wBAAwB;GAAE;GAAM,OAAA,OAD7B,MAAM;GAC8B,CAAC;EAI3D,IAAI,SAAS,QAAQ;AACrB,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IACnC,KAAI,QAAQ,GAAI,MAAM,OAAO,IAAK,UAAS,QAAQ;EAEpD,MAAM,SAAS,OAAO;AAGtB,SAAO,OADN,aAAa,WAAW,UAAU,aAAa,eAAe,aAAa,MACrD,IAAI,CAAC,KAC3B,OAAO,UACL,UACA,IAAI,uBAAuB;GAC1B;GACA,SAAS,oBAAoB,KAAK;GAClC;GACA,CAAC,CACH,CACD;AACD,SAAO,OAAO,oBAAoB;IAChC,SAAS,sBAAsB;IAC/B,SAAS,SAAS,IAAI;GACvB,CAAC;GACD,CAAC,KAAK,OAAO,SAAS,qCAAqC,CAAC;CAE/D,MAAM,aAAmD,MAAM;AAE/D,QAAO,uBAAuB,GAAG;EAAE;EAAc;EAAU;EAAY,CAAC;EACvE,CACF"}
@@ -1,8 +1,5 @@
1
- import { Effect, Schema } from "effect";
2
-
3
- //#region src/substrate/runtime/config-validation.d.ts
4
1
  declare namespace config_validation_d_exports {
5
- export { ConfigErrorFactory, ConfigIssue, decodeConfig, decodeConfigSync, defineConfigError, expectNonEmptyArray, expectNonEmptyString, expectOneOf, expectOptionalNonEmptyString, expectOptionalPort, expectOptionalPositiveInteger, expectPattern, expectPort, expectPositiveFiniteNumber, expectPositiveInteger, expectStringRecord };
2
+ export { ConfigErrorFactory, ConfigIssue, defineConfigError, expectNonEmptyString, expectOptionalPositiveInteger, expectPort, expectPositiveInteger };
6
3
  }
7
4
  interface ConfigIssue {
8
5
  readonly field: string;
@@ -21,18 +18,9 @@ interface ValidatorOptions<E> {
21
18
  readonly hint?: string;
22
19
  }
23
20
  declare const expectNonEmptyString: <E>(value: unknown, options: ValidatorOptions<E>) => string;
24
- declare const expectOptionalNonEmptyString: <E>(value: unknown, options: ValidatorOptions<E>) => string | undefined;
25
21
  declare const expectPositiveInteger: <E>(value: unknown, options: ValidatorOptions<E>) => number;
26
22
  declare const expectOptionalPositiveInteger: <E>(value: unknown, options: ValidatorOptions<E>) => number | undefined;
27
- declare const expectPositiveFiniteNumber: <E>(value: unknown, options: ValidatorOptions<E>) => number;
28
23
  declare const expectPort: <E>(value: unknown, options: ValidatorOptions<E>) => number;
29
- declare const expectOptionalPort: <E>(value: unknown, options: ValidatorOptions<E>) => number | undefined;
30
- declare const expectStringRecord: <E>(value: unknown, options: ValidatorOptions<E>) => Readonly<Record<string, string>>;
31
- declare const expectOneOf: <const Values extends ReadonlyArray<string>, E>(value: unknown, values: Values, options: ValidatorOptions<E>) => Values[number];
32
- declare const expectNonEmptyArray: <T, E>(value: ReadonlyArray<T> | undefined, options: ValidatorOptions<E>) => ReadonlyArray<T>;
33
- declare const expectPattern: <E>(value: string, pattern: RegExp, options: ValidatorOptions<E>) => string;
34
- declare const decodeConfig: <S extends Schema.Decoder<unknown>, E>(schema: S, value: unknown, options: ValidatorOptions<E>) => Effect.Effect<S["Type"], E>;
35
- declare const decodeConfigSync: <S extends Schema.Decoder<unknown>, E>(schema: S, value: unknown, options: ValidatorOptions<E>) => S["Type"];
36
24
  //#endregion
37
25
  export { ConfigIssue, config_validation_d_exports };
38
26
  //# sourceMappingURL=config-validation.d.mts.map
@@ -1,21 +1,11 @@
1
1
  import { __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
2
- import { Effect, Schema } from "effect";
3
2
  //#region src/substrate/runtime/config-validation.ts
4
3
  var config_validation_exports = /* @__PURE__ */ __exportAll({
5
- decodeConfig: () => decodeConfig,
6
- decodeConfigSync: () => decodeConfigSync,
7
4
  defineConfigError: () => defineConfigError,
8
- expectNonEmptyArray: () => expectNonEmptyArray,
9
5
  expectNonEmptyString: () => expectNonEmptyString,
10
- expectOneOf: () => expectOneOf,
11
- expectOptionalNonEmptyString: () => expectOptionalNonEmptyString,
12
- expectOptionalPort: () => expectOptionalPort,
13
6
  expectOptionalPositiveInteger: () => expectOptionalPositiveInteger,
14
- expectPattern: () => expectPattern,
15
7
  expectPort: () => expectPort,
16
- expectPositiveFiniteNumber: () => expectPositiveFiniteNumber,
17
- expectPositiveInteger: () => expectPositiveInteger,
18
- expectStringRecord: () => expectStringRecord
8
+ expectPositiveInteger: () => expectPositiveInteger
19
9
  });
20
10
  const defineConfigError = (tag) => (issue) => ({
21
11
  _tag: tag,
@@ -32,10 +22,6 @@ const expectNonEmptyString = (value, options) => {
32
22
  ...options.hint === void 0 ? {} : { hint: options.hint }
33
23
  });
34
24
  };
35
- const expectOptionalNonEmptyString = (value, options) => {
36
- if (value === void 0) return void 0;
37
- return expectNonEmptyString(value, options);
38
- };
39
25
  const expectPositiveInteger = (value, options) => {
40
26
  if (typeof value === "number" && Number.isInteger(value) && value > 0) return value;
41
27
  return fail(options.mkError, {
@@ -48,14 +34,6 @@ const expectOptionalPositiveInteger = (value, options) => {
48
34
  if (value === void 0) return void 0;
49
35
  return expectPositiveInteger(value, options);
50
36
  };
51
- const expectPositiveFiniteNumber = (value, options) => {
52
- if (typeof value === "number" && Number.isFinite(value) && value > 0) return value;
53
- return fail(options.mkError, {
54
- field: options.field,
55
- message: options.message ?? "must be a positive finite number",
56
- ...options.hint === void 0 ? {} : { hint: options.hint }
57
- });
58
- };
59
37
  const expectPort = (value, options) => {
60
38
  if (typeof value === "number" && Number.isInteger(value) && value > 0 && value <= 65535) return value;
61
39
  return fail(options.mkError, {
@@ -64,74 +42,7 @@ const expectPort = (value, options) => {
64
42
  ...options.hint === void 0 ? {} : { hint: options.hint }
65
43
  });
66
44
  };
67
- const expectOptionalPort = (value, options) => {
68
- if (value === void 0) return void 0;
69
- return expectPort(value, options);
70
- };
71
- const expectStringRecord = (value, options) => {
72
- if (value === void 0) return {};
73
- if (typeof value !== "object" || value === null || Array.isArray(value)) return fail(options.mkError, {
74
- field: options.field,
75
- message: options.message ?? "must be an object of string values",
76
- ...options.hint === void 0 ? {} : { hint: options.hint }
77
- });
78
- for (const [key, entry] of Object.entries(value)) {
79
- if (key.length === 0) return fail(options.mkError, {
80
- field: options.field,
81
- message: "environment variable names must be non-empty",
82
- ...options.hint === void 0 ? {} : { hint: options.hint }
83
- });
84
- if (typeof entry !== "string") return fail(options.mkError, {
85
- field: `${options.field}.${key}`,
86
- message: "must be a string",
87
- ...options.hint === void 0 ? {} : { hint: options.hint }
88
- });
89
- }
90
- return value;
91
- };
92
- const expectOneOf = (value, values, options) => {
93
- if (typeof value === "string" && values.includes(value)) return value;
94
- return fail(options.mkError, {
95
- field: options.field,
96
- message: options.message ?? `must be one of ${values.map((v) => `'${v}'`).join(", ")}`,
97
- ...options.hint === void 0 ? {} : { hint: options.hint }
98
- });
99
- };
100
- const expectNonEmptyArray = (value, options) => {
101
- if (Array.isArray(value) && value.length > 0) return value;
102
- return fail(options.mkError, {
103
- field: options.field,
104
- message: options.message ?? "must be a non-empty array",
105
- ...options.hint === void 0 ? {} : { hint: options.hint }
106
- });
107
- };
108
- const expectPattern = (value, pattern, options) => {
109
- if (pattern.test(value)) return value;
110
- return fail(options.mkError, {
111
- field: options.field,
112
- message: options.message ?? `must match ${pattern.source}`,
113
- ...options.hint === void 0 ? {} : { hint: options.hint }
114
- });
115
- };
116
- const decodeConfig = (schema, value, options) => Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError((cause) => options.mkError({
117
- field: options.field,
118
- message: options.message ?? "failed to decode config value",
119
- ...options.hint === void 0 ? {} : { hint: options.hint },
120
- cause
121
- })));
122
- const decodeConfigSync = (schema, value, options) => {
123
- try {
124
- return Schema.decodeUnknownSync(schema)(value);
125
- } catch (cause) {
126
- return fail(options.mkError, {
127
- field: options.field,
128
- message: options.message ?? "failed to decode config value",
129
- ...options.hint === void 0 ? {} : { hint: options.hint },
130
- cause
131
- });
132
- }
133
- };
134
45
  //#endregion
135
- export { config_validation_exports, defineConfigError, expectNonEmptyArray, expectNonEmptyString, expectOneOf, expectOptionalNonEmptyString, expectOptionalPort, expectOptionalPositiveInteger, expectPositiveFiniteNumber, expectPositiveInteger, expectStringRecord };
46
+ export { config_validation_exports, defineConfigError, expectNonEmptyString, expectOptionalPositiveInteger, expectPositiveInteger };
136
47
 
137
48
  //# sourceMappingURL=config-validation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-validation.mjs","names":[],"sources":["../../../src/substrate/runtime/config-validation.ts"],"sourcesContent":["import { Effect, Schema } from 'effect';\n\nexport interface ConfigIssue {\n\treadonly field: string;\n\treadonly message: string;\n\treadonly hint?: string;\n\treadonly cause?: unknown;\n}\n\nexport type ConfigErrorFactory<E> = (issue: ConfigIssue) => E;\n\nexport const defineConfigError =\n\t<const Tag extends string>(tag: Tag) =>\n\t(issue: ConfigIssue): ConfigIssue & { readonly _tag: Tag } => ({\n\t\t_tag: tag,\n\t\t...issue,\n\t});\n\ninterface ValidatorOptions<E> {\n\treadonly field: string;\n\treadonly mkError: ConfigErrorFactory<E>;\n\treadonly message?: string;\n\treadonly hint?: string;\n}\n\nconst fail = <E>(mkError: ConfigErrorFactory<E>, issue: ConfigIssue): never => {\n\tthrow mkError(issue);\n};\n\nexport const expectNonEmptyString = <E>(value: unknown, options: ValidatorOptions<E>): string => {\n\tif (typeof value === 'string' && value.length > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a non-empty string',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectOptionalNonEmptyString = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): string | undefined => {\n\tif (value === undefined) return undefined;\n\treturn expectNonEmptyString(value, options);\n};\n\nexport const expectPositiveInteger = <E>(value: unknown, options: ValidatorOptions<E>): number => {\n\tif (typeof value === 'number' && Number.isInteger(value) && value > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a positive integer',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectOptionalPositiveInteger = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): number | undefined => {\n\tif (value === undefined) return undefined;\n\treturn expectPositiveInteger(value, options);\n};\n\nexport const expectPositiveFiniteNumber = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): number => {\n\tif (typeof value === 'number' && Number.isFinite(value) && value > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a positive finite number',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectPort = <E>(value: unknown, options: ValidatorOptions<E>): number => {\n\tif (typeof value === 'number' && Number.isInteger(value) && value > 0 && value <= 65_535) {\n\t\treturn value;\n\t}\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be an integer between 1 and 65535',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectOptionalPort = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): number | undefined => {\n\tif (value === undefined) return undefined;\n\treturn expectPort(value, options);\n};\n\nexport const expectStringRecord = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): Readonly<Record<string, string>> => {\n\tif (value === undefined) return {};\n\tif (typeof value !== 'object' || value === null || Array.isArray(value)) {\n\t\treturn fail(options.mkError, {\n\t\t\tfield: options.field,\n\t\t\tmessage: options.message ?? 'must be an object of string values',\n\t\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t\t});\n\t}\n\tfor (const [key, entry] of Object.entries(value)) {\n\t\tif (key.length === 0) {\n\t\t\treturn fail(options.mkError, {\n\t\t\t\tfield: options.field,\n\t\t\t\tmessage: 'environment variable names must be non-empty',\n\t\t\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t\t\t});\n\t\t}\n\t\tif (typeof entry !== 'string') {\n\t\t\treturn fail(options.mkError, {\n\t\t\t\tfield: `${options.field}.${key}`,\n\t\t\t\tmessage: 'must be a string',\n\t\t\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t\t\t});\n\t\t}\n\t}\n\treturn value as Readonly<Record<string, string>>;\n};\n\nexport const expectOneOf = <const Values extends ReadonlyArray<string>, E>(\n\tvalue: unknown,\n\tvalues: Values,\n\toptions: ValidatorOptions<E>,\n): Values[number] => {\n\tif (typeof value === 'string' && (values as ReadonlyArray<string>).includes(value)) {\n\t\treturn value as Values[number];\n\t}\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? `must be one of ${values.map((v) => `'${v}'`).join(', ')}`,\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectNonEmptyArray = <T, E>(\n\tvalue: ReadonlyArray<T> | undefined,\n\toptions: ValidatorOptions<E>,\n): ReadonlyArray<T> => {\n\tif (Array.isArray(value) && value.length > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a non-empty array',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectPattern = <E>(\n\tvalue: string,\n\tpattern: RegExp,\n\toptions: ValidatorOptions<E>,\n): string => {\n\tif (pattern.test(value)) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? `must match ${pattern.source}`,\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const decodeConfig = <S extends Schema.Decoder<unknown>, E>(\n\tschema: S,\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): Effect.Effect<S['Type'], E> =>\n\tSchema.decodeUnknownEffect(schema)(value).pipe(\n\t\tEffect.mapError((cause) =>\n\t\t\toptions.mkError({\n\t\t\t\tfield: options.field,\n\t\t\t\tmessage: options.message ?? 'failed to decode config value',\n\t\t\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t\t\t\tcause,\n\t\t\t}),\n\t\t),\n\t);\n\nexport const decodeConfigSync = <S extends Schema.Decoder<unknown>, E>(\n\tschema: S,\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): S['Type'] => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(value);\n\t} catch (cause) {\n\t\treturn fail(options.mkError, {\n\t\t\tfield: options.field,\n\t\t\tmessage: options.message ?? 'failed to decode config value',\n\t\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t\t\tcause,\n\t\t});\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,MAAa,qBACe,SAC1B,WAA8D;CAC9D,MAAM;CACN,GAAG;CACH;AASF,MAAM,QAAW,SAAgC,UAA8B;AAC9E,OAAM,QAAQ,MAAM;;AAGrB,MAAa,wBAA2B,OAAgB,YAAyC;AAChG,KAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,gCACZ,OACA,YACwB;AACxB,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAO,qBAAqB,OAAO,QAAQ;;AAG5C,MAAa,yBAA4B,OAAgB,YAAyC;AACjG,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,IAAI,QAAQ,EAAG,QAAO;AAC9E,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,iCACZ,OACA,YACwB;AACxB,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAO,sBAAsB,OAAO,QAAQ;;AAG7C,MAAa,8BACZ,OACA,YACY;AACZ,KAAI,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,IAAI,QAAQ,EAAG,QAAO;AAC7E,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,cAAiB,OAAgB,YAAyC;AACtF,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,SAAS,MACjF,QAAO;AAER,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,sBACZ,OACA,YACwB;AACxB,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAO,WAAW,OAAO,QAAQ;;AAGlC,MAAa,sBACZ,OACA,YACsC;AACtC,KAAI,UAAU,KAAA,EAAW,QAAO,EAAE;AAClC,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CACtE,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;AAEH,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE;AACjD,MAAI,IAAI,WAAW,EAClB,QAAO,KAAK,QAAQ,SAAS;GAC5B,OAAO,QAAQ;GACf,SAAS;GACT,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;GAC5D,CAAC;AAEH,MAAI,OAAO,UAAU,SACpB,QAAO,KAAK,QAAQ,SAAS;GAC5B,OAAO,GAAG,QAAQ,MAAM,GAAG;GAC3B,SAAS;GACT,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;GAC5D,CAAC;;AAGJ,QAAO;;AAGR,MAAa,eACZ,OACA,QACA,YACoB;AACpB,KAAI,OAAO,UAAU,YAAa,OAAiC,SAAS,MAAM,CACjF,QAAO;AAER,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW,kBAAkB,OAAO,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK;EACpF,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,uBACZ,OACA,YACsB;AACtB,KAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,EAAG,QAAO;AACrD,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,iBACZ,OACA,SACA,YACY;AACZ,KAAI,QAAQ,KAAK,MAAM,CAAE,QAAO;AAChC,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW,cAAc,QAAQ;EAClD,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,gBACZ,QACA,OACA,YAEA,OAAO,oBAAoB,OAAO,CAAC,MAAM,CAAC,KACzC,OAAO,UAAU,UAChB,QAAQ,QAAQ;CACf,OAAO,QAAQ;CACf,SAAS,QAAQ,WAAW;CAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;CAC5D;CACA,CAAC,CACF,CACD;AAEF,MAAa,oBACZ,QACA,OACA,YACe;AACf,KAAI;AACH,SAAO,OAAO,kBAAkB,OAAO,CAAC,MAAM;UACtC,OAAO;AACf,SAAO,KAAK,QAAQ,SAAS;GAC5B,OAAO,QAAQ;GACf,SAAS,QAAQ,WAAW;GAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;GAC5D;GACA,CAAC"}
1
+ {"version":3,"file":"config-validation.mjs","names":[],"sources":["../../../src/substrate/runtime/config-validation.ts"],"sourcesContent":["// Plain shape-check helpers — sync-throw discipline.\n//\n// Reach for these when you want to assert a single field's shape\n// (\"port must be a positive integer\", \"name must be a non-empty\n// string\") and throw a plugin-tagged `ConfigIssue` if it isn't.\n// Each helper takes one value + a `{ field, mkError }` and either\n// returns the value or throws. Authors compose them at factory /\n// boundary sites.\n//\n// For compound Schema decode (multi-field shapes, refinements,\n// transforms), reach for `decodeUnknownSync(schema, value,\n// { source, mkError })` from `runtime-decode.ts` instead.\n\nexport interface ConfigIssue {\n\treadonly field: string;\n\treadonly message: string;\n\treadonly hint?: string;\n\treadonly cause?: unknown;\n}\n\nexport type ConfigErrorFactory<E> = (issue: ConfigIssue) => E;\n\nexport const defineConfigError =\n\t<const Tag extends string>(tag: Tag) =>\n\t(issue: ConfigIssue): ConfigIssue & { readonly _tag: Tag } => ({\n\t\t_tag: tag,\n\t\t...issue,\n\t});\n\ninterface ValidatorOptions<E> {\n\treadonly field: string;\n\treadonly mkError: ConfigErrorFactory<E>;\n\treadonly message?: string;\n\treadonly hint?: string;\n}\n\nconst fail = <E>(mkError: ConfigErrorFactory<E>, issue: ConfigIssue): never => {\n\tthrow mkError(issue);\n};\n\nexport const expectNonEmptyString = <E>(value: unknown, options: ValidatorOptions<E>): string => {\n\tif (typeof value === 'string' && value.length > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a non-empty string',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectPositiveInteger = <E>(value: unknown, options: ValidatorOptions<E>): number => {\n\tif (typeof value === 'number' && Number.isInteger(value) && value > 0) return value;\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be a positive integer',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n\nexport const expectOptionalPositiveInteger = <E>(\n\tvalue: unknown,\n\toptions: ValidatorOptions<E>,\n): number | undefined => {\n\tif (value === undefined) return undefined;\n\treturn expectPositiveInteger(value, options);\n};\n\nexport const expectPort = <E>(value: unknown, options: ValidatorOptions<E>): number => {\n\tif (typeof value === 'number' && Number.isInteger(value) && value > 0 && value <= 65_535) {\n\t\treturn value;\n\t}\n\treturn fail(options.mkError, {\n\t\tfield: options.field,\n\t\tmessage: options.message ?? 'must be an integer between 1 and 65535',\n\t\t...(options.hint === undefined ? {} : { hint: options.hint }),\n\t});\n};\n"],"mappings":";;;;;;;;;AAsBA,MAAa,qBACe,SAC1B,WAA8D;CAC9D,MAAM;CACN,GAAG;CACH;AASF,MAAM,QAAW,SAAgC,UAA8B;AAC9E,OAAM,QAAQ,MAAM;;AAGrB,MAAa,wBAA2B,OAAgB,YAAyC;AAChG,KAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,yBAA4B,OAAgB,YAAyC;AACjG,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,IAAI,QAAQ,EAAG,QAAO;AAC9E,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC;;AAGH,MAAa,iCACZ,OACA,YACwB;AACxB,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAO,sBAAsB,OAAO,QAAQ;;AAG7C,MAAa,cAAiB,OAAgB,YAAyC;AACtF,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,SAAS,MACjF,QAAO;AAER,QAAO,KAAK,QAAQ,SAAS;EAC5B,OAAO,QAAQ;EACf,SAAS,QAAQ,WAAW;EAC5B,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,GAAG,EAAE,MAAM,QAAQ,MAAM;EAC5D,CAAC"}
@@ -0,0 +1 @@
1
+ import { ContainerRuntimeService } from "../../runtime/docker/service.mjs";
@@ -0,0 +1,2 @@
1
+ import "../../runtime/docker/service.mjs";
2
+ export {};
@@ -0,0 +1,101 @@
1
+ import { readResolvedSync } from "../lifecycle/plugin-registry.mjs";
2
+ import { SnapshotOrchestratorService } from "../../../orchestrators/snapshot/service.mjs";
3
+ import { Context, Effect, FileSystem } from "effect";
4
+ //#region src/substrate/runtime/control-plane/domain.ts
5
+ /** Enumerate every resolved plugin value, in graph order, as
6
+ * `{ pluginKey, id, value }` triples. Skips nodes with no resolved value.
7
+ * The substrate never inspects `id` or `value` — they pass through
8
+ * uninterpreted. */
9
+ const enumerateResolvedValues = (graph, registry) => {
10
+ const out = [];
11
+ for (const [key, node] of graph.nodes) {
12
+ const value = readResolvedSync(registry, key);
13
+ if (value === void 0 || value === null) continue;
14
+ out.push({
15
+ pluginKey: String(key),
16
+ id: node.member.id,
17
+ value
18
+ });
19
+ }
20
+ return out;
21
+ };
22
+ const snapshotEntryFrom = (entry) => {
23
+ const m = entry.metadata;
24
+ return {
25
+ id: entry.id,
26
+ label: m?.label ?? null,
27
+ createdAt: m?.createdAt ?? null,
28
+ app: m?.app ?? null,
29
+ stack: m?.stack ?? null,
30
+ network: m?.network ?? null,
31
+ participants: m?.participants ?? [],
32
+ containerCount: m?.containers?.length ?? 0,
33
+ subtreeCount: m?.subtrees?.length ?? 0,
34
+ corrupt: m === null
35
+ };
36
+ };
37
+ const buildControlPlaneDomain = (deps) => {
38
+ const { graph, registry, snapshotOrchestrator, fileSystem, logStore, spanStore } = deps;
39
+ const provideFs = (eff) => fileSystem === null ? Effect.die("control-plane: FileSystem unavailable") : Effect.provideService(eff, FileSystem.FileSystem, fileSystem);
40
+ const snapshots = snapshotOrchestrator === null ? Effect.succeed([]) : provideFs(snapshotOrchestrator.list).pipe(Effect.map((entries) => entries.map(snapshotEntryFrom)), Effect.catchCause(() => Effect.succeed([])));
41
+ const restoreSnapshot = (id) => snapshotOrchestrator === null ? Effect.succeed({
42
+ ok: false,
43
+ detail: "snapshot orchestrator unavailable"
44
+ }) : provideFs(snapshotOrchestrator.restore({ id })).pipe(Effect.map(() => ({
45
+ ok: true,
46
+ detail: null
47
+ })), Effect.catchCause((cause) => Effect.succeed({
48
+ ok: false,
49
+ detail: String(cause)
50
+ })));
51
+ const deleteSnapshot = (id) => snapshotOrchestrator === null ? Effect.succeed({
52
+ ok: false,
53
+ detail: "snapshot orchestrator unavailable"
54
+ }) : provideFs(snapshotOrchestrator.delete(id)).pipe(Effect.map(() => ({
55
+ ok: true,
56
+ detail: null
57
+ })), Effect.catchCause((cause) => Effect.succeed({
58
+ ok: false,
59
+ detail: String(cause)
60
+ })));
61
+ const resolvedValues = Effect.sync(() => enumerateResolvedValues(graph, registry));
62
+ const logs = (filter) => logStore === null ? Effect.succeed([]) : logStore.query(filter);
63
+ const logServices = logStore === null ? Effect.succeed([]) : logStore.services;
64
+ const spans = (filter) => spanStore === null ? Effect.succeed([]) : spanStore.query(filter);
65
+ return {
66
+ snapshots,
67
+ restoreSnapshot,
68
+ deleteSnapshot,
69
+ resolvedValues,
70
+ logs,
71
+ logServices,
72
+ spans,
73
+ spanServices: spanStore === null ? Effect.succeed([]) : spanStore.services
74
+ };
75
+ };
76
+ Effect.succeed([]), Effect.succeed([]), Effect.succeed([]), Effect.succeed([]);
77
+ /** Read an optional service value out of a `Context.Context<never>`,
78
+ * returning `null` when absent. */
79
+ const readOptional = (ctx, tag) => {
80
+ const opt = Context.getOption(ctx, tag);
81
+ return opt._tag === "Some" ? opt.value : null;
82
+ };
83
+ /** Build the control-plane domain by reading the optional snapshot
84
+ * orchestrator / filesystem services out of the supervisor's
85
+ * `pluginContext`. The supervisor calls THIS (not `buildControlPlaneDomain`
86
+ * directly) so the L3 service tag stays imported only inside the
87
+ * control-plane seam, never in the supervisor core. Each is optional: bare
88
+ * smoke-test `supervise()` paths don't layer them, so the corresponding
89
+ * accessors degrade to empty. */
90
+ const controlPlaneDomainFromContext = (args) => buildControlPlaneDomain({
91
+ graph: args.graph,
92
+ registry: args.registry,
93
+ snapshotOrchestrator: readOptional(args.pluginContext, SnapshotOrchestratorService),
94
+ fileSystem: readOptional(args.pluginContext, FileSystem.FileSystem),
95
+ logStore: args.logStore ?? null,
96
+ spanStore: args.spanStore ?? null
97
+ });
98
+ //#endregion
99
+ export { controlPlaneDomainFromContext };
100
+
101
+ //# sourceMappingURL=domain.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.mjs","names":[],"sources":["../../../../src/substrate/runtime/control-plane/domain.ts"],"sourcesContent":["// Control-plane domain builder.\n//\n// Assembles the generic, name-blind `ControlPlaneDomain` accessor surface\n// from the data the supervisor holds at wiring time: the resolved plugin\n// registry + graph, the (optional) snapshot orchestrator + filesystem (for\n// snapshot catalog reads), and the cross-service observability stores.\n//\n// Design discipline:\n// - The projection (`SubscribableState`) is CLOSED — none of this data\n// touches it. We read resolved plugin VALUES via `readResolvedSync`,\n// the same name-blind seam `runtime-composition.ts` uses for the\n// manifest-extras lookup, and hand them out UNINTERPRETED via\n// `resolvedValues`. The substrate never pattern-matches plugin\n// names — plugin-name-aware shaping lives in the dashboard plugin\n// (allowed to name plugins), one layer up.\n// - Every accessor degrades to empty/`null` rather than failing, so a\n// single missing/uninitialised plugin can't take down a dashboard\n// query (`E = never` on the public surface).\n\nimport { Context, Effect, FileSystem } from 'effect';\n\nimport type { ResolvedGraph } from '../lifecycle/index.ts';\nimport { readResolvedSync, type PluginRegistry } from '../lifecycle/plugin-registry.ts';\n// Cross-layer seam (intentional): the control-plane domain is the single\n// place the substrate reads the L3 snapshot orchestrator, so the\n// supervisor core stays free of that import. This is a runtime VALUE import\n// (the `Context.Key` tag) — confined here.\nimport {\n\tSnapshotOrchestratorService,\n\ttype SnapshotOrchestrator,\n} from '../../../orchestrators/snapshot/service.ts';\nimport type {\n\tControlPlaneDomain,\n\tControlPlaneResolvedValue,\n\tControlPlaneSnapshotEntry,\n} from './service.ts';\nimport type { LogStoreShape, SpanStoreShape } from '../observability/index.ts';\n\n// -----------------------------------------------------------------------------\n// Generic resolved-value enumeration\n//\n// We import NO plugin types — the plugins live above the substrate in the\n// layering. We hand out the opaque `unknown` resolved value alongside its\n// registry key + resource id; the consumer (the dashboard plugin) does any\n// narrowing/shaping by resource-id prefix itself.\n// -----------------------------------------------------------------------------\n\n/** Enumerate every resolved plugin value, in graph order, as\n * `{ pluginKey, id, value }` triples. Skips nodes with no resolved value.\n * The substrate never inspects `id` or `value` — they pass through\n * uninterpreted. */\nconst enumerateResolvedValues = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n): ReadonlyArray<ControlPlaneResolvedValue> => {\n\tconst out: Array<ControlPlaneResolvedValue> = [];\n\tfor (const [key, node] of graph.nodes) {\n\t\tconst value = readResolvedSync(registry, key);\n\t\tif (value === undefined || value === null) continue;\n\t\tout.push({ pluginKey: String(key), id: node.member.id, value });\n\t}\n\treturn out;\n};\n\n// -----------------------------------------------------------------------------\n// Snapshot catalog projection\n// -----------------------------------------------------------------------------\n\nconst snapshotEntryFrom = (entry: {\n\treadonly id: string;\n\treadonly metadata: {\n\t\treadonly label?: string | null;\n\t\treadonly createdAt?: number;\n\t\treadonly app?: string;\n\t\treadonly stack?: string;\n\t\treadonly network?: string;\n\t\treadonly participants?: ReadonlyArray<string>;\n\t\treadonly containers?: ReadonlyArray<unknown>;\n\t\treadonly subtrees?: ReadonlyArray<unknown>;\n\t} | null;\n}): ControlPlaneSnapshotEntry => {\n\tconst m = entry.metadata;\n\treturn {\n\t\tid: entry.id,\n\t\tlabel: m?.label ?? null,\n\t\tcreatedAt: m?.createdAt ?? null,\n\t\tapp: m?.app ?? null,\n\t\tstack: m?.stack ?? null,\n\t\tnetwork: m?.network ?? null,\n\t\tparticipants: m?.participants ?? [],\n\t\tcontainerCount: m?.containers?.length ?? 0,\n\t\tsubtreeCount: m?.subtrees?.length ?? 0,\n\t\tcorrupt: m === null,\n\t};\n};\n\n// -----------------------------------------------------------------------------\n// Builder\n// -----------------------------------------------------------------------------\n\nexport interface ControlPlaneDomainDeps {\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\t/** Optional — present in production wiring (CLI / runStack), absent in\n\t * bare smoke tests. Snapshot accessors degrade to empty when missing. */\n\treadonly snapshotOrchestrator: SnapshotOrchestrator | null;\n\t/** Optional filesystem (snapshot orchestrator effects require it). */\n\treadonly fileSystem: FileSystem.FileSystem | null;\n\t/** Optional cross-service log store. Absent in bare smoke-test paths;\n\t * the `logs`/`logServices` accessors degrade to empty when null. */\n\treadonly logStore: LogStoreShape | null;\n\t/** Optional completed-span store. Absent in bare smoke-test paths; the\n\t * `spans`/`spanServices` accessors degrade to empty when null. */\n\treadonly spanStore: SpanStoreShape | null;\n}\n\nexport const buildControlPlaneDomain = (deps: ControlPlaneDomainDeps): ControlPlaneDomain => {\n\tconst { graph, registry, snapshotOrchestrator, fileSystem, logStore, spanStore } = deps;\n\n\tconst provideFs = <A, E>(eff: Effect.Effect<A, E, FileSystem.FileSystem>): Effect.Effect<A, E> =>\n\t\tfileSystem === null\n\t\t\t? (Effect.die('control-plane: FileSystem unavailable') as Effect.Effect<A, E>)\n\t\t\t: Effect.provideService(eff, FileSystem.FileSystem, fileSystem);\n\n\tconst snapshots: ControlPlaneDomain['snapshots'] =\n\t\tsnapshotOrchestrator === null\n\t\t\t? Effect.succeed([])\n\t\t\t: provideFs(snapshotOrchestrator.list).pipe(\n\t\t\t\t\tEffect.map((entries) => entries.map(snapshotEntryFrom)),\n\t\t\t\t\tEffect.catchCause(() => Effect.succeed([] as ReadonlyArray<ControlPlaneSnapshotEntry>)),\n\t\t\t\t);\n\n\tconst restoreSnapshot: ControlPlaneDomain['restoreSnapshot'] = (id) =>\n\t\tsnapshotOrchestrator === null\n\t\t\t? Effect.succeed({ ok: false, detail: 'snapshot orchestrator unavailable' as string | null })\n\t\t\t: provideFs(snapshotOrchestrator.restore({ id })).pipe(\n\t\t\t\t\tEffect.map(() => ({ ok: true, detail: null as string | null })),\n\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\tEffect.succeed({ ok: false, detail: String(cause) as string | null }),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\tconst deleteSnapshot: ControlPlaneDomain['deleteSnapshot'] = (id) =>\n\t\tsnapshotOrchestrator === null\n\t\t\t? Effect.succeed({ ok: false, detail: 'snapshot orchestrator unavailable' as string | null })\n\t\t\t: provideFs(snapshotOrchestrator.delete(id)).pipe(\n\t\t\t\t\tEffect.map(() => ({ ok: true, detail: null as string | null })),\n\t\t\t\t\tEffect.catchCause((cause) =>\n\t\t\t\t\t\tEffect.succeed({ ok: false, detail: String(cause) as string | null }),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t// Generic, name-blind resolved-value enumeration. The seam the\n\t// dashboard plugin uses to find + shape plugin-domain values itself.\n\tconst resolvedValues: ControlPlaneDomain['resolvedValues'] = Effect.sync(() =>\n\t\tenumerateResolvedValues(graph, registry),\n\t);\n\n\t// Observability accessors. These read the process-scoped stores the\n\t// supervisor created (fed off the same Logger path as the projection\n\t// tail / the recording Tracer). Filtering happens server-side in the\n\t// store; the dashboard never pulls the whole ring across the wire.\n\t// Each degrades to empty when the corresponding store is absent.\n\tconst logs: ControlPlaneDomain['logs'] = (filter) =>\n\t\tlogStore === null ? Effect.succeed([]) : logStore.query(filter);\n\n\tconst logServices: ControlPlaneDomain['logServices'] =\n\t\tlogStore === null ? Effect.succeed([]) : logStore.services;\n\n\tconst spans: ControlPlaneDomain['spans'] = (filter) =>\n\t\tspanStore === null ? Effect.succeed([]) : spanStore.query(filter);\n\n\tconst spanServices: ControlPlaneDomain['spanServices'] =\n\t\tspanStore === null ? Effect.succeed([]) : spanStore.services;\n\n\treturn {\n\t\tsnapshots,\n\t\trestoreSnapshot,\n\t\tdeleteSnapshot,\n\t\tresolvedValues,\n\t\tlogs,\n\t\tlogServices,\n\t\tspans,\n\t\tspanServices,\n\t};\n};\n\n/** An all-empty domain surface. Used by bare smoke-test paths and the\n * dashboard server tests that exercise the projection/command plane\n * without a live registry. Every accessor resolves to empty/`null`. */\nexport const emptyControlPlaneDomain: ControlPlaneDomain = {\n\tsnapshots: Effect.succeed([]),\n\trestoreSnapshot: () => Effect.succeed({ ok: false, detail: 'unavailable' }),\n\tdeleteSnapshot: () => Effect.succeed({ ok: false, detail: 'unavailable' }),\n\tresolvedValues: Effect.succeed([]),\n\tlogs: () => Effect.succeed([]),\n\tlogServices: Effect.succeed([]),\n\tspans: () => Effect.succeed([]),\n\tspanServices: Effect.succeed([]),\n};\n\n/** Read an optional service value out of a `Context.Context<never>`,\n * returning `null` when absent. */\nconst readOptional = <S, I>(ctx: Context.Context<never>, tag: Context.Key<I, S>): S | null => {\n\tconst opt = Context.getOption(ctx as Context.Context<I>, tag);\n\treturn opt._tag === 'Some' ? opt.value : null;\n};\n\n/** Build the control-plane domain by reading the optional snapshot\n * orchestrator / filesystem services out of the supervisor's\n * `pluginContext`. The supervisor calls THIS (not `buildControlPlaneDomain`\n * directly) so the L3 service tag stays imported only inside the\n * control-plane seam, never in the supervisor core. Each is optional: bare\n * smoke-test `supervise()` paths don't layer them, so the corresponding\n * accessors degrade to empty. */\nexport const controlPlaneDomainFromContext = (args: {\n\treadonly pluginContext: Context.Context<never>;\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\t/** The supervisor's process-scoped log store, passed directly (it is\n\t * created in the supervisor closure, not layered into `pluginContext`).\n\t * `null` in bare smoke-test paths that don't build one. */\n\treadonly logStore?: LogStoreShape | null;\n\t/** The supervisor's process-scoped span store, passed directly. `null`\n\t * in bare smoke-test paths. */\n\treadonly spanStore?: SpanStoreShape | null;\n}): ControlPlaneDomain =>\n\tbuildControlPlaneDomain({\n\t\tgraph: args.graph,\n\t\tregistry: args.registry,\n\t\tsnapshotOrchestrator: readOptional(args.pluginContext, SnapshotOrchestratorService),\n\t\tfileSystem: readOptional(args.pluginContext, FileSystem.FileSystem),\n\t\tlogStore: args.logStore ?? null,\n\t\tspanStore: args.spanStore ?? null,\n\t});\n"],"mappings":";;;;;;;;AAmDA,MAAM,2BACL,OACA,aAC8C;CAC9C,MAAM,MAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,KAAK,SAAS,MAAM,OAAO;EACtC,MAAM,QAAQ,iBAAiB,UAAU,IAAI;AAC7C,MAAI,UAAU,KAAA,KAAa,UAAU,KAAM;AAC3C,MAAI,KAAK;GAAE,WAAW,OAAO,IAAI;GAAE,IAAI,KAAK,OAAO;GAAI;GAAO,CAAC;;AAEhE,QAAO;;AAOR,MAAM,qBAAqB,UAYM;CAChC,MAAM,IAAI,MAAM;AAChB,QAAO;EACN,IAAI,MAAM;EACV,OAAO,GAAG,SAAS;EACnB,WAAW,GAAG,aAAa;EAC3B,KAAK,GAAG,OAAO;EACf,OAAO,GAAG,SAAS;EACnB,SAAS,GAAG,WAAW;EACvB,cAAc,GAAG,gBAAgB,EAAE;EACnC,gBAAgB,GAAG,YAAY,UAAU;EACzC,cAAc,GAAG,UAAU,UAAU;EACrC,SAAS,MAAM;EACf;;AAuBF,MAAa,2BAA2B,SAAqD;CAC5F,MAAM,EAAE,OAAO,UAAU,sBAAsB,YAAY,UAAU,cAAc;CAEnF,MAAM,aAAmB,QACxB,eAAe,OACX,OAAO,IAAI,wCAAwC,GACpD,OAAO,eAAe,KAAK,WAAW,YAAY,WAAW;CAEjE,MAAM,YACL,yBAAyB,OACtB,OAAO,QAAQ,EAAE,CAAC,GAClB,UAAU,qBAAqB,KAAK,CAAC,KACrC,OAAO,KAAK,YAAY,QAAQ,IAAI,kBAAkB,CAAC,EACvD,OAAO,iBAAiB,OAAO,QAAQ,EAAE,CAA6C,CAAC,CACvF;CAEJ,MAAM,mBAA0D,OAC/D,yBAAyB,OACtB,OAAO,QAAQ;EAAE,IAAI;EAAO,QAAQ;EAAsD,CAAC,GAC3F,UAAU,qBAAqB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAChD,OAAO,WAAW;EAAE,IAAI;EAAM,QAAQ;EAAuB,EAAE,EAC/D,OAAO,YAAY,UAClB,OAAO,QAAQ;EAAE,IAAI;EAAO,QAAQ,OAAO,MAAM;EAAmB,CAAC,CACrE,CACD;CAEJ,MAAM,kBAAwD,OAC7D,yBAAyB,OACtB,OAAO,QAAQ;EAAE,IAAI;EAAO,QAAQ;EAAsD,CAAC,GAC3F,UAAU,qBAAqB,OAAO,GAAG,CAAC,CAAC,KAC3C,OAAO,WAAW;EAAE,IAAI;EAAM,QAAQ;EAAuB,EAAE,EAC/D,OAAO,YAAY,UAClB,OAAO,QAAQ;EAAE,IAAI;EAAO,QAAQ,OAAO,MAAM;EAAmB,CAAC,CACrE,CACD;CAIJ,MAAM,iBAAuD,OAAO,WACnE,wBAAwB,OAAO,SAAS,CACxC;CAOD,MAAM,QAAoC,WACzC,aAAa,OAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,SAAS,MAAM,OAAO;CAEhE,MAAM,cACL,aAAa,OAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,SAAS;CAEnD,MAAM,SAAsC,WAC3C,cAAc,OAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,UAAU,MAAM,OAAO;AAKlE,QAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAVA,cAAc,OAAO,OAAO,QAAQ,EAAE,CAAC,GAAG,UAAU;EAWpD;;AAOU,OAAO,QAAQ,EAAE,CAAC,EAGb,OAAO,QAAQ,EAAE,CAAC,EAErB,OAAO,QAAQ,EAAE,CAAC,EAEjB,OAAO,QAAQ,EAAE,CAAC;;;AAKjC,MAAM,gBAAsB,KAA6B,QAAqC;CAC7F,MAAM,MAAM,QAAQ,UAAU,KAA2B,IAAI;AAC7D,QAAO,IAAI,SAAS,SAAS,IAAI,QAAQ;;;;;;;;;AAU1C,MAAa,iCAAiC,SAY7C,wBAAwB;CACvB,OAAO,KAAK;CACZ,UAAU,KAAK;CACf,sBAAsB,aAAa,KAAK,eAAe,4BAA4B;CACnF,YAAY,aAAa,KAAK,eAAe,WAAW,WAAW;CACnE,UAAU,KAAK,YAAY;CAC3B,WAAW,KAAK,aAAa;CAC7B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Context } from "effect";
2
+ //#region src/substrate/runtime/control-plane/service.ts
3
+ var ControlPlaneService = class extends Context.Service()("@devstack/substrate/ControlPlane") {};
4
+ //#endregion
5
+ export { ControlPlaneService };
6
+
7
+ //# sourceMappingURL=service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.mjs","names":[],"sources":["../../../../src/substrate/runtime/control-plane/service.ts"],"sourcesContent":["// Control-plane seam exposed to in-process surfaces (the dashboard plugin).\n//\n// Plugins don't normally receive the supervisor's projection ref, event\n// hub, or command channel — those live in `SupervisorState`. This service\n// hands an in-process surface (the dashboard) a read view of the live\n// projection plus a fire-and-forget command publisher, so it can render\n// state and issue controls without reaching into supervisor internals.\n//\n// The projection ref is process-scoped and survives engine cycles, so a\n// subscriber stays valid across `stack.restart` (only `cycle.id` bumps).\n// Command dispatch mirrors the queue publisher the TUI uses: offer onto\n// the supervisor's command queue and observe the effect via `state`.\n//\n// The `domain` surface is GENERIC and name-blind: it exposes the snapshot\n// catalog + restore/delete (which never round-trip through the void\n// `publishCommand`), the cross-service observability rings, and a single\n// generic `resolvedValues` accessor that hands out resolved plugin VALUES\n// WITHOUT interpreting them. Plugin-name-aware shaping (deepbook/seal/coin/\n// postgres/mode/mint) lives ABOVE the substrate in the dashboard plugin,\n// which is allowed to name plugins. The projection (`SubscribableState`)\n// stays CLOSED — none of this leaks into it. Each accessor is a\n// self-contained `Effect` the supervisor populates from the resolved\n// registry / snapshot orchestrator it holds at wiring time.\n\nimport { Context, type Effect, type SubscriptionRef } from 'effect';\nimport type { EngineCommand } from '../../events.ts';\nimport type { SubscribableState } from '../../projection.ts';\nimport type {\n\tLogFilter,\n\tLogRecord,\n\tSpanFilter,\n\tSpanRecord,\n} from '../observability/index.ts';\n\n// -----------------------------------------------------------------------------\n// Domain data shapes — app-agnostic projections of plugin-resolved values.\n// These intentionally stay generic so the control-plane surface and the\n// dashboard schema stay decoupled from plugin internals.\n// -----------------------------------------------------------------------------\n\n/** One catalog entry the snapshot orchestrator's `list` produced. */\nexport interface ControlPlaneSnapshotEntry {\n\treadonly id: string;\n\treadonly label: string | null;\n\treadonly createdAt: number | null;\n\treadonly app: string | null;\n\treadonly stack: string | null;\n\treadonly network: string | null;\n\treadonly participants: ReadonlyArray<string>;\n\treadonly containerCount: number;\n\treadonly subtreeCount: number;\n\t/** `true` when the metadata file was absent/corrupt (do-not-trust). */\n\treadonly corrupt: boolean;\n}\n\n/** One resolved plugin value, handed out GENERICALLY (uninterpreted) so an\n * in-process surface above the substrate (the dashboard plugin) can match\n * + shape it by resource-id prefix itself. `id` is the resource id the\n * plugin factory minted (an opaque string here — the substrate never\n * pattern-matches it); `pluginKey` is the registry key for the node. The\n * substrate imports NO plugin types — `value` is genuinely `unknown`. */\nexport interface ControlPlaneResolvedValue {\n\t/** The registry key for the resolved node. */\n\treadonly pluginKey: string;\n\t/** The resource id the plugin factory minted (opaque to the substrate). */\n\treadonly id: string;\n\t/** The resolved plugin value, uninterpreted. */\n\treadonly value: unknown;\n}\n\n/** The plugin-domain accessor surface. GENERIC + name-blind: it exposes\n * the snapshot catalog, the observability rings, and a single generic\n * `resolvedValues` accessor. Each member is a self-contained Effect the\n * supervisor wires from the data it holds at boot. The Effects never fail\n * (`E = never`); they degrade to empty/`null` so a single missing plugin\n * can't take down the dashboard query. */\nexport interface ControlPlaneDomain {\n\t/** Snapshot catalog (id/label/created/participants/containers). */\n\treadonly snapshots: Effect.Effect<ReadonlyArray<ControlPlaneSnapshotEntry>>;\n\t/** Restore a snapshot by id. Mirrors the orchestrator surface so the\n\t * dashboard gets a real result the void `publishCommand` can't carry. */\n\treadonly restoreSnapshot: (id: string) => Effect.Effect<{ readonly ok: boolean; readonly detail: string | null }>;\n\t/** Delete a snapshot by id. */\n\treadonly deleteSnapshot: (id: string) => Effect.Effect<{ readonly ok: boolean; readonly detail: string | null }>;\n\t/** ALL resolved plugin values, in graph order, handed out\n\t * uninterpreted. The seam an in-process surface above the substrate\n\t * (the dashboard plugin) uses to find + shape plugin-domain values\n\t * itself — the substrate stays name-blind. */\n\treadonly resolvedValues: Effect.Effect<ReadonlyArray<ControlPlaneResolvedValue>>;\n\t/** Cross-service queryable log history (the dashboard Console \"Logs\"\n\t * tab). Filterable by service / level / substring / time window; the\n\t * per-row projection tail is a separate, row-scoped surface. Degrades\n\t * to empty when no log store is wired. */\n\treadonly logs: (filter?: LogFilter) => Effect.Effect<ReadonlyArray<LogRecord>>;\n\t/** Distinct services currently present in the log ring (filter UI). */\n\treadonly logServices: Effect.Effect<ReadonlyArray<string>>;\n\t/** Completed-span ring (the dashboard Console \"Traces\" tab). Filterable\n\t * by service / status / substring / time window. Degrades to empty when\n\t * no span store is wired. */\n\treadonly spans: (filter?: SpanFilter) => Effect.Effect<ReadonlyArray<SpanRecord>>;\n\t/** Distinct services currently present in the span ring (filter UI). */\n\treadonly spanServices: Effect.Effect<ReadonlyArray<string>>;\n}\n\nexport interface ControlPlane {\n\t/** Live projection ref. Read a snapshot with `SubscriptionRef.get`,\n\t * subscribe to updates with `SubscriptionRef.changes`. */\n\treadonly state: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\t/** Publish a command to the supervisor (fire-and-forget). Observe the\n\t * resulting effect via the projection `state`. */\n\treadonly publishCommand: (command: EngineCommand) => Effect.Effect<void>;\n\t/** Generic, name-blind plugin-domain accessors (snapshot catalog,\n\t * observability rings, resolved plugin values). See\n\t * `ControlPlaneDomain`. */\n\treadonly domain: ControlPlaneDomain;\n}\n\nexport class ControlPlaneService extends Context.Service<ControlPlaneService, ControlPlane>()(\n\t'@devstack/substrate/ControlPlane',\n) {}\n"],"mappings":";;AAqHA,IAAa,sBAAb,cAAyC,QAAQ,SAA4C,CAC5F,mCACA,CAAC"}
@@ -1,7 +1,9 @@
1
+ import { selfPid } from "../self-pid.mjs";
1
2
  import { decodeUnknownSync } from "../../runtime-decode.mjs";
2
3
  import { CommandRecordSchema, EventRecordSchema } from "./protocol.mjs";
3
- import { appendRecord, ensureFile, tailRecords } from "./file-channel.mjs";
4
+ import { CommandChannelIoError, appendRecord, ensureFile, tailRecords } from "./file-channel.mjs";
4
5
  import { Effect, Option, Ref, Stream } from "effect";
6
+ import { existsSync, statSync } from "node:fs";
5
7
  import { randomUUID } from "node:crypto";
6
8
  import { hostname } from "node:os";
7
9
  //#region src/substrate/runtime/cross-process/command-channel/channel.ts
@@ -13,6 +15,11 @@ const commandChannelPaths = (stackRoot) => ({
13
15
  commandsFile: `${stackRoot}/${COMMAND_CHANNEL_COMMANDS_FILE_NAME}`,
14
16
  eventsFile: `${stackRoot}/${COMMAND_CHANNEL_EVENTS_FILE_NAME}`
15
17
  });
18
+ /** Default bound for `awaitCompletion` when the caller passes no
19
+ * `timeoutMillis`. A correlated ack/error normally lands within tens of
20
+ * ms; an absent reply (supervisor died mid-handle, dropped record) must
21
+ * NOT park the await fiber forever, so the wait is always bounded. */
22
+ const DEFAULT_AWAIT_COMPLETION_MILLIS = 3e4;
16
23
  const nextSeq = (state) => Ref.modify(state.seq, (n) => [n + 1, n + 1]);
17
24
  /**
18
25
  * Build the publisher half. The events Stream is scope-bound:
@@ -23,11 +30,19 @@ const makeCommandChannelPublisher = (paths) => Effect.gen(function* () {
23
30
  yield* ensureFile(paths.commandsFile);
24
31
  yield* ensureFile(paths.eventsFile);
25
32
  const state = { seq: yield* Ref.make(0) };
26
- const pid = process.pid;
33
+ const pid = selfPid();
27
34
  const host = hostname();
28
35
  const publish = (command) => Effect.gen(function* () {
29
36
  const seq = yield* nextSeq(state);
30
37
  const id = `${pid}-${seq}-${randomUUID().slice(0, 8)}`;
38
+ const fromOffset = yield* Effect.try({
39
+ try: () => existsSync(paths.eventsFile) ? statSync(paths.eventsFile).size : 0,
40
+ catch: (cause) => new CommandChannelIoError({
41
+ path: paths.eventsFile,
42
+ stage: "stat",
43
+ cause
44
+ })
45
+ });
31
46
  const record = {
32
47
  protocol: 1,
33
48
  seq,
@@ -38,29 +53,39 @@ const makeCommandChannelPublisher = (paths) => Effect.gen(function* () {
38
53
  command
39
54
  };
40
55
  yield* appendRecord(paths.commandsFile, record);
41
- return { id };
56
+ return {
57
+ id,
58
+ fromOffset
59
+ };
42
60
  });
43
61
  const decodeEvent = (raw) => decodeUnknownSync(EventRecordSchema, raw, {
44
62
  source: "command-channel event",
45
63
  mkError: (issue) => issue
46
64
  });
47
- const events = tailRecords(paths.eventsFile, (raw) => decodeEvent(raw), { fromOffset: "current" });
48
- const findReply = (id) => Stream.runHead(tailRecords(paths.eventsFile, (raw) => decodeEvent(raw), { fromOffset: "start" }).pipe(Stream.filter((rec) => (rec.kind === "ack" || rec.kind === "error") && rec.correlatesTo === id), Stream.take(1)));
49
- const awaitCompletion = (id, options = {}) => {
50
- const withScope = Effect.scoped(findReply(id));
51
- return (options.timeoutMillis !== void 0 ? withScope.pipe(Effect.timeoutOption(`${options.timeoutMillis} millis`), Effect.map((outer) => Option.flatten(outer))) : withScope).pipe(Effect.map((reply) => {
65
+ const events = tailRecords(paths.eventsFile, (raw) => decodeEvent(raw), {
66
+ fromOffset: "current",
67
+ onDecodeError: "skip"
68
+ });
69
+ const findReply = (id, fromOffset) => Stream.runHead(tailRecords(paths.eventsFile, (raw) => decodeEvent(raw), {
70
+ fromOffset,
71
+ onDecodeError: "skip"
72
+ }).pipe(Stream.filter((rec) => (rec.kind === "ack" || rec.kind === "error") && rec.correlatesTo === id), Stream.take(1)));
73
+ const awaitCompletion = (published, options = {}) => {
74
+ const timeoutMillis = options.timeoutMillis ?? 3e4;
75
+ return Effect.scoped(findReply(published.id, published.fromOffset)).pipe(Effect.timeoutOption(`${timeoutMillis} millis`), Effect.map((outer) => Option.flatten(outer))).pipe(Effect.map((reply) => {
52
76
  const inner = Option.getOrNull(reply);
53
- if (inner === null) return options.timeoutMillis !== void 0 ? {
77
+ if (inner === null) return {
54
78
  ok: false,
55
79
  message: "timed out waiting for ack"
56
- } : {
57
- ok: false,
58
- message: "no reply"
59
80
  };
60
- if (inner.kind === "ack") return { ok: true };
81
+ if (inner.kind === "ack") return inner.payload !== void 0 ? {
82
+ ok: true,
83
+ payload: inner.payload
84
+ } : { ok: true };
61
85
  return {
62
86
  ok: false,
63
- message: inner.detail ? `${inner.message}: ${inner.detail}` : inner.message
87
+ message: inner.detail ? `${inner.message}: ${inner.detail}` : inner.message,
88
+ ...inner.payload !== void 0 ? { payload: inner.payload } : {}
64
89
  };
65
90
  }));
66
91
  };
@@ -94,17 +119,18 @@ const makeCommandChannelSubscriber = (paths, options = {}) => Effect.gen(functio
94
119
  event
95
120
  });
96
121
  });
97
- const ack = (correlatesTo, detail) => Effect.gen(function* () {
122
+ const ack = (correlatesTo, detail, payload) => Effect.gen(function* () {
98
123
  yield* writeEvent({
99
124
  protocol: 1,
100
125
  seq: yield* nextSubSeq(state),
101
126
  at: Date.now(),
102
127
  kind: "ack",
103
128
  correlatesTo,
104
- ...detail !== void 0 ? { detail } : {}
129
+ ...detail !== void 0 ? { detail } : {},
130
+ ...payload !== void 0 ? { payload } : {}
105
131
  });
106
132
  });
107
- const fail = (correlatesTo, message, detail) => Effect.gen(function* () {
133
+ const fail = (correlatesTo, message, detail, payload) => Effect.gen(function* () {
108
134
  yield* writeEvent({
109
135
  protocol: 1,
110
136
  seq: yield* nextSubSeq(state),
@@ -112,7 +138,8 @@ const makeCommandChannelSubscriber = (paths, options = {}) => Effect.gen(functio
112
138
  kind: "error",
113
139
  correlatesTo,
114
140
  message,
115
- ...detail !== void 0 ? { detail } : {}
141
+ ...detail !== void 0 ? { detail } : {},
142
+ ...payload !== void 0 ? { payload } : {}
116
143
  });
117
144
  });
118
145
  return {
@@ -123,6 +150,6 @@ const makeCommandChannelSubscriber = (paths, options = {}) => Effect.gen(functio
123
150
  };
124
151
  });
125
152
  //#endregion
126
- export { COMMAND_CHANNEL_COMMANDS_FILE_NAME, COMMAND_CHANNEL_EVENTS_FILE_NAME, commandChannelPaths, makeCommandChannelPublisher, makeCommandChannelSubscriber };
153
+ export { COMMAND_CHANNEL_COMMANDS_FILE_NAME, COMMAND_CHANNEL_EVENTS_FILE_NAME, DEFAULT_AWAIT_COMPLETION_MILLIS, commandChannelPaths, makeCommandChannelPublisher, makeCommandChannelSubscriber };
127
154
 
128
155
  //# sourceMappingURL=channel.mjs.map