@mysten-incubation/devstack 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/README.md +6 -3
  2. package/dashboard-ui/assets/grpc-a4usE3Nk.js +3 -0
  3. package/dashboard-ui/assets/index-B82Bh84P.css +1 -0
  4. package/dashboard-ui/assets/index-CRYJ4pru.js +1277 -0
  5. package/dashboard-ui/index.html +2 -2
  6. package/dist/api/define-capabilities.d.mts +1 -20
  7. package/dist/api/define-capabilities.mjs +15 -22
  8. package/dist/api/define-capabilities.mjs.map +1 -1
  9. package/dist/api/define-devstack-with.d.mts +7 -1
  10. package/dist/api/define-devstack-with.mjs.map +1 -1
  11. package/dist/api/define-devstack.mjs.map +1 -1
  12. package/dist/api/define-plugin.d.mts +2 -1
  13. package/dist/api/inference-network.d.mts +31 -17
  14. package/dist/api/inference-network.mjs +40 -43
  15. package/dist/api/inference-network.mjs.map +1 -1
  16. package/dist/api/load-config.mjs +88 -0
  17. package/dist/api/load-config.mjs.map +1 -0
  18. package/dist/api/mode-narrowed-factory.d.mts +1 -1
  19. package/dist/api/mode-narrowed-factory.mjs.map +1 -1
  20. package/dist/api/run-stack-internal.mjs +202 -0
  21. package/dist/api/run-stack-internal.mjs.map +1 -0
  22. package/dist/api/run-stack.d.mts +82 -31
  23. package/dist/api/run-stack.mjs +22 -141
  24. package/dist/api/run-stack.mjs.map +1 -1
  25. package/dist/build-integrations/dapp-kit/index.d.mts +61 -0
  26. package/dist/build-integrations/dapp-kit/index.mjs +58 -0
  27. package/dist/build-integrations/dapp-kit/index.mjs.map +1 -0
  28. package/dist/build-integrations/playwright/config.d.mts +1 -30
  29. package/dist/build-integrations/playwright/config.mjs +1 -27
  30. package/dist/build-integrations/playwright/config.mjs.map +1 -1
  31. package/dist/build-integrations/playwright/errors.d.mts +4 -7
  32. package/dist/build-integrations/playwright/errors.mjs.map +1 -1
  33. package/dist/build-integrations/playwright/global-setup.d.mts +42 -71
  34. package/dist/build-integrations/playwright/global-setup.mjs +142 -218
  35. package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
  36. package/dist/build-integrations/playwright/index.d.mts +2 -2
  37. package/dist/build-integrations/playwright/index.mjs +2 -2
  38. package/dist/build-integrations/playwright/stack-context.d.mts +3 -1
  39. package/dist/build-integrations/playwright/stack-context.mjs +4 -2
  40. package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
  41. package/dist/build-integrations/playwright/wallet-context.mjs +44 -19
  42. package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
  43. package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
  44. package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -1
  45. package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -1
  46. package/dist/build-integrations/runtime/discover.d.mts +6 -4
  47. package/dist/build-integrations/runtime/discover.mjs +15 -4
  48. package/dist/build-integrations/runtime/discover.mjs.map +1 -1
  49. package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
  50. package/dist/build-integrations/runtime/errors.mjs.map +1 -1
  51. package/dist/build-integrations/runtime/read-stack-context.mjs +3 -3
  52. package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
  53. package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +23 -7
  54. package/dist/build-integrations/runtime/resolve-discovery-env.mjs +25 -12
  55. package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -1
  56. package/dist/build-integrations/runtime/stack-context.d.mts +2 -2
  57. package/dist/build-integrations/vite/index.d.mts +84 -19
  58. package/dist/build-integrations/vite/index.mjs +203 -28
  59. package/dist/build-integrations/vite/index.mjs.map +1 -1
  60. package/dist/build-integrations/vitest/config.d.mts +20 -2
  61. package/dist/build-integrations/vitest/config.mjs +16 -4
  62. package/dist/build-integrations/vitest/config.mjs.map +1 -1
  63. package/dist/build-integrations/vitest/env.d.mts +18 -10
  64. package/dist/build-integrations/vitest/env.mjs +11 -10
  65. package/dist/build-integrations/vitest/env.mjs.map +1 -1
  66. package/dist/build-integrations/vitest/errors.d.mts +7 -11
  67. package/dist/build-integrations/vitest/errors.mjs +3 -4
  68. package/dist/build-integrations/vitest/errors.mjs.map +1 -1
  69. package/dist/build-integrations/vitest/global-setup.d.mts +35 -0
  70. package/dist/build-integrations/vitest/global-setup.mjs +156 -0
  71. package/dist/build-integrations/vitest/global-setup.mjs.map +1 -0
  72. package/dist/build-integrations/vitest/index.d.mts +3 -2
  73. package/dist/build-integrations/vitest/index.mjs +3 -2
  74. package/dist/build-integrations/vitest/setup.mjs +2 -2
  75. package/dist/build-integrations/vitest/setup.mjs.map +1 -1
  76. package/dist/build-integrations/vitest/stack-context.d.mts +5 -3
  77. package/dist/build-integrations/vitest/stack-context.mjs +3 -2
  78. package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
  79. package/dist/cli/bail.mjs.map +1 -1
  80. package/dist/cli/doctor-probes.mjs +1 -3
  81. package/dist/cli/doctor-probes.mjs.map +1 -1
  82. package/dist/cli/main.d.mts +23 -1
  83. package/dist/cli/main.mjs +63 -8
  84. package/dist/cli/main.mjs.map +1 -1
  85. package/dist/cli/prune-direct.mjs.map +1 -1
  86. package/dist/cli/snapshot-reader.mjs.map +1 -1
  87. package/dist/cli/up-lifecycle.mjs.map +1 -1
  88. package/dist/cli/wirings/apply.mjs +28 -21
  89. package/dist/cli/wirings/apply.mjs.map +1 -1
  90. package/dist/cli/wirings/codegen.mjs +108 -0
  91. package/dist/cli/wirings/codegen.mjs.map +1 -0
  92. package/dist/cli/wirings/config-loader.mjs +12 -62
  93. package/dist/cli/wirings/config-loader.mjs.map +1 -1
  94. package/dist/cli/wirings/dump-ids.mjs +86 -0
  95. package/dist/cli/wirings/dump-ids.mjs.map +1 -0
  96. package/dist/cli/wirings/engine-command.mjs +1 -1
  97. package/dist/cli/wirings/engine-command.mjs.map +1 -1
  98. package/dist/cli/wirings/identity.mjs +2 -2
  99. package/dist/cli/wirings/identity.mjs.map +1 -1
  100. package/dist/cli/wirings/provide-file-system.mjs.map +1 -1
  101. package/dist/cli/wirings/read-devstack-version.mjs +17 -0
  102. package/dist/cli/wirings/read-devstack-version.mjs.map +1 -0
  103. package/dist/cli/wirings/snapshot.mjs +27 -34
  104. package/dist/cli/wirings/snapshot.mjs.map +1 -1
  105. package/dist/cli/wirings/up-ipc.mjs +147 -0
  106. package/dist/cli/wirings/up-ipc.mjs.map +1 -0
  107. package/dist/cli/wirings/up.mjs +218 -198
  108. package/dist/cli/wirings/up.mjs.map +1 -1
  109. package/dist/cli/wirings/wipe.mjs +1 -1
  110. package/dist/cli/wirings/wipe.mjs.map +1 -1
  111. package/dist/contracts/chain-probe.d.mts +1 -1
  112. package/dist/contracts/chain-probe.mjs +1 -1
  113. package/dist/contracts/chain-probe.mjs.map +1 -1
  114. package/dist/contracts/codegenable.d.mts +60 -6
  115. package/dist/contracts/codegenable.mjs +28 -0
  116. package/dist/contracts/codegenable.mjs.map +1 -0
  117. package/dist/contracts/config-bindings.mjs +162 -0
  118. package/dist/contracts/config-bindings.mjs.map +1 -0
  119. package/dist/contracts/container-runtime.d.mts +23 -17
  120. package/dist/contracts/plugin-expander.mjs.map +1 -1
  121. package/dist/contracts/snapshotable.d.mts +5 -7
  122. package/dist/contracts/wallet-protocol.d.mts +2 -5
  123. package/dist/contracts/wallet-protocol.mjs +2 -5
  124. package/dist/contracts/wallet-protocol.mjs.map +1 -1
  125. package/dist/index.d.mts +21 -26
  126. package/dist/index.mjs +8 -9
  127. package/dist/orchestrators/boot.d.mts +28 -0
  128. package/dist/orchestrators/boot.mjs +440 -0
  129. package/dist/orchestrators/boot.mjs.map +1 -0
  130. package/dist/orchestrators/codegen/bindings.d.mts +13 -1
  131. package/dist/orchestrators/codegen/bindings.mjs +23 -9
  132. package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
  133. package/dist/orchestrators/codegen/config-runtime.mjs +208 -0
  134. package/dist/orchestrators/codegen/config-runtime.mjs.map +1 -0
  135. package/dist/orchestrators/codegen/emit.mjs +1 -1
  136. package/dist/orchestrators/codegen/emit.mjs.map +1 -1
  137. package/dist/orchestrators/codegen/errors.mjs +21 -1
  138. package/dist/orchestrators/codegen/errors.mjs.map +1 -1
  139. package/dist/orchestrators/codegen/format.mjs +2 -0
  140. package/dist/orchestrators/codegen/format.mjs.map +1 -1
  141. package/dist/orchestrators/codegen/gitignore.mjs +30 -11
  142. package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
  143. package/dist/orchestrators/codegen/id-config.mjs +107 -0
  144. package/dist/orchestrators/codegen/id-config.mjs.map +1 -0
  145. package/dist/orchestrators/codegen/output-location.mjs +23 -32
  146. package/dist/orchestrators/codegen/output-location.mjs.map +1 -1
  147. package/dist/orchestrators/codegen/paths.mjs +8 -1
  148. package/dist/orchestrators/codegen/paths.mjs.map +1 -1
  149. package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
  150. package/dist/orchestrators/codegen/service.mjs +286 -58
  151. package/dist/orchestrators/codegen/service.mjs.map +1 -1
  152. package/dist/orchestrators/layers.mjs +31 -0
  153. package/dist/orchestrators/layers.mjs.map +1 -0
  154. package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -1
  155. package/dist/orchestrators/lifecycle-prune/index.mjs +8 -10
  156. package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -1
  157. package/dist/orchestrators/network-options.d.mts +52 -0
  158. package/dist/orchestrators/network-options.mjs +43 -0
  159. package/dist/orchestrators/network-options.mjs.map +1 -0
  160. package/dist/orchestrators/router/cleanup.mjs.map +1 -1
  161. package/dist/orchestrators/router/cors.mjs.map +1 -1
  162. package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
  163. package/dist/orchestrators/router/errors.mjs.map +1 -1
  164. package/dist/orchestrators/router/file-provider.mjs.map +1 -1
  165. package/dist/orchestrators/router/hostname.mjs.map +1 -1
  166. package/dist/orchestrators/router/profile.mjs +1 -1
  167. package/dist/orchestrators/router/profile.mjs.map +1 -1
  168. package/dist/orchestrators/router/service.d.mts +2 -2
  169. package/dist/orchestrators/router/service.mjs +12 -27
  170. package/dist/orchestrators/router/service.mjs.map +1 -1
  171. package/dist/orchestrators/router/traefik-container.mjs +1 -1
  172. package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
  173. package/dist/orchestrators/snapshot/capture.mjs +171 -195
  174. package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
  175. package/dist/orchestrators/snapshot/descriptor.d.mts +1 -1
  176. package/dist/orchestrators/snapshot/descriptor.mjs +53 -11
  177. package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
  178. package/dist/orchestrators/snapshot/identity-guard.mjs +3 -5
  179. package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -1
  180. package/dist/orchestrators/snapshot/image-bundle-tags.mjs +32 -101
  181. package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -1
  182. package/dist/orchestrators/snapshot/index.mjs +1 -4
  183. package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
  184. package/dist/orchestrators/snapshot/interrupted-restore.mjs +116 -0
  185. package/dist/orchestrators/snapshot/interrupted-restore.mjs.map +1 -0
  186. package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -1
  187. package/dist/orchestrators/snapshot/prune.mjs +40 -31
  188. package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
  189. package/dist/orchestrators/snapshot/restore.mjs +221 -196
  190. package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
  191. package/dist/orchestrators/snapshot/service.mjs +72 -62
  192. package/dist/orchestrators/snapshot/service.mjs.map +1 -1
  193. package/dist/orchestrators/snapshot/wipe.mjs +67 -56
  194. package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
  195. package/dist/plugins/account/codegen.mjs +3 -0
  196. package/dist/plugins/account/codegen.mjs.map +1 -1
  197. package/dist/plugins/account/errors.d.mts +2 -2
  198. package/dist/plugins/account/errors.mjs +1 -4
  199. package/dist/plugins/account/errors.mjs.map +1 -1
  200. package/dist/plugins/account/funding.mjs +3 -27
  201. package/dist/plugins/account/funding.mjs.map +1 -1
  202. package/dist/plugins/account/index.d.mts +3 -8
  203. package/dist/plugins/account/index.mjs +71 -35
  204. package/dist/plugins/account/index.mjs.map +1 -1
  205. package/dist/plugins/account/keypair.d.mts +8 -7
  206. package/dist/plugins/account/keypair.mjs +5 -18
  207. package/dist/plugins/account/keypair.mjs.map +1 -1
  208. package/dist/plugins/account/lease.mjs.map +1 -1
  209. package/dist/plugins/account/registry.d.mts +1 -46
  210. package/dist/plugins/account/registry.mjs.map +1 -1
  211. package/dist/plugins/account/service.d.mts +43 -34
  212. package/dist/plugins/account/service.mjs +9 -54
  213. package/dist/plugins/account/service.mjs.map +1 -1
  214. package/dist/plugins/account/snapshot.mjs.map +1 -1
  215. package/dist/plugins/account/variants/ephemeral.mjs.map +1 -1
  216. package/dist/plugins/account/variants/impersonate.mjs.map +1 -1
  217. package/dist/plugins/account/variants/signer.mjs.map +1 -1
  218. package/dist/plugins/action/discriminator.mjs.map +1 -1
  219. package/dist/plugins/action/errors.mjs +1 -4
  220. package/dist/plugins/action/errors.mjs.map +1 -1
  221. package/dist/plugins/action/execute.mjs +3 -4
  222. package/dist/plugins/action/execute.mjs.map +1 -1
  223. package/dist/plugins/action/index.d.mts +2 -2
  224. package/dist/plugins/action/index.mjs +7 -11
  225. package/dist/plugins/action/index.mjs.map +1 -1
  226. package/dist/plugins/action/service.d.mts +5 -7
  227. package/dist/plugins/action/service.mjs +2 -16
  228. package/dist/plugins/action/service.mjs.map +1 -1
  229. package/dist/plugins/coin/address-resolution.mjs.map +1 -1
  230. package/dist/plugins/coin/codegen.mjs +97 -16
  231. package/dist/plugins/coin/codegen.mjs.map +1 -1
  232. package/dist/plugins/coin/discovery.mjs.map +1 -1
  233. package/dist/plugins/coin/errors.mjs +1 -4
  234. package/dist/plugins/coin/errors.mjs.map +1 -1
  235. package/dist/plugins/coin/index.d.mts +4 -34
  236. package/dist/plugins/coin/index.mjs +47 -28
  237. package/dist/plugins/coin/index.mjs.map +1 -1
  238. package/dist/plugins/coin/metadata.d.mts +1 -0
  239. package/dist/plugins/coin/metadata.mjs +8 -9
  240. package/dist/plugins/coin/metadata.mjs.map +1 -1
  241. package/dist/plugins/coin/mint.mjs +7 -21
  242. package/dist/plugins/coin/mint.mjs.map +1 -1
  243. package/dist/plugins/coin/registry.mjs +33 -20
  244. package/dist/plugins/coin/registry.mjs.map +1 -1
  245. package/dist/plugins/coin/service.d.mts +1 -1
  246. package/dist/plugins/coin/service.mjs +1 -8
  247. package/dist/plugins/coin/service.mjs.map +1 -1
  248. package/dist/plugins/coin/snapshot.mjs.map +1 -1
  249. package/dist/plugins/coin/type-strings.mjs.map +1 -1
  250. package/dist/plugins/dashboard/domain.mjs +106 -167
  251. package/dist/plugins/dashboard/domain.mjs.map +1 -1
  252. package/dist/plugins/dashboard/index.mjs +13 -13
  253. package/dist/plugins/dashboard/index.mjs.map +1 -1
  254. package/dist/plugins/dashboard/origin-policy.mjs +3 -3
  255. package/dist/plugins/dashboard/origin-policy.mjs.map +1 -1
  256. package/dist/plugins/dashboard/routable.mjs.map +1 -1
  257. package/dist/plugins/dashboard/schema/builder.mjs.map +1 -1
  258. package/dist/plugins/dashboard/schema/enums.mjs.map +1 -1
  259. package/dist/plugins/dashboard/schema/root.mjs +23 -44
  260. package/dist/plugins/dashboard/schema/root.mjs.map +1 -1
  261. package/dist/plugins/dashboard/schema/types.mjs +37 -91
  262. package/dist/plugins/dashboard/schema/types.mjs.map +1 -1
  263. package/dist/plugins/dashboard/schema.mjs.map +1 -1
  264. package/dist/plugins/dashboard/server.mjs.map +1 -1
  265. package/dist/plugins/deepbook/codegen.d.mts +12 -11
  266. package/dist/plugins/deepbook/codegen.mjs +108 -11
  267. package/dist/plugins/deepbook/codegen.mjs.map +1 -1
  268. package/dist/plugins/deepbook/deploy.mjs +7 -14
  269. package/dist/plugins/deepbook/deploy.mjs.map +1 -1
  270. package/dist/plugins/deepbook/errors.mjs +4 -2
  271. package/dist/plugins/deepbook/errors.mjs.map +1 -1
  272. package/dist/plugins/deepbook/faucet-strategy.mjs +4 -10
  273. package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
  274. package/dist/plugins/deepbook/hash.mjs.map +1 -1
  275. package/dist/plugins/deepbook/index.d.mts +38 -34
  276. package/dist/plugins/deepbook/index.mjs +133 -64
  277. package/dist/plugins/deepbook/index.mjs.map +1 -1
  278. package/dist/plugins/deepbook/plugin-key.mjs.map +1 -1
  279. package/dist/plugins/deepbook/pyth/index.mjs +4 -8
  280. package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
  281. package/dist/plugins/deepbook/snapshot.mjs +0 -1
  282. package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
  283. package/dist/plugins/deepbook/type-strings.mjs.map +1 -1
  284. package/dist/plugins/deepbook/types.d.mts +2 -1
  285. package/dist/plugins/deepbook/types.mjs.map +1 -1
  286. package/dist/plugins/faucet/dispatcher.d.mts +3 -3
  287. package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
  288. package/dist/plugins/faucet/errors.mjs.map +1 -1
  289. package/dist/plugins/faucet/http.mjs +2 -10
  290. package/dist/plugins/faucet/http.mjs.map +1 -1
  291. package/dist/plugins/faucet/index.mjs +0 -1
  292. package/dist/plugins/faucet/index.mjs.map +1 -1
  293. package/dist/plugins/host-service/errors.d.mts +1 -3
  294. package/dist/plugins/host-service/errors.mjs +1 -2
  295. package/dist/plugins/host-service/errors.mjs.map +1 -1
  296. package/dist/plugins/host-service/index.d.mts +1 -2
  297. package/dist/plugins/host-service/index.mjs +11 -11
  298. package/dist/plugins/host-service/index.mjs.map +1 -1
  299. package/dist/plugins/host-service/routable.mjs.map +1 -1
  300. package/dist/plugins/host-service/service.mjs +13 -13
  301. package/dist/plugins/host-service/service.mjs.map +1 -1
  302. package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -1
  303. package/dist/plugins/internal/codegen-helpers.mjs +2 -0
  304. package/dist/plugins/internal/codegen-helpers.mjs.map +1 -1
  305. package/dist/plugins/internal/funding-failure-error.mjs.map +1 -1
  306. package/dist/plugins/{postgres → internal/postgres-sidecar}/connection.mjs +1 -1
  307. package/dist/plugins/internal/postgres-sidecar/connection.mjs.map +1 -0
  308. package/dist/plugins/{postgres → internal/postgres-sidecar}/db-ensure.mjs +30 -16
  309. package/dist/plugins/internal/postgres-sidecar/db-ensure.mjs.map +1 -0
  310. package/dist/plugins/internal/postgres-sidecar/errors.mjs +21 -0
  311. package/dist/plugins/internal/postgres-sidecar/errors.mjs.map +1 -0
  312. package/dist/{substrate/runtime/scoped-multimap → plugins/internal/postgres-sidecar}/index.mjs +1 -0
  313. package/dist/plugins/internal/postgres-sidecar/service.mjs +121 -0
  314. package/dist/plugins/internal/postgres-sidecar/service.mjs.map +1 -0
  315. package/dist/plugins/package/build.mjs +2 -2
  316. package/dist/plugins/package/build.mjs.map +1 -1
  317. package/dist/plugins/package/codegen.d.mts +7 -14
  318. package/dist/plugins/package/codegen.mjs +187 -59
  319. package/dist/plugins/package/codegen.mjs.map +1 -1
  320. package/dist/plugins/package/dep-resolution.mjs +51 -3
  321. package/dist/plugins/package/dep-resolution.mjs.map +1 -1
  322. package/dist/plugins/package/errors.mjs +1 -4
  323. package/dist/plugins/package/errors.mjs.map +1 -1
  324. package/dist/plugins/package/git-source.d.mts +18 -0
  325. package/dist/plugins/package/git-source.mjs +119 -0
  326. package/dist/plugins/package/git-source.mjs.map +1 -0
  327. package/dist/plugins/package/index.d.mts +28 -19
  328. package/dist/plugins/package/index.mjs +107 -32
  329. package/dist/plugins/package/index.mjs.map +1 -1
  330. package/dist/plugins/package/mode-known.mjs +2 -2
  331. package/dist/plugins/package/mode-known.mjs.map +1 -1
  332. package/dist/plugins/package/mode-local.mjs +18 -35
  333. package/dist/plugins/package/mode-local.mjs.map +1 -1
  334. package/dist/plugins/package/publish-executor.mjs +13 -8
  335. package/dist/plugins/package/publish-executor.mjs.map +1 -1
  336. package/dist/plugins/package/publish-output.d.mts +1 -11
  337. package/dist/plugins/package/publish-output.mjs +1 -9
  338. package/dist/plugins/package/publish-output.mjs.map +1 -1
  339. package/dist/plugins/package/registry.d.mts +1 -1
  340. package/dist/plugins/package/registry.mjs +26 -14
  341. package/dist/plugins/package/registry.mjs.map +1 -1
  342. package/dist/plugins/package/service.mjs.map +1 -1
  343. package/dist/plugins/package/snapshot.mjs.map +1 -1
  344. package/dist/plugins/router-entrypoints.mjs +1 -3
  345. package/dist/plugins/router-entrypoints.mjs.map +1 -1
  346. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +1 -2
  347. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
  348. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +1 -6
  349. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
  350. package/dist/plugins/seal/codegen.d.mts +1 -5
  351. package/dist/plugins/seal/codegen.mjs +83 -12
  352. package/dist/plugins/seal/codegen.mjs.map +1 -1
  353. package/dist/plugins/seal/config-render.mjs +2 -6
  354. package/dist/plugins/seal/config-render.mjs.map +1 -1
  355. package/dist/plugins/seal/deploy.mjs +18 -29
  356. package/dist/plugins/seal/deploy.mjs.map +1 -1
  357. package/dist/plugins/seal/errors.d.mts +4 -5
  358. package/dist/plugins/seal/errors.mjs +1 -8
  359. package/dist/plugins/seal/errors.mjs.map +1 -1
  360. package/dist/plugins/seal/index.d.mts +7 -28
  361. package/dist/plugins/seal/index.mjs +69 -47
  362. package/dist/plugins/seal/index.mjs.map +1 -1
  363. package/dist/plugins/seal/key-manager.mjs.map +1 -1
  364. package/dist/plugins/seal/key-server.mjs +1 -6
  365. package/dist/plugins/seal/key-server.mjs.map +1 -1
  366. package/dist/plugins/seal/keygen.mjs +2 -3
  367. package/dist/plugins/seal/keygen.mjs.map +1 -1
  368. package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
  369. package/dist/plugins/seal/mode/live.mjs +1 -1
  370. package/dist/plugins/seal/mode/live.mjs.map +1 -1
  371. package/dist/plugins/seal/mode/local-keygen.mjs +4 -10
  372. package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
  373. package/dist/plugins/seal/plugin-key.mjs.map +1 -1
  374. package/dist/plugins/seal/registry-publish.mjs.map +1 -1
  375. package/dist/plugins/seal/routable.mjs.map +1 -1
  376. package/dist/plugins/seal/service.mjs.map +1 -1
  377. package/dist/plugins/seal/snapshot.mjs +1 -2
  378. package/dist/plugins/seal/snapshot.mjs.map +1 -1
  379. package/dist/plugins/sui/auto-tick.mjs +5 -5
  380. package/dist/plugins/sui/auto-tick.mjs.map +1 -1
  381. package/dist/plugins/sui/chain-build-container.mjs +2 -2
  382. package/dist/plugins/sui/chain-build-container.mjs.map +1 -1
  383. package/dist/plugins/sui/chain-probe.mjs +4 -4
  384. package/dist/plugins/sui/chain-probe.mjs.map +1 -1
  385. package/dist/plugins/sui/codegen.d.mts +9 -7
  386. package/dist/plugins/sui/codegen.mjs +49 -46
  387. package/dist/plugins/sui/codegen.mjs.map +1 -1
  388. package/dist/plugins/sui/errors.d.mts +1 -1
  389. package/dist/plugins/sui/errors.mjs +1 -9
  390. package/dist/plugins/sui/errors.mjs.map +1 -1
  391. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.d.mts +1 -1
  392. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.mjs +3 -7
  393. package/dist/plugins/sui/exec/index.mjs.map +1 -0
  394. package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.mjs +1 -1
  395. package/dist/plugins/sui/exec/sign-and-dispatch.mjs.map +1 -0
  396. package/dist/plugins/sui/fork-faucet-strategy.mjs +2 -6
  397. package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -1
  398. package/dist/plugins/sui/fork-orchestration.mjs +13 -23
  399. package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
  400. package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
  401. package/dist/plugins/sui/index.d.mts +34 -83
  402. package/dist/plugins/sui/index.mjs +200 -68
  403. package/dist/plugins/sui/index.mjs.map +1 -1
  404. package/dist/{substrate/runtime/sui-ledger → plugins/sui/ledger}/object-ref.mjs +1 -1
  405. package/dist/plugins/sui/ledger/object-ref.mjs.map +1 -0
  406. package/dist/plugins/sui/local-faucet-strategy.mjs +1 -5
  407. package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -1
  408. package/dist/plugins/sui/log-attrs.mjs +11 -0
  409. package/dist/plugins/sui/log-attrs.mjs.map +1 -0
  410. package/dist/plugins/sui/mode/external.mjs +4 -12
  411. package/dist/plugins/sui/mode/external.mjs.map +1 -1
  412. package/dist/plugins/sui/mode/fork.mjs +19 -16
  413. package/dist/plugins/sui/mode/fork.mjs.map +1 -1
  414. package/dist/plugins/sui/mode/live.mjs +4 -17
  415. package/dist/plugins/sui/mode/live.mjs.map +1 -1
  416. package/dist/plugins/sui/mode/local.d.mts +1 -0
  417. package/dist/plugins/sui/mode/local.mjs +203 -61
  418. package/dist/plugins/sui/mode/local.mjs.map +1 -1
  419. package/dist/plugins/sui/mode/shared-boot.mjs +18 -23
  420. package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
  421. package/dist/plugins/sui/mode/shared.d.mts +6 -7
  422. package/dist/plugins/sui/mode/shared.mjs.map +1 -1
  423. package/dist/plugins/sui/mode/spec.d.mts +23 -6
  424. package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.mjs +28 -30
  425. package/dist/plugins/sui/move/index.mjs.map +1 -0
  426. package/dist/plugins/sui/move-summary-runner.mjs +8 -4
  427. package/dist/plugins/sui/move-summary-runner.mjs.map +1 -1
  428. package/dist/{substrate/network.d.mts → plugins/sui/network-config.d.mts} +11 -10
  429. package/dist/plugins/sui/network-resolver.d.mts +6 -6
  430. package/dist/plugins/sui/routable.mjs.map +1 -1
  431. package/dist/plugins/sui/service.mjs +10 -6
  432. package/dist/plugins/sui/service.mjs.map +1 -1
  433. package/dist/plugins/sui/snapshot.mjs +10 -5
  434. package/dist/plugins/sui/snapshot.mjs.map +1 -1
  435. package/dist/plugins/wallet/codegen.d.mts +8 -6
  436. package/dist/plugins/wallet/codegen.mjs +4 -10
  437. package/dist/plugins/wallet/codegen.mjs.map +1 -1
  438. package/dist/plugins/wallet/errors.mjs +1 -4
  439. package/dist/plugins/wallet/errors.mjs.map +1 -1
  440. package/dist/plugins/wallet/index.d.mts +3 -6
  441. package/dist/plugins/wallet/index.mjs +16 -21
  442. package/dist/plugins/wallet/index.mjs.map +1 -1
  443. package/dist/plugins/wallet/origin-policy.mjs +3 -3
  444. package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
  445. package/dist/plugins/wallet/pairing.mjs +6 -24
  446. package/dist/plugins/wallet/pairing.mjs.map +1 -1
  447. package/dist/plugins/wallet/protocol.mjs.map +1 -1
  448. package/dist/plugins/wallet/routable.mjs.map +1 -1
  449. package/dist/plugins/wallet/server.mjs +17 -24
  450. package/dist/plugins/wallet/server.mjs.map +1 -1
  451. package/dist/plugins/wallet/service.d.mts +2 -2
  452. package/dist/plugins/wallet/service.mjs +4 -15
  453. package/dist/plugins/wallet/service.mjs.map +1 -1
  454. package/dist/plugins/wallet/snapshot.mjs.map +1 -1
  455. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +1 -5
  456. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
  457. package/dist/plugins/walrus/codegen.d.mts +2 -13
  458. package/dist/plugins/walrus/codegen.mjs +93 -28
  459. package/dist/plugins/walrus/codegen.mjs.map +1 -1
  460. package/dist/plugins/walrus/deploy-paths.mjs +2 -3
  461. package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
  462. package/dist/plugins/walrus/deploy.mjs +26 -19
  463. package/dist/plugins/walrus/deploy.mjs.map +1 -1
  464. package/dist/plugins/walrus/errors.mjs +1 -8
  465. package/dist/plugins/walrus/errors.mjs.map +1 -1
  466. package/dist/plugins/walrus/faucet-strategy.mjs +15 -1
  467. package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
  468. package/dist/plugins/walrus/index.d.mts +13 -44
  469. package/dist/plugins/walrus/index.mjs +119 -122
  470. package/dist/plugins/walrus/index.mjs.map +1 -1
  471. package/dist/plugins/walrus/mode/known-deploy.mjs +6 -6
  472. package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
  473. package/dist/plugins/walrus/mode/local-cluster.d.mts +2 -2
  474. package/dist/plugins/walrus/mode/local-cluster.mjs +2 -10
  475. package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
  476. package/dist/plugins/walrus/plugin-key.mjs.map +1 -1
  477. package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
  478. package/dist/plugins/walrus/routable.mjs.map +1 -1
  479. package/dist/plugins/walrus/service.mjs.map +1 -1
  480. package/dist/plugins/walrus/snapshot.mjs +3 -3
  481. package/dist/plugins/walrus/snapshot.mjs.map +1 -1
  482. package/dist/plugins/walrus/storage-nodes.mjs +53 -14
  483. package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
  484. package/dist/plugins/walrus/wal-swap.mjs +4 -8
  485. package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
  486. package/dist/primitives/artifact-publisher.mjs.map +1 -1
  487. package/dist/primitives/cache.d.mts +1 -1
  488. package/dist/runtime/docker/client.mjs +47 -3
  489. package/dist/runtime/docker/client.mjs.map +1 -1
  490. package/dist/runtime/docker/container.mjs +37 -57
  491. package/dist/runtime/docker/container.mjs.map +1 -1
  492. package/dist/runtime/docker/errors.mjs.map +1 -1
  493. package/dist/runtime/docker/exec.mjs +2 -2
  494. package/dist/runtime/docker/exec.mjs.map +1 -1
  495. package/dist/runtime/docker/image.mjs +10 -11
  496. package/dist/runtime/docker/image.mjs.map +1 -1
  497. package/dist/runtime/docker/index.mjs +0 -1
  498. package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -1
  499. package/dist/runtime/docker/inventory.mjs +9 -9
  500. package/dist/runtime/docker/inventory.mjs.map +1 -1
  501. package/dist/runtime/docker/labels.mjs +12 -1
  502. package/dist/runtime/docker/labels.mjs.map +1 -1
  503. package/dist/runtime/docker/network.mjs +6 -6
  504. package/dist/runtime/docker/network.mjs.map +1 -1
  505. package/dist/runtime/docker/render-run-args.mjs.map +1 -1
  506. package/dist/runtime/docker/service.mjs +31 -45
  507. package/dist/runtime/docker/service.mjs.map +1 -1
  508. package/dist/runtime/docker/sweep.mjs +14 -64
  509. package/dist/runtime/docker/sweep.mjs.map +1 -1
  510. package/dist/runtime/docker/volume.mjs +1 -1
  511. package/dist/runtime/docker/volume.mjs.map +1 -1
  512. package/dist/runtime/docker/wrap.mjs +14 -2
  513. package/dist/runtime/docker/wrap.mjs.map +1 -1
  514. package/dist/substrate/brand.d.mts +2 -5
  515. package/dist/substrate/brand.mjs +3 -2
  516. package/dist/substrate/brand.mjs.map +1 -1
  517. package/dist/substrate/cross-process.mjs +2 -16
  518. package/dist/substrate/cross-process.mjs.map +1 -1
  519. package/dist/substrate/event-time.mjs +0 -2
  520. package/dist/substrate/event-time.mjs.map +1 -1
  521. package/dist/substrate/events.d.mts +46 -16
  522. package/dist/substrate/identity.d.mts +11 -5
  523. package/dist/substrate/manifest.d.mts +33 -26
  524. package/dist/substrate/manifest.mjs +8 -3
  525. package/dist/substrate/manifest.mjs.map +1 -1
  526. package/dist/substrate/options.d.mts +33 -4
  527. package/dist/substrate/plugin-ctx.d.mts +70 -0
  528. package/dist/substrate/plugin-ctx.mjs +66 -0
  529. package/dist/substrate/plugin-ctx.mjs.map +1 -0
  530. package/dist/substrate/plugin.d.mts +46 -38
  531. package/dist/substrate/plugin.mjs +13 -9
  532. package/dist/substrate/plugin.mjs.map +1 -1
  533. package/dist/substrate/projection.d.mts +1 -1
  534. package/dist/substrate/runtime/atomic-write.mjs +3 -4
  535. package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
  536. package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
  537. package/dist/substrate/runtime/cache/service.mjs +50 -20
  538. package/dist/substrate/runtime/cache/service.mjs.map +1 -1
  539. package/dist/substrate/runtime/config-validation.mjs.map +1 -1
  540. package/dist/substrate/runtime/control-plane/domain.mjs +34 -12
  541. package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -1
  542. package/dist/substrate/runtime/control-plane/service.mjs.map +1 -1
  543. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +14 -17
  544. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
  545. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
  546. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
  547. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -1
  548. package/dist/substrate/runtime/cross-process/index.mjs +0 -2
  549. package/dist/substrate/runtime/cross-process/live-clock.mjs +1 -1
  550. package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -1
  551. package/dist/substrate/runtime/cross-process/liveness.mjs +11 -18
  552. package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
  553. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +2 -2
  554. package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -1
  555. package/dist/substrate/runtime/cross-process/roster.mjs +17 -127
  556. package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
  557. package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -1
  558. package/dist/substrate/runtime/cross-process/stack-lock.mjs +29 -28
  559. package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
  560. package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
  561. package/dist/substrate/runtime/errors.mjs +1 -13
  562. package/dist/substrate/runtime/errors.mjs.map +1 -1
  563. package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -1
  564. package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -1
  565. package/dist/substrate/runtime/host-gateway.mjs.map +1 -1
  566. package/dist/substrate/runtime/host-tree-tar/index.mjs +15 -163
  567. package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
  568. package/dist/substrate/runtime/http-probe.d.mts +1 -3
  569. package/dist/substrate/runtime/http-probe.mjs.map +1 -1
  570. package/dist/substrate/runtime/index.mjs +1 -6
  571. package/dist/substrate/runtime/lease-broker/service.mjs +5 -23
  572. package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
  573. package/dist/substrate/runtime/lifecycle/dep-graph.mjs +3 -3
  574. package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
  575. package/dist/substrate/runtime/lifecycle/graph-input-id.d.mts +1 -0
  576. package/dist/substrate/runtime/lifecycle/graph-input-id.mjs +133 -0
  577. package/dist/substrate/runtime/lifecycle/graph-input-id.mjs.map +1 -0
  578. package/dist/substrate/runtime/lifecycle/index.mjs +2 -2
  579. package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -1
  580. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +22 -1
  581. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
  582. package/dist/substrate/runtime/lifecycle/ready-gate.mjs +2 -15
  583. package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -1
  584. package/dist/substrate/runtime/lifecycle/selective-restart.mjs +29 -25
  585. package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -1
  586. package/dist/substrate/runtime/lifecycle/signals.mjs +1 -1
  587. package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
  588. package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -1
  589. package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -1
  590. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +0 -1
  591. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -1
  592. package/dist/substrate/runtime/managed-container.d.mts +5 -1
  593. package/dist/substrate/runtime/managed-container.mjs +8 -10
  594. package/dist/substrate/runtime/managed-container.mjs.map +1 -1
  595. package/dist/substrate/runtime/manifest/manifest.mjs +8 -30
  596. package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
  597. package/dist/substrate/runtime/mode-errors.d.mts +1 -2
  598. package/dist/substrate/runtime/mode-errors.mjs.map +1 -1
  599. package/dist/substrate/runtime/observability/cascade-formatter.mjs +1 -11
  600. package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
  601. package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -1
  602. package/dist/substrate/runtime/observability/index.d.mts +1 -1
  603. package/dist/substrate/runtime/observability/index.mjs +4 -6
  604. package/dist/substrate/runtime/observability/log-attrs.mjs +46 -0
  605. package/dist/substrate/runtime/observability/log-attrs.mjs.map +1 -0
  606. package/dist/substrate/runtime/observability/log-store.mjs.map +1 -1
  607. package/dist/substrate/runtime/observability/logger.mjs +3 -3
  608. package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
  609. package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -1
  610. package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
  611. package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -1
  612. package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
  613. package/dist/substrate/runtime/observability/subprocess-capture.mjs +2 -2
  614. package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -1
  615. package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -1
  616. package/dist/substrate/runtime/paths.mjs +27 -9
  617. package/dist/substrate/runtime/paths.mjs.map +1 -1
  618. package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -1
  619. package/dist/substrate/runtime/port-broker/service.mjs +10 -27
  620. package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
  621. package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
  622. package/dist/substrate/runtime/probes.d.mts +2 -3
  623. package/dist/substrate/runtime/probes.mjs.map +1 -1
  624. package/dist/substrate/runtime/process-supervisor.mjs.map +1 -1
  625. package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
  626. package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
  627. package/dist/substrate/runtime/projection/update.mjs +87 -11
  628. package/dist/substrate/runtime/projection/update.mjs.map +1 -1
  629. package/dist/substrate/runtime/random-suffix.mjs.map +1 -1
  630. package/dist/substrate/runtime/reconcile/fs-plan.mjs +146 -0
  631. package/dist/substrate/runtime/reconcile/fs-plan.mjs.map +1 -0
  632. package/dist/substrate/runtime/reconcile/graph.mjs +19 -0
  633. package/dist/substrate/runtime/reconcile/graph.mjs.map +1 -0
  634. package/dist/substrate/runtime/reconcile/index.mjs +5 -0
  635. package/dist/substrate/runtime/reconcile/label.mjs +41 -0
  636. package/dist/substrate/runtime/reconcile/label.mjs.map +1 -0
  637. package/dist/substrate/runtime/reconcile/spec.mjs +15 -0
  638. package/dist/substrate/runtime/reconcile/spec.mjs.map +1 -0
  639. package/dist/substrate/runtime/retry-policy.d.mts +2 -3
  640. package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
  641. package/dist/substrate/runtime/routed-url.mjs.map +1 -1
  642. package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
  643. package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
  644. package/dist/substrate/runtime/stage-and-swap/index.mjs +49 -12
  645. package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
  646. package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -1
  647. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
  648. package/dist/substrate/runtime/strategy-registry/service.mjs +29 -17
  649. package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
  650. package/dist/substrate/runtime/subnet-broker.mjs.map +1 -1
  651. package/dist/substrate/runtime/supervisor/acquire-node.mjs +188 -56
  652. package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -1
  653. package/dist/substrate/runtime/supervisor/background-tasks.mjs +79 -65
  654. package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -1
  655. package/dist/substrate/runtime/supervisor/command-loop.mjs +82 -23
  656. package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -1
  657. package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs +16 -0
  658. package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs.map +1 -0
  659. package/dist/substrate/runtime/supervisor/errors.mjs +11 -2
  660. package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -1
  661. package/dist/substrate/runtime/supervisor/index.mjs +2 -0
  662. package/dist/substrate/runtime/supervisor/shutdown.mjs +6 -6
  663. package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -1
  664. package/dist/substrate/runtime/supervisor/start-supervisor.mjs +60 -70
  665. package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -1
  666. package/dist/substrate/runtime/supervisor/state.d.mts +1 -1
  667. package/dist/substrate/runtime/supervisor/state.mjs +1 -1
  668. package/dist/substrate/runtime/supervisor/state.mjs.map +1 -1
  669. package/dist/substrate/runtime/supervisor/teardown.mjs +10 -9
  670. package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -1
  671. package/dist/substrate/runtime/supervisor/wiring.mjs +6 -20
  672. package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -1
  673. package/dist/substrate/runtime/tar/reader.mjs +216 -0
  674. package/dist/substrate/runtime/tar/reader.mjs.map +1 -0
  675. package/dist/substrate/runtime/typed-env.mjs.map +1 -1
  676. package/dist/substrate/versioned-doc-schema.mjs.map +1 -1
  677. package/dist/substrate/versioned-doc-sync.mjs +5 -5
  678. package/dist/substrate/versioned-doc-sync.mjs.map +1 -1
  679. package/dist/surfaces/cli/command-tree.mjs +49 -7
  680. package/dist/surfaces/cli/command-tree.mjs.map +1 -1
  681. package/dist/surfaces/cli/commands/config.mjs +1 -1
  682. package/dist/surfaces/cli/commands/config.mjs.map +1 -1
  683. package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -1
  684. package/dist/surfaces/cli/commands/confirm.mjs.map +1 -1
  685. package/dist/surfaces/cli/commands/doctor.mjs +1 -1
  686. package/dist/surfaces/cli/commands/doctor.mjs.map +1 -1
  687. package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -1
  688. package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
  689. package/dist/surfaces/cli/commands/prune.mjs +1 -1
  690. package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
  691. package/dist/surfaces/cli/commands/snapshot.mjs +1 -1
  692. package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -1
  693. package/dist/surfaces/cli/commands/status.mjs +1 -1
  694. package/dist/surfaces/cli/commands/status.mjs.map +1 -1
  695. package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
  696. package/dist/surfaces/cli/commands/wipe.mjs +3 -4
  697. package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
  698. package/dist/surfaces/cli/envelope.mjs.map +1 -1
  699. package/dist/surfaces/cli/errors.mjs.map +1 -1
  700. package/dist/surfaces/cli/flags.mjs.map +1 -1
  701. package/dist/surfaces/cli/index.mjs +45 -14
  702. package/dist/surfaces/cli/index.mjs.map +1 -1
  703. package/dist/surfaces/cli/output.mjs.map +1 -1
  704. package/dist/surfaces/cli/sysexits.mjs.map +1 -1
  705. package/dist/surfaces/tui/app.mjs +0 -21
  706. package/dist/surfaces/tui/app.mjs.map +1 -1
  707. package/dist/surfaces/tui/dashboard.mjs +0 -48
  708. package/dist/surfaces/tui/dashboard.mjs.map +1 -1
  709. package/dist/surfaces/tui/display-derivation.mjs +80 -16
  710. package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
  711. package/dist/surfaces/tui/errors.mjs.map +1 -1
  712. package/dist/surfaces/tui/event-log.mjs +0 -9
  713. package/dist/surfaces/tui/event-log.mjs.map +1 -1
  714. package/dist/surfaces/tui/heartbeat.mjs.map +1 -1
  715. package/dist/surfaces/tui/index.mjs +2 -2
  716. package/dist/surfaces/tui/index.mjs.map +1 -1
  717. package/dist/surfaces/tui/input.mjs.map +1 -1
  718. package/dist/surfaces/tui/mode-detect.mjs.map +1 -1
  719. package/dist/surfaces/tui/mount-ink.mjs.map +1 -1
  720. package/dist/surfaces/tui/plain-renderer.mjs +26 -19
  721. package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
  722. package/dist/surfaces/tui/resource-table.mjs +8 -10
  723. package/dist/surfaces/tui/resource-table.mjs.map +1 -1
  724. package/images/postgres/Dockerfile +0 -1
  725. package/images/sui/Dockerfile +27 -54
  726. package/images/sui/entrypoint.sh +17 -179
  727. package/package.json +23 -15
  728. package/dashboard-ui/assets/index-Bmi1UtAg.js +0 -1356
  729. package/dashboard-ui/assets/index-D5EShVt4.js +0 -3
  730. package/dashboard-ui/assets/index-Deml9drg.css +0 -1
  731. package/dist/api/plugin-errors.d.mts +0 -7
  732. package/dist/api/plugin-errors.mjs +0 -10
  733. package/dist/api/plugin-errors.mjs.map +0 -1
  734. package/dist/cli/wirings/build-verb-layers.mjs +0 -42
  735. package/dist/cli/wirings/build-verb-layers.mjs.map +0 -1
  736. package/dist/contracts/capability-decl.d.mts +0 -40
  737. package/dist/orchestrators/built-in-plugin-layers.mjs +0 -54
  738. package/dist/orchestrators/built-in-plugin-layers.mjs.map +0 -1
  739. package/dist/orchestrators/run.mjs +0 -91
  740. package/dist/orchestrators/run.mjs.map +0 -1
  741. package/dist/orchestrators/runtime-composition.d.mts +0 -10
  742. package/dist/orchestrators/runtime-composition.mjs +0 -252
  743. package/dist/orchestrators/runtime-composition.mjs.map +0 -1
  744. package/dist/orchestrators/snapshot/capture-command.d.mts +0 -1
  745. package/dist/orchestrators/snapshot/capture-command.mjs +0 -25
  746. package/dist/orchestrators/snapshot/capture-command.mjs.map +0 -1
  747. package/dist/orchestrators/snapshot/pending-marker.mjs +0 -99
  748. package/dist/orchestrators/snapshot/pending-marker.mjs.map +0 -1
  749. package/dist/orchestrators/snapshot/recover-pending.mjs +0 -223
  750. package/dist/orchestrators/snapshot/recover-pending.mjs.map +0 -1
  751. package/dist/orchestrators/snapshot/state-document.d.mts +0 -1
  752. package/dist/orchestrators/snapshot/state-document.mjs +0 -58
  753. package/dist/orchestrators/snapshot/state-document.mjs.map +0 -1
  754. package/dist/plugins/account/spans.mjs +0 -16
  755. package/dist/plugins/account/spans.mjs.map +0 -1
  756. package/dist/plugins/account/variants/env.mjs +0 -24
  757. package/dist/plugins/account/variants/env.mjs.map +0 -1
  758. package/dist/plugins/account/variants/inline.mjs +0 -13
  759. package/dist/plugins/account/variants/inline.mjs.map +0 -1
  760. package/dist/plugins/account/variants/keystore.mjs +0 -91
  761. package/dist/plugins/account/variants/keystore.mjs.map +0 -1
  762. package/dist/plugins/action/spans.mjs +0 -11
  763. package/dist/plugins/action/spans.mjs.map +0 -1
  764. package/dist/plugins/coin/spans.mjs +0 -20
  765. package/dist/plugins/coin/spans.mjs.map +0 -1
  766. package/dist/plugins/deepbook/spans.mjs +0 -18
  767. package/dist/plugins/deepbook/spans.mjs.map +0 -1
  768. package/dist/plugins/faucet/spans.mjs +0 -12
  769. package/dist/plugins/faucet/spans.mjs.map +0 -1
  770. package/dist/plugins/package/spans.mjs +0 -14
  771. package/dist/plugins/package/spans.mjs.map +0 -1
  772. package/dist/plugins/postgres/codegen.mjs +0 -42
  773. package/dist/plugins/postgres/codegen.mjs.map +0 -1
  774. package/dist/plugins/postgres/connection.d.mts +0 -33
  775. package/dist/plugins/postgres/connection.mjs.map +0 -1
  776. package/dist/plugins/postgres/db-ensure.mjs.map +0 -1
  777. package/dist/plugins/postgres/errors.d.mts +0 -60
  778. package/dist/plugins/postgres/errors.mjs +0 -29
  779. package/dist/plugins/postgres/errors.mjs.map +0 -1
  780. package/dist/plugins/postgres/index.d.mts +0 -37
  781. package/dist/plugins/postgres/index.mjs +0 -68
  782. package/dist/plugins/postgres/index.mjs.map +0 -1
  783. package/dist/plugins/postgres/routable.mjs +0 -33
  784. package/dist/plugins/postgres/routable.mjs.map +0 -1
  785. package/dist/plugins/postgres/service.d.mts +0 -50
  786. package/dist/plugins/postgres/service.mjs +0 -179
  787. package/dist/plugins/postgres/service.mjs.map +0 -1
  788. package/dist/plugins/postgres/snapshot.mjs +0 -32
  789. package/dist/plugins/postgres/snapshot.mjs.map +0 -1
  790. package/dist/plugins/postgres/spans.mjs +0 -11
  791. package/dist/plugins/postgres/spans.mjs.map +0 -1
  792. package/dist/plugins/seal/spans.mjs +0 -18
  793. package/dist/plugins/seal/spans.mjs.map +0 -1
  794. package/dist/plugins/sui/spans.mjs +0 -17
  795. package/dist/plugins/sui/spans.mjs.map +0 -1
  796. package/dist/plugins/wallet/spans.mjs +0 -22
  797. package/dist/plugins/wallet/spans.mjs.map +0 -1
  798. package/dist/plugins/walrus/registry-publish.d.mts +0 -24
  799. package/dist/plugins/walrus/spans.mjs +0 -18
  800. package/dist/plugins/walrus/spans.mjs.map +0 -1
  801. package/dist/runtime/docker/logs.d.mts +0 -1
  802. package/dist/runtime/docker/logs.mjs +0 -34
  803. package/dist/runtime/docker/logs.mjs.map +0 -1
  804. package/dist/substrate/runtime/artifact-publisher/index.mjs +0 -86
  805. package/dist/substrate/runtime/artifact-publisher/index.mjs.map +0 -1
  806. package/dist/substrate/runtime/capability-sinks/index.d.mts +0 -1
  807. package/dist/substrate/runtime/capability-sinks/index.mjs +0 -3
  808. package/dist/substrate/runtime/capability-sinks/layer.d.mts +0 -1
  809. package/dist/substrate/runtime/capability-sinks/layer.mjs +0 -31
  810. package/dist/substrate/runtime/capability-sinks/layer.mjs.map +0 -1
  811. package/dist/substrate/runtime/capability-sinks/service.d.mts +0 -95
  812. package/dist/substrate/runtime/capability-sinks/service.mjs +0 -69
  813. package/dist/substrate/runtime/capability-sinks/service.mjs.map +0 -1
  814. package/dist/substrate/runtime/cross-process/lock.d.mts +0 -1
  815. package/dist/substrate/runtime/cross-process/lock.mjs +0 -23
  816. package/dist/substrate/runtime/cross-process/lock.mjs.map +0 -1
  817. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +0 -113
  818. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +0 -1
  819. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +0 -31
  820. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +0 -1
  821. package/dist/substrate/runtime/observability/formatter-registry.d.mts +0 -1
  822. package/dist/substrate/runtime/observability/formatter-registry.mjs +0 -48
  823. package/dist/substrate/runtime/observability/formatter-registry.mjs.map +0 -1
  824. package/dist/substrate/runtime/observability/span-store.d.mts +0 -1
  825. package/dist/substrate/runtime/observability/span-store.mjs +0 -110
  826. package/dist/substrate/runtime/observability/span-store.mjs.map +0 -1
  827. package/dist/substrate/runtime/observability/spans.d.mts +0 -1
  828. package/dist/substrate/runtime/observability/spans.mjs +0 -87
  829. package/dist/substrate/runtime/observability/spans.mjs.map +0 -1
  830. package/dist/substrate/runtime/projection/index.mjs +0 -4
  831. package/dist/substrate/runtime/projection/persisted.mjs +0 -213
  832. package/dist/substrate/runtime/projection/persisted.mjs.map +0 -1
  833. package/dist/substrate/runtime/scoped-multimap/service.mjs +0 -52
  834. package/dist/substrate/runtime/scoped-multimap/service.mjs.map +0 -1
  835. package/dist/substrate/runtime/scoped-ref-map/index.mjs +0 -2
  836. package/dist/substrate/runtime/scoped-ref-map/service.mjs +0 -83
  837. package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +0 -1
  838. package/dist/substrate/runtime/state-store/index.mjs +0 -3
  839. package/dist/substrate/runtime/state-store/schema.d.mts +0 -1
  840. package/dist/substrate/runtime/state-store/schema.mjs +0 -41
  841. package/dist/substrate/runtime/state-store/schema.mjs.map +0 -1
  842. package/dist/substrate/runtime/state-store/service.d.mts +0 -1
  843. package/dist/substrate/runtime/state-store/service.mjs +0 -145
  844. package/dist/substrate/runtime/state-store/service.mjs.map +0 -1
  845. package/dist/substrate/runtime/sui-execute/index.mjs.map +0 -1
  846. package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +0 -1
  847. package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +0 -1
  848. package/dist/substrate/runtime/sui-move-build/index.mjs.map +0 -1
  849. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +0 -151
  850. package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +0 -1
  851. package/dist/substrate/state-store.d.mts +0 -1
  852. /package/dist/orchestrators/{snapshot/pending-marker.d.mts → codegen/id-config.d.mts} +0 -0
  853. /package/dist/orchestrators/snapshot/{recover-pending.d.mts → interrupted-restore.d.mts} +0 -0
  854. /package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.d.mts +0 -0
  855. /package/dist/plugins/{postgres/snapshot.d.mts → sui/ledger/object-ref.d.mts} +0 -0
  856. /package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.d.mts +0 -0
  857. /package/dist/substrate/runtime/{state-store/index.d.mts → reconcile/graph.d.mts} +0 -0
  858. /package/dist/substrate/runtime/{cross-process/snapshot-reservation.d.mts → supervisor/contribution-dispatcher.d.mts} +0 -0
@@ -1,7 +1,7 @@
1
- import { AccountProjectionSchema, PackageProjectionSchema } from "../../substrate/runtime/projection/persisted.mjs";
2
1
  import { eventAt } from "../../substrate/event-time.mjs";
3
- import { mountFailed } from "./errors.mjs";
2
+ import { AccountProjectionSchema, PackageProjectionSchema } from "../../substrate/runtime/projection/update.mjs";
4
3
  import { accountLine, endpointLine, labelForRow, packageLine, roleLabel, statusLabel } from "./display-derivation.mjs";
4
+ import { mountFailed } from "./errors.mjs";
5
5
  import { Effect, Schema, Stream, SubscriptionRef } from "effect";
6
6
  //#region src/surfaces/tui/plain-renderer.ts
7
7
  /**
@@ -27,15 +27,33 @@ const formatEventLine = (event) => {
27
27
  * Mount subscribes to the live event stream, writes one line per
28
28
  * event to stderr. The state-ref is sampled for the initial sweep
29
29
  * (one line per declared row) so a renderer attached after boot
30
- * still sees a coherent baseline.
30
+ * still sees a coherent baseline. In quiet mode the sweep collapses
31
+ * to the single `stack.identity` line — at boot the per-row/account
32
+ * lines are all `<pending>` and the real signal arrives as readiness
33
+ * + endpoint events.
31
34
  */
32
- const makePlainRenderer = () => ({
35
+ const makePlainRenderer = (options = {}) => ({
33
36
  mount: (stateRef, events) => Effect.gen(function* () {
34
- yield* emitInitialSweep(yield* SubscriptionRef.get(stateRef));
35
- yield* events.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));
37
+ yield* emitInitialSweep(yield* SubscriptionRef.get(stateRef), { quiet: options.quiet });
38
+ yield* (options.quiet ? events.pipe(Stream.filter(keepInQuiet)) : events).pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));
36
39
  }).pipe(Effect.catch((cause) => Effect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))))),
37
40
  flush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed("flush"))))
38
41
  });
42
+ /**
43
+ * Quiet-mode event predicate (pure; exported for tests). Keeps milestone
44
+ * and non-INFO events; drops routine INFO churn. Anything that formats as
45
+ * WARN/ERROR is always kept so failures are never silently filtered out.
46
+ */
47
+ const keepInQuiet = (event) => {
48
+ if (levelForEvent(event) !== "INFO") return true;
49
+ switch (event.tag) {
50
+ case "lifecycle.statusChanged": return event.to === "ready";
51
+ case "endpoint.registered":
52
+ case "codegen.emitted":
53
+ case "shutdown.escalated": return true;
54
+ default: return false;
55
+ }
56
+ };
39
57
  const isoTimestamp = (at) => new Date(at || Date.now()).toISOString();
40
58
  const levelForEvent = (event) => {
41
59
  switch (event.tag) {
@@ -140,18 +158,6 @@ const payloadFor = (event) => {
140
158
  signal: event.signal,
141
159
  exitCode: event.exitCode
142
160
  });
143
- case "snapshot.captureStarted": return kv({
144
- snapshotId: event.snapshotId,
145
- name: event.name
146
- });
147
- case "snapshot.captureProgress": return kv({
148
- snapshotId: event.snapshotId,
149
- name: event.name,
150
- phase: event.phase,
151
- detail: event.detail,
152
- paused: event.pausedContainers,
153
- total: event.totalContainers
154
- });
155
161
  case "snapshot.captureSkipped": return kv({ reason: event.reason });
156
162
  case "snapshot.captureFailed": return kv({
157
163
  snapshotId: event.snapshotId,
@@ -183,8 +189,9 @@ const tryDecodeProjection = (schema, payload) => {
183
189
  return null;
184
190
  }
185
191
  };
186
- const emitInitialSweep = (state) => Effect.gen(function* () {
192
+ const emitInitialSweep = (state, options = {}) => Effect.gen(function* () {
187
193
  yield* writeStderrLine(`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`);
194
+ if (options.quiet) return;
188
195
  for (const row of state.rows) yield* writeStderrLine(`${isoTimestamp(Date.now())} INFO row.declared ${kv({
189
196
  key: row.key,
190
197
  label: labelForRow(row.key),
@@ -1 +1 @@
1
- {"version":3,"file":"plain-renderer.mjs","names":[],"sources":["../../../src/surfaces/tui/plain-renderer.ts"],"sourcesContent":["// Plain (non-TTY) renderer.\n//\n// Architecture §11 + distilled/21-tui §Renderers: when stdout is not\n// a TTY (CI, pipe, log file), the live ink dashboard is replaced by\n// a structured line stream. One line per event; periodic heartbeat\n// per internally-acquiring row, surfaced to operators as \"starting\".\n//\n// Discipline:\n// - One line per EngineEvent — no batching, no aggregation, no\n// diffing. Each event maps to exactly one structured line.\n// - Writes to stderr (architecture invariant: plain renderer goes\n// to stderr so stdout stays clean for whatever consumes the\n// pipe).\n// - EPIPE swallowed (pipe-safety invariant).\n// - Pure formatting helpers exposed for tests; the Effect-shaped\n// side is the `mount` function.\n// - Heartbeat formatting is pure here; scheduling belongs to the\n// renderer mount path. The architecture says it\n// \"anchors on first sighting in the internal acquiring state; phase\n// changes do NOT reset the clock; a late tick emits exactly one\n// heartbeat (no backlog catch-up)\". The seam is exposed via\n// `formatHeartbeat`.\n\nimport { Effect, Schema, Stream, SubscriptionRef } from 'effect';\n\nimport type { Renderer } from '../../contracts/renderer.ts';\nimport type { EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport {\n\tAccountProjectionSchema,\n\tPackageProjectionSchema,\n} from '../../substrate/runtime/projection/persisted.ts';\nimport {\n\taccountLine,\n\tendpointLine,\n\tlabelForRow,\n\tnarrationFor,\n\tpackageLine,\n\troleLabel,\n\tstatusLabel,\n} from './display-derivation.ts';\nimport { mountFailed } from './errors.ts';\nimport { eventAt } from '../../substrate/event-time.ts';\n\n// -----------------------------------------------------------------------------\n// Line shape — pure formatters\n// -----------------------------------------------------------------------------\n\n/**\n * Plain-renderer line shape (each call returns exactly one line, no\n * trailing newline).\n *\n * <iso-timestamp> <level> <event-tag> <key>=<value> ...\n *\n * Example:\n * 2026-05-19T20:11:32.001Z INFO lifecycle.statusChanged key=sui from=starting to=ready\n * 2026-05-19T20:11:32.500Z WARN log.appended key=walrus line=\"failed to bind port 9000\"\n * 2026-05-19T20:11:33.000Z INFO endpoint.registered name=aggregator url=http://localhost:9000\n */\nexport const formatEventLine = (event: EngineEvent): string => {\n\tconst ts = isoTimestamp(eventAt(event));\n\tconst level = levelForEvent(event);\n\tconst payload = payloadFor(event);\n\treturn `${ts} ${level} ${event.tag} ${payload}`;\n};\n\n/**\n * Heartbeat line for an in-flight internal acquiring row. Emitted by the\n * scheduler at architecture-blessed intervals; this function is the\n * pure formatter only.\n */\nexport const formatHeartbeat = (\n\tnow: number,\n\tkey: string,\n\tphase: string | null,\n\troleToken: string,\n): string => {\n\tconst ts = isoTimestamp(now);\n\tconst narration = narrationFor(phase, 'acquiring');\n\treturn `${ts} INFO heartbeat key=${key} role=${roleToken} narration=${quote(narration)}`;\n};\n\n// -----------------------------------------------------------------------------\n// Renderer implementation\n// -----------------------------------------------------------------------------\n\n/**\n * Build a plain renderer satisfying the `Renderer` contract.\n *\n * Mount subscribes to the live event stream, writes one line per\n * event to stderr. The state-ref is sampled for the initial sweep\n * (one line per declared row) so a renderer attached after boot\n * still sees a coherent baseline.\n */\nexport const makePlainRenderer = (): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst initial = yield* SubscriptionRef.get(stateRef);\n\t\t\tyield* emitInitialSweep(initial);\n\t\t\tyield* events.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));\n\t\t}).pipe(\n\t\t\tEffect.catch((cause: unknown) =>\n\t\t\t\tEffect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))),\n\t\t\t),\n\t\t),\n\tflush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed('flush')))),\n});\n\n// -----------------------------------------------------------------------------\n// Internals — formatting\n// -----------------------------------------------------------------------------\n\nconst isoTimestamp = (at: number): string => new Date(at || Date.now()).toISOString();\n\nconst levelForEvent = (event: EngineEvent): 'INFO' | 'WARN' | 'ERROR' => {\n\tswitch (event.tag) {\n\t\tcase 'log.appended':\n\t\t\treturn event.level === 'error' ? 'ERROR' : event.level === 'warn' ? 'WARN' : 'INFO';\n\t\tcase 'error.reported':\n\t\t\treturn event.error.severity === 'fatal' || event.error.severity === 'error'\n\t\t\t\t? 'ERROR'\n\t\t\t\t: 'WARN';\n\t\t// A broken orchestrator capability sink leaves the plugin `ready`\n\t\t// (non-fatal by design — see dispatch-contributions.ts), so this\n\t\t// is the operator's ONLY signal that e.g. RPC/wallet routing is\n\t\t// dead. It must not render as a routine INFO line.\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn 'WARN';\n\t\tdefault:\n\t\t\treturn 'INFO';\n\t}\n};\n\nconst payloadFor = (event: EngineEvent): string => {\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tfrom: statusLabel(event.from),\n\t\t\t\tto: statusLabel(event.to),\n\t\t\t});\n\t\tcase 'lifecycle.phaseSet':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tphase: event.phase ?? '',\n\t\t\t});\n\t\tcase 'log.appended':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tline: event.line,\n\t\t\t});\n\t\tcase 'endpoint.registered':\n\t\t\treturn kv({\n\t\t\t\tkey: event.endpoint.endpointKey,\n\t\t\t\tname: event.endpoint.name,\n\t\t\t\tdisplayUrl: event.endpoint.displayUrl ?? event.endpoint.url,\n\t\t\t\turl: event.endpoint.url,\n\t\t\t\twire: event.endpoint.wireProtocol,\n\t\t\t});\n\t\tcase 'projection.updated':\n\t\t\tif (event.kind === 'account') {\n\t\t\t\t// STYLE_GUIDE §19 — substrate-side `decodeUnknownSync` so a\n\t\t\t\t// malformed payload skips the line rather than rendering\n\t\t\t\t// garbage (`Schema.decodeUnknownSync(...) as A` bare-cast\n\t\t\t\t// is banned). The reducer at\n\t\t\t\t// `substrate/runtime/projection/update.ts` performs the\n\t\t\t\t// same decode; we repeat it here because the renderer\n\t\t\t\t// reads the raw event stream, not the reduced state slice.\n\t\t\t\tconst account = tryDecodeProjection(AccountProjectionSchema, event.payload);\n\t\t\t\tif (account === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: account.key,\n\t\t\t\t\trow: account.rowKey ?? '',\n\t\t\t\t\tname: account.name,\n\t\t\t\t\taddress: account.address ?? '',\n\t\t\t\t\tscheme: account.scheme ?? '',\n\t\t\t\t\tsource: account.source ?? '',\n\t\t\t\t\tfunding: account.funding.status,\n\t\t\t\t\tfundingEntries: (account.funding.entries ?? [])\n\t\t\t\t\t\t.map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`)\n\t\t\t\t\t\t.join(','),\n\t\t\t\t\trequestedMist: account.funding.requestedMist ?? '',\n\t\t\t\t\tbalanceMist: account.funding.balanceMist ?? '',\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (event.kind === 'package') {\n\t\t\t\tconst pkg = tryDecodeProjection(PackageProjectionSchema, event.payload);\n\t\t\t\tif (pkg === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: pkg.key,\n\t\t\t\t\trow: pkg.rowKey ?? '',\n\t\t\t\t\tname: pkg.name,\n\t\t\t\t\tkind: pkg.kind,\n\t\t\t\t\tpackageId: pkg.packageId,\n\t\t\t\t\tupgradeCapId: pkg.upgradeCapId ?? '',\n\t\t\t\t\tmvr: pkg.mvrPlaceholder,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn kv({ kind: event.kind, key: event.key });\n\t\tcase 'endpoint.released':\n\t\t\treturn kv({ key: event.endpointKey });\n\t\tcase 'strategy.registered':\n\t\t\treturn kv({\n\t\t\t\tcapability: event.capabilityKey,\n\t\t\t\tautoMounted: event.autoMounted,\n\t\t\t});\n\t\tcase 'strategy.unregistered':\n\t\t\treturn kv({ capability: event.capabilityKey });\n\t\tcase 'manifest.flushed':\n\t\t\treturn kv({ version: event.manifestVersion });\n\t\tcase 'codegen.emitted':\n\t\t\treturn kv({ files: event.files.length });\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tkind: event.kind,\n\t\t\t\t// `causeType` (the failing sink error's `_tag`, e.g.\n\t\t\t\t// `RouterBootFailed`) is the discriminator an operator scans\n\t\t\t\t// for to tell dead RPC routing from a codegen collision. `kv`\n\t\t\t\t// drops it when undefined, so untagged causes stay clean.\n\t\t\t\tcauseType: event.causeType ?? '',\n\t\t\t\tsummary: event.message,\n\t\t\t});\n\t\tcase 'error.reported':\n\t\t\treturn kv({\n\t\t\t\tkey: event.error.pluginKey ?? '',\n\t\t\t\ttag: event.error.tag,\n\t\t\t\tsummary: event.error.summary,\n\t\t\t\tcause: event.error.chain.join(' | '),\n\t\t\t\tseverity: event.error.severity,\n\t\t\t});\n\t\tcase 'build.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.entry.pluginKey ?? '',\n\t\t\t\tphase: event.entry.phase,\n\t\t\t\tprogress: event.entry.progress,\n\t\t\t});\n\t\tcase 'restart.requested':\n\t\tcase 'restart.completed':\n\t\t\treturn kv({\n\t\t\t\ttarget: event.target === 'stack' ? 'stack' : event.target.pluginKey,\n\t\t\t});\n\t\tcase 'shutdown.escalated':\n\t\t\treturn kv({\n\t\t\t\tmode: 'hard-kill',\n\t\t\t\tsignal: event.signal,\n\t\t\t\texitCode: event.exitCode,\n\t\t\t});\n\t\tcase 'snapshot.captureStarted':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name });\n\t\tcase 'snapshot.captureProgress':\n\t\t\treturn kv({\n\t\t\t\tsnapshotId: event.snapshotId,\n\t\t\t\tname: event.name,\n\t\t\t\tphase: event.phase,\n\t\t\t\tdetail: event.detail,\n\t\t\t\tpaused: event.pausedContainers,\n\t\t\t\ttotal: event.totalContainers,\n\t\t\t});\n\t\tcase 'snapshot.captureSkipped':\n\t\t\treturn kv({ reason: event.reason });\n\t\tcase 'snapshot.captureFailed':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name, summary: event.summary });\n\t\tcase 'snapshot.captured':\n\t\tcase 'snapshot.restored':\n\t\t\treturn kv({ snapshotId: event.snapshotId });\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = event;\n\t\t\tvoid _exhaustive;\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\nconst kv = (record: Readonly<Record<string, unknown>>): string =>\n\tObject.entries(record)\n\t\t.filter(([, v]) => v !== '' && v !== null && v !== undefined)\n\t\t.map(([k, v]) => `${k}=${quoteIfNeeded(String(v))}`)\n\t\t.join(' ');\n\n// Quote anything that contains whitespace, a `\"`, or an ASCII control\n// byte (`\\x00-\\x1f`). Control bytes are the load-bearing case: a\n// projection payload field that contains a stray `\\x1b` (ESC) would\n// otherwise inject an ANSI escape sequence into the plain-renderer's\n// stdout, corrupting subsequent terminal state for callers tailing\n// `--format plain` output.\nconst quoteIfNeeded = (s: string): string => (/[\\s\"\\x00-\\x1f]/.test(s) ? quote(s) : s);\n\nconst quote = (s: string): string => `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n\n/**\n * Structural validate-then-narrow for `projection.updated` payloads\n * before they are formatted as text. Mirrors\n * `tryDecodeProjectionPayload` in the substrate reducer — returns\n * `null` on schema-decode failure so the renderer drops the slice\n * rather than printing fields off a malformed object. The substrate\n * reducer emits the `Effect.logWarning` for the same payload (the\n * decode is deterministic), so we stay silent here to avoid double\n * logging.\n */\nconst tryDecodeProjection = <S extends Schema.Decoder<unknown>>(\n\tschema: S,\n\tpayload: unknown,\n): S['Type'] | null => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(payload);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — initial sweep\n// -----------------------------------------------------------------------------\n\nconst emitInitialSweep = (state: SubscribableState): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* writeStderrLine(\n\t\t\t`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`,\n\t\t);\n\t\tfor (const row of state.rows) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(Date.now())} INFO row.declared ${kv({\n\t\t\t\t\tkey: row.key,\n\t\t\t\t\tlabel: labelForRow(row.key),\n\t\t\t\t\trole: roleLabel(row.role),\n\t\t\t\t\tstatus: statusLabel(row.status),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\t\tfor (const endpoint of state.endpoints) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(endpoint.registeredAt)} INFO endpoint.registered ${endpointLine(endpoint)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const account of state.accounts) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(account.updatedAt)} INFO projection.updated[account] ${accountLine(account)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const pkg of state.packages) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(pkg.updatedAt)} INFO projection.updated[package] ${packageLine(pkg)}`,\n\t\t\t);\n\t\t}\n\t});\n\n// -----------------------------------------------------------------------------\n// Internals — IO (pipe-safe)\n// -----------------------------------------------------------------------------\n\nconst writeStderrLine = (line: string): Effect.Effect<void> =>\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tprocess.stderr.write(`${line}\\n`);\n\t\t} catch (err) {\n\t\t\t// EPIPE swallowed (pipe-safety invariant); other errors\n\t\t\t// likewise swallowed because \"rendering never crashes the\n\t\t\t// stack\" (distilled/21-tui § Invariants).\n\t\t\tvoid err;\n\t\t}\n\t});\n"],"mappings":"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"}
1
+ {"version":3,"file":"plain-renderer.mjs","names":[],"sources":["../../../src/surfaces/tui/plain-renderer.ts"],"sourcesContent":["// Plain (non-TTY) renderer.\n//\n// Architecture §11 + distilled/21-tui §Renderers: when stdout is not\n// a TTY (CI, pipe, log file), the live ink dashboard is replaced by\n// a structured line stream. One line per event; periodic heartbeat\n// per internally-acquiring row, surfaced to operators as \"starting\".\n//\n// Discipline:\n// - One line per EngineEvent — no batching, no aggregation, no\n// diffing. Each event maps to exactly one structured line.\n// - Writes to stderr (architecture invariant: plain renderer goes\n// to stderr so stdout stays clean for whatever consumes the\n// pipe).\n// - EPIPE swallowed (pipe-safety invariant).\n// - Pure formatting helpers exposed for tests; the Effect-shaped\n// side is the `mount` function.\n// - Heartbeat formatting is pure here; scheduling belongs to the\n// renderer mount path. The architecture says it\n// \"anchors on first sighting in the internal acquiring state; phase\n// changes do NOT reset the clock; a late tick emits exactly one\n// heartbeat (no backlog catch-up)\". The seam is exposed via\n// `formatHeartbeat`.\n\nimport { Effect, Schema, Stream, SubscriptionRef } from 'effect';\n\nimport type { Renderer } from '../../contracts/renderer.ts';\nimport type { EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport {\n\tAccountProjectionSchema,\n\tPackageProjectionSchema,\n} from '../../substrate/runtime/projection/update.ts';\nimport {\n\taccountLine,\n\tendpointLine,\n\tlabelForRow,\n\tnarrationFor,\n\tpackageLine,\n\troleLabel,\n\tstatusLabel,\n} from './display-derivation.ts';\nimport { mountFailed } from './errors.ts';\nimport { eventAt } from '../../substrate/event-time.ts';\n\n// -----------------------------------------------------------------------------\n// Line shape — pure formatters\n// -----------------------------------------------------------------------------\n\n/**\n * Plain-renderer line shape (each call returns exactly one line, no\n * trailing newline).\n *\n * <iso-timestamp> <level> <event-tag> <key>=<value> ...\n *\n * Example:\n * 2026-05-19T20:11:32.001Z INFO lifecycle.statusChanged key=sui from=starting to=ready\n * 2026-05-19T20:11:32.500Z WARN log.appended key=walrus line=\"failed to bind port 9000\"\n * 2026-05-19T20:11:33.000Z INFO endpoint.registered name=aggregator url=http://localhost:9000\n */\nexport const formatEventLine = (event: EngineEvent): string => {\n\tconst ts = isoTimestamp(eventAt(event));\n\tconst level = levelForEvent(event);\n\tconst payload = payloadFor(event);\n\treturn `${ts} ${level} ${event.tag} ${payload}`;\n};\n\n/**\n * Heartbeat line for an in-flight internal acquiring row. Emitted by the\n * scheduler at architecture-blessed intervals; this function is the\n * pure formatter only.\n */\nexport const formatHeartbeat = (\n\tnow: number,\n\tkey: string,\n\tphase: string | null,\n\troleToken: string,\n): string => {\n\tconst ts = isoTimestamp(now);\n\tconst narration = narrationFor(phase, 'acquiring');\n\treturn `${ts} INFO heartbeat key=${key} role=${roleToken} narration=${quote(narration)}`;\n};\n\n// -----------------------------------------------------------------------------\n// Renderer implementation\n// -----------------------------------------------------------------------------\n\nexport interface PlainRendererOptions {\n\t/**\n\t * Quiet mode: emit only the milestones an operator tailing the stream\n\t * cares about — per-plugin readiness, endpoint registrations, codegen,\n\t * hard-kill escalations, and ALL warnings/errors — and drop the routine\n\t * intermediate transitions (starting/acquiring), info `log.appended`\n\t * lines, projection churn, build progress, and teardown chatter.\n\t *\n\t * OFF by default: the normal `--format plain` / CI stream keeps the\n\t * architecture invariant of one line per event (no aggregation). This\n\t * is opted into by embedded consumers that pipe the supervisor's output\n\t * through another tool — notably the Playwright `webServer`, where the\n\t * full firehose surfaces as confusing `[WebServer]`-prefixed noise.\n\t */\n\treadonly quiet?: boolean;\n}\n\n/**\n * Build a plain renderer satisfying the `Renderer` contract.\n *\n * Mount subscribes to the live event stream, writes one line per\n * event to stderr. The state-ref is sampled for the initial sweep\n * (one line per declared row) so a renderer attached after boot\n * still sees a coherent baseline. In quiet mode the sweep collapses\n * to the single `stack.identity` line — at boot the per-row/account\n * lines are all `<pending>` and the real signal arrives as readiness\n * + endpoint events.\n */\nexport const makePlainRenderer = (options: PlainRendererOptions = {}): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst initial = yield* SubscriptionRef.get(stateRef);\n\t\t\tyield* emitInitialSweep(initial, { quiet: options.quiet });\n\t\t\tconst stream = options.quiet ? events.pipe(Stream.filter(keepInQuiet)) : events;\n\t\t\tyield* stream.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));\n\t\t}).pipe(\n\t\t\tEffect.catch((cause: unknown) =>\n\t\t\t\tEffect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))),\n\t\t\t),\n\t\t),\n\tflush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed('flush')))),\n});\n\n/**\n * Quiet-mode event predicate (pure; exported for tests). Keeps milestone\n * and non-INFO events; drops routine INFO churn. Anything that formats as\n * WARN/ERROR is always kept so failures are never silently filtered out.\n */\nexport const keepInQuiet = (event: EngineEvent): boolean => {\n\tif (levelForEvent(event) !== 'INFO') return true;\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\t// Only the readiness milestone, not every starting/acquiring tick.\n\t\t\treturn event.to === 'ready';\n\t\tcase 'endpoint.registered':\n\t\tcase 'codegen.emitted':\n\t\tcase 'shutdown.escalated':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — formatting\n// -----------------------------------------------------------------------------\n\nconst isoTimestamp = (at: number): string => new Date(at || Date.now()).toISOString();\n\nconst levelForEvent = (event: EngineEvent): 'INFO' | 'WARN' | 'ERROR' => {\n\tswitch (event.tag) {\n\t\tcase 'log.appended':\n\t\t\treturn event.level === 'error' ? 'ERROR' : event.level === 'warn' ? 'WARN' : 'INFO';\n\t\tcase 'error.reported':\n\t\t\treturn event.error.severity === 'fatal' || event.error.severity === 'error'\n\t\t\t\t? 'ERROR'\n\t\t\t\t: 'WARN';\n\t\t// A failed buffered contribution replayed through the\n\t\t// `ContributionDispatcher` leaves the plugin `ready` (non-fatal by\n\t\t// design — see `dispatchBufferedContributions` in acquire-node.ts),\n\t\t// so this is the operator's ONLY signal that e.g. RPC/wallet routing\n\t\t// is dead. It must not render as a routine INFO line.\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn 'WARN';\n\t\tdefault:\n\t\t\treturn 'INFO';\n\t}\n};\n\nconst payloadFor = (event: EngineEvent): string => {\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tfrom: statusLabel(event.from),\n\t\t\t\tto: statusLabel(event.to),\n\t\t\t});\n\t\tcase 'lifecycle.phaseSet':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tphase: event.phase ?? '',\n\t\t\t});\n\t\tcase 'log.appended':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tline: event.line,\n\t\t\t});\n\t\tcase 'endpoint.registered':\n\t\t\treturn kv({\n\t\t\t\tkey: event.endpoint.endpointKey,\n\t\t\t\tname: event.endpoint.name,\n\t\t\t\tdisplayUrl: event.endpoint.displayUrl ?? event.endpoint.url,\n\t\t\t\turl: event.endpoint.url,\n\t\t\t\twire: event.endpoint.wireProtocol,\n\t\t\t});\n\t\tcase 'projection.updated':\n\t\t\tif (event.kind === 'account') {\n\t\t\t\t// STYLE_GUIDE §19 — substrate-side `decodeUnknownSync` so a\n\t\t\t\t// malformed payload skips the line rather than rendering\n\t\t\t\t// garbage (`Schema.decodeUnknownSync(...) as A` bare-cast\n\t\t\t\t// is banned). The reducer at\n\t\t\t\t// `substrate/runtime/projection/update.ts` performs the\n\t\t\t\t// same decode; we repeat it here because the renderer\n\t\t\t\t// reads the raw event stream, not the reduced state slice.\n\t\t\t\tconst account = tryDecodeProjection(AccountProjectionSchema, event.payload);\n\t\t\t\tif (account === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: account.key,\n\t\t\t\t\trow: account.rowKey ?? '',\n\t\t\t\t\tname: account.name,\n\t\t\t\t\taddress: account.address ?? '',\n\t\t\t\t\tscheme: account.scheme ?? '',\n\t\t\t\t\tsource: account.source ?? '',\n\t\t\t\t\tfunding: account.funding.status,\n\t\t\t\t\tfundingEntries: (account.funding.entries ?? [])\n\t\t\t\t\t\t.map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`)\n\t\t\t\t\t\t.join(','),\n\t\t\t\t\trequestedMist: account.funding.requestedMist ?? '',\n\t\t\t\t\tbalanceMist: account.funding.balanceMist ?? '',\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (event.kind === 'package') {\n\t\t\t\tconst pkg = tryDecodeProjection(PackageProjectionSchema, event.payload);\n\t\t\t\tif (pkg === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: pkg.key,\n\t\t\t\t\trow: pkg.rowKey ?? '',\n\t\t\t\t\tname: pkg.name,\n\t\t\t\t\tkind: pkg.kind,\n\t\t\t\t\tpackageId: pkg.packageId,\n\t\t\t\t\tupgradeCapId: pkg.upgradeCapId ?? '',\n\t\t\t\t\tmvr: pkg.mvrPlaceholder,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn kv({ kind: event.kind, key: event.key });\n\t\tcase 'endpoint.released':\n\t\t\treturn kv({ key: event.endpointKey });\n\t\tcase 'strategy.registered':\n\t\t\treturn kv({\n\t\t\t\tcapability: event.capabilityKey,\n\t\t\t\tautoMounted: event.autoMounted,\n\t\t\t});\n\t\tcase 'strategy.unregistered':\n\t\t\treturn kv({ capability: event.capabilityKey });\n\t\tcase 'manifest.flushed':\n\t\t\treturn kv({ version: event.manifestVersion });\n\t\tcase 'codegen.emitted':\n\t\t\treturn kv({ files: event.files.length });\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tkind: event.kind,\n\t\t\t\t// `causeType` (the failing sink error's `_tag`, e.g.\n\t\t\t\t// `RouterBootFailed`) is the discriminator an operator scans\n\t\t\t\t// for to tell dead RPC routing from a codegen collision. `kv`\n\t\t\t\t// drops it when undefined, so untagged causes stay clean.\n\t\t\t\tcauseType: event.causeType ?? '',\n\t\t\t\tsummary: event.message,\n\t\t\t});\n\t\tcase 'error.reported':\n\t\t\treturn kv({\n\t\t\t\tkey: event.error.pluginKey ?? '',\n\t\t\t\ttag: event.error.tag,\n\t\t\t\tsummary: event.error.summary,\n\t\t\t\tcause: event.error.chain.join(' | '),\n\t\t\t\tseverity: event.error.severity,\n\t\t\t});\n\t\tcase 'build.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.entry.pluginKey ?? '',\n\t\t\t\tphase: event.entry.phase,\n\t\t\t\tprogress: event.entry.progress,\n\t\t\t});\n\t\tcase 'restart.requested':\n\t\tcase 'restart.completed':\n\t\t\treturn kv({\n\t\t\t\ttarget: event.target === 'stack' ? 'stack' : event.target.pluginKey,\n\t\t\t});\n\t\tcase 'shutdown.escalated':\n\t\t\treturn kv({\n\t\t\t\tmode: 'hard-kill',\n\t\t\t\tsignal: event.signal,\n\t\t\t\texitCode: event.exitCode,\n\t\t\t});\n\t\tcase 'snapshot.captureSkipped':\n\t\t\treturn kv({ reason: event.reason });\n\t\tcase 'snapshot.captureFailed':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name, summary: event.summary });\n\t\tcase 'snapshot.captured':\n\t\tcase 'snapshot.restored':\n\t\t\treturn kv({ snapshotId: event.snapshotId });\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = event;\n\t\t\tvoid _exhaustive;\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\nconst kv = (record: Readonly<Record<string, unknown>>): string =>\n\tObject.entries(record)\n\t\t.filter(([, v]) => v !== '' && v !== null && v !== undefined)\n\t\t.map(([k, v]) => `${k}=${quoteIfNeeded(String(v))}`)\n\t\t.join(' ');\n\n// Quote anything that contains whitespace, a `\"`, or an ASCII control\n// byte (`\\x00-\\x1f`). Control bytes are the load-bearing case: a\n// projection payload field that contains a stray `\\x1b` (ESC) would\n// otherwise inject an ANSI escape sequence into the plain-renderer's\n// stdout, corrupting subsequent terminal state for callers tailing\n// `--format plain` output.\nconst quoteIfNeeded = (s: string): string => (/[\\s\"\\x00-\\x1f]/.test(s) ? quote(s) : s);\n\nconst quote = (s: string): string => `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n\n/**\n * Structural validate-then-narrow for `projection.updated` payloads\n * before they are formatted as text. Mirrors\n * `tryDecodeProjectionPayload` in the substrate reducer — returns\n * `null` on schema-decode failure so the renderer drops the slice\n * rather than printing fields off a malformed object. The substrate\n * reducer emits the `Effect.logWarning` for the same payload (the\n * decode is deterministic), so we stay silent here to avoid double\n * logging.\n */\nconst tryDecodeProjection = <S extends Schema.Decoder<unknown>>(\n\tschema: S,\n\tpayload: unknown,\n): S['Type'] | null => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(payload);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — initial sweep\n// -----------------------------------------------------------------------------\n\nconst emitInitialSweep = (\n\tstate: SubscribableState,\n\toptions: { readonly quiet?: boolean } = {},\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* writeStderrLine(\n\t\t\t`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`,\n\t\t);\n\t\t// Quiet mode: stop after the identity line. The per-row/account/\n\t\t// endpoint/package sweep is all `<pending>` at boot; the real signal\n\t\t// arrives as readiness + endpoint events on the (filtered) stream.\n\t\tif (options.quiet) return;\n\t\tfor (const row of state.rows) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(Date.now())} INFO row.declared ${kv({\n\t\t\t\t\tkey: row.key,\n\t\t\t\t\tlabel: labelForRow(row.key),\n\t\t\t\t\trole: roleLabel(row.role),\n\t\t\t\t\tstatus: statusLabel(row.status),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\t\tfor (const endpoint of state.endpoints) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(endpoint.registeredAt)} INFO endpoint.registered ${endpointLine(endpoint)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const account of state.accounts) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(account.updatedAt)} INFO projection.updated[account] ${accountLine(account)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const pkg of state.packages) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(pkg.updatedAt)} INFO projection.updated[package] ${packageLine(pkg)}`,\n\t\t\t);\n\t\t}\n\t});\n\n// -----------------------------------------------------------------------------\n// Internals — IO (pipe-safe)\n// -----------------------------------------------------------------------------\n\nconst writeStderrLine = (line: string): Effect.Effect<void> =>\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tprocess.stderr.write(`${line}\\n`);\n\t\t} catch (err) {\n\t\t\t// EPIPE swallowed (pipe-safety invariant); other errors\n\t\t\t// likewise swallowed because \"rendering never crashes the\n\t\t\t// stack\" (distilled/21-tui § Invariants).\n\t\t\tvoid err;\n\t\t}\n\t});\n"],"mappings":";;;;;;;;;;;;;;;;;AA2DA,MAAa,mBAAmB,UAA+B;CAC9D,MAAM,KAAK,aAAa,QAAQ,KAAK,CAAC;CACtC,MAAM,QAAQ,cAAc,KAAK;CACjC,MAAM,UAAU,WAAW,KAAK;CAChC,OAAO,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,GAAG;AACvC;;;;;;;;;;;;AAkDA,MAAa,qBAAqB,UAAgC,CAAC,OAAiB;CACnF,QAAQ,UAAU,WACjB,OAAO,IAAI,aAAa;EAEvB,OAAO,iBAAiB,OADD,gBAAgB,IAAI,QAAQ,GAClB,EAAE,OAAO,QAAQ,MAAM,CAAC;EAEzD,QADe,QAAQ,QAAQ,OAAO,KAAK,OAAO,OAAO,WAAW,CAAC,IAAI,OAAA,CAC3D,KAAK,OAAO,YAAY,UAAU,gBAAgB,gBAAgB,KAAK,CAAC,CAAC,CAAC;CACzF,CAAC,CAAC,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KAAK,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC,CAChF,CACD;CACD,OAAO,OAAO,KAAK,KAAK,OAAO,YAAY,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC;AAC9E;;;;;;AAOA,MAAa,eAAe,UAAgC;CAC3D,IAAI,cAAc,KAAK,MAAM,QAAQ,OAAO;CAC5C,QAAQ,MAAM,KAAd;EACC,KAAK,2BAEJ,OAAO,MAAM,OAAO;EACrB,KAAK;EACL,KAAK;EACL,KAAK,sBACJ,OAAO;EACR,SACC,OAAO;CACT;AACD;AAMA,MAAM,gBAAgB,OAAuB,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY;AAEpF,MAAM,iBAAiB,UAAkD;CACxE,QAAQ,MAAM,KAAd;EACC,KAAK,gBACJ,OAAO,MAAM,UAAU,UAAU,UAAU,MAAM,UAAU,SAAS,SAAS;EAC9E,KAAK,kBACJ,OAAO,MAAM,MAAM,aAAa,WAAW,MAAM,MAAM,aAAa,UACjE,UACA;EAMJ,KAAK,sCACJ,OAAO;EACR,SACC,OAAO;CACT;AACD;AAEA,MAAM,cAAc,UAA+B;CAClD,QAAQ,MAAM,KAAd;EACC,KAAK,2BACJ,OAAO,GAAG;GACT,KAAK,MAAM;GACX,MAAM,YAAY,MAAM,IAAI;GAC5B,IAAI,YAAY,MAAM,EAAE;EACzB,CAAC;EACF,KAAK,sBACJ,OAAO,GAAG;GACT,KAAK,MAAM;GACX,OAAO,MAAM,SAAS;EACvB,CAAC;EACF,KAAK,gBACJ,OAAO,GAAG;GACT,KAAK,MAAM;GACX,MAAM,MAAM;EACb,CAAC;EACF,KAAK,uBACJ,OAAO,GAAG;GACT,KAAK,MAAM,SAAS;GACpB,MAAM,MAAM,SAAS;GACrB,YAAY,MAAM,SAAS,cAAc,MAAM,SAAS;GACxD,KAAK,MAAM,SAAS;GACpB,MAAM,MAAM,SAAS;EACtB,CAAC;EACF,KAAK;GACJ,IAAI,MAAM,SAAS,WAAW;IAQ7B,MAAM,UAAU,oBAAoB,yBAAyB,MAAM,OAAO;IAC1E,IAAI,YAAY,MAAM,OAAO,GAAG;KAAE,MAAM,MAAM;KAAM,KAAK,MAAM;IAAI,CAAC;IACpE,OAAO,GAAG;KACT,KAAK,QAAQ;KACb,KAAK,QAAQ,UAAU;KACvB,MAAM,QAAQ;KACd,SAAS,QAAQ,WAAW;KAC5B,QAAQ,QAAQ,UAAU;KAC1B,QAAQ,QAAQ,UAAU;KAC1B,SAAS,QAAQ,QAAQ;KACzB,iBAAiB,QAAQ,QAAQ,WAAW,CAAC,EAAA,CAC3C,KAAK,UAAU,GAAG,MAAM,KAAK,GAAG,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAC/D,KAAK,GAAG;KACV,eAAe,QAAQ,QAAQ,iBAAiB;KAChD,aAAa,QAAQ,QAAQ,eAAe;IAC7C,CAAC;GACF;GACA,IAAI,MAAM,SAAS,WAAW;IAC7B,MAAM,MAAM,oBAAoB,yBAAyB,MAAM,OAAO;IACtE,IAAI,QAAQ,MAAM,OAAO,GAAG;KAAE,MAAM,MAAM;KAAM,KAAK,MAAM;IAAI,CAAC;IAChE,OAAO,GAAG;KACT,KAAK,IAAI;KACT,KAAK,IAAI,UAAU;KACnB,MAAM,IAAI;KACV,MAAM,IAAI;KACV,WAAW,IAAI;KACf,cAAc,IAAI,gBAAgB;KAClC,KAAK,IAAI;IACV,CAAC;GACF;GACA,OAAO,GAAG;IAAE,MAAM,MAAM;IAAM,KAAK,MAAM;GAAI,CAAC;EAC/C,KAAK,qBACJ,OAAO,GAAG,EAAE,KAAK,MAAM,YAAY,CAAC;EACrC,KAAK,uBACJ,OAAO,GAAG;GACT,YAAY,MAAM;GAClB,aAAa,MAAM;EACpB,CAAC;EACF,KAAK,yBACJ,OAAO,GAAG,EAAE,YAAY,MAAM,cAAc,CAAC;EAC9C,KAAK,oBACJ,OAAO,GAAG,EAAE,SAAS,MAAM,gBAAgB,CAAC;EAC7C,KAAK,mBACJ,OAAO,GAAG,EAAE,OAAO,MAAM,MAAM,OAAO,CAAC;EACxC,KAAK,sCACJ,OAAO,GAAG;GACT,KAAK,MAAM;GACX,MAAM,MAAM;GAKZ,WAAW,MAAM,aAAa;GAC9B,SAAS,MAAM;EAChB,CAAC;EACF,KAAK,kBACJ,OAAO,GAAG;GACT,KAAK,MAAM,MAAM,aAAa;GAC9B,KAAK,MAAM,MAAM;GACjB,SAAS,MAAM,MAAM;GACrB,OAAO,MAAM,MAAM,MAAM,KAAK,KAAK;GACnC,UAAU,MAAM,MAAM;EACvB,CAAC;EACF,KAAK,uBACJ,OAAO,GAAG;GACT,KAAK,MAAM,MAAM,aAAa;GAC9B,OAAO,MAAM,MAAM;GACnB,UAAU,MAAM,MAAM;EACvB,CAAC;EACF,KAAK;EACL,KAAK,qBACJ,OAAO,GAAG,EACT,QAAQ,MAAM,WAAW,UAAU,UAAU,MAAM,OAAO,UAC3D,CAAC;EACF,KAAK,sBACJ,OAAO,GAAG;GACT,MAAM;GACN,QAAQ,MAAM;GACd,UAAU,MAAM;EACjB,CAAC;EACF,KAAK,2BACJ,OAAO,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC;EACnC,KAAK,0BACJ,OAAO,GAAG;GAAE,YAAY,MAAM;GAAY,MAAM,MAAM;GAAM,SAAS,MAAM;EAAQ,CAAC;EACrF,KAAK;EACL,KAAK,qBACJ,OAAO,GAAG,EAAE,YAAY,MAAM,WAAW,CAAC;EAC3C,SAGC,OAAO;CAET;AACD;AAEA,MAAM,MAAM,WACX,OAAO,QAAQ,MAAM,CAAC,CACpB,QAAQ,GAAG,OAAO,MAAM,MAAM,MAAM,QAAQ,MAAM,KAAA,CAAS,CAAC,CAC5D,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,cAAc,OAAO,CAAC,CAAC,GAAG,CAAC,CACnD,KAAK,GAAG;AAQX,MAAM,iBAAiB,MAAuB,iBAAiB,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI;AAEpF,MAAM,SAAS,MAAsB,IAAI,EAAE,QAAQ,MAAM,MAAK,EAAE;;;;;;;;;;;AAYhE,MAAM,uBACL,QACA,YACsB;CACtB,IAAI;EACH,OAAO,OAAO,kBAAkB,MAAM,CAAC,CAAC,OAAO;CAChD,QAAQ;EACP,OAAO;CACR;AACD;AAMA,MAAM,oBACL,OACA,UAAwC,CAAC,MAEzC,OAAO,IAAI,aAAa;CACvB,OAAO,gBACN,GAAG,aAAa,MAAM,MAAM,aAAa,KAAK,IAAI,CAAC,EAAE,2BAA2B,MAAM,SAAS,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,MAAM,SAAS,QAAQ,SAAS,MAAM,MAAM,IACzL;CAIA,IAAI,QAAQ,OAAO;CACnB,KAAK,MAAM,OAAO,MAAM,MACvB,OAAO,gBACN,GAAG,aAAa,KAAK,IAAI,CAAC,EAAE,qBAAqB,GAAG;EACnD,KAAK,IAAI;EACT,OAAO,YAAY,IAAI,GAAG;EAC1B,MAAM,UAAU,IAAI,IAAI;EACxB,QAAQ,YAAY,IAAI,MAAM;CAC/B,CAAC,GACF;CAED,KAAK,MAAM,YAAY,MAAM,WAC5B,OAAO,gBACN,GAAG,aAAa,SAAS,YAAY,EAAE,4BAA4B,aAAa,QAAQ,GACzF;CAED,KAAK,MAAM,WAAW,MAAM,UAC3B,OAAO,gBACN,GAAG,aAAa,QAAQ,SAAS,EAAE,oCAAoC,YAAY,OAAO,GAC3F;CAED,KAAK,MAAM,OAAO,MAAM,UACvB,OAAO,gBACN,GAAG,aAAa,IAAI,SAAS,EAAE,oCAAoC,YAAY,GAAG,GACnF;AAEF,CAAC;AAMF,MAAM,mBAAmB,SACxB,OAAO,WAAW;CACjB,IAAI;EACH,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;CACjC,SAAS,KAAK,CAKd;AACD,CAAC"}
@@ -436,8 +436,8 @@ const clip = (value, width) => {
436
436
  };
437
437
  const pluginTableLayout = (columns) => {
438
438
  const gapCount = (showDetail) => showDetail ? 3 : 2;
439
- const showDetail = columns >= STATE_WIDTH + NAME_WIDTH + DETAIL_WIDTH + MIN_URL_WIDTH + gapCount(true);
440
- const fixedWidth = STATE_WIDTH + NAME_WIDTH + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);
439
+ const showDetail = columns >= 95 + gapCount(true);
440
+ const fixedWidth = 31 + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);
441
441
  const availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);
442
442
  return {
443
443
  showDetail,
@@ -445,28 +445,26 @@ const pluginTableLayout = (columns) => {
445
445
  };
446
446
  };
447
447
  const accountTableLayout = (columns) => {
448
- const fullWidth = STATE_WIDTH + ACCOUNT_WIDTH + ADDRESS_WIDTH + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + DETAIL_WIDTH + 6;
449
- const midWidth = STATE_WIDTH + ACCOUNT_WIDTH + 32 + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + 5;
448
+ const fullWidth = 183;
449
+ const midWidth = 114;
450
450
  const showDetail = columns >= fullWidth;
451
451
  const showMeta = columns >= midWidth;
452
452
  const showFunding = columns >= midWidth;
453
- const fixed = STATE_WIDTH + ACCOUNT_WIDTH + (showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) + (showFunding ? FUNDING_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));
454
453
  return {
455
454
  showDetail,
456
455
  showMeta,
457
456
  showFunding,
458
- addressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - fixed))
457
+ addressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - (27 + (showMeta ? 16 : 0) + (showFunding ? FUNDING_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0)))))
459
458
  };
460
459
  };
461
460
  const packageTableLayout = (columns) => {
462
- const showDetail = columns >= STATE_WIDTH + PACKAGE_WIDTH + PACKAGE_ID_WIDTH + MVR_WIDTH + DETAIL_WIDTH + 4;
463
- const showMvr = columns >= STATE_WIDTH + PACKAGE_WIDTH + 24 + 16 + 3;
464
- const fixed = STATE_WIDTH + PACKAGE_WIDTH + (showMvr ? MVR_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));
461
+ const showDetail = columns >= 163;
462
+ const showMvr = columns >= 74;
465
463
  return {
466
464
  showDetail,
467
465
  showMvr,
468
466
  mvrWidth: showDetail ? MVR_WIDTH : 20,
469
- packageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - fixed))
467
+ packageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - (31 + (showMvr ? MVR_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0)))))
470
468
  };
471
469
  };
472
470
  const wrap = (value, width) => {
@@ -1 +1 @@
1
- {"version":3,"file":"resource-table.mjs","names":[],"sources":["../../../src/surfaces/tui/resource-table.tsx"],"sourcesContent":["import { Box, Text, useWindowSize } from 'ink';\nimport type React from 'react';\n\nimport type {\n\tAccountProjection,\n\tEndpoint,\n\tPackageProjection,\n\tRow,\n} from '../../substrate/projection.ts';\nimport {\n\taccountCells,\n\tderiveDisplayCells,\n\tendpointLine,\n\tgroupRows,\n\tpackageCells,\n\tvisibleEndpointsForRow,\n\ttype ColorToken,\n\ttype DisplayRow,\n\ttype DisplaySection,\n} from './display-derivation.ts';\n\nexport interface ResourceTablesProps {\n\treadonly rows: ReadonlyArray<Row>;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n}\n\nconst STATE_WIDTH = 13;\nconst NAME_WIDTH = 18;\nconst MIN_URL_WIDTH = 32;\nconst MAX_URL_WIDTH = 96;\nconst DETAIL_WIDTH = 32;\nconst ACCOUNT_WIDTH = 14;\nconst ADDRESS_WIDTH = 68;\nconst SCHEME_WIDTH = 8;\nconst SOURCE_WIDTH = 8;\nconst FUNDING_WIDTH = 34;\nconst PACKAGE_WIDTH = 18;\nconst PACKAGE_ID_WIDTH = 68;\nconst MVR_WIDTH = 28;\n\ninterface PluginTableLayout {\n\treadonly urlWidth: number;\n\treadonly showDetail: boolean;\n}\n\ninterface AccountTableLayout {\n\treadonly addressWidth: number;\n\treadonly showMeta: boolean;\n\treadonly showFunding: boolean;\n\treadonly showDetail: boolean;\n}\n\ninterface PackageTableLayout {\n\treadonly packageIdWidth: number;\n\treadonly mvrWidth: number;\n\treadonly showMvr: boolean;\n\treadonly showDetail: boolean;\n}\n\nexport const ResourceTables = ({\n\trows,\n\tendpoints,\n\taccounts,\n\tpackages,\n}: ResourceTablesProps): React.JSX.Element => {\n\tconst { columns } = useWindowSize();\n\tconst pluginLayout = pluginTableLayout(columns);\n\tconst accountLayout = accountTableLayout(columns);\n\tconst packageLayout = packageTableLayout(columns);\n\tconst sections = groupRows(rows, endpoints);\n\tconst bySection = new Map(sections.map((section) => [section.key, section]));\n\tconst orderedSections = [\n\t\tbySection.get('service'),\n\t\tbySection.get('package'),\n\t\tbySection.get('account'),\n\t\tbySection.get('action'),\n\t\tbySection.get('app'),\n\t\tbySection.get('other'),\n\t].filter((section): section is DisplaySection => section !== undefined);\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t<Text bold>Stack</Text>\n\t\t\t{rows.length === 0 && accounts.length === 0 && packages.length === 0 && (\n\t\t\t\t<Text>no plugins declared</Text>\n\t\t\t)}\n\t\t\t{orderedSections.map((section) =>\n\t\t\t\tsection.key === 'account' ? (\n\t\t\t\t\t<AccountSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\taccounts={accounts}\n\t\t\t\t\t\tlayout={accountLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : section.key === 'package' ? (\n\t\t\t\t\t<PackageSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tpackages={packages}\n\t\t\t\t\t\tlayout={packageLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<PluginSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tendpoints={endpoints}\n\t\t\t\t\t\tlayout={pluginLayout}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t)}\n\t\t\t{bySection.has('account') ? null : accounts.length > 0 ? (\n\t\t\t\t<AccountSection section={undefined} accounts={accounts} layout={accountLayout} />\n\t\t\t) : null}\n\t\t\t{bySection.has('package') ? null : packages.length > 0 ? (\n\t\t\t\t<PackageSection section={undefined} packages={packages} layout={packageLayout} />\n\t\t\t) : null}\n\t\t</Box>\n\t);\n};\n\nconst PluginSection = ({\n\tsection,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly section: DisplaySection;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t<Text bold>{section.label}</Text>\n\t\t<Header\n\t\t\tcells={layout.showDetail ? ['STATE', 'NAME', 'URLS', 'DETAIL'] : ['STATE', 'NAME', 'URLS']}\n\t\t\twidths={\n\t\t\t\tlayout.showDetail\n\t\t\t\t\t? [STATE_WIDTH, NAME_WIDTH, layout.urlWidth, DETAIL_WIDTH]\n\t\t\t\t\t: [STATE_WIDTH, NAME_WIDTH, layout.urlWidth]\n\t\t\t}\n\t\t/>\n\t\t{section.rows.map((displayRow) => (\n\t\t\t<PluginRow\n\t\t\t\tkey={displayRow.row.key}\n\t\t\t\tdisplayRow={displayRow}\n\t\t\t\tendpoints={endpoints}\n\t\t\t\tlayout={layout}\n\t\t\t/>\n\t\t))}\n\t</Box>\n);\n\nconst PluginRow = ({\n\tdisplayRow,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row, endpoints);\n\tconst urlLines = visibleEndpointsForRow(displayRow.row, endpoints).map(endpointLine);\n\tconst detail = cells.errorSummary || cells.narration;\n\tconst detailLines = detail.length === 0 ? [] : [`detail: ${detail}`];\n\tconst compactUrlLines = [\n\t\t...(urlLines.length === 0 ? ['-'] : urlLines),\n\t\t...(layout.showDetail ? [] : detailLines),\n\t];\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={NAME_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{cells.label}\n\t\t\t</FixedText>\n\t\t\t<MultiLineFixedText\n\t\t\t\twidth={layout.urlWidth}\n\t\t\t\tcolor={urlLines.length === 0 ? 'white' : 'cyan'}\n\t\t\t\tlines={compactUrlLines}\n\t\t\t/>\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountSection = ({\n\tsection,\n\taccounts,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst accountByRow = new Map(\n\t\taccounts\n\t\t\t.filter((account) => account.rowKey !== null)\n\t\t\t.map((account) => [account.rowKey as string, account]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedAccounts = accounts.filter(\n\t\t(account) => account.rowKey === null || !rowKeys.has(account.rowKey),\n\t);\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Accounts</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'ACCOUNT',\n\t\t\t\t\t'ADDRESS',\n\t\t\t\t\t...(layout.showMeta ? ['SCHEME', 'SOURCE'] : []),\n\t\t\t\t\t...(layout.showFunding ? ['FUNDING'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tACCOUNT_WIDTH,\n\t\t\t\t\tlayout.addressWidth,\n\t\t\t\t\t...(layout.showMeta ? [SCHEME_WIDTH, SOURCE_WIDTH] : []),\n\t\t\t\t\t...(layout.showFunding ? [FUNDING_WIDTH] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<AccountRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\taccount={accountByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedAccounts.map((account) => (\n\t\t\t\t<AccountRecordRow key={account.key} account={account} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst PackageSection = ({\n\tsection,\n\tpackages,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst packageByRow = new Map(\n\t\tpackages.filter((pkg) => pkg.rowKey !== null).map((pkg) => [pkg.rowKey as string, pkg]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedPackages = packages.filter((pkg) => pkg.rowKey === null || !rowKeys.has(pkg.rowKey));\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Packages</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'PACKAGE',\n\t\t\t\t\t'PACKAGE ID',\n\t\t\t\t\t...(layout.showMvr ? ['MVR'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tPACKAGE_WIDTH,\n\t\t\t\t\tlayout.packageIdWidth,\n\t\t\t\t\t...(layout.showMvr ? [layout.mvrWidth] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<PackageRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\tpkg={packageByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedPackages.map((pkg) => (\n\t\t\t\t<PackageRecordRow key={pkg.key} pkg={pkg} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst AccountRow = ({\n\tdisplayRow,\n\taccount,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly account: AccountProjection | undefined;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\taccount === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\taddress: '<pending>',\n\t\t\t\t\tscheme: 'pending',\n\t\t\t\t\tsource: 'pending',\n\t\t\t\t\tfunding: 'funding pending',\n\t\t\t\t}\n\t\t\t: accountCells(account);\n\tconst detail = cells.errorSummary || cells.narration || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRow = ({\n\tdisplayRow,\n\tpkg,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly pkg: PackageProjection | undefined;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\tpkg === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\tpackageId: '<pending>',\n\t\t\t\t\tmvr: 'pending',\n\t\t\t\t\tdetail: cells.errorSummary || cells.narration || 'publish pending',\n\t\t\t\t}\n\t\t\t: packageCells(pkg);\n\tconst detail = cells.errorSummary || cells.narration || facts.detail || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={PACKAGE_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountRecordRow = ({\n\taccount,\n\tlayout,\n}: {\n\treadonly account: AccountProjection;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst facts = accountCells(account);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<FixedText width={DETAIL_WIDTH} color=\"white\">\n\t\t\t\t\t-\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRecordRow = ({\n\tpkg,\n\tlayout,\n}: {\n\treadonly pkg: PackageProjection;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst facts = packageCells(pkg);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={PACKAGE_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText width={DETAIL_WIDTH} color=\"white\" lines={[facts.detail]} />\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst StateCell = ({\n\tglyph,\n\tlabel,\n\tcolor,\n}: {\n\treadonly glyph: string;\n\treadonly label: string;\n\treadonly color: ColorToken;\n}): React.JSX.Element => (\n\t<FixedText width={STATE_WIDTH} color={color}>\n\t\t{`${glyph} ${label}`}\n\t</FixedText>\n);\n\nconst Header = ({\n\tcells,\n\twidths,\n}: {\n\treadonly cells: ReadonlyArray<string>;\n\treadonly widths: ReadonlyArray<number>;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"row\" gap={1}>\n\t\t{cells.map((cell, index) =>\n\t\t\twidths[index] === 0 ? (\n\t\t\t\t<Text key={`${index}:${cell}`} bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\t<FixedText key={`${index}:${cell}`} width={widths[index] ?? 0} color=\"white\" bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</FixedText>\n\t\t\t),\n\t\t)}\n\t</Box>\n);\n\nconst FixedText = ({\n\twidth,\n\tcolor,\n\tbold = false,\n\tchildren,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly bold?: boolean;\n\treadonly children: string;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0}>\n\t\t<Text color={color} bold={bold}>\n\t\t\t{clip(children, width)}\n\t\t</Text>\n\t</Box>\n);\n\nconst MultiLineFixedText = ({\n\twidth,\n\tcolor,\n\tlines,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly lines: ReadonlyArray<string>;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0} flexDirection=\"column\">\n\t\t{lines\n\t\t\t.flatMap((line) => wrap(line, width))\n\t\t\t.map((line, index) => (\n\t\t\t\t<Text key={`${index}:${line}`} color={color} wrap=\"truncate-end\">\n\t\t\t\t\t{line}\n\t\t\t\t</Text>\n\t\t\t))}\n\t</Box>\n);\n\nconst clip = (value: string, width: number): string => {\n\tif (width <= 0 || value.length <= width) return value;\n\tif (width <= 1) return value.slice(0, width);\n\treturn `${value.slice(0, width - 1)}…`;\n};\n\nconst pluginTableLayout = (columns: number): PluginTableLayout => {\n\tconst gapCount = (showDetail: boolean): number => (showDetail ? 3 : 2);\n\tconst detailBudget = STATE_WIDTH + NAME_WIDTH + DETAIL_WIDTH + MIN_URL_WIDTH + gapCount(true);\n\tconst showDetail = columns >= detailBudget;\n\tconst fixedWidth =\n\t\tSTATE_WIDTH + NAME_WIDTH + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);\n\tconst availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);\n\treturn {\n\t\tshowDetail,\n\t\turlWidth: Math.min(MAX_URL_WIDTH, availableUrlWidth),\n\t};\n};\n\nconst accountTableLayout = (columns: number): AccountTableLayout => {\n\tconst fullWidth =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\tADDRESS_WIDTH +\n\t\tSCHEME_WIDTH +\n\t\tSOURCE_WIDTH +\n\t\tFUNDING_WIDTH +\n\t\tDETAIL_WIDTH +\n\t\t6;\n\tconst midWidth =\n\t\tSTATE_WIDTH + ACCOUNT_WIDTH + 32 + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + 5;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMeta = columns >= midWidth;\n\tconst showFunding = columns >= midWidth;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\t(showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) +\n\t\t(showFunding ? FUNDING_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMeta,\n\t\tshowFunding,\n\t\taddressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst packageTableLayout = (columns: number): PackageTableLayout => {\n\tconst fullWidth = STATE_WIDTH + PACKAGE_WIDTH + PACKAGE_ID_WIDTH + MVR_WIDTH + DETAIL_WIDTH + 4;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMvr = columns >= STATE_WIDTH + PACKAGE_WIDTH + 24 + 16 + 3;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tPACKAGE_WIDTH +\n\t\t(showMvr ? MVR_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMvr,\n\t\tmvrWidth: showDetail ? MVR_WIDTH : 20,\n\t\tpackageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst wrap = (value: string, width: number): ReadonlyArray<string> => {\n\tconst limit = Math.max(1, width - 1);\n\tif (width <= 0 || value.length <= limit) return [value];\n\tconst lines: Array<string> = [];\n\tlet rest = value;\n\twhile (rest.length > limit) {\n\t\tconst idx = wrapIndex(rest, limit);\n\t\tlines.push(rest.slice(0, idx).trimEnd());\n\t\trest = rest.slice(idx).trimStart();\n\t}\n\tif (rest.length > 0) lines.push(rest);\n\treturn lines;\n};\n\nconst wrapIndex = (value: string, width: number): number => {\n\tconst window = value.slice(0, width + 1);\n\tconst candidates = [' -> ', ' | ', ' '];\n\tlet bestIndex = -1;\n\tlet bestLength = 0;\n\tfor (const candidate of candidates) {\n\t\tconst idx = window.lastIndexOf(candidate);\n\t\tif (idx > bestIndex) {\n\t\t\tbestIndex = idx;\n\t\t\tbestLength = candidate.length;\n\t\t}\n\t}\n\tif (bestIndex > 0) return bestIndex + bestLength;\n\treturn width;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"resource-table.mjs","names":[],"sources":["../../../src/surfaces/tui/resource-table.tsx"],"sourcesContent":["import { Box, Text, useWindowSize } from 'ink';\nimport type React from 'react';\n\nimport type {\n\tAccountProjection,\n\tEndpoint,\n\tPackageProjection,\n\tRow,\n} from '../../substrate/projection.ts';\nimport {\n\taccountCells,\n\tderiveDisplayCells,\n\tendpointLine,\n\tgroupRows,\n\tpackageCells,\n\tvisibleEndpointsForRow,\n\ttype ColorToken,\n\ttype DisplayRow,\n\ttype DisplaySection,\n} from './display-derivation.ts';\n\nexport interface ResourceTablesProps {\n\treadonly rows: ReadonlyArray<Row>;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n}\n\nconst STATE_WIDTH = 13;\nconst NAME_WIDTH = 18;\nconst MIN_URL_WIDTH = 32;\nconst MAX_URL_WIDTH = 96;\nconst DETAIL_WIDTH = 32;\nconst ACCOUNT_WIDTH = 14;\nconst ADDRESS_WIDTH = 68;\nconst SCHEME_WIDTH = 8;\nconst SOURCE_WIDTH = 8;\nconst FUNDING_WIDTH = 34;\nconst PACKAGE_WIDTH = 18;\nconst PACKAGE_ID_WIDTH = 68;\nconst MVR_WIDTH = 28;\n\ninterface PluginTableLayout {\n\treadonly urlWidth: number;\n\treadonly showDetail: boolean;\n}\n\ninterface AccountTableLayout {\n\treadonly addressWidth: number;\n\treadonly showMeta: boolean;\n\treadonly showFunding: boolean;\n\treadonly showDetail: boolean;\n}\n\ninterface PackageTableLayout {\n\treadonly packageIdWidth: number;\n\treadonly mvrWidth: number;\n\treadonly showMvr: boolean;\n\treadonly showDetail: boolean;\n}\n\nexport const ResourceTables = ({\n\trows,\n\tendpoints,\n\taccounts,\n\tpackages,\n}: ResourceTablesProps): React.JSX.Element => {\n\tconst { columns } = useWindowSize();\n\tconst pluginLayout = pluginTableLayout(columns);\n\tconst accountLayout = accountTableLayout(columns);\n\tconst packageLayout = packageTableLayout(columns);\n\tconst sections = groupRows(rows, endpoints);\n\tconst bySection = new Map(sections.map((section) => [section.key, section]));\n\tconst orderedSections = [\n\t\tbySection.get('service'),\n\t\tbySection.get('package'),\n\t\tbySection.get('account'),\n\t\tbySection.get('action'),\n\t\tbySection.get('app'),\n\t\tbySection.get('other'),\n\t].filter((section): section is DisplaySection => section !== undefined);\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t<Text bold>Stack</Text>\n\t\t\t{rows.length === 0 && accounts.length === 0 && packages.length === 0 && (\n\t\t\t\t<Text>no plugins declared</Text>\n\t\t\t)}\n\t\t\t{orderedSections.map((section) =>\n\t\t\t\tsection.key === 'account' ? (\n\t\t\t\t\t<AccountSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\taccounts={accounts}\n\t\t\t\t\t\tlayout={accountLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : section.key === 'package' ? (\n\t\t\t\t\t<PackageSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tpackages={packages}\n\t\t\t\t\t\tlayout={packageLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<PluginSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tendpoints={endpoints}\n\t\t\t\t\t\tlayout={pluginLayout}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t)}\n\t\t\t{bySection.has('account') ? null : accounts.length > 0 ? (\n\t\t\t\t<AccountSection section={undefined} accounts={accounts} layout={accountLayout} />\n\t\t\t) : null}\n\t\t\t{bySection.has('package') ? null : packages.length > 0 ? (\n\t\t\t\t<PackageSection section={undefined} packages={packages} layout={packageLayout} />\n\t\t\t) : null}\n\t\t</Box>\n\t);\n};\n\nconst PluginSection = ({\n\tsection,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly section: DisplaySection;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t<Text bold>{section.label}</Text>\n\t\t<Header\n\t\t\tcells={layout.showDetail ? ['STATE', 'NAME', 'URLS', 'DETAIL'] : ['STATE', 'NAME', 'URLS']}\n\t\t\twidths={\n\t\t\t\tlayout.showDetail\n\t\t\t\t\t? [STATE_WIDTH, NAME_WIDTH, layout.urlWidth, DETAIL_WIDTH]\n\t\t\t\t\t: [STATE_WIDTH, NAME_WIDTH, layout.urlWidth]\n\t\t\t}\n\t\t/>\n\t\t{section.rows.map((displayRow) => (\n\t\t\t<PluginRow\n\t\t\t\tkey={displayRow.row.key}\n\t\t\t\tdisplayRow={displayRow}\n\t\t\t\tendpoints={endpoints}\n\t\t\t\tlayout={layout}\n\t\t\t/>\n\t\t))}\n\t</Box>\n);\n\nconst PluginRow = ({\n\tdisplayRow,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row, endpoints);\n\tconst urlLines = visibleEndpointsForRow(displayRow.row, endpoints).map(endpointLine);\n\tconst detail = cells.errorSummary || cells.narration;\n\tconst detailLines = detail.length === 0 ? [] : [`detail: ${detail}`];\n\tconst compactUrlLines = [\n\t\t...(urlLines.length === 0 ? ['-'] : urlLines),\n\t\t...(layout.showDetail ? [] : detailLines),\n\t];\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={NAME_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{cells.label}\n\t\t\t</FixedText>\n\t\t\t<MultiLineFixedText\n\t\t\t\twidth={layout.urlWidth}\n\t\t\t\tcolor={urlLines.length === 0 ? 'white' : 'cyan'}\n\t\t\t\tlines={compactUrlLines}\n\t\t\t/>\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountSection = ({\n\tsection,\n\taccounts,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst accountByRow = new Map(\n\t\taccounts\n\t\t\t.filter((account) => account.rowKey !== null)\n\t\t\t.map((account) => [account.rowKey as string, account]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedAccounts = accounts.filter(\n\t\t(account) => account.rowKey === null || !rowKeys.has(account.rowKey),\n\t);\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Accounts</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'ACCOUNT',\n\t\t\t\t\t'ADDRESS',\n\t\t\t\t\t...(layout.showMeta ? ['SCHEME', 'SOURCE'] : []),\n\t\t\t\t\t...(layout.showFunding ? ['FUNDING'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tACCOUNT_WIDTH,\n\t\t\t\t\tlayout.addressWidth,\n\t\t\t\t\t...(layout.showMeta ? [SCHEME_WIDTH, SOURCE_WIDTH] : []),\n\t\t\t\t\t...(layout.showFunding ? [FUNDING_WIDTH] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<AccountRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\taccount={accountByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedAccounts.map((account) => (\n\t\t\t\t<AccountRecordRow key={account.key} account={account} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst PackageSection = ({\n\tsection,\n\tpackages,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst packageByRow = new Map(\n\t\tpackages.filter((pkg) => pkg.rowKey !== null).map((pkg) => [pkg.rowKey as string, pkg]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedPackages = packages.filter((pkg) => pkg.rowKey === null || !rowKeys.has(pkg.rowKey));\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Packages</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'PACKAGE',\n\t\t\t\t\t'PACKAGE ID',\n\t\t\t\t\t...(layout.showMvr ? ['MVR'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tPACKAGE_WIDTH,\n\t\t\t\t\tlayout.packageIdWidth,\n\t\t\t\t\t...(layout.showMvr ? [layout.mvrWidth] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<PackageRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\tpkg={packageByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedPackages.map((pkg) => (\n\t\t\t\t<PackageRecordRow key={pkg.key} pkg={pkg} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst AccountRow = ({\n\tdisplayRow,\n\taccount,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly account: AccountProjection | undefined;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\taccount === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\taddress: '<pending>',\n\t\t\t\t\tscheme: 'pending',\n\t\t\t\t\tsource: 'pending',\n\t\t\t\t\tfunding: 'funding pending',\n\t\t\t\t}\n\t\t\t: accountCells(account);\n\tconst detail = cells.errorSummary || cells.narration || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRow = ({\n\tdisplayRow,\n\tpkg,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly pkg: PackageProjection | undefined;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\tpkg === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\tpackageId: '<pending>',\n\t\t\t\t\tmvr: 'pending',\n\t\t\t\t\tdetail: cells.errorSummary || cells.narration || 'publish pending',\n\t\t\t\t}\n\t\t\t: packageCells(pkg);\n\tconst detail = cells.errorSummary || cells.narration || facts.detail || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={PACKAGE_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountRecordRow = ({\n\taccount,\n\tlayout,\n}: {\n\treadonly account: AccountProjection;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst facts = accountCells(account);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<FixedText width={DETAIL_WIDTH} color=\"white\">\n\t\t\t\t\t-\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRecordRow = ({\n\tpkg,\n\tlayout,\n}: {\n\treadonly pkg: PackageProjection;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst facts = packageCells(pkg);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={PACKAGE_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText width={DETAIL_WIDTH} color=\"white\" lines={[facts.detail]} />\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst StateCell = ({\n\tglyph,\n\tlabel,\n\tcolor,\n}: {\n\treadonly glyph: string;\n\treadonly label: string;\n\treadonly color: ColorToken;\n}): React.JSX.Element => (\n\t<FixedText width={STATE_WIDTH} color={color}>\n\t\t{`${glyph} ${label}`}\n\t</FixedText>\n);\n\nconst Header = ({\n\tcells,\n\twidths,\n}: {\n\treadonly cells: ReadonlyArray<string>;\n\treadonly widths: ReadonlyArray<number>;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"row\" gap={1}>\n\t\t{cells.map((cell, index) =>\n\t\t\twidths[index] === 0 ? (\n\t\t\t\t<Text key={`${index}:${cell}`} bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\t<FixedText key={`${index}:${cell}`} width={widths[index] ?? 0} color=\"white\" bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</FixedText>\n\t\t\t),\n\t\t)}\n\t</Box>\n);\n\nconst FixedText = ({\n\twidth,\n\tcolor,\n\tbold = false,\n\tchildren,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly bold?: boolean;\n\treadonly children: string;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0}>\n\t\t<Text color={color} bold={bold}>\n\t\t\t{clip(children, width)}\n\t\t</Text>\n\t</Box>\n);\n\nconst MultiLineFixedText = ({\n\twidth,\n\tcolor,\n\tlines,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly lines: ReadonlyArray<string>;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0} flexDirection=\"column\">\n\t\t{lines\n\t\t\t.flatMap((line) => wrap(line, width))\n\t\t\t.map((line, index) => (\n\t\t\t\t<Text key={`${index}:${line}`} color={color} wrap=\"truncate-end\">\n\t\t\t\t\t{line}\n\t\t\t\t</Text>\n\t\t\t))}\n\t</Box>\n);\n\nconst clip = (value: string, width: number): string => {\n\tif (width <= 0 || value.length <= width) return value;\n\tif (width <= 1) return value.slice(0, width);\n\treturn `${value.slice(0, width - 1)}…`;\n};\n\nconst pluginTableLayout = (columns: number): PluginTableLayout => {\n\tconst gapCount = (showDetail: boolean): number => (showDetail ? 3 : 2);\n\tconst detailBudget = STATE_WIDTH + NAME_WIDTH + DETAIL_WIDTH + MIN_URL_WIDTH + gapCount(true);\n\tconst showDetail = columns >= detailBudget;\n\tconst fixedWidth =\n\t\tSTATE_WIDTH + NAME_WIDTH + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);\n\tconst availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);\n\treturn {\n\t\tshowDetail,\n\t\turlWidth: Math.min(MAX_URL_WIDTH, availableUrlWidth),\n\t};\n};\n\nconst accountTableLayout = (columns: number): AccountTableLayout => {\n\tconst fullWidth =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\tADDRESS_WIDTH +\n\t\tSCHEME_WIDTH +\n\t\tSOURCE_WIDTH +\n\t\tFUNDING_WIDTH +\n\t\tDETAIL_WIDTH +\n\t\t6;\n\tconst midWidth =\n\t\tSTATE_WIDTH + ACCOUNT_WIDTH + 32 + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + 5;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMeta = columns >= midWidth;\n\tconst showFunding = columns >= midWidth;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\t(showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) +\n\t\t(showFunding ? FUNDING_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMeta,\n\t\tshowFunding,\n\t\taddressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst packageTableLayout = (columns: number): PackageTableLayout => {\n\tconst fullWidth = STATE_WIDTH + PACKAGE_WIDTH + PACKAGE_ID_WIDTH + MVR_WIDTH + DETAIL_WIDTH + 4;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMvr = columns >= STATE_WIDTH + PACKAGE_WIDTH + 24 + 16 + 3;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tPACKAGE_WIDTH +\n\t\t(showMvr ? MVR_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMvr,\n\t\tmvrWidth: showDetail ? MVR_WIDTH : 20,\n\t\tpackageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst wrap = (value: string, width: number): ReadonlyArray<string> => {\n\tconst limit = Math.max(1, width - 1);\n\tif (width <= 0 || value.length <= limit) return [value];\n\tconst lines: Array<string> = [];\n\tlet rest = value;\n\twhile (rest.length > limit) {\n\t\tconst idx = wrapIndex(rest, limit);\n\t\tlines.push(rest.slice(0, idx).trimEnd());\n\t\trest = rest.slice(idx).trimStart();\n\t}\n\tif (rest.length > 0) lines.push(rest);\n\treturn lines;\n};\n\nconst wrapIndex = (value: string, width: number): number => {\n\tconst window = value.slice(0, width + 1);\n\tconst candidates = [' -> ', ' | ', ' '];\n\tlet bestIndex = -1;\n\tlet bestLength = 0;\n\tfor (const candidate of candidates) {\n\t\tconst idx = window.lastIndexOf(candidate);\n\t\tif (idx > bestIndex) {\n\t\t\tbestIndex = idx;\n\t\t\tbestLength = candidate.length;\n\t\t}\n\t}\n\tif (bestIndex > 0) return bestIndex + bestLength;\n\treturn width;\n};\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- # syntax=docker/dockerfile:1
2
1
  # devstack-rewrite vendored postgres image.
3
2
  #
4
3
  # Single load-bearing modification: relocate PGDATA off the upstream
@@ -2,72 +2,45 @@
2
2
  # Dockerfile fed to `ContainerRuntime.ensureImage` (content-addressed
3
3
  # builds — same Dockerfile + build args produce the same image digest).
4
4
  #
5
- # Multi-arch: the upstream `mysten/sui-tools` image ships amd64 only,
6
- # so on Apple Silicon it runs under Rosetta and `sui start` genesis
7
- # stretches from ~10 s to several minutes. We download the matching
8
- # `ubuntu-aarch64` / `ubuntu-x86_64` release tarball at build time
9
- # instead so the resulting image runs natively on the host.
10
- #
11
- # `ubuntu:24.04` — the Sui release tarballs are linked against
12
- # glibc 2.38+; debian:bookworm (glibc 2.36) fails at runtime with a
13
- # GLIBC_2.38-missing error.
14
-
15
- FROM ubuntu:24.04
5
+ # Base: `mysten/sui-tools` pinned per-arch (the tag is NOT a multi-arch
6
+ # manifest list, so the caller appends `-arm64` on Apple Silicon see
7
+ # `suiCliImageBuildContext` in src/plugins/sui/move/index.ts). The image
8
+ # bundles `sui`/`sui-faucet`/`sui-tool`/`git`/`libpq`.
16
9
 
17
- ARG SUI_VERSION
18
- ARG TARGETARCH
10
+ ARG SUI_TOOLS_IMAGE
11
+ FROM ${SUI_TOOLS_IMAGE}
19
12
 
13
+ # `gawk` — the in-container Move.lock scrub uses `gawk -i inplace` (the
14
+ # `-i` inplace mode is gawk-only; mawk doesn't support it). sui-tools
15
+ # ships `git` (Move's dep resolver runs `git fetch`) but not gawk.
20
16
  RUN apt-get update \
21
- && apt-get install -y --no-install-recommends \
22
- ca-certificates curl gawk git postgresql \
23
- && PG_BIN_DIR="$(dirname "$(find /usr/lib/postgresql -name initdb -type f | sort | tail -n 1)")" \
24
- && test -x "$PG_BIN_DIR/initdb" \
25
- && ln -sf "$PG_BIN_DIR/initdb" /usr/local/bin/initdb \
26
- && ln -sf "$PG_BIN_DIR/pg_ctl" /usr/local/bin/pg_ctl \
27
- && ln -sf "$PG_BIN_DIR/postgres" /usr/local/bin/postgres \
28
- && useradd --create-home --shell /bin/sh devstack-sui \
17
+ && apt-get install -y --no-install-recommends gawk \
29
18
  && rm -rf /var/lib/apt/lists/*
30
19
 
31
- # Why `gawk` + `git`:
32
- # - `gawk` — the in-container Move.lock scrub uses `gawk -i inplace`
33
- # (the `-i` inplace mode is gawk-only; mawk doesn't support it).
34
- # Without this, the package plugin's `containerScrubShellScript`
35
- # fails inside `sui move build` with `find: 'gawk': No such
36
- # file or directory` (host scrub may have already run, but the
37
- # in-container path still invokes gawk).
38
- # - `git` — Move's dep resolver invokes `git fetch` against vendored
39
- # `[dependencies]` blocks (`{ git = "..." }`). Without git on PATH,
40
- # `sui move build` aborts with a dep-fetch error before reaching
41
- # the bytecode pass.
42
- # - `postgresql` — `sui start --with-graphql` initializes an embedded
43
- # local indexer database and shells out to `initdb`/`postgres`.
44
-
45
- # Sui release-tarball fetch. The TARGETARCH branch picks the
46
- # native-architecture asset name and unpacks `sui` (and siblings,
47
- # including `sui-faucet`) into `/usr/local/bin/`.
48
- RUN set -eux; \
49
- case "$TARGETARCH" in \
50
- arm64) SUI_PLATFORM=ubuntu-aarch64 ;; \
51
- amd64) SUI_PLATFORM=ubuntu-x86_64 ;; \
52
- *) echo "unsupported TARGETARCH=$TARGETARCH" >&2; exit 1 ;; \
53
- esac; \
54
- url="https://github.com/MystenLabs/sui/releases/download/${SUI_VERSION}/sui-${SUI_VERSION}-${SUI_PLATFORM}.tgz"; \
55
- curl -fsSL "$url" -o /tmp/sui.tgz; \
56
- mkdir -p /tmp/sui-unpack; \
57
- tar -xzf /tmp/sui.tgz -C /tmp/sui-unpack; \
58
- find /tmp/sui-unpack -maxdepth 2 -type f -executable -exec mv {} /usr/local/bin/ \; ; \
59
- rm -rf /tmp/sui.tgz /tmp/sui-unpack; \
60
- sui --version
61
-
62
- COPY _shared/signal-forward.sh /usr/local/lib/devstack/signal-forward.sh
63
20
  COPY sui/entrypoint.sh /usr/local/bin/devstack-entrypoint.sh
64
21
  RUN chmod +x /usr/local/bin/devstack-entrypoint.sh
65
22
 
66
23
  ENV RUST_LOG=info,sui=info
67
24
 
25
+ # Stop with SIGINT, not SIGTERM. The entrypoint `exec sui …` makes sui
26
+ # PID 1, and `sui start --with-faucet` only registers a SIGINT (ctrl-c)
27
+ # handler — `start_faucet`'s `axum::serve(...).await` shadows sui's
28
+ # `tokio::signal::ctrl_c()` for SIGTERM, so SIGTERM is ignored. Without
29
+ # this, `docker stop` (default SIGTERM) waits the full grace then escalates
30
+ # to SIGKILL → exit 137; `recreate: 'on-failure'` then RECREATES the
31
+ # validator on the next boot, destroying the persisted RocksDB chain state
32
+ # that warm restart/resume relies on. SIGINT drains RocksDB and exits 0 in
33
+ # <1s (verified, plain + external-indexer configs).
34
+ STOPSIGNAL SIGINT
35
+
68
36
  # RPC (9000), faucet (9123), GraphQL consistent-store helper (9124),
69
37
  # and GraphQL HTTP (9125). Local-mode boot probes the public surfaces.
70
38
  EXPOSE 9000 9123 9124 9125
71
39
 
40
+ # GraphQL is gated at the env-wiring layer (NOT in this static CMD, which
41
+ # must stay graphql-less so the indexer:false path works): the entrypoint
42
+ # appends `--with-graphql` only when `DEVSTACK_SUI_INDEXER_URL` is set. The
43
+ # sui plugin sets that var by DEFAULT (pointing at the postgres sidecar it
44
+ # owns), so the default boot is full RPC + faucet + GraphQL.
72
45
  ENTRYPOINT ["/usr/local/bin/devstack-entrypoint.sh"]
73
- CMD ["start", "--with-faucet=0.0.0.0:9123", "--with-graphql=0.0.0.0:9125"]
46
+ CMD ["start", "--with-faucet=0.0.0.0:9123"]